Skip to content

Commit 8a28112

Browse files
authored
feat: Add backend API support for resource metadata (#3242)
* Initial support for metadata in provisioner API and Terraform provisioner * add support for nullable metadata fields * handle metadata fields in provisionerd and API
1 parent 8775192 commit 8a28112

24 files changed

+1231
-214
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,22 @@ func New() database.Store {
2626
organizations: make([]database.Organization, 0),
2727
users: make([]database.User, 0),
2828

29-
auditLogs: make([]database.AuditLog, 0),
30-
files: make([]database.File, 0),
31-
gitSSHKey: make([]database.GitSSHKey, 0),
32-
parameterSchemas: make([]database.ParameterSchema, 0),
33-
parameterValues: make([]database.ParameterValue, 0),
34-
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
35-
provisionerJobAgents: make([]database.WorkspaceAgent, 0),
36-
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
37-
provisionerJobResources: make([]database.WorkspaceResource, 0),
38-
provisionerJobs: make([]database.ProvisionerJob, 0),
39-
templateVersions: make([]database.TemplateVersion, 0),
40-
templates: make([]database.Template, 0),
41-
workspaceBuilds: make([]database.WorkspaceBuild, 0),
42-
workspaceApps: make([]database.WorkspaceApp, 0),
43-
workspaces: make([]database.Workspace, 0),
29+
auditLogs: make([]database.AuditLog, 0),
30+
files: make([]database.File, 0),
31+
gitSSHKey: make([]database.GitSSHKey, 0),
32+
parameterSchemas: make([]database.ParameterSchema, 0),
33+
parameterValues: make([]database.ParameterValue, 0),
34+
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
35+
provisionerJobAgents: make([]database.WorkspaceAgent, 0),
36+
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
37+
provisionerJobResources: make([]database.WorkspaceResource, 0),
38+
provisionerJobResourceMetadata: make([]database.WorkspaceResourceMetadatum, 0),
39+
provisionerJobs: make([]database.ProvisionerJob, 0),
40+
templateVersions: make([]database.TemplateVersion, 0),
41+
templates: make([]database.Template, 0),
42+
workspaceBuilds: make([]database.WorkspaceBuild, 0),
43+
workspaceApps: make([]database.WorkspaceApp, 0),
44+
workspaces: make([]database.Workspace, 0),
4445
},
4546
}
4647
}
@@ -74,21 +75,22 @@ type data struct {
7475
users []database.User
7576

7677
// New tables
77-
auditLogs []database.AuditLog
78-
files []database.File
79-
gitSSHKey []database.GitSSHKey
80-
parameterSchemas []database.ParameterSchema
81-
parameterValues []database.ParameterValue
82-
provisionerDaemons []database.ProvisionerDaemon
83-
provisionerJobAgents []database.WorkspaceAgent
84-
provisionerJobLogs []database.ProvisionerJobLog
85-
provisionerJobResources []database.WorkspaceResource
86-
provisionerJobs []database.ProvisionerJob
87-
templateVersions []database.TemplateVersion
88-
templates []database.Template
89-
workspaceBuilds []database.WorkspaceBuild
90-
workspaceApps []database.WorkspaceApp
91-
workspaces []database.Workspace
78+
auditLogs []database.AuditLog
79+
files []database.File
80+
gitSSHKey []database.GitSSHKey
81+
parameterSchemas []database.ParameterSchema
82+
parameterValues []database.ParameterValue
83+
provisionerDaemons []database.ProvisionerDaemon
84+
provisionerJobAgents []database.WorkspaceAgent
85+
provisionerJobLogs []database.ProvisionerJobLog
86+
provisionerJobResources []database.WorkspaceResource
87+
provisionerJobResourceMetadata []database.WorkspaceResourceMetadatum
88+
provisionerJobs []database.ProvisionerJob
89+
templateVersions []database.TemplateVersion
90+
templates []database.Template
91+
workspaceBuilds []database.WorkspaceBuild
92+
workspaceApps []database.WorkspaceApp
93+
workspaces []database.Workspace
9294

9395
deploymentID string
9496
}
@@ -1331,6 +1333,34 @@ func (q *fakeQuerier) GetWorkspaceResourcesCreatedAfter(_ context.Context, after
13311333
return resources, nil
13321334
}
13331335

1336+
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceID(_ context.Context, id uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
1337+
q.mutex.RLock()
1338+
defer q.mutex.RUnlock()
1339+
1340+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
1341+
for _, metadatum := range q.provisionerJobResourceMetadata {
1342+
if metadatum.WorkspaceResourceID.String() == id.String() {
1343+
metadata = append(metadata, metadatum)
1344+
}
1345+
}
1346+
return metadata, nil
1347+
}
1348+
1349+
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceIDs(_ context.Context, ids []uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
1350+
q.mutex.RLock()
1351+
defer q.mutex.RUnlock()
1352+
1353+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
1354+
for _, metadatum := range q.provisionerJobResourceMetadata {
1355+
for _, id := range ids {
1356+
if metadatum.WorkspaceResourceID.String() == id.String() {
1357+
metadata = append(metadata, metadatum)
1358+
}
1359+
}
1360+
}
1361+
return metadata, nil
1362+
}
1363+
13341364
func (q *fakeQuerier) GetProvisionerJobsByIDs(_ context.Context, ids []uuid.UUID) ([]database.ProvisionerJob, error) {
13351365
q.mutex.RLock()
13361366
defer q.mutex.RUnlock()
@@ -1659,6 +1689,21 @@ func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.In
16591689
return resource, nil
16601690
}
16611691

1692+
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) (database.WorkspaceResourceMetadatum, error) {
1693+
q.mutex.Lock()
1694+
defer q.mutex.Unlock()
1695+
1696+
//nolint:gosimple
1697+
metadatum := database.WorkspaceResourceMetadatum{
1698+
WorkspaceResourceID: arg.WorkspaceResourceID,
1699+
Key: arg.Key,
1700+
Value: arg.Value,
1701+
Sensitive: arg.Sensitive,
1702+
}
1703+
q.provisionerJobResourceMetadata = append(q.provisionerJobResourceMetadata, metadatum)
1704+
return metadatum, nil
1705+
}
1706+
16621707
func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) {
16631708
q.mutex.Lock()
16641709
defer q.mutex.Unlock()

coderd/database/dump.sql

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE IF EXISTS workspace_resource_metadata;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE IF NOT EXISTS workspace_resource_metadata (
2+
workspace_resource_id uuid NOT NULL,
3+
key varchar(1024) NOT NULL,
4+
value varchar(65536),
5+
sensitive boolean NOT NULL,
6+
PRIMARY KEY (workspace_resource_id, key),
7+
FOREIGN KEY (workspace_resource_id) REFERENCES workspace_resources (id) ON DELETE CASCADE
8+
);

coderd/database/models.go

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

coderd/database/querier.go

Lines changed: 3 additions & 0 deletions
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: 105 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaceresources.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,25 @@ INSERT INTO
2222
workspace_resources (id, created_at, job_id, transition, type, name)
2323
VALUES
2424
($1, $2, $3, $4, $5, $6) RETURNING *;
25+
26+
-- name: GetWorkspaceResourceMetadataByResourceID :many
27+
SELECT
28+
*
29+
FROM
30+
workspace_resource_metadata
31+
WHERE
32+
workspace_resource_id = $1;
33+
34+
-- name: GetWorkspaceResourceMetadataByResourceIDs :many
35+
SELECT
36+
*
37+
FROM
38+
workspace_resource_metadata
39+
WHERE
40+
workspace_resource_id = ANY(@ids :: uuid [ ]);
41+
42+
-- name: InsertWorkspaceResourceMetadata :one
43+
INSERT INTO
44+
workspace_resource_metadata (workspace_resource_id, key, value, sensitive)
45+
VALUES
46+
($1, $2, $3, $4) RETURNING *;

coderd/provisionerdaemons.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,25 @@ func insertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.
829829
snapshot.WorkspaceApps = append(snapshot.WorkspaceApps, telemetry.ConvertWorkspaceApp(dbApp))
830830
}
831831
}
832+
833+
for _, metadatum := range protoResource.Metadata {
834+
var value sql.NullString
835+
if !metadatum.IsNull {
836+
value.String = metadatum.Value
837+
value.Valid = true
838+
}
839+
840+
_, err := db.InsertWorkspaceResourceMetadata(ctx, database.InsertWorkspaceResourceMetadataParams{
841+
WorkspaceResourceID: resource.ID,
842+
Key: metadatum.Key,
843+
Value: value,
844+
Sensitive: metadatum.Sensitive,
845+
})
846+
if err != nil {
847+
return xerrors.Errorf("insert metadata: %w", err)
848+
}
849+
}
850+
832851
return nil
833852
}
834853

0 commit comments

Comments
 (0)