mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
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:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Generated
+4
-1
@@ -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';
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user