Skip to content

Commit c900b5f

Browse files
authored
feat: add single tailnet support to pgcoord (#9351)
1 parent fbad06f commit c900b5f

24 files changed

+1639
-285
lines changed

coderd/database/dbauthz/dbauthz.go

+23-2
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,13 @@ func (q *querier) DeleteAPIKeysByUserID(ctx context.Context, userID uuid.UUID) e
694694
return q.db.DeleteAPIKeysByUserID(ctx, userID)
695695
}
696696

697+
func (q *querier) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error {
698+
if err := q.authorizeContext(ctx, rbac.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
699+
return err
700+
}
701+
return q.db.DeleteAllTailnetClientSubscriptions(ctx, arg)
702+
}
703+
697704
func (q *querier) DeleteApplicationConnectAPIKeysByUserID(ctx context.Context, userID uuid.UUID) error {
698705
// TODO: This is not 100% correct because it omits apikey IDs.
699706
err := q.authorizeContext(ctx, rbac.ActionDelete,
@@ -783,6 +790,13 @@ func (q *querier) DeleteTailnetClient(ctx context.Context, arg database.DeleteTa
783790
return q.db.DeleteTailnetClient(ctx, arg)
784791
}
785792

793+
func (q *querier) DeleteTailnetClientSubscription(ctx context.Context, arg database.DeleteTailnetClientSubscriptionParams) error {
794+
if err := q.authorizeContext(ctx, rbac.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
795+
return err
796+
}
797+
return q.db.DeleteTailnetClientSubscription(ctx, arg)
798+
}
799+
786800
func (q *querier) GetAPIKeyByID(ctx context.Context, id string) (database.APIKey, error) {
787801
return fetch(q.log, q.auth, q.db.GetAPIKeyByID)(ctx, id)
788802
}
@@ -825,9 +839,9 @@ func (q *querier) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAg
825839
return q.db.GetAllTailnetAgents(ctx)
826840
}
827841

828-
func (q *querier) GetAllTailnetClients(ctx context.Context) ([]database.TailnetClient, error) {
842+
func (q *querier) GetAllTailnetClients(ctx context.Context) ([]database.GetAllTailnetClientsRow, error) {
829843
if err := q.authorizeContext(ctx, rbac.ActionRead, rbac.ResourceTailnetCoordinator); err != nil {
830-
return []database.TailnetClient{}, err
844+
return []database.GetAllTailnetClientsRow{}, err
831845
}
832846
return q.db.GetAllTailnetClients(ctx)
833847
}
@@ -2794,6 +2808,13 @@ func (q *querier) UpsertTailnetClient(ctx context.Context, arg database.UpsertTa
27942808
return q.db.UpsertTailnetClient(ctx, arg)
27952809
}
27962810

2811+
func (q *querier) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error {
2812+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
2813+
return err
2814+
}
2815+
return q.db.UpsertTailnetClientSubscription(ctx, arg)
2816+
}
2817+
27972818
func (q *querier) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) {
27982819
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
27992820
return database.TailnetCoordinator{}, err

coderd/database/dbfake/dbfake.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,15 @@ func (q *FakeQuerier) DeleteAPIKeysByUserID(_ context.Context, userID uuid.UUID)
854854
return nil
855855
}
856856

857+
func (*FakeQuerier) DeleteAllTailnetClientSubscriptions(_ context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error {
858+
err := validateDatabaseType(arg)
859+
if err != nil {
860+
return err
861+
}
862+
863+
return ErrUnimplemented
864+
}
865+
857866
func (q *FakeQuerier) DeleteApplicationConnectAPIKeysByUserID(_ context.Context, userID uuid.UUID) error {
858867
q.mutex.Lock()
859868
defer q.mutex.Unlock()
@@ -987,6 +996,10 @@ func (*FakeQuerier) DeleteTailnetClient(context.Context, database.DeleteTailnetC
987996
return database.DeleteTailnetClientRow{}, ErrUnimplemented
988997
}
989998

999+
func (*FakeQuerier) DeleteTailnetClientSubscription(context.Context, database.DeleteTailnetClientSubscriptionParams) error {
1000+
return ErrUnimplemented
1001+
}
1002+
9901003
func (q *FakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIKey, error) {
9911004
q.mutex.RLock()
9921005
defer q.mutex.RUnlock()
@@ -1102,7 +1115,7 @@ func (*FakeQuerier) GetAllTailnetAgents(_ context.Context) ([]database.TailnetAg
11021115
return nil, ErrUnimplemented
11031116
}
11041117

1105-
func (*FakeQuerier) GetAllTailnetClients(_ context.Context) ([]database.TailnetClient, error) {
1118+
func (*FakeQuerier) GetAllTailnetClients(_ context.Context) ([]database.GetAllTailnetClientsRow, error) {
11061119
return nil, ErrUnimplemented
11071120
}
11081121

@@ -6112,6 +6125,10 @@ func (*FakeQuerier) UpsertTailnetClient(context.Context, database.UpsertTailnetC
61126125
return database.TailnetClient{}, ErrUnimplemented
61136126
}
61146127

6128+
func (*FakeQuerier) UpsertTailnetClientSubscription(context.Context, database.UpsertTailnetClientSubscriptionParams) error {
6129+
return ErrUnimplemented
6130+
}
6131+
61156132
func (*FakeQuerier) UpsertTailnetCoordinator(context.Context, uuid.UUID) (database.TailnetCoordinator, error) {
61166133
return database.TailnetCoordinator{}, ErrUnimplemented
61176134
}

coderd/database/dbmetrics/dbmetrics.go

+22-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

+44-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

+63-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/foreign_key_constraint.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
BEGIN;
2+
3+
ALTER TABLE
4+
tailnet_clients
5+
ADD COLUMN
6+
agent_id uuid;
7+
8+
UPDATE
9+
tailnet_clients
10+
SET
11+
-- there's no reason for us to try and preserve data since coordinators will
12+
-- have to restart anyways, which will create all of the client mappings.
13+
agent_id = '00000000-0000-0000-0000-000000000000'::uuid;
14+
15+
ALTER TABLE
16+
tailnet_clients
17+
ALTER COLUMN
18+
agent_id SET NOT NULL;
19+
20+
DROP TABLE tailnet_client_subscriptions;
21+
DROP FUNCTION tailnet_notify_client_subscription_change;
22+
23+
-- update the tailnet_clients trigger to the old version.
24+
CREATE OR REPLACE FUNCTION tailnet_notify_client_change() RETURNS trigger
25+
LANGUAGE plpgsql
26+
AS $$
27+
BEGIN
28+
IF (OLD IS NOT NULL) THEN
29+
PERFORM pg_notify('tailnet_client_update', OLD.id || ',' || OLD.agent_id);
30+
RETURN NULL;
31+
END IF;
32+
IF (NEW IS NOT NULL) THEN
33+
PERFORM pg_notify('tailnet_client_update', NEW.id || ',' || NEW.agent_id);
34+
RETURN NULL;
35+
END IF;
36+
END;
37+
$$;
38+
39+
COMMIT;

0 commit comments

Comments
 (0)