From 5b0e6bfa2a79cd8050f8f4ce6adebabaa5edfa55 Mon Sep 17 00:00:00 2001 From: Cian Johnston Date: Thu, 14 Dec 2023 12:52:41 +0000 Subject: [PATCH] feat(coderd/database): add api_version to provisioner_daemons table (#11204) Adds column api_version to the provisioner_daemons table. This is distinct from the coderd version, and is used to handle breaking changes in the provisioner daemon API. --- coderd/database/dbpurge/dbpurge_test.go | 10 +++++++++- coderd/database/dump.sql | 5 ++++- ...79_provisionerdaemon_add_apiversion.down.sql | 2 ++ ...0179_provisionerdaemon_add_apiversion.up.sql | 3 +++ coderd/database/models.go | 2 ++ coderd/database/queries.sql.go | 17 ++++++++++++----- coderd/database/queries/provisionerdaemons.sql | 9 ++++++--- 7 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 coderd/database/migrations/000179_provisionerdaemon_add_apiversion.down.sql create mode 100644 coderd/database/migrations/000179_provisionerdaemon_add_apiversion.up.sql diff --git a/coderd/database/dbpurge/dbpurge_test.go b/coderd/database/dbpurge/dbpurge_test.go index 0cff0b140f..59000e4638 100644 --- a/coderd/database/dbpurge/dbpurge_test.go +++ b/coderd/database/dbpurge/dbpurge_test.go @@ -217,6 +217,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) { Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization}, CreatedAt: now.Add(-14 * 24 * time.Hour), LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-7 * 24 * time.Hour).Add(time.Minute)}, + Version: "1.0.0", + APIVersion: "1.0", }) require.NoError(t, err) _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ @@ -226,6 +228,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) { Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization}, CreatedAt: now.Add(-8 * 24 * time.Hour), LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-8 * 24 * time.Hour).Add(time.Hour)}, + Version: "1.0.0", + APIVersion: "1.0", }) require.NoError(t, err) _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ @@ -236,7 +240,9 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) { provisionersdk.TagScope: provisionersdk.ScopeUser, provisionersdk.TagOwner: uuid.NewString(), }, - CreatedAt: now.Add(-9 * 24 * time.Hour), + CreatedAt: now.Add(-9 * 24 * time.Hour), + Version: "1.0.0", + APIVersion: "1.0", }) require.NoError(t, err) _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ @@ -249,6 +255,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) { }, CreatedAt: now.Add(-6 * 24 * time.Hour), LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-6 * 24 * time.Hour)}, + Version: "1.0.0", + APIVersion: "1.0", }) require.NoError(t, err) diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index a1cf4b0847..b555970c58 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -514,9 +514,12 @@ CREATE TABLE provisioner_daemons ( replica_id uuid, tags jsonb DEFAULT '{}'::jsonb NOT NULL, last_seen_at timestamp with time zone, - version text DEFAULT ''::text NOT NULL + version text DEFAULT ''::text NOT NULL, + api_version text DEFAULT '1.0'::text NOT NULL ); +COMMENT ON COLUMN provisioner_daemons.api_version IS 'The API version of the provisioner daemon'; + CREATE TABLE provisioner_job_logs ( job_id uuid NOT NULL, created_at timestamp with time zone NOT NULL, diff --git a/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.down.sql b/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.down.sql new file mode 100644 index 0000000000..60a2687887 --- /dev/null +++ b/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.down.sql @@ -0,0 +1,2 @@ +ALTER TABLE ONLY provisioner_daemons + DROP COLUMN api_version; diff --git a/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.up.sql b/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.up.sql new file mode 100644 index 0000000000..9467c9511c --- /dev/null +++ b/coderd/database/migrations/000179_provisionerdaemon_add_apiversion.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE ONLY provisioner_daemons + ADD COLUMN api_version text NOT NULL DEFAULT '1.0'; +COMMENT ON COLUMN provisioner_daemons.api_version IS 'The API version of the provisioner daemon'; diff --git a/coderd/database/models.go b/coderd/database/models.go index 47b095a755..1fd9f241fa 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1845,6 +1845,8 @@ type ProvisionerDaemon struct { Tags StringMap `db:"tags" json:"tags"` LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"` Version string `db:"version" json:"version"` + // The API version of the provisioner daemon + APIVersion string `db:"api_version" json:"api_version"` } type ProvisionerJob struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 03d595d9ec..72ad223ef2 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -3019,7 +3019,7 @@ func (q *sqlQuerier) DeleteOldProvisionerDaemons(ctx context.Context) error { const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many SELECT - id, created_at, name, provisioners, replica_id, tags, last_seen_at, version + id, created_at, name, provisioners, replica_id, tags, last_seen_at, version, api_version FROM provisioner_daemons ` @@ -3042,6 +3042,7 @@ func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDa &i.Tags, &i.LastSeenAt, &i.Version, + &i.APIVersion, ); err != nil { return nil, err } @@ -3065,7 +3066,8 @@ INSERT INTO provisioners, tags, last_seen_at, - "version" + "version", + api_version ) VALUES ( gen_random_uuid(), @@ -3074,16 +3076,18 @@ VALUES ( $3, $4, $5, - $6 + $6, + $7 ) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET provisioners = $3, tags = $4, last_seen_at = $5, - "version" = $6 + "version" = $6, + api_version = $7 WHERE -- Only ones with the same tags are allowed clobber provisioner_daemons.tags <@ $4 :: jsonb -RETURNING id, created_at, name, provisioners, replica_id, tags, last_seen_at, version +RETURNING id, created_at, name, provisioners, replica_id, tags, last_seen_at, version, api_version ` type UpsertProvisionerDaemonParams struct { @@ -3093,6 +3097,7 @@ type UpsertProvisionerDaemonParams struct { Tags StringMap `db:"tags" json:"tags"` LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"` Version string `db:"version" json:"version"` + APIVersion string `db:"api_version" json:"api_version"` } func (q *sqlQuerier) UpsertProvisionerDaemon(ctx context.Context, arg UpsertProvisionerDaemonParams) (ProvisionerDaemon, error) { @@ -3103,6 +3108,7 @@ func (q *sqlQuerier) UpsertProvisionerDaemon(ctx context.Context, arg UpsertProv arg.Tags, arg.LastSeenAt, arg.Version, + arg.APIVersion, ) var i ProvisionerDaemon err := row.Scan( @@ -3114,6 +3120,7 @@ func (q *sqlQuerier) UpsertProvisionerDaemon(ctx context.Context, arg UpsertProv &i.Tags, &i.LastSeenAt, &i.Version, + &i.APIVersion, ) return i, err } diff --git a/coderd/database/queries/provisionerdaemons.sql b/coderd/database/queries/provisionerdaemons.sql index 7cc37bdc40..3041efad94 100644 --- a/coderd/database/queries/provisionerdaemons.sql +++ b/coderd/database/queries/provisionerdaemons.sql @@ -23,7 +23,8 @@ INSERT INTO provisioners, tags, last_seen_at, - "version" + "version", + api_version ) VALUES ( gen_random_uuid(), @@ -32,12 +33,14 @@ VALUES ( @provisioners, @tags, @last_seen_at, - @version + @version, + @api_version ) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET provisioners = @provisioners, tags = @tags, last_seen_at = @last_seen_at, - "version" = @version + "version" = @version, + api_version = @api_version WHERE -- Only ones with the same tags are allowed clobber provisioner_daemons.tags <@ @tags :: jsonb