feat: Expose workspace build parameters via API (#5743)

This commit is contained in:
Marcin Tojek 2023-01-17 16:24:45 +01:00 committed by GitHub
parent 985fac642e
commit 1b0560ceb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 463 additions and 45 deletions

54
coderd/apidoc/docs.go generated
View File

@ -4309,6 +4309,43 @@ const docTemplate = `{
} }
} }
}, },
"/workspacebuilds/{workspacebuild}/parameters": {
"get": {
"security": [
{
"CoderSessionToken": []
}
],
"produces": [
"application/json"
],
"tags": [
"Builds"
],
"summary": "Get build parameters for workspace build",
"operationId": "get-build-parameters-for-workspace-build",
"parameters": [
{
"type": "string",
"description": "Workspace build ID",
"name": "workspacebuild",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
}
}
}
}
}
},
"/workspacebuilds/{workspacebuild}/resources": { "/workspacebuilds/{workspacebuild}/resources": {
"get": { "get": {
"security": [ "security": [
@ -5568,6 +5605,12 @@ const docTemplate = `{
"$ref": "#/definitions/codersdk.CreateParameterRequest" "$ref": "#/definitions/codersdk.CreateParameterRequest"
} }
}, },
"rich_parameter_values": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
}
},
"state": { "state": {
"type": "array", "type": "array",
"items": { "items": {
@ -7896,6 +7939,17 @@ const docTemplate = `{
} }
} }
}, },
"codersdk.WorkspaceBuildParameter": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"codersdk.WorkspaceQuota": { "codersdk.WorkspaceQuota": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -3793,6 +3793,39 @@
} }
} }
}, },
"/workspacebuilds/{workspacebuild}/parameters": {
"get": {
"security": [
{
"CoderSessionToken": []
}
],
"produces": ["application/json"],
"tags": ["Builds"],
"summary": "Get build parameters for workspace build",
"operationId": "get-build-parameters-for-workspace-build",
"parameters": [
{
"type": "string",
"description": "Workspace build ID",
"name": "workspacebuild",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
}
}
}
}
}
},
"/workspacebuilds/{workspacebuild}/resources": { "/workspacebuilds/{workspacebuild}/resources": {
"get": { "get": {
"security": [ "security": [
@ -4930,6 +4963,12 @@
"$ref": "#/definitions/codersdk.CreateParameterRequest" "$ref": "#/definitions/codersdk.CreateParameterRequest"
} }
}, },
"rich_parameter_values": {
"type": "array",
"items": {
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
}
},
"state": { "state": {
"type": "array", "type": "array",
"items": { "items": {
@ -7108,6 +7147,17 @@
} }
} }
}, },
"codersdk.WorkspaceBuildParameter": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
},
"codersdk.WorkspaceQuota": { "codersdk.WorkspaceQuota": {
"type": "object", "type": "object",
"properties": { "properties": {

View File

@ -582,6 +582,7 @@ func New(options *Options) *API {
r.Get("/", api.workspaceBuild) r.Get("/", api.workspaceBuild)
r.Patch("/cancel", api.patchCancelWorkspaceBuild) r.Patch("/cancel", api.patchCancelWorkspaceBuild)
r.Get("/logs", api.workspaceBuildLogs) r.Get("/logs", api.workspaceBuildLogs)
r.Get("/parameters", api.workspaceBuildParameters)
r.Get("/resources", api.workspaceBuildResources) r.Get("/resources", api.workspaceBuildResources)
r.Get("/state", api.workspaceBuildState) r.Get("/state", api.workspaceBuildState)
}) })

View File

@ -1372,7 +1372,7 @@ func (q *fakeQuerier) GetWorkspaceBuildParameters(_ context.Context, workspaceBu
defer q.mutex.RUnlock() defer q.mutex.RUnlock()
params := make([]database.WorkspaceBuildParameter, 0) params := make([]database.WorkspaceBuildParameter, 0)
for _, param := range params { for _, param := range q.workspaceBuildParameters {
if param.WorkspaceBuildID != workspaceBuildID { if param.WorkspaceBuildID != workspaceBuildID {
continue continue
} }

View File

@ -377,6 +377,11 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
state = createBuild.ProvisionerState state = createBuild.ProvisionerState
} }
var parameters []codersdk.WorkspaceBuildParameter
if createBuild.RichParameterValues != nil {
parameters = createBuild.RichParameterValues
}
if createBuild.Orphan { if createBuild.Orphan {
if createBuild.Transition != codersdk.WorkspaceTransitionDelete { if createBuild.Transition != codersdk.WorkspaceTransitionDelete {
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
@ -449,6 +454,24 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
state = priorHistory.ProvisionerState state = priorHistory.ProvisionerState
} }
if parameters == nil {
buildParameters, err := api.Database.GetWorkspaceBuildParameters(ctx, priorHistory.ID)
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Internal error fetching prior workspace build parameters.",
Detail: err.Error(),
})
return
}
parameters = make([]codersdk.WorkspaceBuildParameter, 0, len(buildParameters))
for _, param := range buildParameters {
parameters = append(parameters, codersdk.WorkspaceBuildParameter{
Name: param.Name,
Value: param.Value,
})
}
}
var workspaceBuild database.WorkspaceBuild var workspaceBuild database.WorkspaceBuild
var provisionerJob database.ProvisionerJob var provisionerJob database.ProvisionerJob
// This must happen in a transaction to ensure history can be inserted, and // 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) {
return xerrors.Errorf("insert workspace build: %w", err) return xerrors.Errorf("insert workspace build: %w", err)
} }
names := make([]string, 0, len(parameters))
values := make([]string, 0, len(parameters))
for _, param := range parameters {
names = append(names, param.Name)
values = append(values, param.Value)
}
err = db.InsertWorkspaceBuildParameters(ctx, database.InsertWorkspaceBuildParametersParams{
WorkspaceBuildID: workspaceBuildID,
Name: names,
Value: values,
})
if err != nil {
return xerrors.Errorf("insert workspace build parameter: %w", err)
}
return nil return nil
}, nil) }, nil)
if err != nil { if err != nil {
@ -716,6 +754,42 @@ func (api *API) workspaceBuildResources(rw http.ResponseWriter, r *http.Request)
api.provisionerJobResources(rw, r, job) api.provisionerJobResources(rw, r, job)
} }
// @Summary Get build parameters for workspace build
// @ID get-build-parameters-for-workspace-build
// @Security CoderSessionToken
// @Produce json
// @Tags Builds
// @Param workspacebuild path string true "Workspace build ID"
// @Success 200 {array} codersdk.WorkspaceBuildParameter
// @Router /workspacebuilds/{workspacebuild}/parameters [get]
func (api *API) workspaceBuildParameters(rw http.ResponseWriter, r *http.Request) {
ctx := r.Context()
workspaceBuild := httpmw.WorkspaceBuildParam(r)
workspace, err := api.Database.GetWorkspaceByID(ctx, workspaceBuild.WorkspaceID)
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "No workspace exists for this job.",
})
return
}
if !api.Authorize(r, rbac.ActionRead, workspace) {
httpapi.ResourceNotFound(rw)
return
}
parameters, err := api.Database.GetWorkspaceBuildParameters(ctx, workspaceBuild.ID)
if err != nil {
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
Message: "Internal error fetching workspace build parameters.",
Detail: err.Error(),
})
return
}
apiParameters := convertWorkspaceBuildParameters(parameters)
httpapi.Write(ctx, rw, http.StatusOK, apiParameters)
}
// @Summary Get workspace build logs // @Summary Get workspace build logs
// @ID get-workspace-build-logs // @ID get-workspace-build-logs
// @Security CoderSessionToken // @Security CoderSessionToken
@ -1084,3 +1158,16 @@ func convertWorkspaceStatus(jobStatus codersdk.ProvisionerJobStatus, transition
// return error status since we should never get here // return error status since we should never get here
return codersdk.WorkspaceStatusFailed return codersdk.WorkspaceStatusFailed
} }
func convertWorkspaceBuildParameters(parameters []database.WorkspaceBuildParameter) []codersdk.WorkspaceBuildParameter {
var apiParameters = make([]codersdk.WorkspaceBuildParameter, 0, len(parameters))
for _, p := range parameters {
apiParameter := codersdk.WorkspaceBuildParameter{
Name: p.Name,
Value: p.Value,
}
apiParameters = append(apiParameters, apiParameter)
}
return apiParameters
}

View File

@ -636,52 +636,106 @@ func TestWorkspaceBuildStatus(t *testing.T) {
func TestWorkspaceBuildWithRichParameters(t *testing.T) { func TestWorkspaceBuildWithRichParameters(t *testing.T) {
t.Parallel() t.Parallel()
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) const (
user := coderdtest.CreateFirstUser(t, client) firstParameterName = "first_parameter"
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ firstParameterDescription = "This is first parameter"
firstParameterValue = "1"
secondParameterName = "second_parameter"
secondParameterDescription = "This is second parameter"
secondParameterValue = "2"
)
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
{Name: firstParameterName, Value: firstParameterValue},
{Name: secondParameterName, Value: secondParameterValue},
}
echoResponses := &echo.Responses{
Parse: echo.ParseComplete, Parse: echo.ParseComplete,
ProvisionPlan: []*proto.Provision_Response{ ProvisionPlan: []*proto.Provision_Response{
{ {
Type: &proto.Provision_Response_Complete{ Type: &proto.Provision_Response_Complete{
Complete: &proto.Provision_Complete{ Complete: &proto.Provision_Complete{
Parameters: []*proto.RichParameter{ Parameters: []*proto.RichParameter{
{ {Name: firstParameterName, Description: firstParameterDescription},
Name: "first_parameter", {Name: secondParameterName, Description: secondParameterDescription},
Description: "This is first parameter",
},
{
Name: "second_parameter",
Description: "This is second parameter",
},
}, },
}, },
}, },
}}, }},
}) ProvisionApply: []*proto.Provision_Response{{
coderdtest.AwaitTemplateVersionJob(t, client, version.ID) Type: &proto.Provision_Response_Complete{
Complete: &proto.Provision_Complete{},
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
richParameters, err := client.TemplateVersionRichParameters(ctx, version.ID)
require.NoError(t, err)
require.Len(t, richParameters, 2)
require.Equal(t, richParameters[0].Name, "first_parameter")
require.Equal(t, richParameters[1].Name, "second_parameter")
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
cwr.RichParameterValues = []codersdk.WorkspaceBuildParameter{
{
Name: "first_parameter",
Value: "1",
},
{
Name: "second_parameter",
Value: "2",
}, },
}},
}
t.Run("UpdateParameterValues", func(t *testing.T) {
t.Parallel()
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
user := coderdtest.CreateFirstUser(t, client)
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
cwr.RichParameterValues = initialBuildParameters
})
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
// Update build parameters
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
const updatedParameterValue = "3"
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
{Name: firstParameterName, Value: firstParameterValue},
{Name: secondParameterName, Value: updatedParameterValue},
} }
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: nextBuildParameters,
})
require.NoError(t, err)
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
require.NoError(t, err)
require.ElementsMatch(t, nextBuildParameters, workspaceBuildParameters)
})
t.Run("UsePreviousParameterValues", func(t *testing.T) {
t.Parallel()
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
user := coderdtest.CreateFirstUser(t, client)
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
cwr.RichParameterValues = initialBuildParameters
})
firstWorkspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
require.Equal(t, codersdk.WorkspaceStatusRunning, firstWorkspaceBuild.Status)
// Start new workspace build
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: codersdk.WorkspaceTransitionStart,
})
require.NoError(t, err)
require.NotEqual(t, firstWorkspaceBuild, nextWorkspaceBuild)
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
require.NoError(t, err)
require.ElementsMatch(t, initialBuildParameters, workspaceBuildParameters)
}) })
_, err = client.WorkspaceBuild(ctx, workspace.LatestBuild.ID)
require.NoError(t, err)
} }

View File

@ -502,6 +502,21 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
if err != nil { if err != nil {
return xerrors.Errorf("insert workspace build: %w", err) return xerrors.Errorf("insert workspace build: %w", err)
} }
names := make([]string, 0, len(createWorkspace.RichParameterValues))
values := make([]string, 0, len(createWorkspace.RichParameterValues))
for _, param := range createWorkspace.RichParameterValues {
names = append(names, param.Name)
values = append(values, param.Value)
}
err = db.InsertWorkspaceBuildParameters(ctx, database.InsertWorkspaceBuildParametersParams{
WorkspaceBuildID: workspaceBuildID,
Name: names,
Value: values,
})
if err != nil {
return xerrors.Errorf("insert workspace build parameters: %w", err)
}
return nil return nil
}, nil) }, nil)
if err != nil { if err != nil {

View File

@ -1781,3 +1781,66 @@ func TestWorkspaceResource(t *testing.T) {
}}, metadata) }}, metadata)
}) })
} }
func TestWorkspaceWithRichParameters(t *testing.T) {
t.Parallel()
const (
firstParameterName = "first_parameter"
firstParameterDescription = "This is first parameter"
firstParameterValue = "1"
secondParameterName = "second_parameter"
secondParameterDescription = "This is second parameter"
secondParameterValue = "2"
)
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
user := coderdtest.CreateFirstUser(t, client)
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
Parse: echo.ParseComplete,
ProvisionPlan: []*proto.Provision_Response{
{
Type: &proto.Provision_Response_Complete{
Complete: &proto.Provision_Complete{
Parameters: []*proto.RichParameter{
{Name: firstParameterName, Description: firstParameterDescription},
{Name: secondParameterName, Description: secondParameterDescription},
},
},
},
}},
ProvisionApply: []*proto.Provision_Response{{
Type: &proto.Provision_Response_Complete{
Complete: &proto.Provision_Complete{},
},
}},
})
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
defer cancel()
templateRichParameters, err := client.TemplateVersionRichParameters(ctx, version.ID)
require.NoError(t, err)
require.Len(t, templateRichParameters, 2)
require.Equal(t, templateRichParameters[0].Name, firstParameterName)
require.Equal(t, templateRichParameters[1].Name, secondParameterName)
expectedBuildParameters := []codersdk.WorkspaceBuildParameter{
{Name: firstParameterName, Value: firstParameterValue},
{Name: secondParameterName, Value: secondParameterValue},
}
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
cwr.RichParameterValues = expectedBuildParameters
})
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, workspaceBuild.ID)
require.NoError(t, err)
require.ElementsMatch(t, expectedBuildParameters, workspaceBuildParameters)
}

View File

@ -164,3 +164,16 @@ func (c *Client) WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(ctx cont
var workspaceBuild WorkspaceBuild var workspaceBuild WorkspaceBuild
return workspaceBuild, json.NewDecoder(res.Body).Decode(&workspaceBuild) return workspaceBuild, json.NewDecoder(res.Body).Decode(&workspaceBuild)
} }
func (c *Client) WorkspaceBuildParameters(ctx context.Context, build uuid.UUID) ([]WorkspaceBuildParameter, error) {
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/workspacebuilds/%s/parameters", build), nil)
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.StatusCode != http.StatusOK {
return nil, readBodyAsError(res)
}
var params []WorkspaceBuildParameter
return params, json.NewDecoder(res.Body).Decode(&params)
}

View File

@ -56,7 +56,8 @@ type CreateWorkspaceBuildRequest struct {
// ParameterValues are optional. It will write params to the 'workspace' scope. // ParameterValues are optional. It will write params to the 'workspace' scope.
// This will overwrite any existing parameters with the same name. // This will overwrite any existing parameters with the same name.
// This will not delete old params not included in this list. // This will not delete old params not included in this list.
ParameterValues []CreateParameterRequest `json:"parameter_values,omitempty"` ParameterValues []CreateParameterRequest `json:"parameter_values,omitempty"`
RichParameterValues []WorkspaceBuildParameter `json:"rich_parameter_values,omitempty"`
} }
type WorkspaceOptions struct { type WorkspaceOptions struct {

View File

@ -405,6 +405,56 @@ Status Code **200**
To perform this operation, you must be authenticated. [Learn more](authentication.md). To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get build parameters for workspace build
### Code samples
```shell
# Example request using curl
curl -X GET http://coder-server:8080/api/v2/workspacebuilds/{workspacebuild}/parameters \
-H 'Accept: application/json' \
-H 'Coder-Session-Token: API_KEY'
```
`GET /workspacebuilds/{workspacebuild}/parameters`
### Parameters
| Name | In | Type | Required | Description |
| ---------------- | ---- | ------ | -------- | ------------------ |
| `workspacebuild` | path | string | true | Workspace build ID |
### Example responses
> 200 Response
```json
[
{
"name": "string",
"value": "string"
}
]
```
### Responses
| Status | Meaning | Description | Schema |
| ------ | ------------------------------------------------------- | ----------- | --------------------------------------------------------------------------------------- |
| 200 | [OK](https://tools.ietf.org/html/rfc7231#section-6.3.1) | OK | array of [codersdk.WorkspaceBuildParameter](schemas.md#codersdkworkspacebuildparameter) |
<h3 id="get-build-parameters-for-workspace-build-responseschema">Response Schema</h3>
Status Code **200**
| Name | Type | Required | Restrictions | Description |
| -------------- | ------ | -------- | ------------ | ----------- |
| `[array item]` | array | false | | |
| `» name` | string | false | | |
| `» value` | string | false | | |
To perform this operation, you must be authenticated. [Learn more](authentication.md).
## Get workspace resources for workspace build ## Get workspace resources for workspace build
### Code samples ### Code samples
@ -1042,6 +1092,12 @@ curl -X POST http://coder-server:8080/api/v2/workspaces/{workspace}/builds \
"source_value": "string" "source_value": "string"
} }
], ],
"rich_parameter_values": [
{
"name": "string",
"value": "string"
}
],
"state": [0], "state": [0],
"template_version_id": "0ba39c92-1f1b-4c32-aa3e-9925d7713eb1", "template_version_id": "0ba39c92-1f1b-4c32-aa3e-9925d7713eb1",
"transition": "create" "transition": "create"

View File

@ -870,6 +870,12 @@ CreateParameterRequest is a structure used to create a new parameter value for a
"source_value": "string" "source_value": "string"
} }
], ],
"rich_parameter_values": [
{
"name": "string",
"value": "string"
}
],
"state": [0], "state": [0],
"template_version_id": "0ba39c92-1f1b-4c32-aa3e-9925d7713eb1", "template_version_id": "0ba39c92-1f1b-4c32-aa3e-9925d7713eb1",
"transition": "create" "transition": "create"
@ -878,14 +884,15 @@ CreateParameterRequest is a structure used to create a new parameter value for a
### Properties ### Properties
| Name | Type | Required | Restrictions | Description | | Name | Type | Required | Restrictions | Description |
| --------------------- | --------------------------------------------------------------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ----------------------- | ----------------------------------------------------------------------------- | -------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `dry_run` | boolean | false | | | | `dry_run` | boolean | false | | |
| `orphan` | boolean | false | | Orphan may be set for the Destroy transition. | | `orphan` | boolean | false | | Orphan may be set for the Destroy transition. |
| `parameter_values` | array of [codersdk.CreateParameterRequest](#codersdkcreateparameterrequest) | false | | Parameter values are optional. It will write params to the 'workspace' scope. This will overwrite any existing parameters with the same name. This will not delete old params not included in this list. | | `parameter_values` | array of [codersdk.CreateParameterRequest](#codersdkcreateparameterrequest) | false | | Parameter values are optional. It will write params to the 'workspace' scope. This will overwrite any existing parameters with the same name. This will not delete old params not included in this list. |
| `state` | array of integer | false | | | | `rich_parameter_values` | array of [codersdk.WorkspaceBuildParameter](#codersdkworkspacebuildparameter) | false | | |
| `template_version_id` | string | false | | | | `state` | array of integer | false | | |
| `transition` | [codersdk.WorkspaceTransition](#codersdkworkspacetransition) | true | | | | `template_version_id` | string | false | | |
| `transition` | [codersdk.WorkspaceTransition](#codersdkworkspacetransition) | true | | |
#### Enumerated Values #### Enumerated Values
@ -5105,6 +5112,22 @@ Parameter represents a set value for the scope.
| `transition` | `stop` | | `transition` | `stop` |
| `transition` | `delete` | | `transition` | `delete` |
## codersdk.WorkspaceBuildParameter
```json
{
"name": "string",
"value": "string"
}
```
### Properties
| Name | Type | Required | Restrictions | Description |
| ------- | ------ | -------- | ------------ | ----------- |
| `name` | string | false | | |
| `value` | string | false | | |
## codersdk.WorkspaceQuota ## codersdk.WorkspaceQuota
```json ```json

View File

@ -233,6 +233,7 @@ export interface CreateWorkspaceBuildRequest {
readonly state?: string readonly state?: string
readonly orphan?: boolean readonly orphan?: boolean
readonly parameter_values?: CreateParameterRequest[] readonly parameter_values?: CreateParameterRequest[]
readonly rich_parameter_values?: WorkspaceBuildParameter[]
} }
// From codersdk/organizations.go // From codersdk/organizations.go