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

Skip to content

feat: Add CLI support for workspace build parameters #5768

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jan 23, 2023
Next Next commit
WIP
  • Loading branch information
mtojek committed Jan 18, 2023
commit df9ddf38c299b17d5bfda3d120efcf28dacc22f7
70 changes: 52 additions & 18 deletions cli/create.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package cli

import (
"context"
"fmt"
"io"
"time"
Expand All @@ -17,11 +18,12 @@ import (

func create() *cobra.Command {
var (
parameterFile string
templateName string
startAt string
stopAfter time.Duration
workspaceName string
parameterFile string
richParameterFile string
templateName string
startAt string
stopAfter time.Duration
workspaceName string
)
cmd := &cobra.Command{
Annotations: workspaceCommand,
Expand Down Expand Up @@ -121,7 +123,7 @@ func create() *cobra.Command {
schedSpec = ptr.Ref(sched.String())
}

parameters, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
buildParams, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
Template: template,
ExistingParams: []codersdk.Parameter{},
ParameterFile: parameterFile,
Expand All @@ -140,11 +142,12 @@ func create() *cobra.Command {
}

workspace, err := client.CreateWorkspace(cmd.Context(), organization.ID, codersdk.Me, codersdk.CreateWorkspaceRequest{
TemplateID: template.ID,
Name: workspaceName,
AutostartSchedule: schedSpec,
TTLMillis: ptr.Ref(stopAfter.Milliseconds()),
ParameterValues: parameters,
TemplateID: template.ID,
Name: workspaceName,
AutostartSchedule: schedSpec,
TTLMillis: ptr.Ref(stopAfter.Milliseconds()),
ParameterValues: buildParams.parameters,
RichParameterValues: buildParams.richParameters,
})
if err != nil {
return err
Expand All @@ -163,26 +166,54 @@ func create() *cobra.Command {
cliui.AllowSkipPrompt(cmd)
cliflag.StringVarP(cmd.Flags(), &templateName, "template", "t", "CODER_TEMPLATE_NAME", "", "Specify a template name.")
cliflag.StringVarP(cmd.Flags(), &parameterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
cliflag.StringVarP(cmd.Flags(), &richParameterFile, "rich-parameter-file", "", "CODER_RICH_PARAMETER_FILE", "", "Specify a file path with values for rich parameters defined in the template.")
cliflag.StringVarP(cmd.Flags(), &startAt, "start-at", "", "CODER_WORKSPACE_START_AT", "", "Specify the workspace autostart schedule. Check `coder schedule start --help` for the syntax.")
cliflag.DurationVarP(cmd.Flags(), &stopAfter, "stop-after", "", "CODER_WORKSPACE_STOP_AFTER", 8*time.Hour, "Specify a duration after which the workspace should shut down (e.g. 8h).")
return cmd
}

type prepWorkspaceBuildArgs struct {
Template codersdk.Template
ExistingParams []codersdk.Parameter
ParameterFile string
NewWorkspaceName string
Template codersdk.Template
ExistingParams []codersdk.Parameter
ParameterFile string
ExistingRichParams []codersdk.WorkspaceBuildParameter
RichParameterFile string
NewWorkspaceName string
}

type buildParameters struct {
// Parameters contains legacy parameters stored in /parameters.
parameters []codersdk.CreateParameterRequest
// Rich parameters stores values for build parameters annotated with description, icon, type, etc.
richParameters []codersdk.WorkspaceBuildParameter
}

// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
// Any missing params will be prompted to the user.
func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWorkspaceBuildArgs) ([]codersdk.CreateParameterRequest, error) {
// Any missing params will be prompted to the user. It supports legacy and rich parameters.
func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWorkspaceBuildArgs) (*buildParameters, error) {
ctx := cmd.Context()
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
if err != nil {
return nil, err
}

legacyParameters, err := prepLegacyParameters(ctx, cmd, client, templateVersion, args)
if err != nil {
return nil, err
}

richParameters, err := prepRichParameters()
if err != nil {
return nil, err
}

return &buildParameters{
parameters: legacyParameters,
richParameters: richParameters,
}, nil
}

func prepLegacyParameters(ctx context.Context, cmd *cobra.Command, client *codersdk.Client, templateVersion codersdk.TemplateVersion, args prepWorkspaceBuildArgs) ([]codersdk.CreateParameterRequest, error) {
parameterSchemas, err := client.TemplateVersionSchema(ctx, templateVersion.ID)
if err != nil {
return nil, err
Expand Down Expand Up @@ -278,6 +309,9 @@ PromptParamLoop:
if err != nil {
return nil, err
}

return parameters, nil
}

func prepRichParameters() ([]codersdk.WorkspaceBuildParameter, error) {
return nil, nil
}
3 changes: 3 additions & 0 deletions cli/testdata/coder_create_--help.golden
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ Flags:
-h, --help help for create
--parameter-file string Specify a file path with parameter values.
Consumes $CODER_PARAMETER_FILE
--rich-parameter-file string Specify a file path with values for rich
parameters defined in the template.
Consumes $CODER_RICH_PARAMETER_FILE
--start-at coder schedule start --help Specify the workspace autostart schedule. Check
coder schedule start --help for the syntax.
Consumes $CODER_WORKSPACE_START_AT
Expand Down
13 changes: 8 additions & 5 deletions cli/testdata/coder_update_--help.golden
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ Usage:
coder update <workspace> [flags]

Flags:
--always-prompt Always prompt all parameters. Does not pull parameter values
from existing workspace
-h, --help help for update
--parameter-file string Specify a file path with parameter values.
Consumes $CODER_PARAMETER_FILE
--always-prompt Always prompt all parameters. Does not pull parameter
values from existing workspace
-h, --help help for update
--parameter-file string Specify a file path with parameter values.
Consumes $CODER_PARAMETER_FILE
--rich-parameter-file string Specify a file path with values for rich parameters
defined in the template.
Consumes $CODER_RICH_PARAMETER_FILE

Global Flags:
--global-config coder Path to the global coder config directory.
Expand Down
31 changes: 21 additions & 10 deletions cli/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,9 @@ import (

func update() *cobra.Command {
var (
parameterFile string
alwaysPrompt bool
parameterFile string
richParameterFile string
alwaysPrompt bool
)

cmd := &cobra.Command{
Expand All @@ -39,27 +40,36 @@ func update() *cobra.Command {
}

var existingParams []codersdk.Parameter
var existingRichParams []codersdk.WorkspaceBuildParameter
if !alwaysPrompt {
existingParams, err = client.Parameters(cmd.Context(), codersdk.ParameterWorkspace, workspace.ID)
if err != nil {
return nil
}

existingRichParams, err = client.WorkspaceBuildParameters(cmd.Context(), workspace.LatestBuild.ID)
if err != nil {
return nil
}
}

parameters, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
Template: template,
ExistingParams: existingParams,
ParameterFile: parameterFile,
NewWorkspaceName: workspace.Name,
buildParams, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
Template: template,
ExistingParams: existingParams,
ParameterFile: parameterFile,
ExistingRichParams: existingRichParams,
RichParameterFile: richParameterFile,
NewWorkspaceName: workspace.Name,
})
if err != nil {
return nil
}

build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: template.ActiveVersionID,
Transition: workspace.LatestBuild.Transition,
ParameterValues: parameters,
TemplateVersionID: template.ActiveVersionID,
Transition: workspace.LatestBuild.Transition,
ParameterValues: buildParams.parameters,
RichParameterValues: buildParams.richParameters,
})
if err != nil {
return err
Expand All @@ -82,5 +92,6 @@ func update() *cobra.Command {

cmd.Flags().BoolVar(&alwaysPrompt, "always-prompt", false, "Always prompt all parameters. Does not pull parameter values from existing workspace")
cliflag.StringVarP(cmd.Flags(), &parameterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
cliflag.StringVarP(cmd.Flags(), &richParameterFile, "rich-parameter-file", "", "CODER_RICH_PARAMETER_FILE", "", "Specify a file path with values for rich parameters defined in the template.")
return cmd
}