Skip to content

Commit 258920d

Browse files
committed
fix: preserve workspace resource metadata order
Fixes #4511.
1 parent 8e702d8 commit 258920d

File tree

15 files changed

+132
-101
lines changed

15 files changed

+132
-101
lines changed

coderd/database/databasefake/databasefake.go

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2549,19 +2549,31 @@ func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.In
25492549
return resource, nil
25502550
}
25512551

2552-
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) (database.WorkspaceResourceMetadatum, error) {
2552+
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) ([]database.WorkspaceResourceMetadatum, error) {
25532553
q.mutex.Lock()
25542554
defer q.mutex.Unlock()
25552555

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
2556+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
2557+
id := int64(1)
2558+
if len(q.workspaceResourceMetadata) > 0 {
2559+
id = q.workspaceResourceMetadata[len(q.workspaceResourceMetadata)-1].ID
2560+
}
2561+
for index, key := range arg.Key {
2562+
id++
2563+
value := arg.Value[index]
2564+
metadata = append(metadata, database.WorkspaceResourceMetadatum{
2565+
ID: id,
2566+
WorkspaceResourceID: arg.WorkspaceResourceID,
2567+
Key: key,
2568+
Value: sql.NullString{
2569+
String: value,
2570+
Valid: value != "",
2571+
},
2572+
Sensitive: arg.Sensitive[index],
2573+
})
2574+
}
2575+
q.workspaceResourceMetadata = append(q.workspaceResourceMetadata, metadata...)
2576+
return metadata, nil
25652577
}
25662578

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

coderd/database/dump.sql

Lines changed: 17 additions & 2 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+
ALTER TABLE workspace_resource_metadata DROP COLUMN index;
Lines changed: 5 additions & 0 deletions
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

Lines changed: 1 addition & 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: 1 addition & 1 deletion
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: 47 additions & 24 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: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,14 @@ FROM
4747
WHERE
4848
workspace_resource_id = ANY(@ids :: uuid [ ]);
4949

50-
-- name: InsertWorkspaceResourceMetadata :one
50+
-- name: InsertWorkspaceResourceMetadata :many
5151
INSERT INTO
52-
workspace_resource_metadata (workspace_resource_id, key, value, sensitive)
53-
VALUES
54-
($1, $2, $3, $4) RETURNING *;
52+
workspace_resource_metadata
53+
SELECT
54+
@workspace_resource_id :: uuid AS workspace_resource_id,
55+
unnest(@key :: text [ ]) AS key,
56+
unnest(@value :: text [ ]) AS value,
57+
unnest(@sensitive :: boolean [ ]) AS sensitive RETURNING *;
5558

5659
-- name: GetWorkspaceResourceMetadataCreatedAfter :many
5760
SELECT * FROM workspace_resource_metadata WHERE workspace_resource_id = ANY(

coderd/database/unique_constraint.go

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

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 15 additions & 14 deletions
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)