@@ -15,6 +15,7 @@ import (
15
15
"github.com/coder/coder/v2/coderd/database/dbtestutil"
16
16
"github.com/coder/coder/v2/coderd/database/pubsub"
17
17
"github.com/coder/coder/v2/coderd/rbac"
18
+ "github.com/coder/coder/v2/coderd/util/ptr"
18
19
"github.com/coder/coder/v2/codersdk"
19
20
"github.com/coder/coder/v2/codersdk/wsjson"
20
21
"github.com/coder/coder/v2/provisioner/echo"
@@ -211,6 +212,86 @@ func TestDynamicParametersWithTerraformValues(t *testing.T) {
211
212
require .Zero (t , setup .api .FileCache .Count ())
212
213
})
213
214
215
+ t .Run ("RebuildParameters" , func (t * testing.T ) {
216
+ t .Parallel ()
217
+
218
+ dynamicParametersTerraformSource , err := os .ReadFile ("testdata/parameters/modules/main.tf" )
219
+ require .NoError (t , err )
220
+
221
+ modulesArchive , err := terraform .GetModulesArchive (os .DirFS ("testdata/parameters/modules" ))
222
+ require .NoError (t , err )
223
+
224
+ setup := setupDynamicParamsTest (t , setupDynamicParamsTestParams {
225
+ provisionerDaemonVersion : provProto .CurrentVersion .String (),
226
+ mainTF : dynamicParametersTerraformSource ,
227
+ modulesArchive : modulesArchive ,
228
+ plan : nil ,
229
+ static : nil ,
230
+ })
231
+
232
+ ctx := testutil .Context (t , testutil .WaitMedium )
233
+ stream := setup .stream
234
+ previews := stream .Chan ()
235
+
236
+ // Should see the output of the module represented
237
+ preview := testutil .RequireReceive (ctx , t , previews )
238
+ require .Equal (t , - 1 , preview .ID )
239
+ require .Empty (t , preview .Diagnostics )
240
+
241
+ require .Len (t , preview .Parameters , 1 )
242
+ require .Equal (t , "jetbrains_ide" , preview .Parameters [0 ].Name )
243
+ require .True (t , preview .Parameters [0 ].Value .Valid )
244
+ require .Equal (t , "CL" , preview .Parameters [0 ].Value .Value )
245
+ _ = stream .Close (websocket .StatusGoingAway )
246
+
247
+ wrk := coderdtest .CreateWorkspace (t , setup .client , setup .template .ID , func (request * codersdk.CreateWorkspaceRequest ) {
248
+ request .RichParameterValues = []codersdk.WorkspaceBuildParameter {
249
+ {
250
+ Name : preview .Parameters [0 ].Name ,
251
+ Value : "GO" ,
252
+ },
253
+ }
254
+ })
255
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , setup .client , wrk .LatestBuild .ID )
256
+
257
+ params , err := setup .client .WorkspaceBuildParameters (ctx , wrk .LatestBuild .ID )
258
+ require .NoError (t , err )
259
+ require .Len (t , params , 1 )
260
+ require .Equal (t , "jetbrains_ide" , params [0 ].Name )
261
+ require .Equal (t , "GO" , params [0 ].Value )
262
+
263
+ // A helper function to assert params
264
+ doTransition := func (t * testing.T , trans codersdk.WorkspaceTransition ) {
265
+ t .Helper ()
266
+
267
+ fooVal := coderdtest .RandomUsername (t )
268
+ bld , err := setup .client .CreateWorkspaceBuild (ctx , wrk .ID , codersdk.CreateWorkspaceBuildRequest {
269
+ TemplateVersionID : setup .template .ActiveVersionID ,
270
+ Transition : trans ,
271
+ RichParameterValues : []codersdk.WorkspaceBuildParameter {
272
+ // No validation, so this should work as is.
273
+ // Overwrite the value on each transition
274
+ {Name : "foo" , Value : fooVal },
275
+ },
276
+ EnableDynamicParameters : ptr .Ref (true ),
277
+ })
278
+ require .NoError (t , err )
279
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , setup .client , wrk .LatestBuild .ID )
280
+
281
+ latestParams , err := setup .client .WorkspaceBuildParameters (ctx , bld .ID )
282
+ require .NoError (t , err )
283
+ require .ElementsMatch (t , latestParams , []codersdk.WorkspaceBuildParameter {
284
+ {Name : "jetbrains_ide" , Value : "GO" },
285
+ {Name : "foo" , Value : fooVal },
286
+ })
287
+ }
288
+
289
+ // Restart the workspace, then delete. Asserting params on all builds.
290
+ doTransition (t , codersdk .WorkspaceTransitionStop )
291
+ doTransition (t , codersdk .WorkspaceTransitionStart )
292
+ doTransition (t , codersdk .WorkspaceTransitionDelete )
293
+ })
294
+
214
295
t .Run ("BadOwner" , func (t * testing.T ) {
215
296
t .Parallel ()
216
297
@@ -266,9 +347,10 @@ type setupDynamicParamsTestParams struct {
266
347
}
267
348
268
349
type dynamicParamsTest struct {
269
- client * codersdk.Client
270
- api * coderd.API
271
- stream * wsjson.Stream [codersdk.DynamicParametersResponse , codersdk.DynamicParametersRequest ]
350
+ client * codersdk.Client
351
+ api * coderd.API
352
+ stream * wsjson.Stream [codersdk.DynamicParametersResponse , codersdk.DynamicParametersRequest ]
353
+ template codersdk.Template
272
354
}
273
355
274
356
func setupDynamicParamsTest (t * testing.T , args setupDynamicParamsTestParams ) dynamicParamsTest {
@@ -300,7 +382,7 @@ func setupDynamicParamsTest(t *testing.T, args setupDynamicParamsTestParams) dyn
300
382
301
383
version := coderdtest .CreateTemplateVersion (t , templateAdmin , owner .OrganizationID , files )
302
384
coderdtest .AwaitTemplateVersionJobCompleted (t , templateAdmin , version .ID )
303
- _ = coderdtest .CreateTemplate (t , templateAdmin , owner .OrganizationID , version .ID )
385
+ tpl : = coderdtest .CreateTemplate (t , templateAdmin , owner .OrganizationID , version .ID )
304
386
305
387
ctx := testutil .Context (t , testutil .WaitShort )
306
388
stream , err := templateAdmin .TemplateVersionDynamicParameters (ctx , version .ID )
@@ -321,9 +403,10 @@ func setupDynamicParamsTest(t *testing.T, args setupDynamicParamsTestParams) dyn
321
403
})
322
404
323
405
return dynamicParamsTest {
324
- client : ownerClient ,
325
- stream : stream ,
326
- api : api ,
406
+ client : ownerClient ,
407
+ api : api ,
408
+ stream : stream ,
409
+ template : tpl ,
327
410
}
328
411
}
329
412
0 commit comments