Skip to content

feat: add cli support for --require-active-version #10337

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 10 commits into from
Oct 19, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
pr comments
  • Loading branch information
sreya committed Oct 19, 2023
commit 9b96767af0e69673d2a2856345ff4f04858dfc5d
28 changes: 6 additions & 22 deletions cli/restart.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@ import (

"golang.org/x/xerrors"

"github.com/coder/pretty"

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

func (r *RootCmd) restart() *clibase.Cmd {
Expand Down Expand Up @@ -88,29 +87,14 @@ func (r *RootCmd) restart() *clibase.Cmd {
// It's possible for a workspace build to fail due to the template requiring starting
// workspaces with the active version.
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Whoops. This should have been 403 Forbidden, not 401 Unauthorized. Despite the name, 401 is for when we failed to authenticate the user. Probably shouldn't change it now, though.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that's fair I'll update it in a separate PR

template, err := client.Template(inv.Context(), workspace.TemplateID)
if err != nil {
return xerrors.Errorf("get template: %w", err)
}

buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Action: WorkspaceStart,
TemplateVersionID: template.ActiveVersionID,

build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
BuildOptions: buildOptions,
LastBuildParameters: lastBuildParameters,

PromptBuildOptions: parameterFlags.promptBuildOptions,
BuildOptions: buildOptions,
PromptBuildOptions: parameterFlags.promptBuildOptions,
Workspace: workspace,
})
if err != nil {
return err
}

req.RichParameterValues = buildParameters
req.TemplateVersionID = template.ActiveVersionID
build, err = client.CreateWorkspaceBuild(inv.Context(), workspace.ID, req)
if err != nil {
return err
return xerrors.Errorf("start workspace with active template version: %w", err)
}
} else if err != nil {
return err
Expand Down
68 changes: 46 additions & 22 deletions cli/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ import (
"net/http"
"time"

"golang.org/x/xerrors"

"github.com/google/uuid"
"golang.org/x/xerrors"

"github.com/coder/coder/v2/cli/clibase"
"github.com/coder/coder/v2/cli/cliui"
Expand Down Expand Up @@ -66,29 +65,14 @@ func (r *RootCmd) start() *clibase.Cmd {
// It's possible for a workspace build to fail due to the template requiring starting
// workspaces with the active version.
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
template, err := client.Template(inv.Context(), workspace.TemplateID)
if err != nil {
return xerrors.Errorf("get template: %w", err)
}

buildParameters, err = prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Action: WorkspaceStart,
TemplateVersionID: template.ActiveVersionID,

build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
BuildOptions: buildOptions,
LastBuildParameters: lastBuildParameters,

PromptBuildOptions: parameterFlags.promptBuildOptions,
BuildOptions: buildOptions,
PromptBuildOptions: parameterFlags.promptBuildOptions,
Workspace: workspace,
})
if err != nil {
return err
}

req.RichParameterValues = buildParameters
req.TemplateVersionID = template.ActiveVersionID
build, err = client.CreateWorkspaceBuild(inv.Context(), workspace.ID, req)
if err != nil {
return err
return xerrors.Errorf("start workspace with active template version: %w", err)
}
} else if err != nil {
return err
Expand Down Expand Up @@ -138,3 +122,43 @@ func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args p
WithBuildOptions(args.BuildOptions)
return resolver.Resolve(inv, args.Action, templateVersionParameters)
}

type startWorkspaceActiveVersionArgs struct {
BuildOptions []codersdk.WorkspaceBuildParameter
LastBuildParameters []codersdk.WorkspaceBuildParameter
PromptBuildOptions bool
Workspace codersdk.Workspace
}

func startWorkspaceActiveVersion(inv *clibase.Invocation, client *codersdk.Client, args startWorkspaceActiveVersionArgs) (codersdk.WorkspaceBuild, error) {
_, _ = fmt.Fprintln(inv.Stdout, "Failed to restart with the template version from your last build. Policy may require you to restart with the current active template version.")

template, err := client.Template(inv.Context(), args.Workspace.TemplateID)
if err != nil {
return codersdk.WorkspaceBuild{}, xerrors.Errorf("get template: %w", err)
}

buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
Action: WorkspaceStart,
TemplateVersionID: template.ActiveVersionID,

LastBuildParameters: args.LastBuildParameters,

PromptBuildOptions: args.PromptBuildOptions,
BuildOptions: args.BuildOptions,
})
if err != nil {
return codersdk.WorkspaceBuild{}, err
}

build, err := client.CreateWorkspaceBuild(inv.Context(), args.Workspace.ID, codersdk.CreateWorkspaceBuildRequest{
Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: buildParameters,
TemplateVersionID: template.ActiveVersionID,
})
if err != nil {
return codersdk.WorkspaceBuild{}, err
}

return build, nil
}
2 changes: 1 addition & 1 deletion cli/templatecreate.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {

if requireActiveVersion {
if !entitlements.Features[codersdk.FeatureAccessControl].Enabled {
return xerrors.Errorf("your license is not entitled to use template access control, so you cannot set --require-active-version")
return xerrors.Errorf("your license is not entitled to use enterprise access control, so you cannot set --require-active-version")
}

experiments, exErr := client.Experiments(inv.Context())
Expand Down
2 changes: 1 addition & 1 deletion cli/templateedit.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ func (r *RootCmd) templateEdit() *clibase.Cmd {

if requireActiveVersion {
if !entitlements.Features[codersdk.FeatureAccessControl].Enabled {
return xerrors.Errorf("your license is not entitled to use template access control, so you cannot set --require-active-version")
return xerrors.Errorf("your license is not entitled to use enterprise access control, so you cannot set --require-active-version")
}

experiments, exErr := client.Experiments(inv.Context())
Expand Down