8000 feat(cli): provide parameter values via command line by mtojek · Pull Request #8898 · coder/coder · GitHub
[go: up one dir, main page]

Skip to content

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

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 34 commits into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Resolver implemented
  • Loading branch information
mtojek committed Aug 8, 2023
commit c1aeae09e95216f6992e71f30987becfaa8a1cad
44 changes: 0 additions & 44 deletions cli/parameter.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"gopkg.in/yaml.v3"

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

Expand Down Expand Up @@ -100,46 +99,3 @@ func parseParameterMapFile(parameterFile string) (map[string]string, error) {
}
return parameterMap, nil
}

type getParameterArgs struct {
templateVersionParameter codersdk.TemplateVersionParameter

promptBuildOptions bool
buildOptions []codersdk.WorkspaceBuildParameter
parameterMap map[string]string
}

func getParameter(inv *clibase.Invocation, args getParameterArgs) (codersdk.WorkspaceBuildParameter, error) {
if args.parameterMap != nil {
if parameterValue, ok := args.parameterMap[args.templateVersionParameter.Name]; ok {
return codersdk.WorkspaceBuildParameter{
Name: args.templateVersionParameter.Name,
Value: parameterValue,
}, nil
}
}
return getParameterFromCommandLineOrInput(inv, args.promptBuildOptions, args.buildOptions, args.templateVersionParameter)
}

//nolint:revive
func getParameterFromCommandLineOrInput(inv *clibase.Invocation, promptBuildOptions bool, buildOptions []codersdk.WorkspaceBuildParameter, templateVersionParameter codersdk.TemplateVersionParameter) (codersdk.WorkspaceBuildParameter, error) {
if templateVersionParameter.Ephemeral {
for _, bo := range buildOptions {
if bo.Name == templateVersionParameter.Name {
return codersdk.WorkspaceBuildParameter{
Name: templateVersionParameter.Name,
Value: bo.Value,
}, nil
}
}
}

parameterValue, err := cliui.RichParameter(inv, templateVersionParameter)
if err != nil {
return codersdk.WorkspaceBuildParameter{}, err
}
return codersdk.WorkspaceBuildParameter{
Name: templateVersionParameter.Name,
Value: parameterValue,
}, nil
}
64 changes: 47 additions & 17 deletions cli/parameter_resolver.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"golang.org/x/xerrors"

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

Expand All @@ -17,9 +18,6 @@ const (
)

type ParameterResolver struct {
action WorkspaceCLIAction
templateVersionParameters []codersdk.TemplateVersionParameter

lastBuildParameters []codersdk.WorkspaceBuildParameter

richParameters []codersdk.WorkspaceBuildParameter
Expand Down Expand Up @@ -66,11 +64,13 @@ func (pr *ParameterResolver) Resolve(inv *clibase.Invocation, action WorkspaceCL

staged = pr.resolveWithParametersMapFile(staged)
staged = pr.resolveWithCommandLineOrEnv(staged)
staged = pr.resolveWithLastBuildParameters(staged, action)
if err = pr.verifyConstraints(staged, action); err != nil {
staged = pr.resolveWithLastBuildParameters(staged, action, templateVersionParameters)
if err = pr.verifyConstraints(staged, action, templateVersionParameters); err != nil {
return nil, err
}
if staged, err = pr.resolveWithInput(staged, inv, action, templateVersionParameters); err != nil {
return nil, err
}
staged = pr.resolveWithInput(staged, inv, action)
return staged, nil
}

Expand Down Expand Up @@ -121,9 +121,13 @@ func (pr *ParameterResolver) resolveWithCommandLineOrEnv(resolved []codersdk.Wor
return resolved
}

func (pr *ParameterResolver) resolveWithLastBuildParameters(resolved []codersdk.WorkspaceBuildParameter, action WorkspaceCLIAction) []codersdk.WorkspaceBuildParameter {
func (pr *ParameterResolver) resolveWithLastBuildParameters(resolved []codersdk.WorkspaceBuildParameter, action WorkspaceCLIAction, templateVersionParameters []codersdk.TemplateVersionParameter) []codersdk.WorkspaceBuildParameter {
if pr.promptRichParameters {
return resolved // don't pull parameters from last build
}

for _, buildParameter := range pr.lastBuildParameters {
tvp := pr.findTemplateVersionParameter(buildParameter)
tvp := findTemplateVersionParameter(buildParameter, templateVersionParameters)
if tvp == nil {
continue // it looks like this parameter is not present anymore
}
Expand All @@ -149,9 +153,9 @@ func (pr *ParameterResolver) resolveWithLastBuildParameters(resolved []codersdk.
return resolved
}

func (pr *ParameterResolver) verifyConstraints(resolved []codersdk.WorkspaceBuildParameter, action WorkspaceCLIAction) error {
func (pr *ParameterResolver) verifyConstraints(resolved []codersdk.WorkspaceBuildParameter, action WorkspaceCLIAction, templateVersionParameters []codersdk.TemplateVersionParameter) error {
for _, r := range resolved {
tvp := pr.findTemplateVersionParameter(r)
tvp := findTemplateVersionParameter(r, templateVersionParameters)
if tvp == nil {
return xerrors.Errorf("parameter %q is not present in the template", r.Name)
}
Expand All @@ -167,20 +171,46 @@ func (pr *ParameterResolver) verifyConstraints(resolved []codersdk.WorkspaceBuil
return nil
}

func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuildParameter, inv *clibase.Invocation, action WorkspaceCLIAction) []codersdk.WorkspaceBuildParameter {
// update == then skip if in last build parameters unless prompt-all, build options
// update == immutable
func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuildParameter, inv *clibase.Invocation, action WorkspaceCLIAction, templateVersionParameters []codersdk.TemplateVersionParameter) ([]codersdk.WorkspaceBuildParameter, error) {
for _, tvp := range templateVersionParameters {
p := findWorkspaceBuildParameter(tvp, resolved)
if p != nil {
continue
}

panic("not implemented yet")
if (tvp.Ephemeral && pr.promptBuildOptions) ||
tvp.Required ||
(!tvp.Mutable && action == WorkspaceUpdate) {

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

resolved = append(resolved, codersdk.WorkspaceBuildParameter{
Name: tvp.Name,
Value: parameterValue,
})
}

}
return resolved, nil
}

func (pr *ParameterResolver) findTemplateVersionParameter(workspaceBuildParameter codersdk.WorkspaceBuildParameter) *codersdk.TemplateVersionParameter {
for _, tvp := range pr.templateVersionParameters {
func findTemplateVersionParameter(workspaceBuildParameter codersdk.WorkspaceBuildParameter, templateVersionParameters []codersdk.TemplateVersionParameter) *codersdk.TemplateVersionParameter {
for _, tvp := range templateVersionParameters {
if tvp.Name == workspaceBuildParameter.Name {
return &tvp
}
}
return nil
}

func findWorkspaceBuildParameter(tvp codersdk.TemplateVersionParameter, resolved []codersdk.WorkspaceBuildParameter) *codersdk.WorkspaceBuildParameter {
for _, r := range resolved {
if r.Name == tvp.Name {
return &r
}
}
return nil
}
11 changes: 4 additions & 7 deletions cli/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,9 @@ func (r *RootCmd) update() *clibase.Cmd {
return err
}

var existingRichParams []codersdk.WorkspaceBuildParameter
if !alwaysPrompt {
existingRichParams, err = client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
if err != nil {
return err
}
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
if err != nil {
return err
}

cliRichParameters, err := asWorkspaceBuildParameters(parameterFlags.richParameters)
Expand All @@ -65,7 +62,7 @@ func (r *RootCmd) update() *clibase.Cmd {
NewWorkspaceName: workspace.Name,
WorkspaceID: workspace.LatestBuild.ID,

LastBuildParameters: existingRichParams,
LastBuildParameters: lastBuildParameters,

PromptBuildOptions: parameterFlags.promptBuildOptions,
BuildOptions: buildOptions,
Expand Down
0