Skip to content

feat(cli): support ephemeral parameters #8415

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 14 commits into from
Jul 13, 2023
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