Skip to content

Commit 313030c

Browse files
committed
Merge branch 'release-0.12.4'
2 parents a61313d + 4fb30c2 commit 313030c

File tree

9 files changed

+203
-19
lines changed

9 files changed

+203
-19
lines changed

.github/workflows/cleanup.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ jobs:
2525
python-version: '3.10'
2626

2727
- name: Run Cleanup Script
28-
# Keep at least 3 images, delete images older than 168 hours (7 days)
28+
# Keep at least 16 images, delete images older than 720 hours (30 days)
2929
run: |
30-
python containers/cleangcr.py -y -k 3 -g 168
30+
python containers/cleangcr.py -y -k 16 -g 720

cmd/tenant/main.go

+154-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ package main
22

33
import (
44
"context"
5+
"encoding/csv"
6+
"errors"
57
"fmt"
68
"log"
79
"os"
10+
"strings"
811
"text/tabwriter"
912
"time"
1013

@@ -90,6 +93,27 @@ func main() {
9093
},
9194
},
9295
},
96+
{
97+
Name: "db:cleanup",
98+
Usage: "remove all tenants and members that do not appear in the organization list",
99+
Category: "client",
100+
Before: connectDB,
101+
After: closeDB,
102+
Action: cleanup,
103+
Flags: []cli.Flag{
104+
&cli.StringFlag{
105+
Name: "orgs",
106+
Aliases: []string{"f"},
107+
Usage: "path to a CSV file containing a list of organization IDs to keep",
108+
Required: true,
109+
},
110+
&cli.BoolFlag{
111+
Name: "dry-run",
112+
Aliases: []string{"d"},
113+
Usage: "show the effect of cleanup without execution",
114+
},
115+
},
116+
},
93117
}
94118

95119
if err := app.Run(os.Args); err != nil {
@@ -328,6 +352,135 @@ func reindex(c *cli.Context) (err error) {
328352
return nil
329353
}
330354

355+
func cleanup(c *cli.Context) (err error) {
356+
ctx, cancel := context.WithTimeout(context.Background(), timeout)
357+
defer cancel()
358+
359+
dry := c.Bool("dry-run")
360+
361+
// Load the organizations from the CSV file
362+
var f *os.File
363+
if f, err = os.Open(c.String("orgs")); err != nil {
364+
return cli.Exit(err, 1)
365+
}
366+
367+
// Ensure there is a header row
368+
var header []string
369+
reader := csv.NewReader(f)
370+
if header, err = reader.Read(); err != nil {
371+
return cli.Exit(err, 1)
372+
}
373+
374+
// Find the ID column or assume the first column is the ID
375+
var idCol int
376+
for i, col := range header {
377+
if strings.ToLower(col) == "id" {
378+
idCol = i
379+
break
380+
}
381+
}
382+
383+
orgs := make(map[ulid.ULID]struct{})
384+
for {
385+
var record []string
386+
if record, err = reader.Read(); err != nil {
387+
break
388+
}
389+
390+
var id ulid.ULID
391+
if id, err = ulid.Parse(record[idCol]); err != nil {
392+
return cli.Exit(fmt.Errorf("could not parse org ID: %s", record[idCol]), 1)
393+
}
394+
395+
orgs[id] = struct{}{}
396+
}
397+
398+
if len(orgs) == 0 {
399+
return cli.Exit(fmt.Errorf("no organizations found in CSV file"), 1)
400+
}
401+
402+
// Fetch tenants not in the organization list
403+
strandedTenants := make(map[ulid.ULID]*db.Tenant)
404+
for {
405+
var (
406+
tenants []*db.Tenant
407+
next *pagination.Cursor
408+
)
409+
if tenants, next, err = db.ListTenants(ctx, ulid.ULID{}, next); err != nil {
410+
return cli.Exit(err, 1)
411+
}
412+
413+
for _, tenant := range tenants {
414+
if _, ok := orgs[tenant.OrgID]; !ok {
415+
strandedTenants[tenant.ID] = tenant
416+
}
417+
}
418+
419+
if next == nil {
420+
break
421+
}
422+
}
423+
424+
// Fetch members not in the organization list
425+
strandedMembers := make(map[ulid.ULID]*db.Member)
426+
for {
427+
var (
428+
members []*db.Member
429+
next *pagination.Cursor
430+
)
431+
if members, next, err = db.ListMembers(ctx, ulid.ULID{}, next); err != nil {
432+
return cli.Exit(err, 1)
433+
}
434+
435+
for _, member := range members {
436+
if _, ok := orgs[member.OrgID]; !ok {
437+
strandedMembers[member.ID] = member
438+
}
439+
}
440+
441+
if next == nil {
442+
break
443+
}
444+
}
445+
446+
if dry {
447+
fmt.Println("The following tenants would be removed:")
448+
for _, tenant := range strandedTenants {
449+
fmt.Println(tenant.ID.String(), tenant.Name, tenant.Modified)
450+
}
451+
452+
fmt.Println("The following members would be removed:")
453+
for _, member := range strandedMembers {
454+
fmt.Println(member.ID.String(), member.Email, member.Organization, member.Modified)
455+
}
456+
457+
return nil
458+
} else {
459+
var errs error
460+
fmt.Println("Removing", len(strandedTenants), "tenants and", len(strandedMembers), "members")
461+
for _, tenant := range strandedTenants {
462+
fmt.Println("Removing tenant", tenant.ID.String(), tenant.Name, tenant.Modified)
463+
if err = db.DeleteTenant(ctx, tenant.OrgID, tenant.ID); err != nil {
464+
errs = errors.Join(errs, err)
465+
}
466+
}
467+
468+
for _, member := range strandedMembers {
469+
fmt.Println("Removing member", member.ID.String(), member.Email, member.Organization, member.Modified)
470+
if err = db.DeleteMember(ctx, member.OrgID, member.ID); err != nil {
471+
errs = errors.Join(errs, err)
472+
}
473+
}
474+
475+
if errs != nil {
476+
return cli.Exit(errs, 1)
477+
}
478+
fmt.Println("Successfully removed", len(strandedTenants), "tenants and", len(strandedMembers), "members")
479+
}
480+
481+
return nil
482+
}
483+
331484
//===========================================================================
332485
// Helpers
333486
//===========================================================================
@@ -349,7 +502,7 @@ func connectDB(c *cli.Context) (err error) {
349502
}
350503
conf.ConsoleLog = false
351504

352-
// Connect tot he trtl server
505+
// Connect to the trtl server
353506
if err = db.Connect(conf.Database); err != nil {
354507
return cli.Exit(err, 1)
355508
}

docs/content/sdk/golang.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ go run main.go
9191

9292
If you see a message like the following, then congratulations! You've successfully connected to Ensign!
9393

94-
```HEALTHY 0.12.0-beta.15 ([GIT HASH])```
94+
```HEALTHY 0.12.4-beta.18 ([GIT HASH])```
9595

9696
### Make Some Data
9797

docs/content/sdk/python.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ If you see a message like the following, then congratulations! You've successful
7575

7676
```
7777
status: 1
78-
version: 0.12.0-beta.15 ([GIT HASH])
78+
version: 0.12.4-beta.18 ([GIT HASH])
7979
uptime: seconds: 130150
8080
nanos: 862300696
8181
```

pkg/ensign/api/v1beta1/deduplication_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ func TestDuplicateReferencing(t *testing.T) {
603603
PublisherId: "01HD1M0AVDVHPA4WA73MAA7NH7",
604604
Ipaddr: "192.148.21.133",
605605
ClientId: "data-ingestor-bravo",
606-
UserAgent: "Go-Ensign v0.12.0",
606+
UserAgent: "Go-Ensign v0.12.4",
607607
}
608608
}
609609

@@ -982,7 +982,7 @@ func mkwevt(data, kvs string, mime mimetype.MIME, etype, created string) *EventW
982982
PublisherId: "01HD1KY309F3SHSV1M89GSQBDF",
983983
Ipaddr: "192.168.1.1",
984984
ClientId: "data-ingestor-alpha",
985-
UserAgent: "PyEnsign v0.12.0",
985+
UserAgent: "PyEnsign v0.12.4",
986986
},
987987
Encryption: &Encryption{EncryptionAlgorithm: Encryption_PLAINTEXT},
988988
Compression: &Compression{Algorithm: Compression_NONE},
@@ -1016,7 +1016,7 @@ func createRandomEvent(mime mimetype.MIME, etype, meta string) *EventWrapper {
10161016
PublisherId: "01HD1KY309F3SHSV1M89GSQBDF",
10171017
Ipaddr: "192.168.1.1",
10181018
ClientId: "data-ingestor-alpha",
1019-
UserAgent: "PyEnsign v0.12.0",
1019+
UserAgent: "PyEnsign v0.12.4",
10201020
},
10211021
Encryption: &Encryption{EncryptionAlgorithm: Encryption_PLAINTEXT},
10221022
Compression: &Compression{Algorithm: Compression_NONE},

pkg/version.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import "fmt"
66
const (
77
VersionMajor = 0
88
VersionMinor = 12
9-
VersionPatch = 3
9+
VersionPatch = 4
1010
VersionReleaseLevel = "beta"
11-
VersionReleaseNumber = 18
11+
VersionReleaseNumber = 19
1212
)
1313

1414
// Set the GitVersion via -ldflags="-X 'github.com/rotationalio/ensign/pkg.GitVersion=$(git rev-parse --short HEAD)'"

web/beacon-app/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "beacon-app",
3-
"version": "0.12.0",
3+
"version": "0.12.4",
44
"description": "User UI for Ensign.",
55
"main": "index.js",
66
"repository": "https://github.com/rotationalio/ensign",

web/beacon-app/src/application/routes/paths.ts

+2
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,6 @@ export const EXTERNAL_LINKS = {
7373
DOCS: 'https://ensign.rotational.dev/getting-started/',
7474
SUPPORT: '[email protected]',
7575
PROTECT_API_KEYS_VIDEO: 'https://youtu.be/EEpIDkKJopY',
76+
ENSIGN_PRICING: 'https://rotational.io/ensign-pricing/',
77+
RESOURCES: 'https://rotational.io/resources/',
7678
};

web/beacon-app/src/components/auth/LandingFooter/LandingFooter.tsx

+37-8
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@ function LandingFooter() {
1919
<li>
2020
<a href={ROUTES.HOME}>Ensign</a>
2121
</li>
22+
<li>
23+
<a href={EXTERNAL_LINKS.ENSIGN_PRICING} target="_blank" rel="noreferrer">
24+
Pricing
25+
</a>
26+
</li>
2227
<li>
2328
<a href={EXTERNAL_LINKS.DOCUMENTATION} target="_blank" rel="noreferrer">
24-
Documentation
29+
Docs
2530
</a>
2631
</li>
2732
<li>
@@ -40,24 +45,44 @@ function LandingFooter() {
4045
<h3 className="font-light">COMPANY</h3>
4146
<ul>
4247
<li>
43-
<a href={EXTERNAL_LINKS.SERVICES}>Services</a>
48+
<a href={EXTERNAL_LINKS.SERVICES} target="_blank" rel="noreferrer">
49+
Services
50+
</a>
4451
</li>
4552
<li>
46-
<a href={EXTERNAL_LINKS.BLOG}>Blog</a>
53+
<a href={EXTERNAL_LINKS.BLOG} target="_blank" rel="noreferrer">
54+
Blog
55+
</a>
4756
</li>
4857
<li>
49-
<a href={EXTERNAL_LINKS.ABOUT}>About</a>
58+
<a href={EXTERNAL_LINKS.ABOUT} target="_blank" rel="noreferrer">
59+
About
60+
</a>
5061
</li>
5162
</ul>
5263
</div>
5364
<div className="pt-4 font-bold leading-loose">
5465
<h3 className="font-light">COMMUNITY</h3>
5566
<ul>
5667
<li>
57-
<a href={EXTERNAL_LINKS.DATA_PLAYGROUND}>Data Playground</a>
68+
<a href={EXTERNAL_LINKS.ENSIGN_UNIVERSITY} target="_blank" rel="noreferrer">
69+
Ensign U
70+
</a>
71+
</li>
72+
<li>
73+
<a href={EXTERNAL_LINKS.DATA_PLAYGROUND} target="_blank" rel="noreferrer">
74+
Data Playground
75+
</a>
5876
</li>
5977
<li>
60-
<a href={EXTERNAL_LINKS.OPEN_SOURCE}>Open Source</a>
78+
<a href={EXTERNAL_LINKS.OPEN_SOURCE} target="_blank" rel="noreferrer">
79+
Open Source
80+
</a>
81+
</li>
82+
<li>
83+
<a href={EXTERNAL_LINKS.RESOURCES} target="_blank" rel="noreferrer">
84+
Resources
85+
</a>
6186
</li>
6287
</ul>
6388
</div>
@@ -114,10 +139,14 @@ function LandingFooter() {
114139

115140
<ul className="mt-4 flex sm:mt-0">
116141
<li className="mr-4 border-r pr-4">
117-
<a href={EXTERNAL_LINKS.PRIVACY}>Privacy Policy</a>
142+
<a href={EXTERNAL_LINKS.PRIVACY} target="_blank" rel="noreferrer">
143+
Privacy Policy
144+
</a>
118145
</li>
119146
<li className="">
120-
<a href={EXTERNAL_LINKS.TERMS}>Terms of Use</a>
147+
<a href={EXTERNAL_LINKS.TERMS} target="_blank" rel="noreferrer">
148+
Terms of Use
149+
</a>
121150
</li>
122151
</ul>
123152
</div>

0 commit comments

Comments
 (0)