Skip to content

Commit 258920d

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

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

coderd/workspacebuilds.go

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -948,33 +948,17 @@ func (api *API) convertWorkspaceBuild(
948948
}
949949

950950
func convertWorkspaceResource(resource database.WorkspaceResource, agents []codersdk.WorkspaceAgent, metadata []database.WorkspaceResourceMetadatum) codersdk.WorkspaceResource {
951-
metadataMap := map[string]database.WorkspaceResourceMetadatum{}
952-
953-
// implicit metadata fields come first
954-
metadataMap["type"] = database.WorkspaceResourceMetadatum{
955-
Key: "type",
956-
Value: sql.NullString{String: resource.Type, Valid: true},
957-
Sensitive: false,
958-
}
959-
// explicit metadata fields come afterward, and can override implicit ones
960-
for _, field := range metadata {
961-
metadataMap[field.Key] = field
962-
}
963-
951+
slices.SortFunc(metadata, func(a, b database.WorkspaceResourceMetadatum) bool {
952+
return a.ID < b.ID
953+
})
964954
var convertedMetadata []codersdk.WorkspaceResourceMetadata
965-
for _, field := range metadataMap {
966-
if field.Value.Valid {
967-
convertedField := codersdk.WorkspaceResourceMetadata{
968-
Key: field.Key,
969-
Value: field.Value.String,
970-
Sensitive: field.Sensitive,
971-
}
972-
convertedMetadata = append(convertedMetadata, convertedField)
973-
}
955+
for _, field := range metadata {
956+
convertedMetadata = append(convertedMetadata, codersdk.WorkspaceResourceMetadata{
957+
Key: field.Key,
958+
Value: field.Value.String,
959+
Sensitive: field.Sensitive,
960+
})
974961
}
975-
slices.SortFunc(convertedMetadata, func(a, b codersdk.WorkspaceResourceMetadata) bool {
976-
return a.Key < b.Key
977-
})
978962

979963
return codersdk.WorkspaceResource{
980964
ID: resource.ID,

coderd/workspaces_test.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1770,17 +1770,14 @@ func TestWorkspaceResource(t *testing.T) {
17701770
require.NoError(t, err)
17711771
metadata := workspace.LatestBuild.Resources[0].Metadata
17721772
require.Equal(t, []codersdk.WorkspaceResourceMetadata{{
1773-
Key: "empty",
1774-
}, {
17751773
Key: "foo",
17761774
Value: "bar",
1775+
}, {
1776+
Key: "empty",
17771777
}, {
17781778
Key: "secret",
17791779
Value: "squirrel",
17801780
Sensitive: true,
1781-
}, {
1782-
Key: "type",
1783-
Value: "example",
17841781
}}, metadata)
17851782
})
17861783
}

site/src/components/Resources/ResourceCard.stories.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ BunchOfMetadata.args = {
3131
resource: {
3232
...MockWorkspaceResource,
3333
metadata: [
34-
{ key: "type", value: "kubernetes_pod", sensitive: false },
3534
{
3635
key: "CPU(limits, requests)",
3736
value: "2 cores, 500m",

site/src/components/Resources/ResourceCard.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ export const ResourceCard: FC<ResourceCardProps> = ({ resource, agentRow }) => {
2222
const [shouldDisplayAllMetadata, setShouldDisplayAllMetadata] =
2323
useState(false)
2424
const styles = useStyles()
25-
const metadataToDisplay =
26-
// Type is already displayed in the header
27-
resource.metadata?.filter((data) => data.key !== "type") ?? []
25+
const metadataToDisplay = resource.metadata ?? []
2826
const visibleMetadata = shouldDisplayAllMetadata
2927
? metadataToDisplay
3028
: metadataToDisplay.slice(0, 4)

0 commit comments

Comments
 (0)