Skip to content

Commit b5f866c

Browse files
authored
chore: add organization_id column to provisioner daemons (coder#12356)
* chore: add organization_id column to provisioner daemons * Update upsert to include organization id on set
1 parent 46a2ff1 commit b5f866c

File tree

10 files changed

+91
-44
lines changed

10 files changed

+91
-44
lines changed

coderd/coderd.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,10 +1239,18 @@ func (api *API) CreateInMemoryProvisionerDaemon(dialCtx context.Context, name st
12391239
}
12401240
}()
12411241

1242+
// All in memory provisioners will be part of the default org for now.
1243+
//nolint:gocritic // in-memory provisioners are owned by system
1244+
defaultOrg, err := api.Database.GetDefaultOrganization(dbauthz.AsSystemRestricted(dialCtx))
1245+
if err != nil {
1246+
return nil, xerrors.Errorf("unable to fetch default org for in memory provisioner: %w", err)
1247+
}
1248+
12421249
//nolint:gocritic // in-memory provisioners are owned by system
12431250
daemon, err := api.Database.UpsertProvisionerDaemon(dbauthz.AsSystemRestricted(dialCtx), database.UpsertProvisionerDaemonParams{
1244-
Name: name,
1245-
CreatedAt: dbtime.Now(),
1251+
Name: name,
1252+
OrganizationID: defaultOrg.ID,
1253+
CreatedAt: dbtime.Now(),
12461254
Provisioners: []database.ProvisionerType{
12471255
database.ProvisionerTypeEcho, database.ProvisionerTypeTerraform,
12481256
},

coderd/database/dbpurge/dbpurge_test.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
203203
t.Parallel()
204204

205205
db, _ := dbtestutil.NewDB(t)
206+
defaultOrg := dbgen.Organization(t, db, database.Organization{})
206207
logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
207208

208209
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
@@ -213,24 +214,26 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
213214
// given
214215
_, err := db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
215216
// Provisioner daemon created 14 days ago, and checked in just before 7 days deadline.
216-
Name: "external-0",
217-
Provisioners: []database.ProvisionerType{"echo"},
218-
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
219-
CreatedAt: now.Add(-14 * 24 * time.Hour),
220-
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-7 * 24 * time.Hour).Add(time.Minute)},
221-
Version: "1.0.0",
222-
APIVersion: proto.CurrentVersion.String(),
217+
Name: "external-0",
218+
Provisioners: []database.ProvisionerType{"echo"},
219+
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
220+
CreatedAt: now.Add(-14 * 24 * time.Hour),
221+
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-7 * 24 * time.Hour).Add(time.Minute)},
222+
Version: "1.0.0",
223+
APIVersion: proto.CurrentVersion.String(),
224+
OrganizationID: defaultOrg.ID,
223225
})
224226
require.NoError(t, err)
225227
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
226228
// Provisioner daemon created 8 days ago, and checked in last time an hour after creation.
227-
Name: "external-1",
228-
Provisioners: []database.ProvisionerType{"echo"},
229-
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
230-
CreatedAt: now.Add(-8 * 24 * time.Hour),
231-
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-8 * 24 * time.Hour).Add(time.Hour)},
232-
Version: "1.0.0",
233-
APIVersion: proto.CurrentVersion.String(),
229+
Name: "external-1",
230+
Provisioners: []database.ProvisionerType{"echo"},
231+
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
232+
CreatedAt: now.Add(-8 * 24 * time.Hour),
233+
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-8 * 24 * time.Hour).Add(time.Hour)},
234+
Version: "1.0.0",
235+
APIVersion: proto.CurrentVersion.String(),
236+
OrganizationID: defaultOrg.ID,
234237
})
235238
require.NoError(t, err)
236239
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
@@ -241,9 +244,10 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
241244
provisionersdk.TagScope: provisionersdk.ScopeUser,
242245
provisionersdk.TagOwner: uuid.NewString(),
243246
},
244-
CreatedAt: now.Add(-9 * 24 * time.Hour),
245-
Version: "1.0.0",
246-
APIVersion: proto.CurrentVersion.String(),
247+
CreatedAt: now.Add(-9 * 24 * time.Hour),
248+
Version: "1.0.0",
249+
APIVersion: proto.CurrentVersion.String(),
250+
OrganizationID: defaultOrg.ID,
247251
})
248252
require.NoError(t, err)
249253
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
@@ -254,10 +258,11 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
254258
provisionersdk.TagScope: provisionersdk.ScopeUser,
255259
provisionersdk.TagOwner: uuid.NewString(),
256260
},
257-
CreatedAt: now.Add(-6 * 24 * time.Hour),
258-
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-6 * 24 * time.Hour)},
259-
Version: "1.0.0",
260-
APIVersion: proto.CurrentVersion.String(),
261+
CreatedAt: now.Add(-6 * 24 * time.Hour),
262+
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-6 * 24 * time.Hour)},
263+
Version: "1.0.0",
264+
APIVersion: proto.CurrentVersion.String(),
265+
OrganizationID: defaultOrg.ID,
261266
})
262267
require.NoError(t, err)
263268

coderd/database/dump.sql

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

coderd/database/foreign_key_constraint.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE provisioner_daemons
2+
DROP COLUMN organization_id;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- At the time of this migration, only 1 org is expected in a deployment.
2+
-- In the future when multi-org is more common, there might be a use case
3+
-- to allow a provisioner to be associated with multiple orgs.
4+
ALTER TABLE provisioner_daemons
5+
ADD COLUMN organization_id UUID REFERENCES organizations(id) ON DELETE CASCADE;
6+
7+
UPDATE
8+
provisioner_daemons
9+
SET
10+
-- Default to the first org
11+
organization_id = (SELECT id FROM organizations WHERE is_default = true LIMIT 1 );
12+
13+
ALTER TABLE provisioner_daemons
14+
ALTER COLUMN organization_id SET NOT NULL;

coderd/database/models.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/provisionerdaemons.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ INSERT INTO
2424
tags,
2525
last_seen_at,
2626
"version",
27+
organization_id,
2728
api_version
2829
)
2930
VALUES (
@@ -34,13 +35,15 @@ VALUES (
3435
@tags,
3536
@last_seen_at,
3637
@version,
38+
@organization_id,
3739
@api_version
3840
) ON CONFLICT("name", LOWER(COALESCE(tags ->> 'owner'::text, ''::text))) DO UPDATE SET
3941
provisioners = @provisioners,
4042
tags = @tags,
4143
last_seen_at = @last_seen_at,
4244
"version" = @version,
43-
api_version = @api_version
45+
api_version = @api_version,
46+
organization_id = @organization_id
4447
WHERE
4548
-- Only ones with the same tags are allowed clobber
4649
provisioner_daemons.tags <@ @tags :: jsonb

enterprise/coderd/provisionerdaemons.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ func (p *provisionerDaemonAuth) authorize(r *http.Request, tags map[string]strin
134134
// @Router /organizations/{organization}/provisionerdaemons/serve [get]
135135
func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request) {
136136
ctx := r.Context()
137+
organization := httpmw.OrganizationParam(r)
137138

138139
tags := map[string]string{}
139140
if r.URL.Query().Has("tag") {
@@ -246,13 +247,14 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request)
246247
// Create the daemon in the database.
247248
now := dbtime.Now()
248249
daemon, err := api.Database.UpsertProvisionerDaemon(authCtx, database.UpsertProvisionerDaemonParams{
249-
Name: name,
250-
Provisioners: provisioners,
251-
Tags: tags,
252-
CreatedAt: now,
253-
LastSeenAt: sql.NullTime{Time: now, Valid: true},
254-
Version: versionHdrVal,
255-
APIVersion: apiVersion,
250+
Name: name,
251+
Provisioners: provisioners,
252+
Tags: tags,
253+
CreatedAt: now,
254+
LastSeenAt: sql.NullTime{Time: now, Valid: true},
255+
Version: versionHdrVal,
256+
APIVersion: apiVersion,
257+
OrganizationID: organization.ID,
256258
})
257259
if err != nil {
258260
if !xerrors.Is(err, context.Canceled) {

0 commit comments

Comments
 (0)