mirror of
https://github.com/coder/coder.git
synced 2025-07-21 01:28:49 +00:00
fix(cli): remove prompt for immutable parameters on start and restart (#9173)
This commit is contained in:
@ -177,14 +177,16 @@ func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuild
|
|||||||
if p != nil {
|
if p != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
// Parameter has not been resolved yet, so CLI needs to determine if user should input it.
|
||||||
|
|
||||||
firstTimeUse := pr.isFirstTimeUse(tvp.Name)
|
firstTimeUse := pr.isFirstTimeUse(tvp.Name)
|
||||||
|
|
||||||
if (tvp.Ephemeral && pr.promptBuildOptions) ||
|
if (tvp.Ephemeral && pr.promptBuildOptions) ||
|
||||||
tvp.Required ||
|
(action == WorkspaceCreate && tvp.Required) ||
|
||||||
|
(action == WorkspaceCreate && !tvp.Ephemeral) ||
|
||||||
|
(action == WorkspaceUpdate && tvp.Required) ||
|
||||||
(action == WorkspaceUpdate && !tvp.Mutable && firstTimeUse) ||
|
(action == WorkspaceUpdate && !tvp.Mutable && firstTimeUse) ||
|
||||||
(action == WorkspaceUpdate && tvp.Mutable && !tvp.Ephemeral && pr.promptRichParameters) ||
|
(action == WorkspaceUpdate && tvp.Mutable && !tvp.Ephemeral && pr.promptRichParameters) {
|
||||||
(action == WorkspaceCreate && !tvp.Ephemeral) {
|
|
||||||
parameterValue, err := cliui.RichParameter(inv, tvp)
|
parameterValue, err := cliui.RichParameter(inv, tvp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -181,3 +181,78 @@ func TestRestart(t *testing.T) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRestartWithParameters(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
echoResponses := &echo.Responses{
|
||||||
|
Parse: echo.ParseComplete,
|
||||||
|
ProvisionPlan: []*proto.Provision_Response{
|
||||||
|
{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{
|
||||||
|
Parameters: []*proto.RichParameter{
|
||||||
|
{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Description: immutableParameterDescription,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ProvisionApply: []*proto.Provision_Response{{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("DoNotAskForImmutables", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// Create the workspace
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
|
||||||
|
cwr.RichParameterValues = []codersdk.WorkspaceBuildParameter{
|
||||||
|
{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Value: immutableParameterValue,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
|
||||||
|
|
||||||
|
// Restart the workspace again
|
||||||
|
inv, root := clitest.New(t, "restart", workspace.Name, "-y")
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
pty := ptytest.New(t).Attach(inv)
|
||||||
|
go func() {
|
||||||
|
defer close(doneChan)
|
||||||
|
err := inv.Run()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
pty.ExpectMatch("workspace has been restarted")
|
||||||
|
<-doneChan
|
||||||
|
|
||||||
|
// Verify if immutable parameter is set
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Value: immutableParameterValue,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/coder/coder/cli/clitest"
|
"github.com/coder/coder/cli/clitest"
|
||||||
"github.com/coder/coder/coderd/coderdtest"
|
"github.com/coder/coder/coderd/coderdtest"
|
||||||
|
"github.com/coder/coder/coderd/database"
|
||||||
"github.com/coder/coder/codersdk"
|
"github.com/coder/coder/codersdk"
|
||||||
"github.com/coder/coder/provisioner/echo"
|
"github.com/coder/coder/provisioner/echo"
|
||||||
"github.com/coder/coder/provisionersdk/proto"
|
"github.com/coder/coder/provisionersdk/proto"
|
||||||
@ -21,6 +22,10 @@ const (
|
|||||||
ephemeralParameterName = "ephemeral_parameter"
|
ephemeralParameterName = "ephemeral_parameter"
|
||||||
ephemeralParameterDescription = "This is ephemeral parameter"
|
ephemeralParameterDescription = "This is ephemeral parameter"
|
||||||
ephemeralParameterValue = "3"
|
ephemeralParameterValue = "3"
|
||||||
|
|
||||||
|
immutableParameterName = "immutable_parameter"
|
||||||
|
immutableParameterDescription = "This is immutable parameter"
|
||||||
|
immutableParameterValue = "abc"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestStart(t *testing.T) {
|
func TestStart(t *testing.T) {
|
||||||
@ -140,3 +145,82 @@ func TestStart(t *testing.T) {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestStartWithParameters(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
echoResponses := &echo.Responses{
|
||||||
|
Parse: echo.ParseComplete,
|
||||||
|
ProvisionPlan: []*proto.Provision_Response{
|
||||||
|
{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{
|
||||||
|
Parameters: []*proto.RichParameter{
|
||||||
|
{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Description: immutableParameterDescription,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ProvisionApply: []*proto.Provision_Response{{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("DoNotAskForImmutables", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
// Create the workspace
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
|
||||||
|
cwr.RichParameterValues = []codersdk.WorkspaceBuildParameter{
|
||||||
|
{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Value: immutableParameterValue,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
|
||||||
|
|
||||||
|
// Stop the workspace
|
||||||
|
workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop)
|
||||||
|
coderdtest.AwaitWorkspaceBuildJob(t, client, workspaceBuild.ID)
|
||||||
|
|
||||||
|
// Start the workspace again
|
||||||
|
inv, root := clitest.New(t, "start", workspace.Name)
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
pty := ptytest.New(t).Attach(inv)
|
||||||
|
go func() {
|
||||||
|
defer close(doneChan)
|
||||||
|
err := inv.Run()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
pty.ExpectMatch("workspace has been started")
|
||||||
|
<-doneChan
|
||||||
|
|
||||||
|
// Verify if immutable parameter is set
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
|
||||||
|
require.NoError(t, err)
|
||||||
|
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Value: immutableParameterValue,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user