Skip to content

Commit 071bb26

Browse files
authored
feat(coderd): add endpoint to list provisioner daemons (#16028)
Updates #15190 Updates #15084 Supersedes #15940
1 parent d7809ec commit 071bb26

31 files changed

+1106
-188
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

+3
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,9 @@ func New(options *Options) *API {
10071007
})
10081008
})
10091009
})
1010+
r.Route("/provisionerdaemons", func(r chi.Router) {
1011+
r.Get("/", api.provisionerDaemons)
1012+
})
10101013
})
10111014
})
10121015
r.Route("/templates", func(r chi.Router) {

coderd/database/dbauthz/dbauthz.go

+4
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,10 @@ func (q *querier) GetProvisionerDaemonsByOrganization(ctx context.Context, organ
19361936
return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.GetProvisionerDaemonsByOrganization)(ctx, organizationID)
19371937
}
19381938

1939+
func (q *querier) GetProvisionerDaemonsWithStatusByOrganization(ctx context.Context, arg database.GetProvisionerDaemonsWithStatusByOrganizationParams) ([]database.GetProvisionerDaemonsWithStatusByOrganizationRow, error) {
1940+
return fetchWithPostFilter(q.auth, policy.ActionRead, q.db.GetProvisionerDaemonsWithStatusByOrganization)(ctx, arg)
1941+
}
1942+
19391943
func (q *querier) GetProvisionerJobByID(ctx context.Context, id uuid.UUID) (database.ProvisionerJob, error) {
19401944
job, err := q.db.GetProvisionerJobByID(ctx, id)
19411945
if err != nil {

coderd/database/dbauthz/dbauthz_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -3189,6 +3189,24 @@ func (s *MethodTestSuite) TestExtraMethods() {
31893189
s.NoError(err, "get provisioner daemon by org")
31903190
check.Args(database.GetProvisionerDaemonsByOrganizationParams{OrganizationID: org.ID}).Asserts(d, policy.ActionRead).Returns(ds)
31913191
}))
3192+
s.Run("GetProvisionerDaemonsWithStatusByOrganization", s.Subtest(func(db database.Store, check *expects) {
3193+
org := dbgen.Organization(s.T(), db, database.Organization{})
3194+
d := dbgen.ProvisionerDaemon(s.T(), db, database.ProvisionerDaemon{
3195+
OrganizationID: org.ID,
3196+
Tags: map[string]string{
3197+
provisionersdk.TagScope: provisionersdk.ScopeOrganization,
3198+
},
3199+
})
3200+
ds, err := db.GetProvisionerDaemonsWithStatusByOrganization(context.Background(), database.GetProvisionerDaemonsWithStatusByOrganizationParams{
3201+
OrganizationID: org.ID,
3202+
StaleIntervalMS: 24 * time.Hour.Milliseconds(),
3203+
})
3204+
s.NoError(err, "get provisioner daemon with status by org")
3205+
check.Args(database.GetProvisionerDaemonsWithStatusByOrganizationParams{
3206+
OrganizationID: org.ID,
3207+
StaleIntervalMS: 24 * time.Hour.Milliseconds(),
3208+
}).Asserts(d, policy.ActionRead).Returns(ds)
3209+
}))
31923210
s.Run("GetEligibleProvisionerDaemonsByProvisionerJobIDs", s.Subtest(func(db database.Store, check *expects) {
31933211
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
31943212
org := dbgen.Organization(s.T(), db, database.Organization{})

coderd/database/dbgen/dbgen.go

+26-19
Original file line numberDiff line numberDiff line change
@@ -505,9 +505,27 @@ func GroupMember(t testing.TB, db database.Store, member database.GroupMemberTab
505505

506506
// ProvisionerDaemon creates a provisioner daemon as far as the database is concerned. It does not run a provisioner daemon.
507507
// If no key is provided, it will create one.
508-
func ProvisionerDaemon(t testing.TB, db database.Store, daemon database.ProvisionerDaemon) database.ProvisionerDaemon {
508+
func ProvisionerDaemon(t testing.TB, db database.Store, orig database.ProvisionerDaemon) database.ProvisionerDaemon {
509509
t.Helper()
510510

511+
var defOrgID uuid.UUID
512+
if orig.OrganizationID == uuid.Nil {
513+
defOrg, _ := db.GetDefaultOrganization(genCtx)
514+
defOrgID = defOrg.ID
515+
}
516+
517+
daemon := database.UpsertProvisionerDaemonParams{
518+
Name: takeFirst(orig.Name, testutil.GetRandomName(t)),
519+
OrganizationID: takeFirst(orig.OrganizationID, defOrgID, uuid.New()),
520+
CreatedAt: takeFirst(orig.CreatedAt, dbtime.Now()),
521+
Provisioners: takeFirstSlice(orig.Provisioners, []database.ProvisionerType{database.ProvisionerTypeEcho}),
522+
Tags: takeFirstMap(orig.Tags, database.StringMap{}),
523+
KeyID: takeFirst(orig.KeyID, uuid.Nil),
524+
LastSeenAt: takeFirst(orig.LastSeenAt, sql.NullTime{Time: dbtime.Now(), Valid: true}),
525+
Version: takeFirst(orig.Version, "v0.0.0"),
526+
APIVersion: takeFirst(orig.APIVersion, "1.1"),
527+
}
528+
511529
if daemon.KeyID == uuid.Nil {
512530
key, err := db.InsertProvisionerKey(genCtx, database.InsertProvisionerKeyParams{
513531
ID: uuid.New(),
@@ -521,24 +539,7 @@ func ProvisionerDaemon(t testing.TB, db database.Store, daemon database.Provisio
521539
daemon.KeyID = key.ID
522540
}
523541

524-
if daemon.CreatedAt.IsZero() {
525-
daemon.CreatedAt = dbtime.Now()
526-
}
527-
if daemon.Name == "" {
528-
daemon.Name = "test-daemon"
529-
}
530-
531-
d, err := db.UpsertProvisionerDaemon(genCtx, database.UpsertProvisionerDaemonParams{
532-
Name: daemon.Name,
533-
OrganizationID: daemon.OrganizationID,
534-
CreatedAt: daemon.CreatedAt,
535-
Provisioners: daemon.Provisioners,
536-
Tags: daemon.Tags,
537-
KeyID: daemon.KeyID,
538-
LastSeenAt: daemon.LastSeenAt,
539-
Version: daemon.Version,
540-
APIVersion: daemon.APIVersion,
541-
})
542+
d, err := db.UpsertProvisionerDaemon(genCtx, daemon)
542543
require.NoError(t, err)
543544
return d
544545
}
@@ -1109,6 +1110,12 @@ func takeFirstSlice[T any](values ...[]T) []T {
11091110
})
11101111
}
11111112

1113+
func takeFirstMap[T, E comparable](values ...map[T]E) map[T]E {
1114+
return takeFirstF(values, func(v map[T]E) bool {
1115+
return v != nil
1116+
})
1117+
}
1118+
11121119
// takeFirstF takes the first value that returns true
11131120
func takeFirstF[Value any](values []Value, take func(v Value) bool) Value {
11141121
for _, v := range values {

0 commit comments

Comments
 (0)