@@ -377,6 +377,11 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
377
377
state = createBuild .ProvisionerState
378
378
}
379
379
380
+ var parameters []codersdk.WorkspaceBuildParameter
381
+ if createBuild .RichParameterValues != nil {
382
+ parameters = createBuild .RichParameterValues
383
+ }
384
+
380
385
if createBuild .Orphan {
381
386
if createBuild .Transition != codersdk .WorkspaceTransitionDelete {
382
387
httpapi .Write (ctx ,rw ,http .StatusBadRequest , codersdk.Response {
@@ -449,6 +454,24 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
449
454
state = priorHistory .ProvisionerState
450
455
}
451
456
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
+
452
475
var workspaceBuild database.WorkspaceBuild
453
476
var provisionerJob database.ProvisionerJob
454
477
// 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) {
532
555
return xerrors .Errorf ("insert workspace build: %w" ,err )
533
556
}
534
557
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
+
535
573
return nil
536
574
},nil )
537
575
if err != nil {
@@ -716,6 +754,42 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request)
716
754
api .provisionerJobResources (rw ,r ,job )
717
755
}
718
756
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
+
719
793
// @Summary Get workspace build logs
720
794
// @ID get-workspace-build-logs
721
795
// @Security CoderSessionToken
@@ -1084,3 +1158,16 @@ func convertWorkspaceStatus(jobStatus codersdk.ProvisionerJobStatus, transition
1084
1158
// return error status since we should never get here
1085
1159
return codersdk .WorkspaceStatusFailed
1086
1160
}
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
+ }