diff --git a/cli/exp_scaletest.go b/cli/exp_scaletest.go index 5b8da2713fa40..063cc827f06ff 100644 --- a/cli/exp_scaletest.go +++ b/cli/exp_scaletest.go @@ -525,6 +525,8 @@ func (r *RootCmd) scaletestCreateWorkspaces() *clibase.Cmd { useHostUser bool + parameterFlags workspaceParameterFlags + tracingFlags = &scaletestTracingFlags{} strategy = &scaletestStrategyFlags{} cleanupStrategy = &scaletestStrategyFlags{cleanup: true} @@ -597,11 +599,29 @@ func (r *RootCmd) scaletestCreateWorkspaces() *clibase.Cmd { return xerrors.Errorf("get template version %q: %w", tpl.ActiveVersionID, err) } + cliRichParameters, err := asWorkspaceBuildParameters(parameterFlags.richParameters) + if err != nil { + return xerrors.Errorf("can't parse given parameter values: %w", err) + } + + richParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{ + Action: WorkspaceCreate, + Template: tpl, + NewWorkspaceName: "scaletest-%", // TODO: the scaletest runner will pass in a different name here. Does this matter? + + RichParameterFile: parameterFlags.richParameterFile, + RichParameters: cliRichParameters, + }) + if err != nil { + return xerrors.Errorf("prepare build: %w", err) + } + // Do a dry-run to ensure the template and parameters are valid // before we start creating users and workspaces. if !noPlan { dryRun, err := client.CreateTemplateVersionDryRun(ctx, templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{ - WorkspaceName: "scaletest", + WorkspaceName: "scaletest", + RichParameterValues: richParameters, }) if err != nil { return xerrors.Errorf("start dry run workspace creation: %w", err) @@ -653,7 +673,8 @@ func (r *RootCmd) scaletestCreateWorkspaces() *clibase.Cmd { OrganizationID: me.OrganizationIDs[0], // UserID is set by the test automatically. Request: codersdk.CreateWorkspaceRequest{ - TemplateID: tpl.ID, + TemplateID: tpl.ID, + RichParameterValues: richParameters, }, NoWaitForAgents: noWaitForAgents, }, @@ -865,6 +886,7 @@ func (r *RootCmd) scaletestCreateWorkspaces() *clibase.Cmd { }, } + cmd.Options = append(cmd.Options, parameterFlags.cliParameters()...) tracingFlags.attach(&cmd.Options) strategy.attach(&cmd.Options) cleanupStrategy.attach(&cmd.Options) diff --git a/cli/exp_scaletest_test.go b/cli/exp_scaletest_test.go index b3a60ce24c4a8..556aed6c21a82 100644 --- a/cli/exp_scaletest_test.go +++ b/cli/exp_scaletest_test.go @@ -48,6 +48,8 @@ func TestScaleTestCreateWorkspaces(t *testing.T) { "--cleanup-job-timeout", "15s", "--output", "text", "--output", "json:"+outputFile, + "--parameter", "foo=baz", + "--rich-parameter-file", "/path/to/some/parameter/file.ext", ) clitest.SetupConfig(t, client, root) pty := ptytest.New(t) diff --git a/scaletest/createworkspaces/run_test.go b/scaletest/createworkspaces/run_test.go index 524b39499ecc3..aa4b5ffb41802 100644 --- a/scaletest/createworkspaces/run_test.go +++ b/scaletest/createworkspaces/run_test.go @@ -34,6 +34,19 @@ func Test_Runner(t *testing.T) { t.Skip("Race detector enabled, skipping time-sensitive test.") } + testParameters := []*proto.RichParameter{ + { + Name: "foo", + DefaultValue: "baz", + }, + } + testParameterValues := []codersdk.WorkspaceBuildParameter{ + { + Name: "foo", + Value: "baz", + }, + } + t.Run("OK", func(t *testing.T) { t.Parallel() @@ -47,8 +60,16 @@ func Test_Runner(t *testing.T) { authToken := uuid.NewString() version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: testParameters, + }, + }, + }, + }, ProvisionApply: []*proto.Response{ { Type: &proto.Response_Log{ @@ -102,7 +123,8 @@ func Test_Runner(t *testing.T) { Workspace: workspacebuild.Config{ OrganizationID: user.OrganizationID, Request: codersdk.CreateWorkspaceRequest{ - TemplateID: template.ID, + TemplateID: template.ID, + RichParameterValues: testParameterValues, }, }, ReconnectingPTY: &reconnectingpty.Config{ @@ -133,6 +155,13 @@ func Test_Runner(t *testing.T) { require.NoError(t, err) require.Len(t, workspaces.Workspaces, 1) + // Ensure the correct build parameters were used. + buildParams, err := client.WorkspaceBuildParameters(ctx, workspaces.Workspaces[0].LatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParams, 1) + require.Equal(t, testParameterValues[0].Name, buildParams[0].Name) + require.Equal(t, testParameterValues[0].Value, buildParams[0].Value) + // Look for strings in the logs. require.Contains(t, logsStr, "Generating user password...") require.Contains(t, logsStr, "Creating user:") @@ -173,8 +202,16 @@ func Test_Runner(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: testParameters, + }, + }, + }, + }, ProvisionApply: []*proto.Response{ { Type: &proto.Response_Log{Log: &proto.Log{}}, @@ -200,7 +237,8 @@ func Test_Runner(t *testing.T) { Workspace: workspacebuild.Config{ OrganizationID: user.OrganizationID, Request: codersdk.CreateWorkspaceRequest{ - TemplateID: template.ID, + TemplateID: template.ID, + RichParameterValues: testParameterValues, }, }, }) @@ -288,8 +326,16 @@ func Test_Runner(t *testing.T) { authToken := uuid.NewString() version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: testParameters, + }, + }, + }, + }, ProvisionApply: []*proto.Response{ { Type: &proto.Response_Log{ @@ -344,7 +390,8 @@ func Test_Runner(t *testing.T) { Workspace: workspacebuild.Config{ OrganizationID: user.OrganizationID, Request: codersdk.CreateWorkspaceRequest{ - TemplateID: template.ID, + TemplateID: template.ID, + RichParameterValues: testParameterValues, }, }, ReconnectingPTY: &reconnectingpty.Config{ @@ -375,6 +422,13 @@ func Test_Runner(t *testing.T) { require.NoError(t, err) require.Len(t, workspaces.Workspaces, 1) + // Ensure the correct build parameters were used. + buildParams, err := client.WorkspaceBuildParameters(ctx, workspaces.Workspaces[0].LatestBuild.ID) + require.NoError(t, err) + require.Len(t, buildParams, 1) + require.Equal(t, testParameterValues[0].Name, buildParams[0].Name) + require.Equal(t, testParameterValues[0].Value, buildParams[0].Value) + // Look for strings in the logs. require.Contains(t, logsStr, "Generating user password...") require.Contains(t, logsStr, "Creating user:") @@ -413,8 +467,16 @@ func Test_Runner(t *testing.T) { user := coderdtest.CreateFirstUser(t, client) version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, + Parse: echo.ParseComplete, + ProvisionPlan: []*proto.Response{ + { + Type: &proto.Response_Plan{ + Plan: &proto.PlanComplete{ + Parameters: testParameters, + }, + }, + }, + }, ProvisionApply: []*proto.Response{ { Type: &proto.Response_Apply{ @@ -438,7 +500,8 @@ func Test_Runner(t *testing.T) { Workspace: workspacebuild.Config{ OrganizationID: user.OrganizationID, Request: codersdk.CreateWorkspaceRequest{ - TemplateID: template.ID, + TemplateID: template.ID, + RichParameterValues: testParameterValues, }, }, }) diff --git a/scripts/coder-dev.sh b/scripts/coder-dev.sh index 29072a60f7903..69696351ea05a 100755 --- a/scripts/coder-dev.sh +++ b/scripts/coder-dev.sh @@ -17,6 +17,9 @@ fi if [[ ${1:-} == wsproxy ]] && [[ ${2:-} == server ]]; then BINARY_TYPE=coder fi +if [[ ${1:-} == exp ]] && [[ ${2:-} == scaletest ]]; then + BINARY_TYPE=coder +fi RELATIVE_BINARY_PATH="build/${BINARY_TYPE}_${GOOS}_${GOARCH}" # To preserve the CWD when running the binary, we need to use pushd and popd to