diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 72003c9273f9a..49e8b238e8ffd 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -9542,6 +9542,10 @@ const docTemplate = `{ "type": "string", "format": "uuid" }, + "last_seen_at": { + "type": "string", + "format": "date-time" + }, "name": { "type": "string" }, @@ -9564,6 +9568,9 @@ const docTemplate = `{ "$ref": "#/definitions/sql.NullTime" } ] + }, + "version": { + "type": "string" } } }, diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 477bb430fc55c..6191edfdf34df 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -8581,6 +8581,10 @@ "type": "string", "format": "uuid" }, + "last_seen_at": { + "type": "string", + "format": "date-time" + }, "name": { "type": "string" }, @@ -8603,6 +8607,9 @@ "$ref": "#/definitions/sql.NullTime" } ] + }, + "version": { + "type": "string" } } }, diff --git a/coderd/database/dump.sql b/coderd/database/dump.sql index 9d79ae7c348da..2a439aad78144 100644 --- a/coderd/database/dump.sql +++ b/coderd/database/dump.sql @@ -513,7 +513,9 @@ CREATE TABLE provisioner_daemons ( name character varying(64) NOT NULL, provisioners provisioner_type[] NOT NULL, replica_id uuid, - tags jsonb DEFAULT '{}'::jsonb NOT NULL + tags jsonb DEFAULT '{}'::jsonb NOT NULL, + last_seen_at timestamp with time zone, + version text DEFAULT ''::text NOT NULL ); CREATE TABLE provisioner_job_logs ( diff --git a/coderd/database/migrations/000173_provisioner_last_seen_at.down.sql b/coderd/database/migrations/000173_provisioner_last_seen_at.down.sql new file mode 100644 index 0000000000000..cc4be4594e92c --- /dev/null +++ b/coderd/database/migrations/000173_provisioner_last_seen_at.down.sql @@ -0,0 +1,3 @@ +ALTER TABLE provisioner_daemons + DROP COLUMN last_seen_at, + DROP COLUMN version; diff --git a/coderd/database/migrations/000173_provisioner_last_seen_at.up.sql b/coderd/database/migrations/000173_provisioner_last_seen_at.up.sql new file mode 100644 index 0000000000000..2ac224dc0614c --- /dev/null +++ b/coderd/database/migrations/000173_provisioner_last_seen_at.up.sql @@ -0,0 +1,3 @@ +ALTER TABLE provisioner_daemons + ADD COLUMN last_seen_at TIMESTAMP WITH TIME ZONE NULL, + ADD COLUMN version TEXT NOT NULL DEFAULT ''::TEXT; diff --git a/coderd/database/models.go b/coderd/database/models.go index c3e4fdf42fddb..c5b40c66f58ab 100644 --- a/coderd/database/models.go +++ b/coderd/database/models.go @@ -1844,6 +1844,8 @@ type ProvisionerDaemon struct { Provisioners []ProvisionerType `db:"provisioners" json:"provisioners"` ReplicaID uuid.NullUUID `db:"replica_id" json:"replica_id"` Tags StringMap `db:"tags" json:"tags"` + LastSeenAt sql.NullTime `db:"last_seen_at" json:"last_seen_at"` + Version string `db:"version" json:"version"` } type ProvisionerJob struct { diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index c4cc4246fdc1a..a99a1cefc9884 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -3004,7 +3004,7 @@ func (q *sqlQuerier) DeleteOldProvisionerDaemons(ctx context.Context) error { const getProvisionerDaemons = `-- name: GetProvisionerDaemons :many SELECT - id, created_at, updated_at, name, provisioners, replica_id, tags + id, created_at, updated_at, name, provisioners, replica_id, tags, last_seen_at, version FROM provisioner_daemons ` @@ -3026,6 +3026,8 @@ func (q *sqlQuerier) GetProvisionerDaemons(ctx context.Context) ([]ProvisionerDa pq.Array(&i.Provisioners), &i.ReplicaID, &i.Tags, + &i.LastSeenAt, + &i.Version, ); err != nil { return nil, err } @@ -3051,7 +3053,7 @@ INSERT INTO updated_at ) VALUES - ($1, $2, $3, $4, $5, $6) RETURNING id, created_at, updated_at, name, provisioners, replica_id, tags + ($1, $2, $3, $4, $5, $6) RETURNING id, created_at, updated_at, name, provisioners, replica_id, tags, last_seen_at, version ` type InsertProvisionerDaemonParams struct { @@ -3081,6 +3083,8 @@ func (q *sqlQuerier) InsertProvisionerDaemon(ctx context.Context, arg InsertProv pq.Array(&i.Provisioners), &i.ReplicaID, &i.Tags, + &i.LastSeenAt, + &i.Version, ) return i, err } diff --git a/codersdk/provisionerdaemons.go b/codersdk/provisionerdaemons.go index 0b321e51662ab..ea35fdd70e4c2 100644 --- a/codersdk/provisionerdaemons.go +++ b/codersdk/provisionerdaemons.go @@ -40,7 +40,9 @@ type ProvisionerDaemon struct { ID uuid.UUID `json:"id" format:"uuid"` CreatedAt time.Time `json:"created_at" format:"date-time"` UpdatedAt sql.NullTime `json:"updated_at" format:"date-time"` + LastSeenAt NullTime `json:"last_seen_at,omitempty" format:"date-time"` Name string `json:"name"` + Version string `json:"version"` Provisioners []ProvisionerType `json:"provisioners"` Tags map[string]string `json:"tags"` } diff --git a/docs/api/enterprise.md b/docs/api/enterprise.md index e25b48aedb34a..6393ffc974654 100644 --- a/docs/api/enterprise.md +++ b/docs/api/enterprise.md @@ -700,6 +700,7 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization}/provisi { "created_at": "2019-08-24T14:15:22Z", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "last_seen_at": "2019-08-24T14:15:22Z", "name": "string", "provisioners": ["string"], "tags": { @@ -709,7 +710,8 @@ curl -X GET http://coder-server:8080/api/v2/organizations/{organization}/provisi "updated_at": { "time": "string", "valid": true - } + }, + "version": "string" } ] ``` @@ -729,6 +731,7 @@ Status Code **200** | `[array item]` | array | false | | | | `» created_at` | string(date-time) | false | | | | `» id` | string(uuid) | false | | | +| `» last_seen_at` | string(date-time) | false | | | | `» name` | string | false | | | | `» provisioners` | array | false | | | | `» tags` | object | false | | | @@ -736,6 +739,7 @@ Status Code **200** | `» updated_at` | [sql.NullTime](schemas.md#sqlnulltime) | false | | | | `»» time` | string | false | | | | `»» valid` | boolean | false | | Valid is true if Time is not NULL | +| `» version` | string | false | | | To perform this operation, you must be authenticated. [Learn more](authentication.md). diff --git a/docs/api/schemas.md b/docs/api/schemas.md index cf05ec3ba3f41..97b0e3783caff 100644 --- a/docs/api/schemas.md +++ b/docs/api/schemas.md @@ -3770,6 +3770,7 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in { "created_at": "2019-08-24T14:15:22Z", "id": "497f6eca-6276-4993-bfeb-53cbbbba6f08", + "last_seen_at": "2019-08-24T14:15:22Z", "name": "string", "provisioners": ["string"], "tags": { @@ -3779,7 +3780,8 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in "updated_at": { "time": "string", "valid": true - } + }, + "version": "string" } ``` @@ -3789,11 +3791,13 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in | ------------------ | ---------------------------- | -------- | ------------ | ----------- | | `created_at` | string | false | | | | `id` | string | false | | | +| `last_seen_at` | string | false | | | | `name` | string | false | | | | `provisioners` | array of string | false | | | | `tags` | object | false | | | | » `[any property]` | string | false | | | | `updated_at` | [sql.NullTime](#sqlnulltime) | false | | | +| `version` | string | false | | | ## codersdk.ProvisionerJob diff --git a/enterprise/coderd/provisionerdaemons.go b/enterprise/coderd/provisionerdaemons.go index e10489f45a6c7..f0b824ecbe12f 100644 --- a/enterprise/coderd/provisionerdaemons.go +++ b/enterprise/coderd/provisionerdaemons.go @@ -310,11 +310,13 @@ func (api *API) provisionerDaemonServe(rw http.ResponseWriter, r *http.Request) func convertProvisionerDaemon(daemon database.ProvisionerDaemon) codersdk.ProvisionerDaemon { result := codersdk.ProvisionerDaemon{ - ID: daemon.ID, - CreatedAt: daemon.CreatedAt, - UpdatedAt: daemon.UpdatedAt, - Name: daemon.Name, - Tags: daemon.Tags, + ID: daemon.ID, + CreatedAt: daemon.CreatedAt, + UpdatedAt: daemon.UpdatedAt, + LastSeenAt: codersdk.NullTime{NullTime: daemon.LastSeenAt}, + Name: daemon.Name, + Tags: daemon.Tags, + Version: daemon.Version, } for _, provisionerType := range daemon.Provisioners { result.Provisioners = append(result.Provisioners, codersdk.ProvisionerType(provisionerType)) diff --git a/site/src/api/api.ts b/site/src/api/api.ts index 139c24e7369ad..9513ce023e449 100644 --- a/site/src/api/api.ts +++ b/site/src/api/api.ts @@ -78,6 +78,7 @@ export const provisioners: TypesGen.ProvisionerDaemon[] = [ created_at: "", provisioners: [], tags: {}, + version: "v2.34.5", }, { id: "cdr-basic", @@ -85,6 +86,7 @@ export const provisioners: TypesGen.ProvisionerDaemon[] = [ created_at: "", provisioners: [], tags: {}, + version: "v2.34.5", }, ]; diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index 3f4763e583f79..c73fdfb9a472c 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -748,7 +748,9 @@ export interface ProvisionerDaemon { readonly id: string; readonly created_at: string; readonly updated_at?: string; + readonly last_seen_at?: string; readonly name: string; + readonly version: string; readonly provisioners: ProvisionerType[]; readonly tags: Record; } diff --git a/site/src/testHelpers/entities.ts b/site/src/testHelpers/entities.ts index 6596ed358158b..48ce84c7bcf2b 100644 --- a/site/src/testHelpers/entities.ts +++ b/site/src/testHelpers/entities.ts @@ -325,11 +325,13 @@ export const SuspendedMockUser: TypesGen.User = { }; export const MockProvisioner: TypesGen.ProvisionerDaemon = { - created_at: "", + created_at: "2022-05-17T17:39:01.382927298Z", + updated_at: "2022-05-17T17:39:01.382927298Z", id: "test-provisioner", name: "Test Provisioner", provisioners: ["echo"], tags: {}, + version: "v2.34.5", }; export const MockProvisionerJob: TypesGen.ProvisionerJob = {