Skip to content

Commit 43f40f0

Browse files
committed
Long unit test to test the migration path
1 parent c5e7816 commit 43f40f0

File tree

3 files changed

+166
-5
lines changed

3 files changed

+166
-5
lines changed

coderd/workspacebuilds.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
498498

499499
// Check if legacy variable is defined
500500
for _, legacyParameter := range legacyParameters {
501-
if legacyParameter.Name != templateVersionParameter.Name {
501+
if legacyParameter.Name != templateVersionParameter.LegacyVariableName {
502502
continue
503503
}
504504

coderd/workspacebuilds_test.go

+165
Original file line numberDiff line numberDiff line change
@@ -971,3 +971,168 @@ func TestWorkspaceBuildValidateRichParameters(t *testing.T) {
971971
}
972972
})
973973
}
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+
}

provisionerd/runner/runner.go

-4
Original file line numberDiff line numberDiff line change
@@ -779,10 +779,6 @@ func (r *Runner) runTemplateImportProvisionWithRichParameters(ctx context.Contex
779779
return nil, xerrors.New(msgType.Complete.Error)
780780
}
781781

782-
if len(msgType.Complete.Parameters) > 0 && len(values) > 0 {
783-
return nil, xerrors.Errorf(`rich parameters can't be used together with legacy parameters, set the coder provider flag "feature_use_managed_variables = true" to enable managed variables`)
784-
}
785-
786782
r.logger.Info(context.Background(), "parse dry-run provision successful",
787783
slog.F("resource_count", len(msgType.Complete.Resources)),
788784
slog.F("resources", msgType.Complete.Resources),

0 commit comments

Comments
 (0)