Skip to content

Commit 84995b7

Browse files
authored
fix: preserve workspace resource metadata order (#5421)
Fixes #4511.
1 parent c0b251a commit 84995b7

15 files changed

+132
-161
lines changed

coderd/database/databasefake/databasefake.go

+22-23
Original file line numberDiff line numberDiff line change
@@ -2193,19 +2193,6 @@ func (q *fakeQuerier) GetWorkspaceResourceMetadataCreatedAfter(ctx context.Conte
21932193
return metadata, nil
21942194
}
21952195

2196-
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceID(_ context.Context, id uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
2197-
q.mutex.RLock()
2198-
defer q.mutex.RUnlock()
2199-
2200-
metadata := make([]database.WorkspaceResourceMetadatum, 0)
2201-
for _, metadatum := range q.workspaceResourceMetadata {
2202-
if metadatum.WorkspaceResourceID == id {
2203-
metadata = append(metadata, metadatum)
2204-
}
2205-
}
2206-
return metadata, nil
2207-
}
2208-
22092196
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceIDs(_ context.Context, ids []uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
22102197
q.mutex.RLock()
22112198
defer q.mutex.RUnlock()
@@ -2549,19 +2536,31 @@ func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.In
25492536
return resource, nil
25502537
}
25512538

2552-
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) (database.WorkspaceResourceMetadatum, error) {
2539+
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) ([]database.WorkspaceResourceMetadatum, error) {
25532540
q.mutex.Lock()
25542541
defer q.mutex.Unlock()
25552542

2556-
//nolint:gosimple
2557-
metadatum := database.WorkspaceResourceMetadatum{
2558-
WorkspaceResourceID: arg.WorkspaceResourceID,
2559-
Key: arg.Key,
2560-
Value: arg.Value,
2561-
Sensitive: arg.Sensitive,
2562-
}
2563-
q.workspaceResourceMetadata = append(q.workspaceResourceMetadata, metadatum)
2564-
return metadatum, nil
2543+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
2544+
id := int64(1)
2545+
if len(q.workspaceResourceMetadata) > 0 {
2546+
id = q.workspaceResourceMetadata[len(q.workspaceResourceMetadata)-1].ID
2547+
}
2548+
for index, key := range arg.Key {
2549+
id++
2550+
value := arg.Value[index]
2551+
metadata = append(metadata, database.WorkspaceResourceMetadatum{
2552+
ID: id,
2553+
WorkspaceResourceID: arg.WorkspaceResourceID,
2554+
Key: key,
2555+
Value: sql.NullString{
2556+
String: value,
2557+
Valid: value != "",
2558+
},
2559+
Sensitive: arg.Sensitive[index],
2560+
})
2561+
}
2562+
q.workspaceResourceMetadata = append(q.workspaceResourceMetadata, metadata...)
2563+
return metadata, nil
25652564
}
25662565

25672566
func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) {

coderd/database/dump.sql

+17-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
ALTER TABLE workspace_resource_metadata DROP COLUMN id;
2+
ALTER TABLE workspace_resource_metadata DROP CONSTRAINT workspace_resource_metadata_name;
3+
ALTER TABLE workspace_resource_metadata ADD CONSTRAINT workspace_resource_metadata_pkey PRIMARY KEY (workspace_resource_id, key);
4+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
ALTER TABLE workspace_resource_metadata DROP CONSTRAINT workspace_resource_metadata_pkey;
2+
3+
ALTER TABLE workspace_resource_metadata ADD COLUMN id BIGSERIAL PRIMARY KEY;
4+
5+
ALTER TABLE workspace_resource_metadata ADD CONSTRAINT workspace_resource_metadata_name UNIQUE(workspace_resource_id, key);

coderd/database/models.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

+1-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

+46-61
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaceresources.sql

+8-13
Original file line numberDiff line numberDiff line change
@@ -31,27 +31,22 @@ INSERT INTO
3131
VALUES
3232
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING *;
3333

34-
-- name: GetWorkspaceResourceMetadataByResourceID :many
35-
SELECT
36-
*
37-
FROM
38-
workspace_resource_metadata
39-
WHERE
40-
workspace_resource_id = $1;
41-
4234
-- name: GetWorkspaceResourceMetadataByResourceIDs :many
4335
SELECT
4436
*
4537
FROM
4638
workspace_resource_metadata
4739
WHERE
48-
workspace_resource_id = ANY(@ids :: uuid [ ]);
40+
workspace_resource_id = ANY(@ids :: uuid [ ]) ORDER BY id ASC;
4941

50-
-- name: InsertWorkspaceResourceMetadata :one
42+
-- name: InsertWorkspaceResourceMetadata :many
5143
INSERT INTO
52-
workspace_resource_metadata (workspace_resource_id, key, value, sensitive)
53-
VALUES
54-
($1, $2, $3, $4) RETURNING *;
44+
workspace_resource_metadata
45+
SELECT
46+
@workspace_resource_id :: uuid AS workspace_resource_id,
47+
unnest(@key :: text [ ]) AS key,
48+
unnest(@value :: text [ ]) AS value,
49+
unnest(@sensitive :: boolean [ ]) AS sensitive RETURNING *;
5550

5651
-- name: GetWorkspaceResourceMetadataCreatedAfter :many
5752
SELECT * FROM workspace_resource_metadata WHERE workspace_resource_id = ANY(

coderd/database/unique_constraint.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/provisionerdserver/provisionerdserver.go

+15-14
Original file line numberDiff line numberDiff line change
@@ -966,22 +966,23 @@ func InsertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.
966966
}
967967
}
968968

969+
arg := database.InsertWorkspaceResourceMetadataParams{
970+
WorkspaceResourceID: resource.ID,
971+
Key: []string{},
972+
Value: []string{},
973+
Sensitive: []bool{},
974+
}
969975
for _, metadatum := range protoResource.Metadata {
970-
var value sql.NullString
971-
if !metadatum.IsNull {
972-
value.String = metadatum.Value
973-
value.Valid = true
974-
}
975-
976-
_, err := db.InsertWorkspaceResourceMetadata(ctx, database.InsertWorkspaceResourceMetadataParams{
977-
WorkspaceResourceID: resource.ID,
978-
Key: metadatum.Key,
979-
Value: value,
980-
Sensitive: metadatum.Sensitive,
981-
})
982-
if err != nil {
983-
return xerrors.Errorf("insert metadata: %w", err)
976+
if metadatum.IsNull {
977+
continue
984978
}
979+
arg.Key = append(arg.Key, metadatum.Key)
980+
arg.Value = append(arg.Value, metadatum.Value)
981+
arg.Sensitive = append(arg.Sensitive, metadatum.Sensitive)
982+
}
983+
_, err = db.InsertWorkspaceResourceMetadata(ctx, arg)
984+
if err != nil {
985+
return xerrors.Errorf("insert workspace resource metadata: %w", err)
985986
}
986987

987988
return nil

0 commit comments

Comments
 (0)