Skip to content

Commit 814dd6f

Browse files
authored
feat(coderd): update API to allow filtering provisioner daemons by tags (coder#15448)
This PR provides new parameters to an endpoint that will be necessary for coder#15048
1 parent 4080295 commit 814dd6f

27 files changed

+389
-80
lines changed

coderd/apidoc/docs.go

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbauthz/dbauthz.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1890,7 +1890,7 @@ func (q *querier) GetProvisionerDaemons(ctx context.Context) ([]database.Provisi
18901890
return fetchWithPostFilter(q.auth, policy.ActionRead, fetch)(ctx, nil)
18911891
}
18921892

1893-
func (q *querier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) {
1893+
func (q *querier) GetProvisionerDaemonsByOrganization(ctx context.Context, organizationID database.GetProvisionerDaemonsByOrganizationParams) ([]database.ProvisionerDaemon, error) {
18941894
return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.GetProvisionerDaemonsByOrganization)(ctx, organizationID)
18951895
}
18961896

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2066,9 +2066,9 @@ func (s *MethodTestSuite) TestExtraMethods() {
20662066
}),
20672067
})
20682068
s.NoError(err, "insert provisioner daemon")
2069-
ds, err := db.GetProvisionerDaemonsByOrganization(context.Background(), org.ID)
2069+
ds, err := db.GetProvisionerDaemonsByOrganization(context.Background(), database.GetProvisionerDaemonsByOrganizationParams{OrganizationID: org.ID})
20702070
s.NoError(err, "get provisioner daemon by org")
2071-
check.Args(org.ID).Asserts(d, policy.ActionRead).Returns(ds)
2071+
check.Args(database.GetProvisionerDaemonsByOrganizationParams{OrganizationID: org.ID}).Asserts(d, policy.ActionRead).Returns(ds)
20722072
}))
20732073
s.Run("DeleteOldProvisionerDaemons", s.Subtest(func(db database.Store, check *expects) {
20742074
_, err := db.UpsertProvisionerDaemon(context.Background(), database.UpsertProvisionerDaemonParams{
@@ -2560,7 +2560,7 @@ func (s *MethodTestSuite) TestSystemFunctions() {
25602560
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{
25612561
StartedAt: sql.NullTime{Valid: false},
25622562
})
2563-
check.Args(database.AcquireProvisionerJobParams{OrganizationID: j.OrganizationID, Types: []database.ProvisionerType{j.Provisioner}, Tags: must(json.Marshal(j.Tags))}).
2563+
check.Args(database.AcquireProvisionerJobParams{OrganizationID: j.OrganizationID, Types: []database.ProvisionerType{j.Provisioner}, ProvisionerTags: must(json.Marshal(j.Tags))}).
25642564
Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/ )
25652565
}))
25662566
s.Run("UpdateProvisionerJobWithCompleteByID", s.Subtest(func(db database.Store, check *expects) {

coderd/database/dbfake/dbfake.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,8 +194,8 @@ func (b WorkspaceBuildBuilder) Do() WorkspaceResponse {
194194
UUID: uuid.New(),
195195
Valid: true,
196196
},
197-
Types: []database.ProvisionerType{database.ProvisionerTypeEcho},
198-
Tags: []byte(`{"scope": "organization"}`),
197+
Types: []database.ProvisionerType{database.ProvisionerTypeEcho},
198+
ProvisionerTags: []byte(`{"scope": "organization"}`),
199199
})
200200
require.NoError(b.t, err, "acquire starting job")
201201
if j.ID == job.ID {

coderd/database/dbgen/dbgen.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -531,11 +531,11 @@ func ProvisionerJob(t testing.TB, db database.Store, ps pubsub.Pubsub, orig data
531531
}
532532
if !orig.StartedAt.Time.IsZero() {
533533
job, err = db.AcquireProvisionerJob(genCtx, database.AcquireProvisionerJobParams{
534-
StartedAt: orig.StartedAt,
535-
OrganizationID: job.OrganizationID,
536-
Types: []database.ProvisionerType{database.ProvisionerTypeEcho},
537-
Tags: must(json.Marshal(orig.Tags)),
538-
WorkerID: uuid.NullUUID{},
534+
StartedAt: orig.StartedAt,
535+
OrganizationID: job.OrganizationID,
536+
Types: []database.ProvisionerType{database.ProvisionerTypeEcho},
537+
ProvisionerTags: must(json.Marshal(orig.Tags)),
538+
WorkerID: uuid.NullUUID{},
539539
})
540540
require.NoError(t, err)
541541
// There is no easy way to make sure we acquire the correct job.

coderd/database/dbmem/dbmem.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,8 +1194,8 @@ func (q *FakeQuerier) AcquireProvisionerJob(_ context.Context, arg database.Acqu
11941194
continue
11951195
}
11961196
tags := map[string]string{}
1197-
if arg.Tags != nil {
1198-
err := json.Unmarshal(arg.Tags, &tags)
1197+
if arg.ProvisionerTags != nil {
1198+
err := json.Unmarshal(arg.ProvisionerTags, &tags)
11991199
if err != nil {
12001200
return provisionerJob, xerrors.Errorf("unmarshal: %w", err)
12011201
}
@@ -3625,16 +3625,28 @@ func (q *FakeQuerier) GetProvisionerDaemons(_ context.Context) ([]database.Provi
36253625
return out, nil
36263626
}
36273627

3628-
func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(_ context.Context, organizationID uuid.UUID) ([]database.ProvisionerDaemon, error) {
3628+
func (q *FakeQuerier) GetProvisionerDaemonsByOrganization(_ context.Context, arg database.GetProvisionerDaemonsByOrganizationParams) ([]database.ProvisionerDaemon, error) {
36293629
q.mutex.RLock()
36303630
defer q.mutex.RUnlock()
36313631

36323632
daemons := make([]database.ProvisionerDaemon, 0)
36333633
for _, daemon := range q.provisionerDaemons {
3634-
if daemon.OrganizationID == organizationID {
3635-
daemon.Tags = maps.Clone(daemon.Tags)
3636-
daemons = append(daemons, daemon)
3634+
if daemon.OrganizationID != arg.OrganizationID {
3635+
continue
3636+
}
3637+
// Special case for untagged provisioners: only match untagged jobs.
3638+
// Ref: coderd/database/queries/provisionerjobs.sql:24-30
3639+
// CASE WHEN nested.tags :: jsonb = '{"scope": "organization", "owner": ""}' :: jsonb
3640+
// THEN nested.tags :: jsonb = @tags :: jsonb
3641+
if tagsEqual(arg.WantTags, tagsUntagged) && !tagsEqual(arg.WantTags, daemon.Tags) {
3642+
continue
3643+
}
3644+
// ELSE nested.tags :: jsonb <@ @tags :: jsonb
3645+
if !tagsSubset(arg.WantTags, daemon.Tags) {
3646+
continue
36373647
}
3648+
daemon.Tags = maps.Clone(daemon.Tags)
3649+
daemons = append(daemons, daemon)
36383650
}
36393651

36403652
return daemons, nil

coderd/database/dbmetrics/querymetrics.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)