feat(cli): provide parameter values via command line (#8898)

This commit is contained in:
Marcin Tojek
2023-08-09 13:00:25 +02:00
committed by GitHub
parent 1730d35467
commit 0d382d1e05
19 changed files with 684 additions and 249 deletions

View File

@ -11,21 +11,6 @@ import (
"github.com/coder/coder/codersdk"
)
// workspaceParameterFlags are used by "start", "restart", and "update".
type workspaceParameterFlags struct {
buildOptions bool
}
func (wpf *workspaceParameterFlags) options() []clibase.Option {
return clibase.OptionSet{
{
Flag: "build-options",
Description: "Prompt for one-time build options defined with ephemeral parameters.",
Value: clibase.BoolOf(&wpf.buildOptions),
},
}
}
func (r *RootCmd) start() *clibase.Cmd {
var parameterFlags workspaceParameterFlags
@ -38,21 +23,36 @@ func (r *RootCmd) start() *clibase.Cmd {
clibase.RequireNArgs(1),
r.InitClient(client),
),
Options: append(parameterFlags.options(), cliui.SkipPromptOption()),
Options: append(parameterFlags.cliBuildOptions(), cliui.SkipPromptOption()),
Handler: func(inv *clibase.Invocation) error {
workspace, err := namedWorkspace(inv.Context(), client, inv.Args[0])
if err != nil {
return err
}
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
if err != nil {
return err
}
template, err := client.Template(inv.Context(), workspace.TemplateID)
if err != nil {
return err
}
buildParams, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Template: template,
BuildOptions: parameterFlags.buildOptions,
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
if err != nil {
return xerrors.Errorf("unable to parse build options: %w", err)
}
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Action: WorkspaceStart,
Template: template,
LastBuildParameters: lastBuildParameters,
PromptBuildOptions: parameterFlags.promptBuildOptions,
BuildOptions: buildOptions,
})
if err != nil {
return err
@ -60,7 +60,7 @@ func (r *RootCmd) start() *clibase.Cmd {
build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: buildParams.richParameters,
RichParameterValues: buildParameters,
})
if err != nil {
return err
@ -79,16 +79,21 @@ func (r *RootCmd) start() *clibase.Cmd {
}
type prepStartWorkspaceArgs struct {
Template codersdk.Template
BuildOptions bool
Action WorkspaceCLIAction
Template codersdk.Template
LastBuildParameters []codersdk.WorkspaceBuildParameter
PromptBuildOptions bool
BuildOptions []codersdk.WorkspaceBuildParameter
}
func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args prepStartWorkspaceArgs) (*buildParameters, error) {
func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args prepStartWorkspaceArgs) ([]codersdk.WorkspaceBuildParameter, error) {
ctx := inv.Context()
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
if err != nil {
return nil, err
return nil, xerrors.Errorf("get template version: %w", err)
}
templateVersionParameters, err := client.TemplateVersionRichParameters(inv.Context(), templateVersion.ID)
@ -96,30 +101,9 @@ func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args p
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 {
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
resolver := new(ParameterResolver).
WithLastBuildParameters(args.LastBuildParameters).
WithPromptBuildOptions(args.PromptBuildOptions).
WithBuildOptions(args.BuildOptions)
return resolver.Resolve(inv, args.Action, templateVersionParameters)
}