Skip to content
Prev Previous commit
Next Next commit
Start with options
  • Loading branch information
mtojek committed Jul 11, 2023
commit fdea6b2c4ecc27a9f5cbfac08de593e1748e08cb
72 changes: 71 additions & 1 deletion cli/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@ import (
"fmt"
"time"

"golang.org/x/xerrors"

"github.com/coder/coder/cli/clibase"
"github.com/coder/coder/cli/cliui"
"github.com/coder/coder/codersdk"
)

func (r *RootCmd) start() *clibase.Cmd {
var buildOptions bool

client := new(codersdk.Client)
cmd := &clibase.Cmd{
Annotations: workspaceCommand,
Expand All @@ -20,15 +24,35 @@ func (r *RootCmd) start() *clibase.Cmd {
r.InitClient(client),
),
Options: clibase.OptionSet{
{
Flag: "build-options",
Description: "Prompt for one-time build options defined with ephemeral parameters.",
Value: clibase.BoolOf(&buildOptions),
},
cliui.SkipPromptOption(),
},
Handler: func(inv *clibase.Invocation) error {
workspace, err := namedWorkspace(inv.Context(), client, inv.Args[0])
if err != nil {
return err
}

template, err := client.Template(inv.Context(), workspace.TemplateID)
if err != nil {
return nil
}

buildParams, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Template: template,
BuildOptions: buildOptions,
})
if err != nil {
return nil
}

build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: codersdk.WorkspaceTransitionStart,
Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: buildParams.richParameters,
})
if err != nil {
return err
Expand All @@ -45,3 +69,49 @@ func (r *RootCmd) start() *clibase.Cmd {
}
return cmd
}

type prepStartWorkspaceArgs struct {
Template codersdk.Template
BuildOptions bool
}

func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args prepStartWorkspaceArgs) (*buildParameters, error) {
ctx := inv.Context()

templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
if err != nil {
return nil, err
}

templateVersionParameters, err := client.TemplateVersionRichParameters(inv.Context(), templateVersion.ID)
if err != nil {
return nil, xerrors.Errorf("get template version rich parameters: %w", err)
}

richParameters := make([]codersdk.WorkspaceBuildParameter, 0)
if !args.BuildOptions {
return &buildParameters{
richParameters: richParameters,
}, nil
}

for _, templateVersionParameter := range templateVersionParameters {
if !templateVersionParameter.Ephemeral || !templateVersionParameter.Mutable {
continue
}

parameterValue, err := cliui.RichParameter(inv, templateVersionParameter)
if err != nil {
return nil, err
}

richParameters = append(richParameters, codersdk.WorkspaceBuildParameter{
Name: templateVersionParameter.Name,
Value: parameterValue,
})
}

return &buildParameters{
richParameters: richParameters,
}, nil
}
3 changes: 3 additions & 0 deletions cli/testdata/coder_start_--help.golden
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ Usage: coder start [flags] <workspace>
Start a workspace

Options
--build-options bool
Prompt for one-time build options defined with ephemeral parameters.

-y, --yes bool
Bypass prompts.

Expand Down
8 changes: 8 additions & 0 deletions docs/cli/start.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ coder start [flags] <workspace>

## Options

### --build-options

| | |
| ---- | ----------------- |
| Type | <code>bool</code> |

Prompt for one-time build options defined with ephemeral parameters.

### -y, --yes

| | |
Expand Down