@@ -416,6 +416,124 @@ func TestCreateWithRichParameters(t *testing.T) {
416
416
assert .ErrorContains (t , err , "parameter \" " + wrongFirstParameterName + "\" is not present in the template" )
417
417
assert .ErrorContains (t , err , "Did you mean: " + firstParameterName )
418
418
})
419
+
420
+ t .Run ("CopyParameters" , func (t * testing.T ) {
421
+ t .Parallel ()
422
+
423
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
424
+ owner := coderdtest .CreateFirstUser (t , client )
425
+ member , _ := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID )
426
+ version := coderdtest .CreateTemplateVersion (t , client , owner .OrganizationID , echoResponses )
427
+ coderdtest .AwaitTemplateVersionJobCompleted (t , client , version .ID )
428
+
429
+ template := coderdtest .CreateTemplate (t , client , owner .OrganizationID , version .ID )
430
+
431
+ // Firstly, create a regular workspace using template with parameters.
432
+ inv , root := clitest .New (t , "create" , "my-workspace" , "--template" , template .Name , "-y" ,
433
+ "--parameter" , fmt .Sprintf ("%s=%s" , firstParameterName , firstParameterValue ),
434
+ "--parameter" , fmt .Sprintf ("%s=%s" , secondParameterName , secondParameterValue ),
435
+ "--parameter" , fmt .Sprintf ("%s=%s" , immutableParameterName , immutableParameterValue ))
436
+ clitest .SetupConfig (t , member , root )
437
+ pty := ptytest .New (t ).Attach (inv )
438
+ inv .Stdout = pty .Output ()
439
+ inv .Stderr = pty .Output ()
440
+ err := inv .Run ()
441
+ require .NoError (t , err , "can't create first workspace" )
442
+
443
+ // Secondly, create a new workspace using parameters from the previous workspace.
444
+ const otherWorkspace = "other-workspace"
445
+
446
+ inv , root = clitest .New (t , "create" , "--copy-parameters-from" , "my-workspace" , otherWorkspace , "-y" )
447
+ clitest .SetupConfig (t , member , root )
448
+ pty = ptytest .New (t ).Attach (inv )
449
+ inv .Stdout = pty .Output ()
450
+ inv .Stderr = pty .Output ()
451
+ err = inv .Run ()
452
+ require .NoError (t , err , "can't create a workspace based on the source workspace" )
453
+
454
+ // Verify if the new workspace uses expected parameters.
455
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitShort )
456
+ defer cancel ()
457
+
458
+ workspaces , err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
459
+ Name : otherWorkspace ,
460
+ })
461
+ require .NoError (t , err , "can't list available workspaces" )
462
+ require .Len (t , workspaces .Workspaces , 1 )
463
+
464
+ otherWorkspaceLatestBuild := workspaces .Workspaces [0 ].LatestBuild
465
+
466
+ buildParameters , err := client .WorkspaceBuildParameters (ctx , otherWorkspaceLatestBuild .ID )
467
+ require .NoError (t , err )
468
+ require .Len (t , buildParameters , 3 )
469
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : firstParameterName , Value : firstParameterValue })
470
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : secondParameterName , Value : secondParameterValue })
471
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : immutableParameterName , Value : immutableParameterValue })
472
+ })
473
+
474
+ t .Run ("CopyParametersFromNotUpdatedWorkspace" , func (t * testing.T ) {
475
+ t .Parallel ()
476
+
477
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
478
+ owner := coderdtest .CreateFirstUser (t , client )
479
+ member , _ := coderdtest .CreateAnotherUser (t , client , owner .OrganizationID )
480
+ version := coderdtest .CreateTemplateVersion (t , client , owner .OrganizationID , echoResponses )
481
+ coderdtest .AwaitTemplateVersionJobCompleted (t , client , version .ID )
482
+
483
+ template := coderdtest .CreateTemplate (t , client , owner .OrganizationID , version .ID )
484
+
485
+ // Firstly, create a regular workspace using template with parameters.
486
+ inv , root := clitest .New (t , "create" , "my-workspace" , "--template" , template .Name , "-y" ,
487
+ "--parameter" , fmt .Sprintf ("%s=%s" , firstParameterName , firstParameterValue ),
488
+ "--parameter" , fmt .Sprintf ("%s=%s" , secondParameterName , secondParameterValue ),
489
+ "--parameter" , fmt .Sprintf ("%s=%s" , immutableParameterName , immutableParameterValue ))
490
+ clitest .SetupConfig (t , member , root )
491
+ pty := ptytest .New (t ).Attach (inv )
492
+ inv .Stdout = pty .Output ()
493
+ inv .Stderr = pty .Output ()
494
+ err := inv .Run ()
495
+ require .NoError (t , err , "can't create first workspace" )
496
+
497
+ // Secondly, update the template to the newer version.
498
+ version2 := coderdtest .CreateTemplateVersion (t , client , owner .OrganizationID , prepareEchoResponses ([]* proto.RichParameter {
499
+ {Name : "third_parameter" , Type : "string" , DefaultValue : "not-relevant" },
500
+ }), func (ctvr * codersdk.CreateTemplateVersionRequest ) {
501
+ ctvr .TemplateID = template .ID
502
+ })
503
+ coderdtest .AwaitTemplateVersionJobCompleted (t , client , version2 .ID )
504
+ coderdtest .UpdateActiveTemplateVersion (t , client , template .ID , version2 .ID )
505
+
506
+ // Thirdly, create a new workspace using parameters from the previous workspace.
507
+ const otherWorkspace = "other-workspace"
508
+
509
+ inv , root = clitest .New (t , "create" , "--copy-parameters-from" , "my-workspace" , otherWorkspace , "-y" )
510
+ clitest .SetupConfig (t , member , root )
511
+ pty = ptytest .New (t ).Attach (inv )
512
+ inv .Stdout = pty .Output ()
513
+ inv .Stderr = pty .Output ()
514
+ err = inv .Run ()
515
+ require .NoError (t , err , "can't create a workspace based on the source workspace" )
516
+
517
+ // Verify if the new workspace uses expected parameters.
518
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitShort )
519
+ defer cancel ()
520
+
521
+ workspaces , err := client .Workspaces (ctx , codersdk.WorkspaceFilter {
522
+ Name : otherWorkspace ,
523
+ })
524
+ require .NoError (t , err , "can't list available workspaces" )
525
+ require .Len (t , workspaces .Workspaces , 1 )
526
+
527
+ otherWorkspaceLatestBuild := workspaces .Workspaces [0 ].LatestBuild
528
+ require .Equal (t , version .ID , otherWorkspaceLatestBuild .TemplateVersionID )
529
+
530
+ buildParameters , err := client .WorkspaceBuildParameters (ctx , otherWorkspaceLatestBuild .ID )
531
+ require .NoError (t , err )
532
+ require .Len (t , buildParameters , 3 )
533
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : firstParameterName , Value : firstParameterValue })
534
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : secondParameterName , Value : secondParameterValue })
535
+ require .Contains (t , buildParameters , codersdk.WorkspaceBuildParameter {Name : immutableParameterName , Value : immutableParameterValue })
536
+ })
419
537
}
420
538
421
539
func TestCreateValidateRichParameters (t * testing.T ) {
0 commit comments