prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version. Any missing params will be prompted to the user. It supports rich parameters.
(inv *serpent.Invocation, client *codersdk.Client, args prepWorkspaceBuildArgs)
| 562 | // prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version. |
| 563 | // Any missing params will be prompted to the user. It supports rich parameters. |
| 564 | func prepWorkspaceBuild(inv *serpent.Invocation, client *codersdk.Client, args prepWorkspaceBuildArgs) ([]codersdk.WorkspaceBuildParameter, error) { |
| 565 | ctx := inv.Context() |
| 566 | |
| 567 | templateVersion, err := client.TemplateVersion(ctx, args.TemplateVersionID) |
| 568 | if err != nil { |
| 569 | return nil, xerrors.Errorf("get template version: %w", err) |
| 570 | } |
| 571 | |
| 572 | dynamicParameters := true |
| 573 | if templateVersion.TemplateID != nil { |
| 574 | // TODO: This fetch is often redundant, as the caller often has the template already. |
| 575 | template, err := client.Template(ctx, *templateVersion.TemplateID) |
| 576 | if err != nil { |
| 577 | return nil, xerrors.Errorf("get template: %w", err) |
| 578 | } |
| 579 | dynamicParameters = !template.UseClassicParameterFlow |
| 580 | } |
| 581 | |
| 582 | parameterFile := map[string]string{} |
| 583 | if args.RichParameterFile != "" { |
| 584 | parameterFile, err = parseParameterMapFile(args.RichParameterFile) |
| 585 | if err != nil { |
| 586 | return nil, xerrors.Errorf("can't parse parameter map file: %w", err) |
| 587 | } |
| 588 | } |
| 589 | |
| 590 | resolver := new(ParameterResolver). |
| 591 | WithLastBuildParameters(args.LastBuildParameters). |
| 592 | WithSourceWorkspaceParameters(args.SourceWorkspaceParameters). |
| 593 | WithPromptEphemeralParameters(args.PromptEphemeralParameters). |
| 594 | WithEphemeralParameters(args.EphemeralParameters). |
| 595 | WithPresetParameters(args.PresetParameters). |
| 596 | WithPromptRichParameters(args.PromptRichParameters). |
| 597 | WithRichParameters(args.RichParameters). |
| 598 | WithRichParametersFile(parameterFile). |
| 599 | WithRichParametersDefaults(args.RichParameterDefaults). |
| 600 | WithUseParameterDefaults(args.UseParameterDefaults) |
| 601 | |
| 602 | var templateVersionParameters []codersdk.TemplateVersionParameter |
| 603 | if !dynamicParameters { |
| 604 | templateVersionParameters, err = client.TemplateVersionRichParameters(inv.Context(), templateVersion.ID) |
| 605 | if err != nil { |
| 606 | return nil, xerrors.Errorf("get template version rich parameters: %w", err) |
| 607 | } |
| 608 | } else { |
| 609 | var ownerID uuid.UUID |
| 610 | { // Putting in its own block to limit scope of owningMember, as it might be nil |
| 611 | owningMember, err := client.OrganizationMember(ctx, templateVersion.OrganizationID.String(), args.Owner) |
| 612 | if err != nil { |
| 613 | // This is unfortunate, but if we are an org owner, then we can create workspaces |
| 614 | // for users that are not part of the organization. |
| 615 | owningUser, uerr := client.User(ctx, args.Owner) |
| 616 | if uerr != nil { |
| 617 | return nil, xerrors.Errorf("get owning member: %w", err) |
| 618 | } |
| 619 | ownerID = owningUser.ID |
| 620 | } else { |
| 621 | ownerID = owningMember.UserID |
no test coverage detected