Skip to content

Commit 669ae9d

Browse files
authored
fix(cli): remove prompt for immutable parameters on start and restart (#9173)
1 parent 376352e commit 669ae9d

File tree

3 files changed

+164
-3
lines changed

3 files changed

+164
-3
lines changed

cli/parameterresolver.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,16 @@ func (pr *ParameterResolver) resolveWithInput(resolved []codersdk.WorkspaceBuild
177177
if p != nil {
178178
continue
179179
}
180+
// Parameter has not been resolved yet, so CLI needs to determine if user should input it.
180181

181182
firstTimeUse := pr.isFirstTimeUse(tvp.Name)
182183

183184
if (tvp.Ephemeral && pr.promptBuildOptions) ||
184-
tvp.Required ||
185+
(action == WorkspaceCreate && tvp.Required) ||
186+
(action == WorkspaceCreate && !tvp.Ephemeral) ||
187+
(action == WorkspaceUpdate && tvp.Required) ||
185188
(action == WorkspaceUpdate && !tvp.Mutable && firstTimeUse) ||
186-
(action == WorkspaceUpdate && tvp.Mutable && !tvp.Ephemeral && pr.promptRichParameters) ||
187-
(action == WorkspaceCreate && !tvp.Ephemeral) {
189+
(action == WorkspaceUpdate && tvp.Mutable && !tvp.Ephemeral && pr.promptRichParameters) {
188190
parameterValue, err := cliui.RichParameter(inv, tvp)
189191
if err != nil {
190192
return nil, err

cli/restart_test.go

+75
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,78 @@ func TestRestart(t *testing.T) {
181181
})
182182
})
183183
}
184+
185+
func TestRestartWithParameters(t *testing.T) {
186+
t.Parallel()
187+
188+
echoResponses := &echo.Responses{
189+
Parse: echo.ParseComplete,
190+
ProvisionPlan: []*proto.Provision_Response{
191+
{
192+
Type: &proto.Provision_Response_Complete{
193+
Complete: &proto.Provision_Complete{
194+
Parameters: []*proto.RichParameter{
195+
{
196+
Name: immutableParameterName,
197+
Description: immutableParameterDescription,
198+
Required: true,
199+
},
200+
},
201+
},
202+
},
203+
},
204+
},
205+
ProvisionApply: []*proto.Provision_Response{{
206+
Type: &proto.Provision_Response_Complete{
207+
Complete: &proto.Provision_Complete{},
208+
},
209+
}},
210+
}
211+
212+
t.Run("DoNotAskForImmutables", func(t *testing.T) {
213+
t.Parallel()
214+
215+
// Create the workspace
216+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
217+
user := coderdtest.CreateFirstUser(t, client)
218+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
219+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
220+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
221+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
222+
cwr.RichParameterValues = []codersdk.WorkspaceBuildParameter{
223+
{
224+
Name: immutableParameterName,
225+
Value: immutableParameterValue,
226+
},
227+
}
228+
})
229+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
230+
231+
// Restart the workspace again
232+
inv, root := clitest.New(t, "restart", workspace.Name, "-y")
233+
clitest.SetupConfig(t, client, root)
234+
doneChan := make(chan struct{})
235+
pty := ptytest.New(t).Attach(inv)
236+
go func() {
237+
defer close(doneChan)
238+
err := inv.Run()
239+
assert.NoError(t, err)
240+
}()
241+
242+
pty.ExpectMatch("workspace has been restarted")
243+
<-doneChan
244+
245+
// Verify if immutable parameter is set
246+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
247+
defer cancel()
248+
249+
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
250+
require.NoError(t, err)
251+
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
252+
require.NoError(t, err)
253+
require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{
254+
Name: immutableParameterName,
255+
Value: immutableParameterValue,
256+
})
257+
})
258+
}

cli/start_test.go

+84
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
"github.com/coder/coder/cli/clitest"
1212
"github.com/coder/coder/coderd/coderdtest"
13+
"github.com/coder/coder/coderd/database"
1314
"github.com/coder/coder/codersdk"
1415
"github.com/coder/coder/provisioner/echo"
1516
"github.com/coder/coder/provisionersdk/proto"
@@ -21,6 +22,10 @@ const (
2122
ephemeralParameterName = "ephemeral_parameter"
2223
ephemeralParameterDescription = "This is ephemeral parameter"
2324
ephemeralParameterValue = "3"
25+
26+
immutableParameterName = "immutable_parameter"
27+
immutableParameterDescription = "This is immutable parameter"
28+
immutableParameterValue = "abc"
2429
)
2530

2631
func TestStart(t *testing.T) {
@@ -140,3 +145,82 @@ func TestStart(t *testing.T) {
140145
})
141146
})
142147
}
148+
149+
func TestStartWithParameters(t *testing.T) {
150+
t.Parallel()
151+
152+
echoResponses := &echo.Responses{
153+
Parse: echo.ParseComplete,
154+
ProvisionPlan: []*proto.Provision_Response{
155+
{
156+
Type: &proto.Provision_Response_Complete{
157+
Complete: &proto.Provision_Complete{
158+
Parameters: []*proto.RichParameter{
159+
{
160+
Name: immutableParameterName,
161+
Description: immutableParameterDescription,
162+
Required: true,
163+
},
164+
},
165+
},
166+
},
167+
},
168+
},
169+
ProvisionApply: []*proto.Provision_Response{{
170+
Type: &proto.Provision_Response_Complete{
171+
Complete: &proto.Provision_Complete{},
172+
},
173+
}},
174+
}
175+
176+
t.Run("DoNotAskForImmutables", func(t *testing.T) {
177+
t.Parallel()
178+
179+
// Create the workspace
180+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
181+
user := coderdtest.CreateFirstUser(t, client)
182+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
183+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
184+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
185+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
186+
cwr.RichParameterValues = []codersdk.WorkspaceBuildParameter{
187+
{
188+
Name: immutableParameterName,
189+
Value: immutableParameterValue,
190+
},
191+
}
192+
})
193+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
194+
195+
// Stop the workspace
196+
workspaceBuild := coderdtest.CreateWorkspaceBuild(t, client, workspace, database.WorkspaceTransitionStop)
197+
coderdtest.AwaitWorkspaceBuildJob(t, client, workspaceBuild.ID)
198+
199+
// Start the workspace again
200+
inv, root := clitest.New(t, "start", workspace.Name)
201+
clitest.SetupConfig(t, client, root)
202+
doneChan := make(chan struct{})
203+
pty := ptytest.New(t).Attach(inv)
204+
go func() {
205+
defer close(doneChan)
206+
err := inv.Run()
207+
assert.NoError(t, err)
208+
}()
209+
210+
pty.ExpectMatch("workspace has been started")
211+
<-doneChan
212+
213+
// Verify if immutable parameter is set
214+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
215+
defer cancel()
216+
217+
workspace, err := client.WorkspaceByOwnerAndName(ctx, workspace.OwnerName, workspace.Name, codersdk.WorkspaceOptions{})
218+
require.NoError(t, err)
219+
actualParameters, err := client.WorkspaceBuildParameters(ctx, workspace.LatestBuild.ID)
220+
require.NoError(t, err)
221+
require.Contains(t, actualParameters, codersdk.WorkspaceBuildParameter{
222+
Name: immutableParameterName,
223+
Value: immutableParameterValue,
224+
})
225+
})
226+
}

0 commit comments

Comments
 (0)