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

Lines changed: 5 additions & 3 deletions
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

Lines changed: 75 additions & 0 deletions
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

Lines changed: 84 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy