@@ -971,3 +971,168 @@ func TestWorkspaceBuildValidateRichParameters(t *testing.T) {
971
971
}
972
972
})
973
973
}
974
+
975
+ func TestMigrateLegacyToRichParameters (t * testing.T ) {
976
+ t .Parallel ()
977
+
978
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
979
+ user := coderdtest .CreateFirstUser (t , client )
980
+
981
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
982
+ defer cancel ()
983
+
984
+ // 1. Prepare a template with legacy parameters.
985
+ templateVersion := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , & echo.Responses {
986
+ Parse : []* proto.Parse_Response {{
987
+ Type : & proto.Parse_Response_Complete {
988
+ Complete : & proto.Parse_Complete {
989
+ ParameterSchemas : []* proto.ParameterSchema {{
990
+ AllowOverrideSource : true ,
991
+ Name : "example" ,
992
+ Description : "description 1" ,
993
+ DefaultSource : & proto.ParameterSource {
994
+ Scheme : proto .ParameterSource_DATA ,
995
+ Value : "tomato" ,
996
+ },
997
+ DefaultDestination : & proto.ParameterDestination {
998
+ Scheme : proto .ParameterDestination_PROVISIONER_VARIABLE ,
999
+ },
1000
+ },
1001
+ },
1002
+ },
1003
+ },
1004
+ }},
1005
+ ProvisionApply : echo .ProvisionComplete ,
1006
+ ProvisionPlan : echo .ProvisionComplete ,
1007
+ })
1008
+ coderdtest .AwaitTemplateVersionJob (t , client , templateVersion .ID )
1009
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , templateVersion .ID )
1010
+
1011
+ // Create a workspace
1012
+ workspace := coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID , func (cwr * codersdk.CreateWorkspaceRequest ) {
1013
+ cwr .ParameterValues = []codersdk.CreateParameterRequest {
1014
+ {
1015
+ Name : "example" ,
1016
+ SourceValue : "carrot" ,
1017
+ SourceScheme : codersdk .ParameterSourceSchemeData ,
1018
+ DestinationScheme : codersdk .ParameterDestinationSchemeEnvironmentVariable ,
1019
+ },
1020
+ }
1021
+ })
1022
+ workspaceBuild := coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
1023
+ require .Equal (t , codersdk .WorkspaceStatusRunning , workspaceBuild .Status )
1024
+
1025
+ // 2. Upload the template with legacy and rich parameters.
1026
+ templateWithParameters := & echo.Responses {
1027
+ Parse : []* proto.Parse_Response {{
1028
+ Type : & proto.Parse_Response_Complete {
1029
+ Complete : & proto.Parse_Complete {
1030
+ ParameterSchemas : []* proto.ParameterSchema {{
1031
+ AllowOverrideSource : true ,
1032
+ Name : "example" ,
1033
+ Description : "description 1" ,
1034
+ DefaultSource : & proto.ParameterSource {
1035
+ Scheme : proto .ParameterSource_DATA ,
1036
+ Value : "tomato" ,
1037
+ },
1038
+ DefaultDestination : & proto.ParameterDestination {
1039
+ Scheme : proto .ParameterDestination_PROVISIONER_VARIABLE ,
1040
+ },
1041
+ },
1042
+ },
1043
+ },
1044
+ },
1045
+ }},
1046
+ ProvisionPlan : []* proto.Provision_Response {
1047
+ {
1048
+ Type : & proto.Provision_Response_Complete {
1049
+ Complete : & proto.Provision_Complete {
1050
+ Parameters : []* proto.RichParameter {
1051
+ {
1052
+ Name : "new_example" ,
1053
+ Type : "string" ,
1054
+ Mutable : true ,
1055
+ Required : true ,
1056
+ LegacyVariableName : "example" ,
1057
+ },
1058
+ },
1059
+ },
1060
+ },
1061
+ },
1062
+ },
1063
+ ProvisionApply : echo .ProvisionComplete ,
1064
+ }
1065
+ templateVersion = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , templateWithParameters , template .ID )
1066
+ coderdtest .AwaitTemplateVersionJob (t , client , templateVersion .ID )
1067
+
1068
+ // Check if rich parameters are expected
1069
+ richParameters , err := client .TemplateVersionRichParameters (ctx , templateVersion .ID )
1070
+ require .NoError (t , err )
1071
+ require .Len (t , richParameters , 1 )
1072
+ require .Equal (t , "new_example" , richParameters [0 ].Name )
1073
+
1074
+ // Update workspace to use rich parameters and template variables
1075
+ workspaceBuild , err = client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
1076
+ TemplateVersionID : templateVersion .ID ,
1077
+ Transition : codersdk .WorkspaceTransitionStart ,
1078
+ })
1079
+ require .NoError (t , err )
1080
+ require .Eventually (t , func () bool {
1081
+ workspaceBuild = coderdtest .AwaitWorkspaceBuildJob (t , client , workspaceBuild .ID )
1082
+ return codersdk .WorkspaceStatusRunning == workspaceBuild .Status
1083
+ }, testutil .WaitLong , testutil .IntervalFast )
1084
+
1085
+ // Check if variable value has been imported
1086
+ buildParameters , err := client .WorkspaceBuildParameters (ctx , workspaceBuild .ID )
1087
+ require .NoError (t , err )
1088
+ require .Len (t , buildParameters , 1 )
1089
+ require .Equal (t , "carrot" , buildParameters [0 ].Value )
1090
+
1091
+ // 3. Upload the template with rich parameters only
1092
+ templateWithParameters = & echo.Responses {
1093
+ Parse : echo .ParseComplete ,
1094
+ ProvisionPlan : []* proto.Provision_Response {
1095
+ {
1096
+ Type : & proto.Provision_Response_Complete {
1097
+ Complete : & proto.Provision_Complete {
1098
+ Parameters : []* proto.RichParameter {
1099
+ {
1100
+ Name : "new_example" ,
1101
+ Type : "string" ,
1102
+ Mutable : true ,
1103
+ Required : true ,
1104
+ LegacyVariableName : "example" ,
1105
+ },
1106
+ },
1107
+ },
1108
+ },
1109
+ },
1110
+ },
1111
+ ProvisionApply : echo .ProvisionComplete ,
1112
+ }
1113
+ templateVersion = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , templateWithParameters , template .ID )
1114
+ coderdtest .AwaitTemplateVersionJob (t , client , templateVersion .ID )
1115
+
1116
+ // Check if rich parameters are expected
1117
+ richParameters , err = client .TemplateVersionRichParameters (ctx , templateVersion .ID )
1118
+ require .NoError (t , err )
1119
+ require .Len (t , richParameters , 1 )
1120
+ require .Equal (t , "new_example" , richParameters [0 ].Name )
1121
+
1122
+ // Update workspace to use rich parameters and template variables
1123
+ workspaceBuild , err = client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
1124
+ TemplateVersionID : templateVersion .ID ,
1125
+ Transition : codersdk .WorkspaceTransitionStart ,
1126
+ })
1127
+ require .NoError (t , err )
1128
+ require .Eventually (t , func () bool {
1129
+ workspaceBuild = coderdtest .AwaitWorkspaceBuildJob (t , client , workspaceBuild .ID )
1130
+ return codersdk .WorkspaceStatusRunning == workspaceBuild .Status
1131
+ }, testutil .WaitLong , testutil .IntervalFast )
1132
+
1133
+ // Check if build parameters have been pulled from last build
1134
+ buildParameters , err = client .WorkspaceBuildParameters (ctx , workspaceBuild .ID )
1135
+ require .NoError (t , err )
1136
+ require .Len (t , buildParameters , 1 )
1137
+ require .Equal (t , "carrot" , buildParameters [0 ].Value )
1138
+ }
0 commit comments