Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b04d883

Browse files
authored
feat: add provisioner job metadata (#16454)
This change adds metadata to provisioner jobs to help with rendering related tempaltes and workspaces in the UI. Updates #15084
1 parent 44d9f5f commit b04d883

18 files changed

+666
-167
lines changed

cli/testdata/coder_provisioner_jobs_list_--help.golden

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ OPTIONS:
1111
-O, --org string, $CODER_ORGANIZATION
1212
Select which organization (uuid or name) to use.
1313

14-
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|organization|queue] (default: created at,id,organization,status,type,queue,tags)
14+
-c, --column [id|created at|started at|completed at|canceled at|error|error code|status|worker id|file id|tags|queue position|queue size|organization id|template version id|workspace build id|type|available workers|template version name|template id|template name|template display name|workspace id|workspace name|organization|queue] (default: created at,id,organization,status,type,queue,tags)
1515
Columns to display in table output.
1616

1717
-l, --limit int, $CODER_PROVISIONER_JOB_LIST_LIMIT (default: 50)

cli/testdata/coder_provisioner_jobs_list_--output_json.golden

+14
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@
1818
"template_version_id": "============[version ID]============"
1919
},
2020
"type": "template_version_import",
21+
"metadata": {
22+
"template_version_name": "===========[version name]===========",
23+
"template_id": "===========[template ID]============",
24+
"template_name": "test-template",
25+
"template_display_name": ""
26+
},
2127
"organization_name": "Coder"
2228
},
2329
{
@@ -39,6 +45,14 @@
3945
"workspace_build_id": "========[workspace build ID]========"
4046
},
4147
"type": "workspace_build",
48+
"metadata": {
49+
"template_version_name": "===========[version name]===========",
50+
"template_id": "===========[template ID]============",
51+
"template_name": "test-template",
52+
"template_display_name": "",
53+
"workspace_id": "===========[workspace ID]===========",
54+
"workspace_name": "test-workspace"
55+
},
4256
"organization_name": "Coder"
4357
}
4458
]

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/database/dbmem/dbmem.go

+39
Original file line numberDiff line numberDiff line change
@@ -4117,6 +4117,45 @@ func (q *FakeQuerier) GetProvisionerJobsByOrganizationAndStatusWithQueuePosition
41174117
QueuePosition: rowQP.QueuePosition,
41184118
QueueSize: rowQP.QueueSize,
41194119
}
4120+
4121+
// Start add metadata.
4122+
var input codersdk.ProvisionerJobInput
4123+
err := json.Unmarshal([]byte(job.Input), &input)
4124+
if err != nil {
4125+
return nil, err
4126+
}
4127+
templateVersionID := input.TemplateVersionID
4128+
if input.WorkspaceBuildID != nil {
4129+
workspaceBuild, err := q.getWorkspaceBuildByIDNoLock(ctx, *input.WorkspaceBuildID)
4130+
if err != nil {
4131+
return nil, err
4132+
}
4133+
workspace, err := q.getWorkspaceByIDNoLock(ctx, workspaceBuild.WorkspaceID)
4134+
if err != nil {
4135+
return nil, err
4136+
}
4137+
row.WorkspaceID = uuid.NullUUID{UUID: workspace.ID, Valid: true}
4138+
row.WorkspaceName = workspace.Name
4139+
if templateVersionID == nil {
4140+
templateVersionID = &workspaceBuild.TemplateVersionID
4141+
}
4142+
}
4143+
if templateVersionID != nil {
4144+
templateVersion, err := q.getTemplateVersionByIDNoLock(ctx, *templateVersionID)
4145+
if err != nil {
4146+
return nil, err
4147+
}
4148+
row.TemplateVersionName = templateVersion.Name
4149+
template, err := q.getTemplateByIDNoLock(ctx, templateVersion.TemplateID.UUID)
4150+
if err != nil {
4151+
return nil, err
4152+
}
4153+
row.TemplateID = uuid.NullUUID{UUID: template.ID, Valid: true}
4154+
row.TemplateName = template.Name
4155+
row.TemplateDisplayName = template.DisplayName
4156+
}
4157+
// End add metadata.
4158+
41204159
if row.QueuePosition > 0 {
41214160
var availableWorkers []database.ProvisionerDaemon
41224161
for _, daemon := range q.provisionerDaemons {

coderd/database/queries.sql.go

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

coderd/database/queries/provisionerjobs.sql

+24-2
Original file line numberDiff line numberDiff line change
@@ -130,21 +130,43 @@ SELECT
130130
AND pj.organization_id = pd.organization_id
131131
AND pj.provisioner = ANY(pd.provisioners)
132132
AND provisioner_tagset_contains(pd.tags, pj.tags)
133-
) AS available_workers
133+
) AS available_workers,
134+
-- Include template and workspace information.
135+
COALESCE(tv.name, '') AS template_version_name,
136+
t.id AS template_id,
137+
COALESCE(t.name, '') AS template_name,
138+
COALESCE(t.display_name, '') AS template_display_name,
139+
w.id AS workspace_id,
140+
COALESCE(w.name, '') AS workspace_name
134141
FROM
135142
provisioner_jobs pj
136143
LEFT JOIN
137144
queue_position qp ON qp.id = pj.id
138145
LEFT JOIN
139146
queue_size qs ON TRUE
147+
LEFT JOIN
148+
workspace_builds wb ON wb.id = CASE WHEN pj.input ? 'workspace_build_id' THEN (pj.input->>'workspace_build_id')::uuid END
149+
LEFT JOIN
150+
workspaces w ON wb.workspace_id = w.id
151+
LEFT JOIN
152+
-- We should always have a template version, either explicitly or implicitly via workspace build.
153+
template_versions tv ON tv.id = CASE WHEN pj.input ? 'template_version_id' THEN (pj.input->>'template_version_id')::uuid ELSE wb.template_version_id END
154+
LEFT JOIN
155+
templates t ON tv.template_id = t.id
140156
WHERE
141157
(sqlc.narg('organization_id')::uuid IS NULL OR pj.organization_id = @organization_id)
142158
AND (COALESCE(array_length(@ids::uuid[], 1), 0) = 0 OR pj.id = ANY(@ids::uuid[]))
143159
AND (COALESCE(array_length(@status::provisioner_job_status[], 1), 0) = 0 OR pj.job_status = ANY(@status::provisioner_job_status[]))
144160
GROUP BY
145161
pj.id,
146162
qp.queue_position,
147-
qs.count
163+
qs.count,
164+
tv.name,
165+
t.id,
166+
t.name,
167+
t.display_name,
168+
w.id,
169+
w.name
148170
ORDER BY
149171
pj.created_at DESC
150172
LIMIT

coderd/provisionerjobs.go

+10
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,16 @@ func convertProvisionerJobWithQueuePosition(pj database.GetProvisionerJobsByOrga
388388
QueueSize: pj.QueueSize,
389389
})
390390
job.AvailableWorkers = pj.AvailableWorkers
391+
job.Metadata = &codersdk.ProvisionerJobMetadata{
392+
TemplateVersionName: pj.TemplateVersionName,
393+
TemplateID: pj.TemplateID.UUID,
394+
TemplateName: pj.TemplateName,
395+
TemplateDisplayName: pj.TemplateDisplayName,
396+
WorkspaceName: pj.WorkspaceName,
397+
}
398+
if pj.WorkspaceID.Valid {
399+
job.Metadata.WorkspaceID = &pj.WorkspaceID.UUID
400+
}
391401
return job
392402
}
393403

coderd/provisionerjobs_test.go

+39-6
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"time"
99

1010
"github.com/google/uuid"
11+
"github.com/stretchr/testify/assert"
1112
"github.com/stretchr/testify/require"
1213

1314
"github.com/coder/coder/v2/coderd/coderdtest"
@@ -72,13 +73,45 @@ func TestProvisionerJobs(t *testing.T) {
7273

7374
t.Run("Single", func(t *testing.T) {
7475
t.Parallel()
75-
t.Run("OK", func(t *testing.T) {
76+
t.Run("Workspace", func(t *testing.T) {
7677
t.Parallel()
77-
ctx := testutil.Context(t, testutil.WaitMedium)
78-
// Note this calls the single job endpoint.
79-
job2, err := templateAdminClient.OrganizationProvisionerJob(ctx, owner.OrganizationID, job.ID)
80-
require.NoError(t, err)
81-
require.Equal(t, job.ID, job2.ID)
78+
t.Run("OK", func(t *testing.T) {
79+
t.Parallel()
80+
ctx := testutil.Context(t, testutil.WaitMedium)
81+
// Note this calls the single job endpoint.
82+
job2, err := templateAdminClient.OrganizationProvisionerJob(ctx, owner.OrganizationID, job.ID)
83+
require.NoError(t, err)
84+
require.Equal(t, job.ID, job2.ID)
85+
86+
// Verify that job metadata is correct.
87+
assert.Equal(t, job2.Metadata, &codersdk.ProvisionerJobMetadata{
88+
TemplateVersionName: version.Name,
89+
TemplateID: template.ID,
90+
TemplateName: template.Name,
91+
TemplateDisplayName: template.DisplayName,
92+
WorkspaceID: &w.ID,
93+
WorkspaceName: w.Name,
94+
})
95+
})
96+
})
97+
t.Run("Template Import", func(t *testing.T) {
98+
t.Parallel()
99+
t.Run("OK", func(t *testing.T) {
100+
t.Parallel()
101+
ctx := testutil.Context(t, testutil.WaitMedium)
102+
// Note this calls the single job endpoint.
103+
job2, err := templateAdminClient.OrganizationProvisionerJob(ctx, owner.OrganizationID, version.Job.ID)
104+
require.NoError(t, err)
105+
require.Equal(t, version.Job.ID, job2.ID)
106+
107+
// Verify that job metadata is correct.
108+
assert.Equal(t, job2.Metadata, &codersdk.ProvisionerJobMetadata{
109+
TemplateVersionName: version.Name,
110+
TemplateID: template.ID,
111+
TemplateName: template.Name,
112+
TemplateDisplayName: template.DisplayName,
113+
})
114+
})
82115
})
83116
t.Run("Missing", func(t *testing.T) {
84117
t.Parallel()

0 commit comments

Comments
 (0)