Skip to content

Commit 1b0560c

Browse files
authored
feat: Expose workspace build parameters via API (#5743)
1 parent 985fac6 commit 1b0560c

File tree

13 files changed

+461
-43
lines changed

13 files changed

+461
-43
lines changed

coderd/apidoc/docs.go

Lines changed: 54 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: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ func New(options *Options) *API {
582582
r.Get("/", api.workspaceBuild)
583583
r.Patch("/cancel", api.patchCancelWorkspaceBuild)
584584
r.Get("/logs", api.workspaceBuildLogs)
585+
r.Get("/parameters", api.workspaceBuildParameters)
585586
r.Get("/resources", api.workspaceBuildResources)
586587
r.Get("/state", api.workspaceBuildState)
587588
})

coderd/database/databasefake/databasefake.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1372,7 +1372,7 @@ func (q *fakeQuerier) GetWorkspaceBuildParameters(_ context.Context, workspaceBu
13721372
defer q.mutex.RUnlock()
13731373

13741374
params := make([]database.WorkspaceBuildParameter, 0)
1375-
for _, param := range params {
1375+
for _, param := range q.workspaceBuildParameters {
13761376
if param.WorkspaceBuildID != workspaceBuildID {
13771377
continue
13781378
}

coderd/workspacebuilds.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,11 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
377377
state = createBuild.ProvisionerState
378378
}
379379

380+
var parameters []codersdk.WorkspaceBuildParameter
381+
if createBuild.RichParameterValues != nil {
382+
parameters = createBuild.RichParameterValues
383+
}
384+
380385
if createBuild.Orphan {
381386
if createBuild.Transition != codersdk.WorkspaceTransitionDelete {
382387
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
@@ -449,6 +454,24 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
449454
state = priorHistory.ProvisionerState
450455
}
451456

457+
if parameters == nil {
458+
buildParameters, err := api.Database.GetWorkspaceBuildParameters(ctx, priorHistory.ID)
459+
if err != nil {
460+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
461+
Message: "Internal error fetching prior workspace build parameters.",
462+
Detail: err.Error(),
463+
})
464+
return
465+
}
466+
parameters = make([]codersdk.WorkspaceBuildParameter, 0, len(buildParameters))
467+
for _, param := range buildParameters {
468+
parameters = append(parameters, codersdk.WorkspaceBuildParameter{
469+
Name: param.Name,
470+
Value: param.Value,
471+
})
472+
}
473+
}
474+
452475
var workspaceBuild database.WorkspaceBuild
453476
var provisionerJob database.ProvisionerJob
454477
// This must happen in a transaction to ensure history can be inserted, and
@@ -532,6 +555,21 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
532555
return xerrors.Errorf("insert workspace build: %w", err)
533556
}
534557

558+
names := make([]string, 0, len(parameters))
559+
values := make([]string, 0, len(parameters))
560+
for _, param := range parameters {
561+
names = append(names, param.Name)
562+
values = append(values, param.Value)
563+
}
564+
err = db.InsertWorkspaceBuildParameters(ctx, database.InsertWorkspaceBuildParametersParams{
565+
WorkspaceBuildID: workspaceBuildID,
566+
Name: names,
567+
Value: values,
568+
})
569+
if err != nil {
570+
return xerrors.Errorf("insert workspace build parameter: %w", err)
571+
}
572+
535573
return nil
536574
}, nil)
537575
if err != nil {
@@ -716,6 +754,42 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request)
716754
api.provisionerJobResources(rw, r, job)
717755
}
718756

757+
// @Summary Get build parameters for workspace build
758+
// @ID get-build-parameters-for-workspace-build
759+
// @Security CoderSessionToken
760+
// @Produce json
761+
// @Tags Builds
762+
// @Param workspacebuild path string true "Workspace build ID"
763+
// @Success 200 {array} codersdk.WorkspaceBuildParameter
764+
// @Router /workspacebuilds/{workspacebuild}/parameters [get]
765+
func (api *API) workspaceBuildParameters(rw http.ResponseWriter, r *http.Request) {
766+
ctx := r.Context()
767+
workspaceBuild := httpmw.WorkspaceBuildParam(r)
768+
workspace, err := api.Database.GetWorkspaceByID(ctx, workspaceBuild.WorkspaceID)
769+
if err != nil {
770+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
771+
Message: "No workspace exists for this job.",
772+
})
773+
return
774+
}
775+
776+
if !api.Authorize(r, rbac.ActionRead, workspace) {
777+
httpapi.ResourceNotFound(rw)
778+
return
779+
}
780+
781+
parameters, err := api.Database.GetWorkspaceBuildParameters(ctx, workspaceBuild.ID)
782+
if err != nil {
783+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
784+
Message: "Internal error fetching workspace build parameters.",
785+
Detail: err.Error(),
786+
})
787+
return
788+
}
789+
apiParameters := convertWorkspaceBuildParameters(parameters)
790+
httpapi.Write(ctx, rw, http.StatusOK, apiParameters)
791+
}
792+
719793
// @Summary Get workspace build logs
720794
// @ID get-workspace-build-logs
721795
// @Security CoderSessionToken
@@ -1084,3 +1158,16 @@ func convertWorkspaceStatus(jobStatus codersdk.ProvisionerJobStatus, transition
10841158
// return error status since we should never get here
10851159
return codersdk.WorkspaceStatusFailed
10861160
}
1161+
1162+
func convertWorkspaceBuildParameters(parameters []database.WorkspaceBuildParameter) []codersdk.WorkspaceBuildParameter {
1163+
var apiParameters = make([]codersdk.WorkspaceBuildParameter, 0, len(parameters))
1164+
1165+
for _, p := range parameters {
1166+
apiParameter := codersdk.WorkspaceBuildParameter{
1167+
Name: p.Name,
1168+
Value: p.Value,
1169+
}
1170+
apiParameters = append(apiParameters, apiParameter)
1171+
}
1172+
return apiParameters
1173+
}

0 commit comments

Comments
 (0)