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.
This commit is contained in:
Cian Johnston
2023-12-14 12:52:41 +00:00
committed by GitHub
parent b779655f01
commit 5b0e6bfa2a
7 changed files with 38 additions and 10 deletions
+9 -1
View File
@@ -217,6 +217,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization}, Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
CreatedAt: now.Add(-14 * 24 * time.Hour), CreatedAt: now.Add(-14 * 24 * time.Hour),
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-7 * 24 * time.Hour).Add(time.Minute)}, 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) require.NoError(t, err)
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
@@ -226,6 +228,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization}, Tags: database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
CreatedAt: now.Add(-8 * 24 * time.Hour), CreatedAt: now.Add(-8 * 24 * time.Hour),
LastSeenAt: sql.NullTime{Valid: true, Time: now.Add(-8 * 24 * time.Hour).Add(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) require.NoError(t, err)
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
@@ -236,7 +240,9 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
provisionersdk.TagScope: provisionersdk.ScopeUser, provisionersdk.TagScope: provisionersdk.ScopeUser,
provisionersdk.TagOwner: uuid.NewString(), 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) require.NoError(t, err)
_, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{ _, err = db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
@@ -249,6 +255,8 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
}, },
CreatedAt: now.Add(-6 * 24 * time.Hour), CreatedAt: now.Add(-6 * 24 * time.Hour),
LastSeenAt: sql.NullTime{Valid: true, Time: 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) require.NoError(t, err)
+4 -1
View File
@@ -514,9 +514,12 @@ CREATE TABLE provisioner_daemons (
replica_id uuid, replica_id uuid,
tags jsonb DEFAULT '{}'::jsonb NOT NULL, tags jsonb DEFAULT '{}'::jsonb NOT NULL,
last_seen_at timestamp with time zone, 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 ( CREATE TABLE provisioner_job_logs (
job_id uuid NOT NULL, job_id uuid NOT NULL,
created_at timestamp with time zone NOT NULL, created_at timestamp with time zone NOT NULL,
@@ -0,0 +1,2 @@
ALTER TABLE ONLY provisioner_daemons
DROP COLUMN api_version;
@@ -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';
+2
View File
@@ -1845,6 +1845,8 @@ type ProvisionerDaemon struct {
Tags StringMap `db:"tags" json:"tags"` Tags StringMap `db:"tags" json:"tags"`
LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"` LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"`
Version string `db:"version" json:"version"` Version string `db:"version" json:"version"`
// The API version of the provisioner daemon
APIVersion string `db:"api_version" json:"api_version"`
} }
type ProvisionerJob struct { type ProvisionerJob struct {
+12 -5
View File
@@ -3019,7 +3019,7 @@ func (q *sqlQuerier) DeleteOldProvisionerDaemons(ctx context.Context) error {
const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many
SELECT 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 FROM
provisioner_daemons provisioner_daemons
` `
@@ -3042,6 +3042,7 @@ func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDa
&i.Tags, &i.Tags,
&i.LastSeenAt, &i.LastSeenAt,
&i.Version, &i.Version,
&i.APIVersion,
); err != nil { ); err != nil {
return nil, err return nil, err
} }
@@ -3065,7 +3066,8 @@ INSERT INTO
provisioners, provisioners,
tags, tags,
last_seen_at, last_seen_at,
"version" "version",
api_version
) )
VALUES ( VALUES (
gen_random_uuid(), gen_random_uuid(),
@@ -3074,16 +3076,18 @@ VALUES (
$3, $3,
$4, $4,
$5, $5,
$6 $6,
$7
) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET ) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET
provisioners = $3, provisioners = $3,
tags = $4, tags = $4,
last_seen_at = $5, last_seen_at = $5,
"version" = $6 "version" = $6,
api_version = $7
WHERE WHERE
-- Only ones with the same tags are allowed clobber -- Only ones with the same tags are allowed clobber
provisioner_daemons.tags <@ $4 :: jsonb 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 { type UpsertProvisionerDaemonParams struct {
@@ -3093,6 +3097,7 @@ type UpsertProvisionerDaemonParams struct {
Tags StringMap `db:"tags" json:"tags"` Tags StringMap `db:"tags" json:"tags"`
LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"` LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"`
Version string `db:"version" json:"version"` 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) { 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.Tags,
arg.LastSeenAt, arg.LastSeenAt,
arg.Version, arg.Version,
arg.APIVersion,
) )
var i ProvisionerDaemon var i ProvisionerDaemon
err := row.Scan( err := row.Scan(
@@ -3114,6 +3120,7 @@ func (q *sqlQuerier) UpsertProvisionerDaemon(ctx context.Context, arg UpsertProv
&i.Tags, &i.Tags,
&i.LastSeenAt, &i.LastSeenAt,
&i.Version, &i.Version,
&i.APIVersion,
) )
return i, err return i, err
} }
@@ -23,7 +23,8 @@ INSERT INTO
provisioners, provisioners,
tags, tags,
last_seen_at, last_seen_at,
"version" "version",
api_version
) )
VALUES ( VALUES (
gen_random_uuid(), gen_random_uuid(),
@@ -32,12 +33,14 @@ VALUES (
@provisioners, @provisioners,
@tags, @tags,
@last_seen_at, @last_seen_at,
@version @version,
@api_version
) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET ) ON CONFLICT("name", lower((tags ->> 'owner'::text))) DO UPDATE SET
provisioners = @provisioners, provisioners = @provisioners,
tags = @tags, tags = @tags,
last_seen_at = @last_seen_at, last_seen_at = @last_seen_at,
"version" = @version "version" = @version,
api_version = @api_version
WHERE WHERE
-- Only ones with the same tags are allowed clobber -- Only ones with the same tags are allowed clobber
provisioner_daemons.tags <@ @tags :: jsonb provisioner_daemons.tags <@ @tags :: jsonb