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

Lines changed: 1 addition & 1 deletion
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

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

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

coderd/apidoc/swagger.json

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

coderd/database/dbmem/dbmem.go

Lines changed: 39 additions & 0 deletions
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

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

coderd/database/queries/provisionerjobs.sql

Lines changed: 24 additions & 2 deletions
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

Lines changed: 10 additions & 0 deletions
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

Lines changed: 39 additions & 6 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy