From 06214eeed9b86f54c8deae0aa7437961e108c591 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Fri, 19 Jul 2024 18:37:34 +0000 Subject: [PATCH 1/8] generate db query --- coderd/database/dbauthz/dbauthz.go | 4 ++ coderd/database/dbauthz/dbauthz_test.go | 6 +++ coderd/database/dbmem/dbmem.go | 18 ++++++++ coderd/database/dbmetrics/dbmetrics.go | 7 +++ coderd/database/dbmock/dbmock.go | 15 +++++++ coderd/database/modelmethods.go | 4 +- coderd/database/querier.go | 1 + coderd/database/queries.sql.go | 43 +++++++++++++++++++ .../database/queries/provisionerdaemons.sql | 8 ++++ 9 files changed, 105 insertions(+), 1 deletion(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index 9f2de9088b5c5..b720b74331b4b 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -1627,6 +1627,10 @@ func (q *querier) GetProvisionerDaemons(ctx context.Context) ([]database.Provisi return fetchWithPostFilter(q.auth, policy.ActionRead, fetch)(ctx, nil) } +func (q *querier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) { + return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.GetProvisionerDaemonsByOrganization)(ctx, organizationID) +} + func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (database.ProvisionerJob, error) { job, err := q.db.GetProvisionerJobByID(ctx, id) if err != nil { diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index a7dc07367dd8f..920e2ae3b8cb1 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -1863,6 +1863,12 @@ func (s *MethodTestSuite) TestExtraMethods() { s.NoError(err, "insert provisioner daemon") check.Args().Asserts(d, policy.ActionRead) })) + s.Run("GetProvisionerDaemonsByOrganization", s.Subtest(func(db database.Store, check *expects) { + org := dbgen.Organization(s.T(), db, database.Organization{}) + d, err := db.GetProvisionerDaemonsByOrganization(context.Background(), org.ID) + s.NoError(err, "get provisioner daemon by org") + check.Args().Asserts(d, policy.ActionRead) + })) s.Run("DeleteOldProvisionerDaemons", s.Subtest(func(db database.Store, check *expects) { _, err := db.UpsertProvisionerDaemon(context.Background(), database.UpsertProvisionerDaemonParams{ Tags: database.StringMap(map[string]string{ diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 198b4b4f3b6a9..dbf5d13c721f6 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -3133,6 +3133,24 @@ func (q *FakeQuerier) GetProvisionerDaemons(_ context.Context) ([]database.Provi return out, nil } +func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) { + q.mutex.RLock() + defer q.mutex.RUnlock() + + daemons := make([]database.ProvisionerDaemon, 0) + for _, daemon := range q.provisionerDaemons { + if daemon.OrganizationID == organizationID { + // clone the Tags before appending, since maps are reference types and + // we don't want the caller to be able to mutate the map we have inside + // dbmem! + daemon.Tags = maps.Clone(daemon.Tags) + daemons = append(daemons, daemon) + } + } + + return daemons, nil +} + func (q *FakeQuerier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (database.ProvisionerJob, error) { q.mutex.RLock() defer q.mutex.RUnlock() diff --git a/coderd/database/dbmetrics/dbmetrics.go b/coderd/database/dbmetrics/dbmetrics.go index f249a78436153..312f8e0765d06 100644 --- a/coderd/database/dbmetrics/dbmetrics.go +++ b/coderd/database/dbmetrics/dbmetrics.go @@ -879,6 +879,13 @@ func (m metricsStore) GetProvisionerDaemons(ctx context.Context) ([]database.Pro return daemons, err } +func (m metricsStore) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) { + start := time.Now() + r0, r1 := m.s.GetProvisionerDaemonsByOrganization(ctx, organizationID) + m.queryLatencies.WithLabelValues("GetProvisionerDaemonsByOrganization").Observe(time.Since(start).Seconds()) + return r0, r1 +} + func (m metricsStore) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (database.ProvisionerJob, error) { start := time.Now() job, err := m.s.GetProvisionerJobByID(ctx, id) diff --git a/coderd/database/dbmock/dbmock.go b/coderd/database/dbmock/dbmock.go index 093869e655583..65802bc768eae 100644 --- a/coderd/database/dbmock/dbmock.go +++ b/coderd/database/dbmock/dbmock.go @@ -1765,6 +1765,21 @@ func (mr *MockStoreMockRecorder) GetProvisionerDaemons(arg0 any) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProvisionerDaemons", reflect.TypeOf((*MockStore)(nil).GetProvisionerDaemons), arg0) } +// GetProvisionerDaemonsByOrganization mocks base method. +func (m *MockStore) GetProvisionerDaemonsByOrganization(arg0 context.Context, arg1 uuid.UUID) ([]database.ProvisionerDaemon, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetProvisionerDaemonsByOrganization", arg0, arg1) + ret0, _ := ret[0].([]database.ProvisionerDaemon) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetProvisionerDaemonsByOrganization indicates an expected call of GetProvisionerDaemonsByOrganization. +func (mr *MockStoreMockRecorder) GetProvisionerDaemonsByOrganization(arg0, arg1 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProvisionerDaemonsByOrganization", reflect.TypeOf((*MockStore)(nil).GetProvisionerDaemonsByOrganization), arg0, arg1) +} + // GetProvisionerJobByID mocks base method. func (m *MockStore) GetProvisionerJobByID(arg0 context.Context, arg1 uuid.UUID) (database.ProvisionerJob, error) { m.ctrl.T.Helper() diff --git a/coderd/database/modelmethods.go b/coderd/database/modelmethods.go index 85d08cbfba8ec..d92a6048baf22 100644 --- a/coderd/database/modelmethods.go +++ b/coderd/database/modelmethods.go @@ -209,7 +209,9 @@ func (o Organization) RBACObject() rbac.Object { } func (p ProvisionerDaemon) RBACObject() rbac.Object { - return rbac.ResourceProvisionerDaemon.WithID(p.ID) + return rbac.ResourceProvisionerDaemon. + WithID(p.ID). + InOrg(p.OrganizationID) } func (p ProvisionerKey) RBACObject() rbac.Object { diff --git a/coderd/database/querier.go b/coderd/database/querier.go index 2a8153deec2d1..f680bedcde727 100644 --- a/coderd/database/querier.go +++ b/coderd/database/querier.go @@ -181,6 +181,7 @@ type sqlcQuerier interface { GetParameterSchemasByJobID(ctx context.Context, jobID uuid.UUID) ([]ParameterSchema, error) GetPreviousTemplateVersion(ctx context.Context, arg GetPreviousTemplateVersionParams) (TemplateVersion, error) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDaemon, error) + GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]ProvisionerDaemon, error) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (ProvisionerJob, error) GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]ProvisionerJob, error) GetProvisionerJobsByIDsWithQueuePosition(ctx context.Context, ids []uuid.UUID) ([]GetProvisionerJobsByIDsWithQueuePositionRow, error) diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 511db6ae4dccf..71d1f24c6d38f 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -4760,6 +4760,49 @@ func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDa return items, nil } +const getProvisionerDaemonsByOrganization = `-- name: GetProvisionerDaemonsByOrganization :many +SELECT + id, created_at, name, provisioners, replica_id, tags, last_seen_at, version, api_version, organization_id +FROM + provisioner_daemons +WHERE + organization_id = $1 +` + +func (q *sqlQuerier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]ProvisionerDaemon, error) { + rows, err := q.db.QueryContext(ctx, getProvisionerDaemonsByOrganization, organizationID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ProvisionerDaemon + for rows.Next() { + var i ProvisionerDaemon + if err := rows.Scan( + &i.ID, + &i.CreatedAt, + &i.Name, + pq.Array(&i.Provisioners), + &i.ReplicaID, + &i.Tags, + &i.LastSeenAt, + &i.Version, + &i.APIVersion, + &i.OrganizationID, + ); 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 updateProvisionerDaemonLastSeenAt = `-- name: UpdateProvisionerDaemonLastSeenAt :exec UPDATE provisioner_daemons SET diff --git a/coderd/database/queries/provisionerdaemons.sql b/coderd/database/queries/provisionerdaemons.sql index c8b04eddc3a93..aa34fb5fff711 100644 --- a/coderd/database/queries/provisionerdaemons.sql +++ b/coderd/database/queries/provisionerdaemons.sql @@ -4,6 +4,14 @@ SELECT FROM provisioner_daemons; +-- name: GetProvisionerDaemonsByOrganization :many +SELECT + * +FROM + provisioner_daemons +WHERE + organization_id = @organization_id; + -- name: DeleteOldProvisionerDaemons :exec -- Delete provisioner daemons that have been created at least a week ago -- and have not connected to coderd since a week. From 5c26725007a58a9d63b1b99fb51a4ddf255b9e43 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Fri, 19 Jul 2024 19:17:28 +0000 Subject: [PATCH 2/8] failing rbac --- enterprise/coderd/provisionerdaemons.go | 24 +++++-------- enterprise/coderd/provisionerdaemons_test.go | 37 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/enterprise/coderd/provisionerdaemons.go b/enterprise/coderd/provisionerdaemons.go index 34bacd1d223af..da007e692d84c 100644 --- a/enterprise/coderd/provisionerdaemons.go +++ b/enterprise/coderd/provisionerdaemons.go @@ -21,7 +21,6 @@ import ( "cdr.dev/slog" - "github.com/coder/coder/v2/coderd" "github.com/coder/coder/v2/coderd/database" "github.com/coder/coder/v2/coderd/database/db2sdk" "github.com/coder/coder/v2/coderd/database/dbauthz" @@ -65,22 +64,15 @@ func (api *API) provisionerDaemonsEnabledMW(next http.Handler) http.Handler { // @Router /organizations/{organization}/provisionerdaemons [get] func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() - daemons, err := api.Database.GetProvisionerDaemons(ctx) - if errors.Is(err, sql.ErrNoRows) { - err = nil - } - if err != nil { - httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ - Message: "Internal error fetching provisioner daemons.", - Detail: err.Error(), - }) - return - } - if daemons == nil { - daemons = []database.ProvisionerDaemon{} - } - daemons, err = coderd.AuthorizeFilter(api.AGPL.HTTPAuth, r, policy.ActionRead, daemons) + org := httpmw.OrganizationParam(r) + + daemons, err := api.Database.GetProvisionerDaemonsByOrganization(ctx, org.ID) if err != nil { + if errors.Is(err, sql.ErrNoRows) { + httpapi.Write(ctx, rw, http.StatusOK, []codersdk.ProvisionerDaemon{}) + return + } + httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ Message: "Internal error fetching provisioner daemons.", Detail: err.Error(), diff --git a/enterprise/coderd/provisionerdaemons_test.go b/enterprise/coderd/provisionerdaemons_test.go index 68558706914a0..ad9d44686f419 100644 --- a/enterprise/coderd/provisionerdaemons_test.go +++ b/enterprise/coderd/provisionerdaemons_test.go @@ -556,3 +556,40 @@ func TestProvisionerDaemonServe(t *testing.T) { require.Len(t, daemons, 0) }) } + +func TestGetProvisionerDaemons(t *testing.T) { + t.Parallel() + + t.Run("OK", func(t *testing.T) { + t.Parallel() + client, _ := coderdenttest.New(t, &coderdenttest.Options{LicenseOptions: &coderdenttest.LicenseOptions{ + Features: license.Features{ + codersdk.FeatureExternalProvisionerDaemons: 1, + }, + }}) + org := coderdtest.CreateOrganization(t, client, coderdtest.CreateOrganizationOptions{}) + orgAdmin, _ := coderdtest.CreateAnotherUser(t, client, org.ID, rbac.ScopedRoleOrgAdmin(org.ID)) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + daemonName := testutil.MustRandString(t, 63) + srv, err := orgAdmin.ServeProvisionerDaemon(ctx, codersdk.ServeProvisionerDaemonRequest{ + ID: uuid.New(), + Name: daemonName, + Organization: org.ID, + Provisioners: []codersdk.ProvisionerType{ + codersdk.ProvisionerTypeEcho, + }, + Tags: map[string]string{}, + }) + require.NoError(t, err) + srv.DRPCConn().Close() + + daemons, err := client.OrganizationProvisionerDaemons(ctx, org.ID) //nolint:gocritic // Test assertion. + require.NoError(t, err) + if assert.Len(t, daemons, 1) { + assert.Equal(t, daemonName, daemons[0].Name) + assert.Equal(t, buildinfo.Version(), daemons[0].Version) + assert.Equal(t, proto.CurrentVersion.String(), daemons[0].APIVersion) + } + }) +} From 8d9dbe59f074b7bc13bd984a646f81178133f193 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 22 Jul 2024 15:25:10 +0000 Subject: [PATCH 3/8] fix test --- coderd/database/dbauthz/dbauthz.go | 2 +- enterprise/coderd/provisionerdaemons.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz.go b/coderd/database/dbauthz/dbauthz.go index b720b74331b4b..82f26c31da3e6 100644 --- a/coderd/database/dbauthz/dbauthz.go +++ b/coderd/database/dbauthz/dbauthz.go @@ -3731,7 +3731,7 @@ func (q *querier) UpsertOAuthSigningKey(ctx context.Context, value string) error } func (q *querier) UpsertProvisionerDaemon(ctx context.Context, arg database.UpsertProvisionerDaemonParams) (database.ProvisionerDaemon, error) { - res := rbac.ResourceProvisionerDaemon.All() + res := rbac.ResourceProvisionerDaemon.InOrg(arg.OrganizationID) if arg.Tags[provisionersdk.TagScope] == provisionersdk.ScopeUser { res.Owner = arg.Tags[provisionersdk.TagOwner] } diff --git a/enterprise/coderd/provisionerdaemons.go b/enterprise/coderd/provisionerdaemons.go index da007e692d84c..c63cbfc358122 100644 --- a/enterprise/coderd/provisionerdaemons.go +++ b/enterprise/coderd/provisionerdaemons.go @@ -90,7 +90,7 @@ type provisionerDaemonAuth struct { // authorize returns mutated tags and true if the given HTTP request is authorized to access the provisioner daemon // protobuf API, and returns nil, false otherwise. -func (p *provisionerDaemonAuth) authorize(r *http.Request, tags map[string]string) (map[string]string, bool) { +func (p *provisionerDaemonAuth) authorize(r *http.Request, orgID uuid.UUID, tags map[string]string) (map[string]string, bool) { ctx := r.Context() apiKey, ok := httpmw.APIKeyOptional(r) if ok { @@ -101,7 +101,7 @@ func (p *provisionerDaemonAuth) authorize(r *http.Request, tags map[string]strin return tags, true } ua := httpmw.UserAuthorization(r) - if err := p.authorizer.Authorize(ctx, ua, policy.ActionCreate, rbac.ResourceProvisionerDaemon); err == nil { + if err := p.authorizer.Authorize(ctx, ua, policy.ActionCreate, rbac.ResourceProvisionerDaemon.InOrg(orgID)); err == nil { // User is allowed to create provisioner daemons return tags, true } @@ -177,7 +177,7 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request) api.Logger.Warn(ctx, "unnamed provisioner daemon") } - tags, authorized := api.provisionerDaemonAuth.authorize(r, tags) + tags, authorized := api.provisionerDaemonAuth.authorize(r, organization.ID, tags) if !authorized { api.Logger.Warn(ctx, "unauthorized provisioner daemon serve request", slog.F("tags", tags)) httpapi.Write(ctx, rw, http.StatusForbidden, From 11d1899a98eeeab610846d22461d0bbf4f012478 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 22 Jul 2024 16:00:08 +0000 Subject: [PATCH 4/8] fix rbac --- coderd/database/dbauthz/dbauthz_test.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index 920e2ae3b8cb1..c97e0ad7bf5a7 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -1865,9 +1865,16 @@ func (s *MethodTestSuite) TestExtraMethods() { })) s.Run("GetProvisionerDaemonsByOrganization", s.Subtest(func(db database.Store, check *expects) { org := dbgen.Organization(s.T(), db, database.Organization{}) - d, err := db.GetProvisionerDaemonsByOrganization(context.Background(), org.ID) + d, err := db.UpsertProvisionerDaemon(context.Background(), database.UpsertProvisionerDaemonParams{ + OrganizationID: org.ID, + Tags: database.StringMap(map[string]string{ + provisionersdk.TagScope: provisionersdk.ScopeOrganization, + }), + }) + s.NoError(err, "insert provisioner daemon") + ds, err := db.GetProvisionerDaemonsByOrganization(context.Background(), org.ID) s.NoError(err, "get provisioner daemon by org") - check.Args().Asserts(d, policy.ActionRead) + check.Args(org.ID).Asserts(d, policy.ActionRead).Returns(ds) })) s.Run("DeleteOldProvisionerDaemons", s.Subtest(func(db database.Store, check *expects) { _, err := db.UpsertProvisionerDaemon(context.Background(), database.UpsertProvisionerDaemonParams{ From de4b71b4734f4f08abbb0db804eba90c88a1544d Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 22 Jul 2024 16:13:52 +0000 Subject: [PATCH 5/8] no more .all() --- coderd/database/dbauthz/dbauthz_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coderd/database/dbauthz/dbauthz_test.go b/coderd/database/dbauthz/dbauthz_test.go index c97e0ad7bf5a7..6514d2f0dfeb0 100644 --- a/coderd/database/dbauthz/dbauthz_test.go +++ b/coderd/database/dbauthz/dbauthz_test.go @@ -2341,13 +2341,16 @@ func (s *MethodTestSuite) TestSystemFunctions() { }).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/ ) })) s.Run("UpsertProvisionerDaemon", s.Subtest(func(db database.Store, check *expects) { - pd := rbac.ResourceProvisionerDaemon.All() + org := dbgen.Organization(s.T(), db, database.Organization{}) + pd := rbac.ResourceProvisionerDaemon.InOrg(org.ID) check.Args(database.UpsertProvisionerDaemonParams{ + OrganizationID: org.ID, Tags: database.StringMap(map[string]string{ provisionersdk.TagScope: provisionersdk.ScopeOrganization, }), }).Asserts(pd, policy.ActionCreate) check.Args(database.UpsertProvisionerDaemonParams{ + OrganizationID: org.ID, Tags: database.StringMap(map[string]string{ provisionersdk.TagScope: provisionersdk.ScopeUser, provisionersdk.TagOwner: "11111111-1111-1111-1111-111111111111", From 6ef3bc4400bc95dcdfd175da6387c9bab7980293 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 22 Jul 2024 16:21:11 +0000 Subject: [PATCH 6/8] no error for org admin --- coderd/database/dbmem/dbmem.go | 2 +- enterprise/coderd/provisionerdaemons_test.go | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index dbf5d13c721f6..9f88b2c4c19b9 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -3133,7 +3133,7 @@ func (q *FakeQuerier) GetProvisionerDaemons(_ context.Context) ([]database.Provi return out, nil } -func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) { +func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(_ context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) { q.mutex.RLock() defer q.mutex.RUnlock() diff --git a/enterprise/coderd/provisionerdaemons_test.go b/enterprise/coderd/provisionerdaemons_test.go index ad9d44686f419..2509bbd79ec18 100644 --- a/enterprise/coderd/provisionerdaemons_test.go +++ b/enterprise/coderd/provisionerdaemons_test.go @@ -211,10 +211,7 @@ func TestProvisionerDaemonServe(t *testing.T) { provisionersdk.TagScope: provisionersdk.ScopeOrganization, }, }) - require.Error(t, err) - var apiError *codersdk.Error - require.ErrorAs(t, err, &apiError) - require.Equal(t, http.StatusForbidden, apiError.StatusCode()) + require.NoError(t, err) }) t.Run("OrganizationNoPerms", func(t *testing.T) { From f629752bd2d52f7dd8a0af48f0824654b01e5600 Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Mon, 22 Jul 2024 16:35:25 +0000 Subject: [PATCH 7/8] cleanup --- coderd/database/dbmem/dbmem.go | 3 --- enterprise/coderd/provisionerdaemons_test.go | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/coderd/database/dbmem/dbmem.go b/coderd/database/dbmem/dbmem.go index 9f88b2c4c19b9..907d89ef8b974 100644 --- a/coderd/database/dbmem/dbmem.go +++ b/coderd/database/dbmem/dbmem.go @@ -3140,9 +3140,6 @@ func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(_ context.Context, org daemons := make([]database.ProvisionerDaemon, 0) for _, daemon := range q.provisionerDaemons { if daemon.OrganizationID == organizationID { - // clone the Tags before appending, since maps are reference types and - // we don't want the caller to be able to mutate the map we have inside - // dbmem! daemon.Tags = maps.Clone(daemon.Tags) daemons = append(daemons, daemon) } diff --git a/enterprise/coderd/provisionerdaemons_test.go b/enterprise/coderd/provisionerdaemons_test.go index 2509bbd79ec18..c7c256f041c8b 100644 --- a/enterprise/coderd/provisionerdaemons_test.go +++ b/enterprise/coderd/provisionerdaemons_test.go @@ -581,7 +581,7 @@ func TestGetProvisionerDaemons(t *testing.T) { require.NoError(t, err) srv.DRPCConn().Close() - daemons, err := client.OrganizationProvisionerDaemons(ctx, org.ID) //nolint:gocritic // Test assertion. + daemons, err := orgAdmin.OrganizationProvisionerDaemons(ctx, org.ID) require.NoError(t, err) if assert.Len(t, daemons, 1) { assert.Equal(t, daemonName, daemons[0].Name) From e04b3311a3dfffcfa67a970264e031926c4aee7c Mon Sep 17 00:00:00 2001 From: Garrett Delfosse Date: Tue, 23 Jul 2024 14:43:31 +0000 Subject: [PATCH 8/8] stop catching no rows --- enterprise/coderd/provisionerdaemons.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/enterprise/coderd/provisionerdaemons.go b/enterprise/coderd/provisionerdaemons.go index c63cbfc358122..e74f2821092b9 100644 --- a/enterprise/coderd/provisionerdaemons.go +++ b/enterprise/coderd/provisionerdaemons.go @@ -3,7 +3,6 @@ package coderd import ( "context" "database/sql" - "errors" "fmt" "io" "net/http" @@ -68,11 +67,6 @@ func (api *API) provisionerDaemons(rw http.ResponseWriter, r *http.Request) { daemons, err := api.Database.GetProvisionerDaemonsByOrganization(ctx, org.ID) if err != nil { - if errors.Is(err, sql.ErrNoRows) { - httpapi.Write(ctx, rw, http.StatusOK, []codersdk.ProvisionerDaemon{}) - return - } - httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ Message: "Internal error fetching provisioner daemons.", Detail: err.Error(),