From f47f89d997a3d70f77174889e9c460e44e26d6c0 Mon Sep 17 00:00:00 2001 From: Spike Curtis Date: Mon, 26 Jan 2026 14:27:17 +0400 Subject: [PATCH] chore: remove unused tailnet v1 tables and queries (#21646) Removes the legacy tailnet v1 API tables (`tailnet_clients`, `tailnet_agents`, `tailnet_client_subscriptions`) and their associated queries, triggers, and functions. These were superseded by the v2 tables (`tailnet_peers`, `tailnet_tunnels`) in migration 000168, and the v1 API code was removed in commit d6154c4310, but the database artifacts were never cleaned up. **Changes:** - New migration `000410_remove_tailnet_v1_tables` to drop the unused tables - Removed 11 unused queries from `tailnet.sql` - Removed associated manual wrapper methods in `dbauthz` and `dbmetrics` - ~930 lines deleted across 11 files --- coderd/database/dbauthz/dbauthz.go | 77 ----- coderd/database/dbauthz/dbauthz_test.go | 47 --- coderd/database/dbmetrics/querymetrics.go | 88 ----- coderd/database/dbmock/dbmock.go | 161 ---------- coderd/database/dump.sql | 123 ------- coderd/database/foreign_key_constraint.go | 3 - .../000410_remove_tailnet_v1_tables.down.sql | 124 ++++++++ .../000410_remove_tailnet_v1_tables.up.sql | 20 ++ coderd/database/models.go | 21 -- coderd/database/querier.go | 11 - coderd/database/queries.sql.go | 300 ------------------ coderd/database/queries/tailnet.sql | 99 ------ coderd/database/unique_constraint.go | 3 - 13 files changed, 144 insertions(+), 933 deletions(-) create mode 100644 coderd/database/migrations/000410_remove_tailnet_v1_tables.down.sql create mode 100644 coderd/database/migrations/000410_remove_tailnet_v1_tables.up.sql diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 2beda99c47..3083914b4c 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -1641,13 +1641,6 @@ func (q *querier) DeleteAPIKeysByUserID(ctx context.Context, userID uuid.UUID) e return q.db.DeleteAPIKeysByUserID(ctx, userID) } -func (q *querier) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error { - if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { - return err - } - return q.db.DeleteAllTailnetClientSubscriptions(ctx, arg) -} - func (q *querier) DeleteAllTailnetTunnels(ctx context.Context, arg database.DeleteAllTailnetTunnelsParams) error { if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { return err @@ -1672,13 +1665,6 @@ func (q *querier) DeleteApplicationConnectAPIKeysByUserID(ctx context.Context, u return q.db.DeleteApplicationConnectAPIKeysByUserID(ctx, userID) } -func (q *querier) DeleteCoordinator(ctx context.Context, id uuid.UUID) error { - if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { - return err - } - return q.db.DeleteCoordinator(ctx, id) -} - func (q *querier) DeleteCryptoKey(ctx context.Context, arg database.DeleteCryptoKeyParams) (database.CryptoKey, error) { if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceCryptoKey); err != nil { return database.CryptoKey{}, err @@ -1887,27 +1873,6 @@ func (q *querier) DeleteRuntimeConfig(ctx context.Context, key string) error { return q.db.DeleteRuntimeConfig(ctx, key) } -func (q *querier) DeleteTailnetAgent(ctx context.Context, arg database.DeleteTailnetAgentParams) (database.DeleteTailnetAgentRow, error) { - if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil { - return database.DeleteTailnetAgentRow{}, err - } - return q.db.DeleteTailnetAgent(ctx, arg) -} - -func (q *querier) DeleteTailnetClient(ctx context.Context, arg database.DeleteTailnetClientParams) (database.DeleteTailnetClientRow, error) { - if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { - return database.DeleteTailnetClientRow{}, err - } - return q.db.DeleteTailnetClient(ctx, arg) -} - -func (q *querier) DeleteTailnetClientSubscription(ctx context.Context, arg database.DeleteTailnetClientSubscriptionParams) error { - if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { - return err - } - return q.db.DeleteTailnetClientSubscription(ctx, arg) -} - func (q *querier) DeleteTailnetPeer(ctx context.Context, arg database.DeleteTailnetPeerParams) (database.DeleteTailnetPeerRow, error) { if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil { return database.DeleteTailnetPeerRow{}, err @@ -2192,13 +2157,6 @@ func (q *querier) GetActiveWorkspaceBuildsByTemplateID(ctx context.Context, temp return q.db.GetActiveWorkspaceBuildsByTemplateID(ctx, templateID) } -func (q *querier) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAgent, error) { - if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil { - return []database.TailnetAgent{}, err - } - return q.db.GetAllTailnetAgents(ctx) -} - func (q *querier) GetAllTailnetCoordinators(ctx context.Context) ([]database.TailnetCoordinator, error) { if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil { return nil, err @@ -3064,20 +3022,6 @@ func (q *querier) GetRuntimeConfig(ctx context.Context, key string) (string, err return q.db.GetRuntimeConfig(ctx, key) } -func (q *querier) GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]database.TailnetAgent, error) { - if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil { - return nil, err - } - return q.db.GetTailnetAgents(ctx, id) -} - -func (q *querier) GetTailnetClientsForAgent(ctx context.Context, agentID uuid.UUID) ([]database.TailnetClient, error) { - if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil { - return nil, err - } - return q.db.GetTailnetClientsForAgent(ctx, agentID) -} - func (q *querier) GetTailnetPeers(ctx context.Context, id uuid.UUID) ([]database.TailnetPeer, error) { if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil { return nil, err @@ -6059,27 +6003,6 @@ func (q *querier) UpsertRuntimeConfig(ctx context.Context, arg database.UpsertRu return q.db.UpsertRuntimeConfig(ctx, arg) } -func (q *querier) UpsertTailnetAgent(ctx context.Context, arg database.UpsertTailnetAgentParams) (database.TailnetAgent, error) { - if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil { - return database.TailnetAgent{}, err - } - return q.db.UpsertTailnetAgent(ctx, arg) -} - -func (q *querier) UpsertTailnetClient(ctx context.Context, arg database.UpsertTailnetClientParams) (database.TailnetClient, error) { - if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil { - return database.TailnetClient{}, err - } - return q.db.UpsertTailnetClient(ctx, arg) -} - -func (q *querier) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error { - if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil { - return err - } - return q.db.UpsertTailnetClientSubscription(ctx, arg) -} - func (q *querier) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) { if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil { return database.TailnetCoordinator{}, err diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 127aa63181..b69b0493b4 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -2742,30 +2742,10 @@ func (s *MethodTestSuite) TestTailnetFunctions() { check.Args(). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete) })) - s.Run("DeleteAllTailnetClientSubscriptions", s.Subtest(func(_ database.Store, check *expects) { - check.Args(database.DeleteAllTailnetClientSubscriptionsParams{}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete) - })) s.Run("DeleteAllTailnetTunnels", s.Subtest(func(_ database.Store, check *expects) { check.Args(database.DeleteAllTailnetTunnelsParams{}). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete) })) - s.Run("DeleteCoordinator", s.Subtest(func(_ database.Store, check *expects) { - check.Args(uuid.New()). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete) - })) - s.Run("DeleteTailnetAgent", s.Subtest(func(_ database.Store, check *expects) { - check.Args(database.DeleteTailnetAgentParams{}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionUpdate).Errors(sql.ErrNoRows) - })) - s.Run("DeleteTailnetClient", s.Subtest(func(_ database.Store, check *expects) { - check.Args(database.DeleteTailnetClientParams{}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete).Errors(sql.ErrNoRows) - })) - s.Run("DeleteTailnetClientSubscription", s.Subtest(func(_ database.Store, check *expects) { - check.Args(database.DeleteTailnetClientSubscriptionParams{}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete) - })) s.Run("DeleteTailnetPeer", s.Subtest(func(_ database.Store, check *expects) { check.Args(database.DeleteTailnetPeerParams{}). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete).Errors(sql.ErrNoRows) @@ -2774,18 +2754,6 @@ func (s *MethodTestSuite) TestTailnetFunctions() { check.Args(database.DeleteTailnetTunnelParams{}). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionDelete).Errors(sql.ErrNoRows) })) - s.Run("GetAllTailnetAgents", s.Subtest(func(_ database.Store, check *expects) { - check.Args(). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionRead) - })) - s.Run("GetTailnetAgents", s.Subtest(func(_ database.Store, check *expects) { - check.Args(uuid.New()). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionRead) - })) - s.Run("GetTailnetClientsForAgent", s.Subtest(func(_ database.Store, check *expects) { - check.Args(uuid.New()). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionRead) - })) s.Run("GetTailnetPeers", s.Subtest(func(_ database.Store, check *expects) { check.Args(uuid.New()). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionRead) @@ -2810,21 +2778,6 @@ func (s *MethodTestSuite) TestTailnetFunctions() { check.Args(). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionRead) })) - s.Run("UpsertTailnetAgent", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - check.Args(database.UpsertTailnetAgentParams{Node: json.RawMessage("{}")}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionUpdate) - })) - s.Run("UpsertTailnetClient", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - check.Args(database.UpsertTailnetClientParams{Node: json.RawMessage("{}")}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionUpdate) - })) - s.Run("UpsertTailnetClientSubscription", s.Subtest(func(db database.Store, check *expects) { - dbtestutil.DisableForeignKeysAndTriggers(s.T(), db) - check.Args(database.UpsertTailnetClientSubscriptionParams{}). - Asserts(rbac.ResourceTailnetCoordinator, policy.ActionUpdate) - })) s.Run("UpsertTailnetCoordinator", s.Subtest(func(_ database.Store, check *expects) { check.Args(uuid.New()). Asserts(rbac.ResourceTailnetCoordinator, policy.ActionUpdate) diff --git a/coderd/database/dbmetrics/querymetrics.go b/coderd/database/dbmetrics/querymetrics.go index 1682f6f2a5..65e0b38a28 100644 --- a/coderd/database/dbmetrics/querymetrics.go +++ b/coderd/database/dbmetrics/querymetrics.go @@ -311,14 +311,6 @@ func (m queryMetricsStore) DeleteAPIKeysByUserID(ctx context.Context, userID uui return r0 } -func (m queryMetricsStore) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error { - start := time.Now() - r0 := m.s.DeleteAllTailnetClientSubscriptions(ctx, arg) - m.queryLatencies.WithLabelValues("DeleteAllTailnetClientSubscriptions").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteAllTailnetClientSubscriptions").Inc() - return r0 -} - func (m queryMetricsStore) DeleteAllTailnetTunnels(ctx context.Context, arg database.DeleteAllTailnetTunnelsParams) error { start := time.Now() r0 := m.s.DeleteAllTailnetTunnels(ctx, arg) @@ -343,14 +335,6 @@ func (m queryMetricsStore) DeleteApplicationConnectAPIKeysByUserID(ctx context.C return r0 } -func (m queryMetricsStore) DeleteCoordinator(ctx context.Context, id uuid.UUID) error { - start := time.Now() - r0 := m.s.DeleteCoordinator(ctx, id) - m.queryLatencies.WithLabelValues("DeleteCoordinator").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteCoordinator").Inc() - return r0 -} - func (m queryMetricsStore) DeleteCryptoKey(ctx context.Context, arg database.DeleteCryptoKeyParams) (database.CryptoKey, error) { start := time.Now() r0, r1 := m.s.DeleteCryptoKey(ctx, arg) @@ -567,30 +551,6 @@ func (m queryMetricsStore) DeleteRuntimeConfig(ctx context.Context, key string) return r0 } -func (m queryMetricsStore) DeleteTailnetAgent(ctx context.Context, arg database.DeleteTailnetAgentParams) (database.DeleteTailnetAgentRow, error) { - start := time.Now() - r0, r1 := m.s.DeleteTailnetAgent(ctx, arg) - m.queryLatencies.WithLabelValues("DeleteTailnetAgent").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteTailnetAgent").Inc() - return r0, r1 -} - -func (m queryMetricsStore) DeleteTailnetClient(ctx context.Context, arg database.DeleteTailnetClientParams) (database.DeleteTailnetClientRow, error) { - start := time.Now() - r0, r1 := m.s.DeleteTailnetClient(ctx, arg) - m.queryLatencies.WithLabelValues("DeleteTailnetClient").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteTailnetClient").Inc() - return r0, r1 -} - -func (m queryMetricsStore) DeleteTailnetClientSubscription(ctx context.Context, arg database.DeleteTailnetClientSubscriptionParams) error { - start := time.Now() - r0 := m.s.DeleteTailnetClientSubscription(ctx, arg) - m.queryLatencies.WithLabelValues("DeleteTailnetClientSubscription").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "DeleteTailnetClientSubscription").Inc() - return r0 -} - func (m queryMetricsStore) DeleteTailnetPeer(ctx context.Context, arg database.DeleteTailnetPeerParams) (database.DeleteTailnetPeerRow, error) { start := time.Now() r0, r1 := m.s.DeleteTailnetPeer(ctx, arg) @@ -862,14 +822,6 @@ func (m queryMetricsStore) GetActiveWorkspaceBuildsByTemplateID(ctx context.Cont return r0, r1 } -func (m queryMetricsStore) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAgent, error) { - start := time.Now() - r0, r1 := m.s.GetAllTailnetAgents(ctx) - m.queryLatencies.WithLabelValues("GetAllTailnetAgents").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "GetAllTailnetAgents").Inc() - return r0, r1 -} - func (m queryMetricsStore) GetAllTailnetCoordinators(ctx context.Context) ([]database.TailnetCoordinator, error) { start := time.Now() r0, r1 := m.s.GetAllTailnetCoordinators(ctx) @@ -1758,22 +1710,6 @@ func (m queryMetricsStore) GetRuntimeConfig(ctx context.Context, key string) (st return r0, r1 } -func (m queryMetricsStore) GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]database.TailnetAgent, error) { - start := time.Now() - r0, r1 := m.s.GetTailnetAgents(ctx, id) - m.queryLatencies.WithLabelValues("GetTailnetAgents").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "GetTailnetAgents").Inc() - return r0, r1 -} - -func (m queryMetricsStore) GetTailnetClientsForAgent(ctx context.Context, agentID uuid.UUID) ([]database.TailnetClient, error) { - start := time.Now() - r0, r1 := m.s.GetTailnetClientsForAgent(ctx, agentID) - m.queryLatencies.WithLabelValues("GetTailnetClientsForAgent").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "GetTailnetClientsForAgent").Inc() - return r0, r1 -} - func (m queryMetricsStore) GetTailnetPeers(ctx context.Context, id uuid.UUID) ([]database.TailnetPeer, error) { start := time.Now() r0, r1 := m.s.GetTailnetPeers(ctx, id) @@ -4229,30 +4165,6 @@ func (m queryMetricsStore) UpsertRuntimeConfig(ctx context.Context, arg database return r0 } -func (m queryMetricsStore) UpsertTailnetAgent(ctx context.Context, arg database.UpsertTailnetAgentParams) (database.TailnetAgent, error) { - start := time.Now() - r0, r1 := m.s.UpsertTailnetAgent(ctx, arg) - m.queryLatencies.WithLabelValues("UpsertTailnetAgent").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "UpsertTailnetAgent").Inc() - return r0, r1 -} - -func (m queryMetricsStore) UpsertTailnetClient(ctx context.Context, arg database.UpsertTailnetClientParams) (database.TailnetClient, error) { - start := time.Now() - r0, r1 := m.s.UpsertTailnetClient(ctx, arg) - m.queryLatencies.WithLabelValues("UpsertTailnetClient").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "UpsertTailnetClient").Inc() - return r0, r1 -} - -func (m queryMetricsStore) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error { - start := time.Now() - r0 := m.s.UpsertTailnetClientSubscription(ctx, arg) - m.queryLatencies.WithLabelValues("UpsertTailnetClientSubscription").Observe(time.Since(start).Seconds()) - m.queryCounts.WithLabelValues(httpmw.ExtractHTTPRoute(ctx), httpmw.ExtractHTTPMethod(ctx), "UpsertTailnetClientSubscription").Inc() - return r0 -} - func (m queryMetricsStore) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) { start := time.Now() r0, r1 := m.s.UpsertTailnetCoordinator(ctx, id) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index fe057ea74d..cf989e216f 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -469,20 +469,6 @@ func (mr *MockStoreMockRecorder) DeleteAPIKeysByUserID(ctx, userID any) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAPIKeysByUserID", reflect.TypeOf((*MockStore)(nil).DeleteAPIKeysByUserID), ctx, userID) } -// DeleteAllTailnetClientSubscriptions mocks base method. -func (m *MockStore) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteAllTailnetClientSubscriptions", ctx, arg) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteAllTailnetClientSubscriptions indicates an expected call of DeleteAllTailnetClientSubscriptions. -func (mr *MockStoreMockRecorder) DeleteAllTailnetClientSubscriptions(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllTailnetClientSubscriptions", reflect.TypeOf((*MockStore)(nil).DeleteAllTailnetClientSubscriptions), ctx, arg) -} - // DeleteAllTailnetTunnels mocks base method. func (m *MockStore) DeleteAllTailnetTunnels(ctx context.Context, arg database.DeleteAllTailnetTunnelsParams) error { m.ctrl.T.Helper() @@ -525,20 +511,6 @@ func (mr *MockStoreMockRecorder) DeleteApplicationConnectAPIKeysByUserID(ctx, us return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteApplicationConnectAPIKeysByUserID", reflect.TypeOf((*MockStore)(nil).DeleteApplicationConnectAPIKeysByUserID), ctx, userID) } -// DeleteCoordinator mocks base method. -func (m *MockStore) DeleteCoordinator(ctx context.Context, id uuid.UUID) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteCoordinator", ctx, id) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteCoordinator indicates an expected call of DeleteCoordinator. -func (mr *MockStoreMockRecorder) DeleteCoordinator(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteCoordinator", reflect.TypeOf((*MockStore)(nil).DeleteCoordinator), ctx, id) -} - // DeleteCryptoKey mocks base method. func (m *MockStore) DeleteCryptoKey(ctx context.Context, arg database.DeleteCryptoKeyParams) (database.CryptoKey, error) { m.ctrl.T.Helper() @@ -924,50 +896,6 @@ func (mr *MockStoreMockRecorder) DeleteRuntimeConfig(ctx, key any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteRuntimeConfig", reflect.TypeOf((*MockStore)(nil).DeleteRuntimeConfig), ctx, key) } -// DeleteTailnetAgent mocks base method. -func (m *MockStore) DeleteTailnetAgent(ctx context.Context, arg database.DeleteTailnetAgentParams) (database.DeleteTailnetAgentRow, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteTailnetAgent", ctx, arg) - ret0, _ := ret[0].(database.DeleteTailnetAgentRow) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteTailnetAgent indicates an expected call of DeleteTailnetAgent. -func (mr *MockStoreMockRecorder) DeleteTailnetAgent(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTailnetAgent", reflect.TypeOf((*MockStore)(nil).DeleteTailnetAgent), ctx, arg) -} - -// DeleteTailnetClient mocks base method. -func (m *MockStore) DeleteTailnetClient(ctx context.Context, arg database.DeleteTailnetClientParams) (database.DeleteTailnetClientRow, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteTailnetClient", ctx, arg) - ret0, _ := ret[0].(database.DeleteTailnetClientRow) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// DeleteTailnetClient indicates an expected call of DeleteTailnetClient. -func (mr *MockStoreMockRecorder) DeleteTailnetClient(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTailnetClient", reflect.TypeOf((*MockStore)(nil).DeleteTailnetClient), ctx, arg) -} - -// DeleteTailnetClientSubscription mocks base method. -func (m *MockStore) DeleteTailnetClientSubscription(ctx context.Context, arg database.DeleteTailnetClientSubscriptionParams) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "DeleteTailnetClientSubscription", ctx, arg) - ret0, _ := ret[0].(error) - return ret0 -} - -// DeleteTailnetClientSubscription indicates an expected call of DeleteTailnetClientSubscription. -func (mr *MockStoreMockRecorder) DeleteTailnetClientSubscription(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTailnetClientSubscription", reflect.TypeOf((*MockStore)(nil).DeleteTailnetClientSubscription), ctx, arg) -} - // DeleteTailnetPeer mocks base method. func (m *MockStore) DeleteTailnetPeer(ctx context.Context, arg database.DeleteTailnetPeerParams) (database.DeleteTailnetPeerRow, error) { m.ctrl.T.Helper() @@ -1466,21 +1394,6 @@ func (mr *MockStoreMockRecorder) GetActiveWorkspaceBuildsByTemplateID(ctx, templ return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetActiveWorkspaceBuildsByTemplateID", reflect.TypeOf((*MockStore)(nil).GetActiveWorkspaceBuildsByTemplateID), ctx, templateID) } -// GetAllTailnetAgents mocks base method. -func (m *MockStore) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAgent, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetAllTailnetAgents", ctx) - ret0, _ := ret[0].([]database.TailnetAgent) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetAllTailnetAgents indicates an expected call of GetAllTailnetAgents. -func (mr *MockStoreMockRecorder) GetAllTailnetAgents(ctx any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetAllTailnetAgents", reflect.TypeOf((*MockStore)(nil).GetAllTailnetAgents), ctx) -} - // GetAllTailnetCoordinators mocks base method. func (m *MockStore) GetAllTailnetCoordinators(ctx context.Context) ([]database.TailnetCoordinator, error) { m.ctrl.T.Helper() @@ -3251,36 +3164,6 @@ func (mr *MockStoreMockRecorder) GetRuntimeConfig(ctx, key any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetRuntimeConfig", reflect.TypeOf((*MockStore)(nil).GetRuntimeConfig), ctx, key) } -// GetTailnetAgents mocks base method. -func (m *MockStore) GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]database.TailnetAgent, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetTailnetAgents", ctx, id) - ret0, _ := ret[0].([]database.TailnetAgent) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTailnetAgents indicates an expected call of GetTailnetAgents. -func (mr *MockStoreMockRecorder) GetTailnetAgents(ctx, id any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTailnetAgents", reflect.TypeOf((*MockStore)(nil).GetTailnetAgents), ctx, id) -} - -// GetTailnetClientsForAgent mocks base method. -func (m *MockStore) GetTailnetClientsForAgent(ctx context.Context, agentID uuid.UUID) ([]database.TailnetClient, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "GetTailnetClientsForAgent", ctx, agentID) - ret0, _ := ret[0].([]database.TailnetClient) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// GetTailnetClientsForAgent indicates an expected call of GetTailnetClientsForAgent. -func (mr *MockStoreMockRecorder) GetTailnetClientsForAgent(ctx, agentID any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTailnetClientsForAgent", reflect.TypeOf((*MockStore)(nil).GetTailnetClientsForAgent), ctx, agentID) -} - // GetTailnetPeers mocks base method. func (m *MockStore) GetTailnetPeers(ctx context.Context, id uuid.UUID) ([]database.TailnetPeer, error) { m.ctrl.T.Helper() @@ -7889,50 +7772,6 @@ func (mr *MockStoreMockRecorder) UpsertRuntimeConfig(ctx, arg any) *gomock.Call return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertRuntimeConfig", reflect.TypeOf((*MockStore)(nil).UpsertRuntimeConfig), ctx, arg) } -// UpsertTailnetAgent mocks base method. -func (m *MockStore) UpsertTailnetAgent(ctx context.Context, arg database.UpsertTailnetAgentParams) (database.TailnetAgent, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpsertTailnetAgent", ctx, arg) - ret0, _ := ret[0].(database.TailnetAgent) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpsertTailnetAgent indicates an expected call of UpsertTailnetAgent. -func (mr *MockStoreMockRecorder) UpsertTailnetAgent(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertTailnetAgent", reflect.TypeOf((*MockStore)(nil).UpsertTailnetAgent), ctx, arg) -} - -// UpsertTailnetClient mocks base method. -func (m *MockStore) UpsertTailnetClient(ctx context.Context, arg database.UpsertTailnetClientParams) (database.TailnetClient, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpsertTailnetClient", ctx, arg) - ret0, _ := ret[0].(database.TailnetClient) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// UpsertTailnetClient indicates an expected call of UpsertTailnetClient. -func (mr *MockStoreMockRecorder) UpsertTailnetClient(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertTailnetClient", reflect.TypeOf((*MockStore)(nil).UpsertTailnetClient), ctx, arg) -} - -// UpsertTailnetClientSubscription mocks base method. -func (m *MockStore) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "UpsertTailnetClientSubscription", ctx, arg) - ret0, _ := ret[0].(error) - return ret0 -} - -// UpsertTailnetClientSubscription indicates an expected call of UpsertTailnetClientSubscription. -func (mr *MockStoreMockRecorder) UpsertTailnetClientSubscription(ctx, arg any) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UpsertTailnetClientSubscription", reflect.TypeOf((*MockStore)(nil).UpsertTailnetClientSubscription), ctx, arg) -} - // UpsertTailnetCoordinator mocks base method. func (m *MockStore) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) { m.ctrl.T.Helper() diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 6cd3eb56bf..0a1c494f35 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -971,80 +971,6 @@ BEGIN END; $$; -CREATE FUNCTION tailnet_notify_agent_change() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF (OLD IS NOT NULL) THEN - PERFORM pg_notify('tailnet_agent_update', OLD.id::text); - RETURN NULL; - END IF; - IF (NEW IS NOT NULL) THEN - PERFORM pg_notify('tailnet_agent_update', NEW.id::text); - RETURN NULL; - END IF; -END; -$$; - -CREATE FUNCTION tailnet_notify_client_change() RETURNS trigger - LANGUAGE plpgsql - AS $$ -DECLARE - var_client_id uuid; - var_coordinator_id uuid; - var_agent_ids uuid[]; - var_agent_id uuid; -BEGIN - IF (NEW.id IS NOT NULL) THEN - var_client_id = NEW.id; - var_coordinator_id = NEW.coordinator_id; - ELSIF (OLD.id IS NOT NULL) THEN - var_client_id = OLD.id; - var_coordinator_id = OLD.coordinator_id; - END IF; - - -- Read all agents the client is subscribed to, so we can notify them. - SELECT - array_agg(agent_id) - INTO - var_agent_ids - FROM - tailnet_client_subscriptions subs - WHERE - subs.client_id = NEW.id AND - subs.coordinator_id = NEW.coordinator_id; - - -- No agents to notify - if (var_agent_ids IS NULL) THEN - return NULL; - END IF; - - -- pg_notify is limited to 8k bytes, which is approximately 221 UUIDs. - -- Instead of sending all agent ids in a single update, send one for each - -- agent id to prevent overflow. - FOREACH var_agent_id IN ARRAY var_agent_ids - LOOP - PERFORM pg_notify('tailnet_client_update', var_client_id || ',' || var_agent_id); - END LOOP; - - return NULL; -END; -$$; - -CREATE FUNCTION tailnet_notify_client_subscription_change() RETURNS trigger - LANGUAGE plpgsql - AS $$ -BEGIN - IF (NEW IS NOT NULL) THEN - PERFORM pg_notify('tailnet_client_update', NEW.client_id || ',' || NEW.agent_id); - RETURN NULL; - ELSIF (OLD IS NOT NULL) THEN - PERFORM pg_notify('tailnet_client_update', OLD.client_id || ',' || OLD.agent_id); - RETURN NULL; - END IF; -END; -$$; - CREATE FUNCTION tailnet_notify_coordinator_heartbeat() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -1806,27 +1732,6 @@ CREATE TABLE site_configs ( value text NOT NULL ); -CREATE TABLE tailnet_agents ( - id uuid NOT NULL, - coordinator_id uuid NOT NULL, - updated_at timestamp with time zone NOT NULL, - node jsonb NOT NULL -); - -CREATE TABLE tailnet_client_subscriptions ( - client_id uuid NOT NULL, - coordinator_id uuid NOT NULL, - agent_id uuid NOT NULL, - updated_at timestamp with time zone NOT NULL -); - -CREATE TABLE tailnet_clients ( - id uuid NOT NULL, - coordinator_id uuid NOT NULL, - updated_at timestamp with time zone NOT NULL, - node jsonb NOT NULL -); - CREATE TABLE tailnet_coordinators ( id uuid NOT NULL, heartbeat_at timestamp with time zone NOT NULL @@ -3156,15 +3061,6 @@ ALTER TABLE ONLY provisioner_keys ALTER TABLE ONLY site_configs ADD CONSTRAINT site_configs_key_key UNIQUE (key); -ALTER TABLE ONLY tailnet_agents - ADD CONSTRAINT tailnet_agents_pkey PRIMARY KEY (id, coordinator_id); - -ALTER TABLE ONLY tailnet_client_subscriptions - ADD CONSTRAINT tailnet_client_subscriptions_pkey PRIMARY KEY (client_id, coordinator_id, agent_id); - -ALTER TABLE ONLY tailnet_clients - ADD CONSTRAINT tailnet_clients_pkey PRIMARY KEY (id, coordinator_id); - ALTER TABLE ONLY tailnet_coordinators ADD CONSTRAINT tailnet_coordinators_pkey PRIMARY KEY (id); @@ -3404,10 +3300,6 @@ COMMENT ON INDEX idx_provisioner_daemons_org_name_owner_key IS 'Allow unique pro CREATE INDEX idx_provisioner_jobs_status ON provisioner_jobs USING btree (job_status); -CREATE INDEX idx_tailnet_agents_coordinator ON tailnet_agents USING btree (coordinator_id); - -CREATE INDEX idx_tailnet_clients_coordinator ON tailnet_clients USING btree (coordinator_id); - CREATE INDEX idx_tailnet_peers_coordinator ON tailnet_peers USING btree (coordinator_id); CREATE INDEX idx_tailnet_tunnels_dst_id ON tailnet_tunnels USING hash (dst_id); @@ -3582,12 +3474,6 @@ CREATE TRIGGER remove_organization_member_custom_role BEFORE DELETE ON custom_ro COMMENT ON TRIGGER remove_organization_member_custom_role ON custom_roles IS 'When a custom_role is deleted, this trigger removes the role from all organization members.'; -CREATE TRIGGER tailnet_notify_agent_change AFTER INSERT OR DELETE OR UPDATE ON tailnet_agents FOR EACH ROW EXECUTE FUNCTION tailnet_notify_agent_change(); - -CREATE TRIGGER tailnet_notify_client_change AFTER INSERT OR DELETE OR UPDATE ON tailnet_clients FOR EACH ROW EXECUTE FUNCTION tailnet_notify_client_change(); - -CREATE TRIGGER tailnet_notify_client_subscription_change AFTER INSERT OR DELETE OR UPDATE ON tailnet_client_subscriptions FOR EACH ROW EXECUTE FUNCTION tailnet_notify_client_subscription_change(); - CREATE TRIGGER tailnet_notify_coordinator_heartbeat AFTER INSERT OR UPDATE ON tailnet_coordinators FOR EACH ROW EXECUTE FUNCTION tailnet_notify_coordinator_heartbeat(); CREATE TRIGGER tailnet_notify_peer_change AFTER INSERT OR DELETE OR UPDATE ON tailnet_peers FOR EACH ROW EXECUTE FUNCTION tailnet_notify_peer_change(); @@ -3725,15 +3611,6 @@ ALTER TABLE ONLY provisioner_jobs ALTER TABLE ONLY provisioner_keys ADD CONSTRAINT provisioner_keys_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; -ALTER TABLE ONLY tailnet_agents - ADD CONSTRAINT tailnet_agents_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; - -ALTER TABLE ONLY tailnet_client_subscriptions - ADD CONSTRAINT tailnet_client_subscriptions_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; - -ALTER TABLE ONLY tailnet_clients - ADD CONSTRAINT tailnet_clients_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; - ALTER TABLE ONLY tailnet_peers ADD CONSTRAINT tailnet_peers_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; diff --git a/coderd/database/foreign_key_constraint.go b/coderd/database/foreign_key_constraint.go index ac2c87fc95..2d5f65e209 100644 --- a/coderd/database/foreign_key_constraint.go +++ b/coderd/database/foreign_key_constraint.go @@ -41,9 +41,6 @@ const ( ForeignKeyProvisionerJobTimingsJobID ForeignKeyConstraint = "provisioner_job_timings_job_id_fkey" // ALTER TABLE ONLY provisioner_job_timings ADD CONSTRAINT provisioner_job_timings_job_id_fkey FOREIGN KEY (job_id) REFERENCES provisioner_jobs(id) ON DELETE CASCADE; ForeignKeyProvisionerJobsOrganizationID ForeignKeyConstraint = "provisioner_jobs_organization_id_fkey" // ALTER TABLE ONLY provisioner_jobs ADD CONSTRAINT provisioner_jobs_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; ForeignKeyProvisionerKeysOrganizationID ForeignKeyConstraint = "provisioner_keys_organization_id_fkey" // ALTER TABLE ONLY provisioner_keys ADD CONSTRAINT provisioner_keys_organization_id_fkey FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE; - ForeignKeyTailnetAgentsCoordinatorID ForeignKeyConstraint = "tailnet_agents_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_agents ADD CONSTRAINT tailnet_agents_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; - ForeignKeyTailnetClientSubscriptionsCoordinatorID ForeignKeyConstraint = "tailnet_client_subscriptions_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_client_subscriptions ADD CONSTRAINT tailnet_client_subscriptions_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; - ForeignKeyTailnetClientsCoordinatorID ForeignKeyConstraint = "tailnet_clients_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_clients ADD CONSTRAINT tailnet_clients_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; ForeignKeyTailnetPeersCoordinatorID ForeignKeyConstraint = "tailnet_peers_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_peers ADD CONSTRAINT tailnet_peers_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; ForeignKeyTailnetTunnelsCoordinatorID ForeignKeyConstraint = "tailnet_tunnels_coordinator_id_fkey" // ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_coordinator_id_fkey FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators(id) ON DELETE CASCADE; ForeignKeyTaskSnapshotsTaskID ForeignKeyConstraint = "task_snapshots_task_id_fkey" // ALTER TABLE ONLY task_snapshots ADD CONSTRAINT task_snapshots_task_id_fkey FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE; diff --git a/coderd/database/migrations/000410_remove_tailnet_v1_tables.down.sql b/coderd/database/migrations/000410_remove_tailnet_v1_tables.down.sql new file mode 100644 index 0000000000..e48c63bb7d --- /dev/null +++ b/coderd/database/migrations/000410_remove_tailnet_v1_tables.down.sql @@ -0,0 +1,124 @@ +-- Restore tailnet v1 API tables (unused, but required for rollback). + +-- Create tables. +CREATE TABLE tailnet_clients ( + id uuid NOT NULL, + coordinator_id uuid NOT NULL, + updated_at timestamp with time zone NOT NULL, + node jsonb NOT NULL, + PRIMARY KEY (id, coordinator_id), + FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators (id) ON DELETE CASCADE +); + +CREATE TABLE tailnet_agents ( + id uuid NOT NULL, + coordinator_id uuid NOT NULL, + updated_at timestamp with time zone NOT NULL, + node jsonb NOT NULL, + PRIMARY KEY (id, coordinator_id), + FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators (id) ON DELETE CASCADE +); + +CREATE TABLE tailnet_client_subscriptions ( + client_id uuid NOT NULL, + coordinator_id uuid NOT NULL, + agent_id uuid NOT NULL, + updated_at timestamp with time zone NOT NULL, + PRIMARY KEY (client_id, coordinator_id, agent_id), + FOREIGN KEY (coordinator_id) REFERENCES tailnet_coordinators (id) ON DELETE CASCADE +); + +-- Create indexes. +CREATE INDEX idx_tailnet_agents_coordinator ON tailnet_agents USING btree (coordinator_id); +CREATE INDEX idx_tailnet_clients_coordinator ON tailnet_clients USING btree (coordinator_id); + +-- Create trigger functions. +CREATE FUNCTION tailnet_notify_agent_change() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF (OLD IS NOT NULL) THEN + PERFORM pg_notify('tailnet_agent_update', OLD.id::text); + RETURN NULL; + END IF; + IF (NEW IS NOT NULL) THEN + PERFORM pg_notify('tailnet_agent_update', NEW.id::text); + RETURN NULL; + END IF; +END; +$$; + +CREATE FUNCTION tailnet_notify_client_change() RETURNS trigger + LANGUAGE plpgsql + AS $$ +DECLARE + var_client_id uuid; + var_coordinator_id uuid; + var_agent_ids uuid[]; + var_agent_id uuid; +BEGIN + IF (NEW.id IS NOT NULL) THEN + var_client_id = NEW.id; + var_coordinator_id = NEW.coordinator_id; + ELSIF (OLD.id IS NOT NULL) THEN + var_client_id = OLD.id; + var_coordinator_id = OLD.coordinator_id; + END IF; + + -- Read all agents the client is subscribed to, so we can notify them. + SELECT + array_agg(agent_id) + INTO + var_agent_ids + FROM + tailnet_client_subscriptions subs + WHERE + subs.client_id = NEW.id AND + subs.coordinator_id = NEW.coordinator_id; + + -- No agents to notify + if (var_agent_ids IS NULL) THEN + return NULL; + END IF; + + -- pg_notify is limited to 8k bytes, which is approximately 221 UUIDs. + -- Instead of sending all agent ids in a single update, send one for each + -- agent id to prevent overflow. + FOREACH var_agent_id IN ARRAY var_agent_ids + LOOP + PERFORM pg_notify('tailnet_client_update', var_client_id || ',' || var_agent_id); + END LOOP; + + return NULL; +END; +$$; + +CREATE FUNCTION tailnet_notify_client_subscription_change() RETURNS trigger + LANGUAGE plpgsql + AS $$ +BEGIN + IF (NEW IS NOT NULL) THEN + PERFORM pg_notify('tailnet_client_update', NEW.client_id || ',' || NEW.agent_id); + RETURN NULL; + ELSIF (OLD IS NOT NULL) THEN + PERFORM pg_notify('tailnet_client_update', OLD.client_id || ',' || OLD.agent_id); + RETURN NULL; + END IF; +END; +$$; + +-- Create triggers. +CREATE TRIGGER tailnet_notify_agent_change + AFTER INSERT OR DELETE OR UPDATE ON tailnet_agents + FOR EACH ROW + EXECUTE FUNCTION tailnet_notify_agent_change(); + +CREATE TRIGGER tailnet_notify_client_change + AFTER INSERT OR DELETE OR UPDATE ON tailnet_clients + FOR EACH ROW + EXECUTE FUNCTION tailnet_notify_client_change(); + +CREATE TRIGGER tailnet_notify_client_subscription_change + AFTER INSERT OR DELETE OR UPDATE ON tailnet_client_subscriptions + FOR EACH ROW + EXECUTE FUNCTION tailnet_notify_client_subscription_change(); diff --git a/coderd/database/migrations/000410_remove_tailnet_v1_tables.up.sql b/coderd/database/migrations/000410_remove_tailnet_v1_tables.up.sql new file mode 100644 index 0000000000..f2af2d3a42 --- /dev/null +++ b/coderd/database/migrations/000410_remove_tailnet_v1_tables.up.sql @@ -0,0 +1,20 @@ +-- Remove unused tailnet v1 API tables. +-- These tables were superseded by tailnet_peers and tailnet_tunnels in migration +-- 000168. The v1 API code was removed in commit d6154c4310 ("remove tailnet v1 +-- API support"), but the tables and queries were never cleaned up. + +-- Drop triggers first (they reference the functions). +DROP TRIGGER IF EXISTS tailnet_notify_agent_change ON tailnet_agents; +DROP TRIGGER IF EXISTS tailnet_notify_client_change ON tailnet_clients; +DROP TRIGGER IF EXISTS tailnet_notify_client_subscription_change ON tailnet_client_subscriptions; + +-- Drop the trigger functions. +DROP FUNCTION IF EXISTS tailnet_notify_agent_change(); +DROP FUNCTION IF EXISTS tailnet_notify_client_change(); +DROP FUNCTION IF EXISTS tailnet_notify_client_subscription_change(); + +-- Drop the tables. Foreign keys and indexes are dropped automatically via CASCADE. +-- Order matters due to potential foreign key relationships. +DROP TABLE IF EXISTS tailnet_client_subscriptions; +DROP TABLE IF EXISTS tailnet_agents; +DROP TABLE IF EXISTS tailnet_clients; diff --git a/coderd/database/models.go b/coderd/database/models.go index dc56bcebeb..6f94bbea49 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -4178,27 +4178,6 @@ type SiteConfig struct { Value string `db:"value" json:"value"` } -type TailnetAgent struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Node json.RawMessage `db:"node" json:"node"` -} - -type TailnetClient struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` - Node json.RawMessage `db:"node" json:"node"` -} - -type TailnetClientSubscription struct { - ClientID uuid.UUID `db:"client_id" json:"client_id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - AgentID uuid.UUID `db:"agent_id" json:"agent_id"` - UpdatedAt time.Time `db:"updated_at" json:"updated_at"` -} - // We keep this separate from replicas in case we need to break the coordinator out into its own service type TailnetCoordinator struct { ID uuid.UUID `db:"id" json:"id"` diff --git a/coderd/database/querier.go b/coderd/database/querier.go index de31cd410a..79088d846d 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -81,7 +81,6 @@ type sqlcQuerier interface { CustomRoles(ctx context.Context, arg CustomRolesParams) ([]CustomRole, error) DeleteAPIKeyByID(ctx context.Context, id string) error DeleteAPIKeysByUserID(ctx context.Context, userID uuid.UUID) error - DeleteAllTailnetClientSubscriptions(ctx context.Context, arg DeleteAllTailnetClientSubscriptionsParams) error DeleteAllTailnetTunnels(ctx context.Context, arg DeleteAllTailnetTunnelsParams) error // Deletes all existing webpush subscriptions. // This should be called when the VAPID keypair is regenerated, as the old @@ -89,7 +88,6 @@ type sqlcQuerier interface { // be recreated. DeleteAllWebpushSubscriptions(ctx context.Context) error DeleteApplicationConnectAPIKeysByUserID(ctx context.Context, userID uuid.UUID) error - DeleteCoordinator(ctx context.Context, id uuid.UUID) error DeleteCryptoKey(ctx context.Context, arg DeleteCryptoKeyParams) (CryptoKey, error) DeleteCustomRole(ctx context.Context, arg DeleteCustomRoleParams) error DeleteExpiredAPIKeys(ctx context.Context, arg DeleteExpiredAPIKeysParams) (int64, error) @@ -130,9 +128,6 @@ type sqlcQuerier interface { DeleteProvisionerKey(ctx context.Context, id uuid.UUID) error DeleteReplicasUpdatedBefore(ctx context.Context, updatedAt time.Time) error DeleteRuntimeConfig(ctx context.Context, key string) error - DeleteTailnetAgent(ctx context.Context, arg DeleteTailnetAgentParams) (DeleteTailnetAgentRow, error) - DeleteTailnetClient(ctx context.Context, arg DeleteTailnetClientParams) (DeleteTailnetClientRow, error) - DeleteTailnetClientSubscription(ctx context.Context, arg DeleteTailnetClientSubscriptionParams) error DeleteTailnetPeer(ctx context.Context, arg DeleteTailnetPeerParams) (DeleteTailnetPeerRow, error) DeleteTailnetTunnel(ctx context.Context, arg DeleteTailnetTunnelParams) (DeleteTailnetTunnelRow, error) DeleteTask(ctx context.Context, arg DeleteTaskParams) (TaskTable, error) @@ -180,7 +175,6 @@ type sqlcQuerier interface { GetActivePresetPrebuildSchedules(ctx context.Context) ([]TemplateVersionPresetPrebuildSchedule, error) GetActiveUserCount(ctx context.Context, includeSystem bool) (int64, error) GetActiveWorkspaceBuildsByTemplateID(ctx context.Context, templateID uuid.UUID) ([]WorkspaceBuild, error) - GetAllTailnetAgents(ctx context.Context) ([]TailnetAgent, error) // For PG Coordinator HTMLDebug GetAllTailnetCoordinators(ctx context.Context) ([]TailnetCoordinator, error) GetAllTailnetPeers(ctx context.Context) ([]TailnetPeer, error) @@ -353,8 +347,6 @@ type sqlcQuerier interface { GetReplicasUpdatedAfter(ctx context.Context, updatedAt time.Time) ([]Replica, error) GetRunningPrebuiltWorkspaces(ctx context.Context) ([]GetRunningPrebuiltWorkspacesRow, error) GetRuntimeConfig(ctx context.Context, key string) (string, error) - GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]TailnetAgent, error) - GetTailnetClientsForAgent(ctx context.Context, agentID uuid.UUID) ([]TailnetClient, error) GetTailnetPeers(ctx context.Context, id uuid.UUID) ([]TailnetPeer, error) GetTailnetTunnelPeerBindings(ctx context.Context, srcID uuid.UUID) ([]GetTailnetTunnelPeerBindingsRow, error) GetTailnetTunnelPeerIDs(ctx context.Context, srcID uuid.UUID) ([]GetTailnetTunnelPeerIDsRow, error) @@ -777,9 +769,6 @@ type sqlcQuerier interface { UpsertPrebuildsSettings(ctx context.Context, value string) error UpsertProvisionerDaemon(ctx context.Context, arg UpsertProvisionerDaemonParams) (ProvisionerDaemon, error) UpsertRuntimeConfig(ctx context.Context, arg UpsertRuntimeConfigParams) error - UpsertTailnetAgent(ctx context.Context, arg UpsertTailnetAgentParams) (TailnetAgent, error) - UpsertTailnetClient(ctx context.Context, arg UpsertTailnetClientParams) (TailnetClient, error) - UpsertTailnetClientSubscription(ctx context.Context, arg UpsertTailnetClientSubscriptionParams) error UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (TailnetCoordinator, error) UpsertTailnetPeer(ctx context.Context, arg UpsertTailnetPeerParams) (TailnetPeer, error) UpsertTailnetTunnel(ctx context.Context, arg UpsertTailnetTunnelParams) (TailnetTunnel, error) diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 864cd971b4..7d84db116c 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -12634,22 +12634,6 @@ func (q *sqlQuerier) CleanTailnetTunnels(ctx context.Context) error { return err } -const deleteAllTailnetClientSubscriptions = `-- name: DeleteAllTailnetClientSubscriptions :exec -DELETE -FROM tailnet_client_subscriptions -WHERE client_id = $1 and coordinator_id = $2 -` - -type DeleteAllTailnetClientSubscriptionsParams struct { - ClientID uuid.UUID `db:"client_id" json:"client_id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -func (q *sqlQuerier) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg DeleteAllTailnetClientSubscriptionsParams) error { - _, err := q.db.ExecContext(ctx, deleteAllTailnetClientSubscriptions, arg.ClientID, arg.CoordinatorID) - return err -} - const deleteAllTailnetTunnels = `-- name: DeleteAllTailnetTunnels :exec DELETE FROM tailnet_tunnels @@ -12666,82 +12650,6 @@ func (q *sqlQuerier) DeleteAllTailnetTunnels(ctx context.Context, arg DeleteAllT return err } -const deleteCoordinator = `-- name: DeleteCoordinator :exec -DELETE -FROM tailnet_coordinators -WHERE id = $1 -` - -func (q *sqlQuerier) DeleteCoordinator(ctx context.Context, id uuid.UUID) error { - _, err := q.db.ExecContext(ctx, deleteCoordinator, id) - return err -} - -const deleteTailnetAgent = `-- name: DeleteTailnetAgent :one -DELETE -FROM tailnet_agents -WHERE id = $1 and coordinator_id = $2 -RETURNING id, coordinator_id -` - -type DeleteTailnetAgentParams struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -type DeleteTailnetAgentRow struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -func (q *sqlQuerier) DeleteTailnetAgent(ctx context.Context, arg DeleteTailnetAgentParams) (DeleteTailnetAgentRow, error) { - row := q.db.QueryRowContext(ctx, deleteTailnetAgent, arg.ID, arg.CoordinatorID) - var i DeleteTailnetAgentRow - err := row.Scan(&i.ID, &i.CoordinatorID) - return i, err -} - -const deleteTailnetClient = `-- name: DeleteTailnetClient :one -DELETE -FROM tailnet_clients -WHERE id = $1 and coordinator_id = $2 -RETURNING id, coordinator_id -` - -type DeleteTailnetClientParams struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -type DeleteTailnetClientRow struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -func (q *sqlQuerier) DeleteTailnetClient(ctx context.Context, arg DeleteTailnetClientParams) (DeleteTailnetClientRow, error) { - row := q.db.QueryRowContext(ctx, deleteTailnetClient, arg.ID, arg.CoordinatorID) - var i DeleteTailnetClientRow - err := row.Scan(&i.ID, &i.CoordinatorID) - return i, err -} - -const deleteTailnetClientSubscription = `-- name: DeleteTailnetClientSubscription :exec -DELETE -FROM tailnet_client_subscriptions -WHERE client_id = $1 and agent_id = $2 and coordinator_id = $3 -` - -type DeleteTailnetClientSubscriptionParams struct { - ClientID uuid.UUID `db:"client_id" json:"client_id"` - AgentID uuid.UUID `db:"agent_id" json:"agent_id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` -} - -func (q *sqlQuerier) DeleteTailnetClientSubscription(ctx context.Context, arg DeleteTailnetClientSubscriptionParams) error { - _, err := q.db.ExecContext(ctx, deleteTailnetClientSubscription, arg.ClientID, arg.AgentID, arg.CoordinatorID) - return err -} - const deleteTailnetPeer = `-- name: DeleteTailnetPeer :one DELETE FROM tailnet_peers @@ -12792,39 +12700,6 @@ func (q *sqlQuerier) DeleteTailnetTunnel(ctx context.Context, arg DeleteTailnetT return i, err } -const getAllTailnetAgents = `-- name: GetAllTailnetAgents :many -SELECT id, coordinator_id, updated_at, node -FROM tailnet_agents -` - -func (q *sqlQuerier) GetAllTailnetAgents(ctx context.Context) ([]TailnetAgent, error) { - rows, err := q.db.QueryContext(ctx, getAllTailnetAgents) - if err != nil { - return nil, err - } - defer rows.Close() - var items []TailnetAgent - for rows.Next() { - var i TailnetAgent - if err := rows.Scan( - &i.ID, - &i.CoordinatorID, - &i.UpdatedAt, - &i.Node, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getAllTailnetCoordinators = `-- name: GetAllTailnetCoordinators :many SELECT id, heartbeat_at FROM tailnet_coordinators @@ -12919,78 +12794,6 @@ func (q *sqlQuerier) GetAllTailnetTunnels(ctx context.Context) ([]TailnetTunnel, return items, nil } -const getTailnetAgents = `-- name: GetTailnetAgents :many -SELECT id, coordinator_id, updated_at, node -FROM tailnet_agents -WHERE id = $1 -` - -func (q *sqlQuerier) GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]TailnetAgent, error) { - rows, err := q.db.QueryContext(ctx, getTailnetAgents, id) - if err != nil { - return nil, err - } - defer rows.Close() - var items []TailnetAgent - for rows.Next() { - var i TailnetAgent - if err := rows.Scan( - &i.ID, - &i.CoordinatorID, - &i.UpdatedAt, - &i.Node, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - -const getTailnetClientsForAgent = `-- name: GetTailnetClientsForAgent :many -SELECT id, coordinator_id, updated_at, node -FROM tailnet_clients -WHERE id IN ( - SELECT tailnet_client_subscriptions.client_id - FROM tailnet_client_subscriptions - WHERE tailnet_client_subscriptions.agent_id = $1 -) -` - -func (q *sqlQuerier) GetTailnetClientsForAgent(ctx context.Context, agentID uuid.UUID) ([]TailnetClient, error) { - rows, err := q.db.QueryContext(ctx, getTailnetClientsForAgent, agentID) - if err != nil { - return nil, err - } - defer rows.Close() - var items []TailnetClient - for rows.Next() { - var i TailnetClient - if err := rows.Scan( - &i.ID, - &i.CoordinatorID, - &i.UpdatedAt, - &i.Node, - ); err != nil { - return nil, err - } - items = append(items, i) - } - if err := rows.Close(); err != nil { - return nil, err - } - if err := rows.Err(); err != nil { - return nil, err - } - return items, nil -} - const getTailnetPeers = `-- name: GetTailnetPeers :many SELECT id, coordinator_id, updated_at, node, status FROM tailnet_peers WHERE id = $1 ` @@ -13133,109 +12936,6 @@ func (q *sqlQuerier) UpdateTailnetPeerStatusByCoordinator(ctx context.Context, a return err } -const upsertTailnetAgent = `-- name: UpsertTailnetAgent :one -INSERT INTO - tailnet_agents ( - id, - coordinator_id, - node, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (id, coordinator_id) -DO UPDATE SET - id = $1, - coordinator_id = $2, - node = $3, - updated_at = now() at time zone 'utc' -RETURNING id, coordinator_id, updated_at, node -` - -type UpsertTailnetAgentParams struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - Node json.RawMessage `db:"node" json:"node"` -} - -func (q *sqlQuerier) UpsertTailnetAgent(ctx context.Context, arg UpsertTailnetAgentParams) (TailnetAgent, error) { - row := q.db.QueryRowContext(ctx, upsertTailnetAgent, arg.ID, arg.CoordinatorID, arg.Node) - var i TailnetAgent - err := row.Scan( - &i.ID, - &i.CoordinatorID, - &i.UpdatedAt, - &i.Node, - ) - return i, err -} - -const upsertTailnetClient = `-- name: UpsertTailnetClient :one -INSERT INTO - tailnet_clients ( - id, - coordinator_id, - node, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (id, coordinator_id) -DO UPDATE SET - id = $1, - coordinator_id = $2, - node = $3, - updated_at = now() at time zone 'utc' -RETURNING id, coordinator_id, updated_at, node -` - -type UpsertTailnetClientParams struct { - ID uuid.UUID `db:"id" json:"id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - Node json.RawMessage `db:"node" json:"node"` -} - -func (q *sqlQuerier) UpsertTailnetClient(ctx context.Context, arg UpsertTailnetClientParams) (TailnetClient, error) { - row := q.db.QueryRowContext(ctx, upsertTailnetClient, arg.ID, arg.CoordinatorID, arg.Node) - var i TailnetClient - err := row.Scan( - &i.ID, - &i.CoordinatorID, - &i.UpdatedAt, - &i.Node, - ) - return i, err -} - -const upsertTailnetClientSubscription = `-- name: UpsertTailnetClientSubscription :exec -INSERT INTO - tailnet_client_subscriptions ( - client_id, - coordinator_id, - agent_id, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (client_id, coordinator_id, agent_id) -DO UPDATE SET - client_id = $1, - coordinator_id = $2, - agent_id = $3, - updated_at = now() at time zone 'utc' -` - -type UpsertTailnetClientSubscriptionParams struct { - ClientID uuid.UUID `db:"client_id" json:"client_id"` - CoordinatorID uuid.UUID `db:"coordinator_id" json:"coordinator_id"` - AgentID uuid.UUID `db:"agent_id" json:"agent_id"` -} - -func (q *sqlQuerier) UpsertTailnetClientSubscription(ctx context.Context, arg UpsertTailnetClientSubscriptionParams) error { - _, err := q.db.ExecContext(ctx, upsertTailnetClientSubscription, arg.ClientID, arg.CoordinatorID, arg.AgentID) - return err -} - const upsertTailnetCoordinator = `-- name: UpsertTailnetCoordinator :one INSERT INTO tailnet_coordinators ( diff --git a/coderd/database/queries/tailnet.sql b/coderd/database/queries/tailnet.sql index 614d718789..1843a2bdb2 100644 --- a/coderd/database/queries/tailnet.sql +++ b/coderd/database/queries/tailnet.sql @@ -1,102 +1,3 @@ --- name: UpsertTailnetClient :one -INSERT INTO - tailnet_clients ( - id, - coordinator_id, - node, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (id, coordinator_id) -DO UPDATE SET - id = $1, - coordinator_id = $2, - node = $3, - updated_at = now() at time zone 'utc' -RETURNING *; - --- name: UpsertTailnetClientSubscription :exec -INSERT INTO - tailnet_client_subscriptions ( - client_id, - coordinator_id, - agent_id, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (client_id, coordinator_id, agent_id) -DO UPDATE SET - client_id = $1, - coordinator_id = $2, - agent_id = $3, - updated_at = now() at time zone 'utc'; - --- name: UpsertTailnetAgent :one -INSERT INTO - tailnet_agents ( - id, - coordinator_id, - node, - updated_at -) -VALUES - ($1, $2, $3, now() at time zone 'utc') -ON CONFLICT (id, coordinator_id) -DO UPDATE SET - id = $1, - coordinator_id = $2, - node = $3, - updated_at = now() at time zone 'utc' -RETURNING *; - - --- name: DeleteTailnetClient :one -DELETE -FROM tailnet_clients -WHERE id = $1 and coordinator_id = $2 -RETURNING id, coordinator_id; - --- name: DeleteTailnetClientSubscription :exec -DELETE -FROM tailnet_client_subscriptions -WHERE client_id = $1 and agent_id = $2 and coordinator_id = $3; - --- name: DeleteAllTailnetClientSubscriptions :exec -DELETE -FROM tailnet_client_subscriptions -WHERE client_id = $1 and coordinator_id = $2; - --- name: DeleteTailnetAgent :one -DELETE -FROM tailnet_agents -WHERE id = $1 and coordinator_id = $2 -RETURNING id, coordinator_id; - --- name: DeleteCoordinator :exec -DELETE -FROM tailnet_coordinators -WHERE id = $1; - --- name: GetTailnetAgents :many -SELECT * -FROM tailnet_agents -WHERE id = $1; - --- name: GetAllTailnetAgents :many -SELECT * -FROM tailnet_agents; - --- name: GetTailnetClientsForAgent :many -SELECT * -FROM tailnet_clients -WHERE id IN ( - SELECT tailnet_client_subscriptions.client_id - FROM tailnet_client_subscriptions - WHERE tailnet_client_subscriptions.agent_id = $1 -); - -- name: UpsertTailnetCoordinator :one INSERT INTO tailnet_coordinators ( diff --git a/coderd/database/unique_constraint.go b/coderd/database/unique_constraint.go index dc2c3bd1dc..a7d15bf3c3 100644 --- a/coderd/database/unique_constraint.go +++ b/coderd/database/unique_constraint.go @@ -53,9 +53,6 @@ const ( UniqueProvisionerJobsPkey UniqueConstraint = "provisioner_jobs_pkey" // ALTER TABLE ONLY provisioner_jobs ADD CONSTRAINT provisioner_jobs_pkey PRIMARY KEY (id); UniqueProvisionerKeysPkey UniqueConstraint = "provisioner_keys_pkey" // ALTER TABLE ONLY provisioner_keys ADD CONSTRAINT provisioner_keys_pkey PRIMARY KEY (id); UniqueSiteConfigsKeyKey UniqueConstraint = "site_configs_key_key" // ALTER TABLE ONLY site_configs ADD CONSTRAINT site_configs_key_key UNIQUE (key); - UniqueTailnetAgentsPkey UniqueConstraint = "tailnet_agents_pkey" // ALTER TABLE ONLY tailnet_agents ADD CONSTRAINT tailnet_agents_pkey PRIMARY KEY (id, coordinator_id); - UniqueTailnetClientSubscriptionsPkey UniqueConstraint = "tailnet_client_subscriptions_pkey" // ALTER TABLE ONLY tailnet_client_subscriptions ADD CONSTRAINT tailnet_client_subscriptions_pkey PRIMARY KEY (client_id, coordinator_id, agent_id); - UniqueTailnetClientsPkey UniqueConstraint = "tailnet_clients_pkey" // ALTER TABLE ONLY tailnet_clients ADD CONSTRAINT tailnet_clients_pkey PRIMARY KEY (id, coordinator_id); UniqueTailnetCoordinatorsPkey UniqueConstraint = "tailnet_coordinators_pkey" // ALTER TABLE ONLY tailnet_coordinators ADD CONSTRAINT tailnet_coordinators_pkey PRIMARY KEY (id); UniqueTailnetPeersPkey UniqueConstraint = "tailnet_peers_pkey" // ALTER TABLE ONLY tailnet_peers ADD CONSTRAINT tailnet_peers_pkey PRIMARY KEY (id, coordinator_id); UniqueTailnetTunnelsPkey UniqueConstraint = "tailnet_tunnels_pkey" // ALTER TABLE ONLY tailnet_tunnels ADD CONSTRAINT tailnet_tunnels_pkey PRIMARY KEY (coordinator_id, src_id, dst_id);