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

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

Lines changed: 3 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 18 additions & 0 deletions
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

Lines changed: 26 additions & 19 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy