mirror of https://github.com/coder/coder.git
feat: Add CLI support for workspace build parameters (#5768)
* WIP * WIP * CLI: handle workspace build parameters * fix: golintci * Fix: dry run * fix * CLI: is mutable * coderd: mutable * fix: golanci * fix: richParameterFile * CLI: create unit tests * CLI: update test * Fix * fix: order * fix
This commit is contained in:
parent
6a245ab1cc
commit
bbb208e29c
|
@ -60,3 +60,56 @@ func ParameterSchema(cmd *cobra.Command, parameterSchema codersdk.ParameterSchem
|
||||||
|
|
||||||
return value, nil
|
return value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RichParameter(cmd *cobra.Command, templateVersionParameter codersdk.TemplateVersionParameter) (string, error) {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), Styles.Bold.Render(templateVersionParameter.Name))
|
||||||
|
if templateVersionParameter.Description != "" {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+strings.TrimSpace(strings.Join(strings.Split(templateVersionParameter.Description, "\n"), "\n "))+"\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Implement full validation and show descriptions.
|
||||||
|
var err error
|
||||||
|
var value string
|
||||||
|
if len(templateVersionParameter.Options) > 0 {
|
||||||
|
// Move the cursor up a single line for nicer display!
|
||||||
|
_, _ = fmt.Fprint(cmd.OutOrStdout(), "\033[1A")
|
||||||
|
value, err = Select(cmd, SelectOptions{
|
||||||
|
Options: templateVersionParameterOptionValues(templateVersionParameter),
|
||||||
|
Default: templateVersionParameter.DefaultValue,
|
||||||
|
HideSearch: true,
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout())
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+Styles.Prompt.String()+Styles.Field.Render(value))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
text := "Enter a value"
|
||||||
|
if templateVersionParameter.DefaultValue != "" {
|
||||||
|
text += fmt.Sprintf(" (default: %q)", templateVersionParameter.DefaultValue)
|
||||||
|
}
|
||||||
|
text += ":"
|
||||||
|
|
||||||
|
value, err = Prompt(cmd, PromptOptions{
|
||||||
|
Text: Styles.Bold.Render(text),
|
||||||
|
})
|
||||||
|
value = strings.TrimSpace(value)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If they didn't specify anything, use the default value if set.
|
||||||
|
if len(templateVersionParameter.Options) == 0 && value == "" {
|
||||||
|
value = templateVersionParameter.DefaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
return value, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func templateVersionParameterOptionValues(param codersdk.TemplateVersionParameter) []string {
|
||||||
|
var options []string
|
||||||
|
for _, opt := range param.Options {
|
||||||
|
options = append(options, opt.Value)
|
||||||
|
}
|
||||||
|
return options
|
||||||
|
}
|
||||||
|
|
131
cli/create.go
131
cli/create.go
|
@ -17,11 +17,12 @@ import (
|
||||||
|
|
||||||
func create() *cobra.Command {
|
func create() *cobra.Command {
|
||||||
var (
|
var (
|
||||||
parameterFile string
|
parameterFile string
|
||||||
templateName string
|
richParameterFile string
|
||||||
startAt string
|
templateName string
|
||||||
stopAfter time.Duration
|
startAt string
|
||||||
workspaceName string
|
stopAfter time.Duration
|
||||||
|
workspaceName string
|
||||||
)
|
)
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Annotations: workspaceCommand,
|
Annotations: workspaceCommand,
|
||||||
|
@ -121,11 +122,12 @@ func create() *cobra.Command {
|
||||||
schedSpec = ptr.Ref(sched.String())
|
schedSpec = ptr.Ref(sched.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
parameters, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
|
buildParams, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
|
||||||
Template: template,
|
Template: template,
|
||||||
ExistingParams: []codersdk.Parameter{},
|
ExistingParams: []codersdk.Parameter{},
|
||||||
ParameterFile: parameterFile,
|
ParameterFile: parameterFile,
|
||||||
NewWorkspaceName: workspaceName,
|
RichParameterFile: richParameterFile,
|
||||||
|
NewWorkspaceName: workspaceName,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -140,11 +142,12 @@ func create() *cobra.Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
workspace, err := client.CreateWorkspace(cmd.Context(), organization.ID, codersdk.Me, codersdk.CreateWorkspaceRequest{
|
workspace, err := client.CreateWorkspace(cmd.Context(), organization.ID, codersdk.Me, codersdk.CreateWorkspaceRequest{
|
||||||
TemplateID: template.ID,
|
TemplateID: template.ID,
|
||||||
Name: workspaceName,
|
Name: workspaceName,
|
||||||
AutostartSchedule: schedSpec,
|
AutostartSchedule: schedSpec,
|
||||||
TTLMillis: ptr.Ref(stopAfter.Milliseconds()),
|
TTLMillis: ptr.Ref(stopAfter.Milliseconds()),
|
||||||
ParameterValues: parameters,
|
ParameterValues: buildParams.parameters,
|
||||||
|
RichParameterValues: buildParams.richParameters,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -163,26 +166,40 @@ func create() *cobra.Command {
|
||||||
cliui.AllowSkipPrompt(cmd)
|
cliui.AllowSkipPrompt(cmd)
|
||||||
cliflag.StringVarP(cmd.Flags(), &templateName, "template", "t", "CODER_TEMPLATE_NAME", "", "Specify a template name.")
|
cliflag.StringVarP(cmd.Flags(), &templateName, "template", "t", "CODER_TEMPLATE_NAME", "", "Specify a template name.")
|
||||||
cliflag.StringVarP(cmd.Flags(), ¶meterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
|
cliflag.StringVarP(cmd.Flags(), ¶meterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
|
||||||
|
cliflag.StringVarP(cmd.Flags(), &richParameterFile, "rich-parameter-file", "", "CODER_RICH_PARAMETER_FILE", "", "Specify a file path with values for rich parameters defined in the template.")
|
||||||
cliflag.StringVarP(cmd.Flags(), &startAt, "start-at", "", "CODER_WORKSPACE_START_AT", "", "Specify the workspace autostart schedule. Check `coder schedule start --help` for the syntax.")
|
cliflag.StringVarP(cmd.Flags(), &startAt, "start-at", "", "CODER_WORKSPACE_START_AT", "", "Specify the workspace autostart schedule. Check `coder schedule start --help` for the syntax.")
|
||||||
cliflag.DurationVarP(cmd.Flags(), &stopAfter, "stop-after", "", "CODER_WORKSPACE_STOP_AFTER", 8*time.Hour, "Specify a duration after which the workspace should shut down (e.g. 8h).")
|
cliflag.DurationVarP(cmd.Flags(), &stopAfter, "stop-after", "", "CODER_WORKSPACE_STOP_AFTER", 8*time.Hour, "Specify a duration after which the workspace should shut down (e.g. 8h).")
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
||||||
type prepWorkspaceBuildArgs struct {
|
type prepWorkspaceBuildArgs struct {
|
||||||
Template codersdk.Template
|
Template codersdk.Template
|
||||||
ExistingParams []codersdk.Parameter
|
ExistingParams []codersdk.Parameter
|
||||||
ParameterFile string
|
ParameterFile string
|
||||||
NewWorkspaceName string
|
ExistingRichParams []codersdk.WorkspaceBuildParameter
|
||||||
|
RichParameterFile string
|
||||||
|
NewWorkspaceName string
|
||||||
|
|
||||||
|
UpdateWorkspace bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type buildParameters struct {
|
||||||
|
// Parameters contains legacy parameters stored in /parameters.
|
||||||
|
parameters []codersdk.CreateParameterRequest
|
||||||
|
// Rich parameters stores values for build parameters annotated with description, icon, type, etc.
|
||||||
|
richParameters []codersdk.WorkspaceBuildParameter
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
|
// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
|
||||||
// Any missing params will be prompted to the user.
|
// Any missing params will be prompted to the user. It supports legacy and rich parameters.
|
||||||
func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWorkspaceBuildArgs) ([]codersdk.CreateParameterRequest, error) {
|
func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWorkspaceBuildArgs) (*buildParameters, error) {
|
||||||
ctx := cmd.Context()
|
ctx := cmd.Context()
|
||||||
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
|
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Legacy parameters
|
||||||
parameterSchemas, err := client.TemplateVersionSchema(ctx, templateVersion.ID)
|
parameterSchemas, err := client.TemplateVersionSchema(ctx, templateVersion.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -200,7 +217,7 @@ func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
disclaimerPrinted := false
|
disclaimerPrinted := false
|
||||||
parameters := make([]codersdk.CreateParameterRequest, 0)
|
legacyParameters := make([]codersdk.CreateParameterRequest, 0)
|
||||||
PromptParamLoop:
|
PromptParamLoop:
|
||||||
for _, parameterSchema := range parameterSchemas {
|
for _, parameterSchema := range parameterSchemas {
|
||||||
if !parameterSchema.AllowOverrideSource {
|
if !parameterSchema.AllowOverrideSource {
|
||||||
|
@ -227,19 +244,76 @@ PromptParamLoop:
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
parameters = append(parameters, codersdk.CreateParameterRequest{
|
legacyParameters = append(legacyParameters, codersdk.CreateParameterRequest{
|
||||||
Name: parameterSchema.Name,
|
Name: parameterSchema.Name,
|
||||||
SourceValue: parameterValue,
|
SourceValue: parameterValue,
|
||||||
SourceScheme: codersdk.ParameterSourceSchemeData,
|
SourceScheme: codersdk.ParameterSourceSchemeData,
|
||||||
DestinationScheme: parameterSchema.DefaultDestinationScheme,
|
DestinationScheme: parameterSchema.DefaultDestinationScheme,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
_, _ = fmt.Fprintln(cmd.OutOrStdout())
|
|
||||||
|
if disclaimerPrinted {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rich parameters
|
||||||
|
templateVersionParameters, err := client.TemplateVersionRichParameters(cmd.Context(), templateVersion.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("get template version rich parameters: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
parameterMapFromFile = map[string]string{}
|
||||||
|
useParamFile = false
|
||||||
|
if args.RichParameterFile != "" {
|
||||||
|
useParamFile = true
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("Attempting to read the variables from the rich parameter file.")+"\r\n")
|
||||||
|
parameterMapFromFile, err = createParameterMapFromFile(args.RichParameterFile)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
disclaimerPrinted = false
|
||||||
|
richParameters := make([]codersdk.WorkspaceBuildParameter, 0)
|
||||||
|
PromptRichParamLoop:
|
||||||
|
for _, templateVersionParameter := range templateVersionParameters {
|
||||||
|
if !disclaimerPrinted {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("This template has customizable parameters. Values can be changed after create, but may have unintended side effects (like data loss).")+"\r\n")
|
||||||
|
disclaimerPrinted = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Param file is all or nothing
|
||||||
|
if !useParamFile {
|
||||||
|
for _, e := range args.ExistingRichParams {
|
||||||
|
if e.Name == templateVersionParameter.Name {
|
||||||
|
// If the param already exists, we do not need to prompt it again.
|
||||||
|
// The workspace scope will reuse params for each build.
|
||||||
|
continue PromptRichParamLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if args.UpdateWorkspace && !templateVersionParameter.Mutable {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Warn.Render(fmt.Sprintf(`Parameter %q is not mutable, so can't be customized after workspace creation.`, templateVersionParameter.Name)))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parameterValue, err := getWorkspaceBuildParameterValueFromMapOrInput(cmd, parameterMapFromFile, templateVersionParameter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
richParameters = append(richParameters, *parameterValue)
|
||||||
|
}
|
||||||
|
|
||||||
|
if disclaimerPrinted {
|
||||||
|
_, _ = fmt.Fprintln(cmd.OutOrStdout())
|
||||||
|
}
|
||||||
|
|
||||||
// Run a dry-run with the given parameters to check correctness
|
// Run a dry-run with the given parameters to check correctness
|
||||||
dryRun, err := client.CreateTemplateVersionDryRun(cmd.Context(), templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{
|
dryRun, err := client.CreateTemplateVersionDryRun(cmd.Context(), templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{
|
||||||
WorkspaceName: args.NewWorkspaceName,
|
WorkspaceName: args.NewWorkspaceName,
|
||||||
ParameterValues: parameters,
|
ParameterValues: legacyParameters,
|
||||||
|
RichParameterValues: richParameters,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, xerrors.Errorf("begin workspace dry-run: %w", err)
|
return nil, xerrors.Errorf("begin workspace dry-run: %w", err)
|
||||||
|
@ -279,5 +353,8 @@ PromptParamLoop:
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return parameters, nil
|
return &buildParameters{
|
||||||
|
parameters: legacyParameters,
|
||||||
|
richParameters: richParameters,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -321,6 +321,124 @@ func TestCreate(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCreateWithRichParameters(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const (
|
||||||
|
firstParameterName = "first_parameter"
|
||||||
|
firstParameterDescription = "This is first parameter"
|
||||||
|
firstParameterValue = "1"
|
||||||
|
|
||||||
|
secondParameterName = "second_parameter"
|
||||||
|
secondParameterDescription = "This is second parameter"
|
||||||
|
secondParameterValue = "2"
|
||||||
|
|
||||||
|
immutableParameterName = "third_parameter"
|
||||||
|
immutableParameterDescription = "This is not mutable parameter"
|
||||||
|
immutableParameterValue = "3"
|
||||||
|
)
|
||||||
|
|
||||||
|
echoResponses := &echo.Responses{
|
||||||
|
Parse: echo.ParseComplete,
|
||||||
|
ProvisionPlan: []*proto.Provision_Response{
|
||||||
|
{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{
|
||||||
|
Parameters: []*proto.RichParameter{
|
||||||
|
{Name: firstParameterName, Description: firstParameterDescription, Mutable: true},
|
||||||
|
{Name: secondParameterName, Description: secondParameterDescription, Mutable: true},
|
||||||
|
{Name: immutableParameterName, Description: immutableParameterDescription, Mutable: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
ProvisionApply: []*proto.Provision_Response{{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("InputParameters", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
|
||||||
|
cmd, root := clitest.New(t, "create", "my-workspace", "--template", template.Name)
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
pty := ptytest.New(t)
|
||||||
|
cmd.SetIn(pty.Input())
|
||||||
|
cmd.SetOut(pty.Output())
|
||||||
|
go func() {
|
||||||
|
defer close(doneChan)
|
||||||
|
err := cmd.Execute()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
matches := []string{
|
||||||
|
firstParameterDescription, firstParameterValue,
|
||||||
|
secondParameterDescription, secondParameterValue,
|
||||||
|
immutableParameterDescription, immutableParameterValue,
|
||||||
|
"Confirm create?", "yes",
|
||||||
|
}
|
||||||
|
for i := 0; i < len(matches); i += 2 {
|
||||||
|
match := matches[i]
|
||||||
|
value := matches[i+1]
|
||||||
|
pty.ExpectMatch(match)
|
||||||
|
pty.WriteLine(value)
|
||||||
|
}
|
||||||
|
<-doneChan
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("RichParametersFile", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
|
||||||
|
tempDir := t.TempDir()
|
||||||
|
removeTmpDirUntilSuccessAfterTest(t, tempDir)
|
||||||
|
parameterFile, _ := os.CreateTemp(tempDir, "testParameterFile*.yaml")
|
||||||
|
_, _ = parameterFile.WriteString(
|
||||||
|
firstParameterName + ": " + firstParameterValue + "\n" +
|
||||||
|
secondParameterName + ": " + secondParameterValue + "\n" +
|
||||||
|
immutableParameterName + ": " + immutableParameterValue)
|
||||||
|
cmd, root := clitest.New(t, "create", "my-workspace", "--template", template.Name, "--rich-parameter-file", parameterFile.Name())
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
pty := ptytest.New(t)
|
||||||
|
cmd.SetIn(pty.Input())
|
||||||
|
cmd.SetOut(pty.Output())
|
||||||
|
go func() {
|
||||||
|
defer close(doneChan)
|
||||||
|
err := cmd.Execute()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
matches := []string{
|
||||||
|
"Confirm create?", "yes",
|
||||||
|
}
|
||||||
|
for i := 0; i < len(matches); i += 2 {
|
||||||
|
match := matches[i]
|
||||||
|
value := matches[i+1]
|
||||||
|
pty.ExpectMatch(match)
|
||||||
|
pty.WriteLine(value)
|
||||||
|
}
|
||||||
|
<-doneChan
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func createTestParseResponseWithDefault(defaultValue string) []*proto.Parse_Response {
|
func createTestParseResponseWithDefault(defaultValue string) []*proto.Parse_Response {
|
||||||
return []*proto.Parse_Response{{
|
return []*proto.Parse_Response{{
|
||||||
Type: &proto.Parse_Response_Complete{
|
Type: &proto.Parse_Response_Complete{
|
||||||
|
|
|
@ -3,11 +3,10 @@ package cli
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/spf13/cobra"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
|
|
||||||
"github.com/coder/coder/cli/cliui"
|
"github.com/coder/coder/cli/cliui"
|
||||||
"github.com/coder/coder/codersdk"
|
"github.com/coder/coder/codersdk"
|
||||||
)
|
)
|
||||||
|
@ -58,3 +57,27 @@ func getParameterValueFromMapOrInput(cmd *cobra.Command, parameterMap map[string
|
||||||
}
|
}
|
||||||
return parameterValue, nil
|
return parameterValue, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getWorkspaceBuildParameterValueFromMapOrInput(cmd *cobra.Command, parameterMap map[string]string, templateVersionParameter codersdk.TemplateVersionParameter) (*codersdk.WorkspaceBuildParameter, error) {
|
||||||
|
var parameterValue string
|
||||||
|
var err error
|
||||||
|
if parameterMap != nil {
|
||||||
|
var ok bool
|
||||||
|
parameterValue, ok = parameterMap[templateVersionParameter.Name]
|
||||||
|
if !ok {
|
||||||
|
parameterValue, err = cliui.RichParameter(cmd, templateVersionParameter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
parameterValue, err = cliui.RichParameter(cmd, templateVersionParameter)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &codersdk.WorkspaceBuildParameter{
|
||||||
|
Name: templateVersionParameter.Name,
|
||||||
|
Value: parameterValue,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
|
@ -7,6 +7,9 @@ Flags:
|
||||||
-h, --help help for create
|
-h, --help help for create
|
||||||
--parameter-file string Specify a file path with parameter values.
|
--parameter-file string Specify a file path with parameter values.
|
||||||
Consumes $CODER_PARAMETER_FILE
|
Consumes $CODER_PARAMETER_FILE
|
||||||
|
--rich-parameter-file string Specify a file path with values for rich
|
||||||
|
parameters defined in the template.
|
||||||
|
Consumes $CODER_RICH_PARAMETER_FILE
|
||||||
--start-at coder schedule start --help Specify the workspace autostart schedule. Check
|
--start-at coder schedule start --help Specify the workspace autostart schedule. Check
|
||||||
coder schedule start --help for the syntax.
|
coder schedule start --help for the syntax.
|
||||||
Consumes $CODER_WORKSPACE_START_AT
|
Consumes $CODER_WORKSPACE_START_AT
|
||||||
|
|
|
@ -4,11 +4,14 @@ Usage:
|
||||||
coder update <workspace> [flags]
|
coder update <workspace> [flags]
|
||||||
|
|
||||||
Flags:
|
Flags:
|
||||||
--always-prompt Always prompt all parameters. Does not pull parameter values
|
--always-prompt Always prompt all parameters. Does not pull parameter
|
||||||
from existing workspace
|
values from existing workspace
|
||||||
-h, --help help for update
|
-h, --help help for update
|
||||||
--parameter-file string Specify a file path with parameter values.
|
--parameter-file string Specify a file path with parameter values.
|
||||||
Consumes $CODER_PARAMETER_FILE
|
Consumes $CODER_PARAMETER_FILE
|
||||||
|
--rich-parameter-file string Specify a file path with values for rich parameters
|
||||||
|
defined in the template.
|
||||||
|
Consumes $CODER_RICH_PARAMETER_FILE
|
||||||
|
|
||||||
Global Flags:
|
Global Flags:
|
||||||
--global-config coder Path to the global coder config directory.
|
--global-config coder Path to the global coder config directory.
|
||||||
|
|
|
@ -11,8 +11,9 @@ import (
|
||||||
|
|
||||||
func update() *cobra.Command {
|
func update() *cobra.Command {
|
||||||
var (
|
var (
|
||||||
parameterFile string
|
parameterFile string
|
||||||
alwaysPrompt bool
|
richParameterFile string
|
||||||
|
alwaysPrompt bool
|
||||||
)
|
)
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
|
@ -39,27 +40,37 @@ func update() *cobra.Command {
|
||||||
}
|
}
|
||||||
|
|
||||||
var existingParams []codersdk.Parameter
|
var existingParams []codersdk.Parameter
|
||||||
|
var existingRichParams []codersdk.WorkspaceBuildParameter
|
||||||
if !alwaysPrompt {
|
if !alwaysPrompt {
|
||||||
existingParams, err = client.Parameters(cmd.Context(), codersdk.ParameterWorkspace, workspace.ID)
|
existingParams, err = client.Parameters(cmd.Context(), codersdk.ParameterWorkspace, workspace.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
existingRichParams, err = client.WorkspaceBuildParameters(cmd.Context(), workspace.LatestBuild.ID)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
parameters, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
|
buildParams, err := prepWorkspaceBuild(cmd, client, prepWorkspaceBuildArgs{
|
||||||
Template: template,
|
Template: template,
|
||||||
ExistingParams: existingParams,
|
ExistingParams: existingParams,
|
||||||
ParameterFile: parameterFile,
|
ParameterFile: parameterFile,
|
||||||
NewWorkspaceName: workspace.Name,
|
ExistingRichParams: existingRichParams,
|
||||||
|
RichParameterFile: richParameterFile,
|
||||||
|
NewWorkspaceName: workspace.Name,
|
||||||
|
UpdateWorkspace: true,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
|
build, err := client.CreateWorkspaceBuild(cmd.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
|
||||||
TemplateVersionID: template.ActiveVersionID,
|
TemplateVersionID: template.ActiveVersionID,
|
||||||
Transition: workspace.LatestBuild.Transition,
|
Transition: workspace.LatestBuild.Transition,
|
||||||
ParameterValues: parameters,
|
ParameterValues: buildParams.parameters,
|
||||||
|
RichParameterValues: buildParams.richParameters,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -82,5 +93,6 @@ func update() *cobra.Command {
|
||||||
|
|
||||||
cmd.Flags().BoolVar(&alwaysPrompt, "always-prompt", false, "Always prompt all parameters. Does not pull parameter values from existing workspace")
|
cmd.Flags().BoolVar(&alwaysPrompt, "always-prompt", false, "Always prompt all parameters. Does not pull parameter values from existing workspace")
|
||||||
cliflag.StringVarP(cmd.Flags(), ¶meterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
|
cliflag.StringVarP(cmd.Flags(), ¶meterFile, "parameter-file", "", "CODER_PARAMETER_FILE", "", "Specify a file path with parameter values.")
|
||||||
|
cliflag.StringVarP(cmd.Flags(), &richParameterFile, "rich-parameter-file", "", "CODER_RICH_PARAMETER_FILE", "", "Specify a file path with values for rich parameters defined in the template.")
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ package cli_test
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
@ -12,6 +13,7 @@ import (
|
||||||
"github.com/coder/coder/coderd/coderdtest"
|
"github.com/coder/coder/coderd/coderdtest"
|
||||||
"github.com/coder/coder/codersdk"
|
"github.com/coder/coder/codersdk"
|
||||||
"github.com/coder/coder/provisioner/echo"
|
"github.com/coder/coder/provisioner/echo"
|
||||||
|
"github.com/coder/coder/provisionersdk/proto"
|
||||||
"github.com/coder/coder/pty/ptytest"
|
"github.com/coder/coder/pty/ptytest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -139,3 +141,94 @@ func TestUpdate(t *testing.T) {
|
||||||
<-doneChan
|
<-doneChan
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateWithRichParameters(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
const (
|
||||||
|
firstParameterName = "first_parameter"
|
||||||
|
firstParameterDescription = "This is first parameter"
|
||||||
|
firstParameterValue = "1"
|
||||||
|
|
||||||
|
secondParameterName = "second_parameter"
|
||||||
|
secondParameterDescription = "This is second parameter"
|
||||||
|
secondParameterValue = "2"
|
||||||
|
|
||||||
|
immutableParameterName = "immutable_parameter"
|
||||||
|
immutableParameterDescription = "This is not mutable parameter"
|
||||||
|
immutableParameterValue = "3"
|
||||||
|
)
|
||||||
|
|
||||||
|
echoResponses := &echo.Responses{
|
||||||
|
Parse: echo.ParseComplete,
|
||||||
|
ProvisionPlan: []*proto.Provision_Response{
|
||||||
|
{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{
|
||||||
|
Parameters: []*proto.RichParameter{
|
||||||
|
{Name: firstParameterName, Description: firstParameterDescription, Mutable: true},
|
||||||
|
{Name: immutableParameterName, Description: immutableParameterDescription, Mutable: false},
|
||||||
|
{Name: secondParameterName, Description: secondParameterDescription, Mutable: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
ProvisionApply: []*proto.Provision_Response{{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Run("ImmutableCannotBeCustomized", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
|
||||||
|
tempDir := t.TempDir()
|
||||||
|
removeTmpDirUntilSuccessAfterTest(t, tempDir)
|
||||||
|
parameterFile, _ := os.CreateTemp(tempDir, "testParameterFile*.yaml")
|
||||||
|
_, _ = parameterFile.WriteString(
|
||||||
|
firstParameterName + ": " + firstParameterValue + "\n" +
|
||||||
|
immutableParameterName + ": " + immutableParameterValue + "\n" +
|
||||||
|
secondParameterName + ": " + secondParameterValue)
|
||||||
|
|
||||||
|
cmd, root := clitest.New(t, "create", "my-workspace", "--template", template.Name, "--rich-parameter-file", parameterFile.Name(), "-y")
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
err := cmd.Execute()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
cmd, root = clitest.New(t, "update", "my-workspace", "--always-prompt")
|
||||||
|
clitest.SetupConfig(t, client, root)
|
||||||
|
|
||||||
|
doneChan := make(chan struct{})
|
||||||
|
pty := ptytest.New(t)
|
||||||
|
cmd.SetIn(pty.Input())
|
||||||
|
cmd.SetOut(pty.Output())
|
||||||
|
go func() {
|
||||||
|
defer close(doneChan)
|
||||||
|
err := cmd.Execute()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}()
|
||||||
|
|
||||||
|
matches := []string{
|
||||||
|
firstParameterDescription, firstParameterValue,
|
||||||
|
fmt.Sprintf("Parameter %q is not mutable, so can't be customized after workspace creation.", immutableParameterName), "",
|
||||||
|
secondParameterDescription, secondParameterValue,
|
||||||
|
}
|
||||||
|
for i := 0; i < len(matches); i += 2 {
|
||||||
|
match := matches[i]
|
||||||
|
value := matches[i+1]
|
||||||
|
pty.ExpectMatch(match)
|
||||||
|
if value != "" {
|
||||||
|
pty.WriteLine(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
<-doneChan
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -5519,6 +5519,12 @@ const docTemplate = `{
|
||||||
"$ref": "#/definitions/codersdk.CreateParameterRequest"
|
"$ref": "#/definitions/codersdk.CreateParameterRequest"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rich_parameter_values": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
|
||||||
|
}
|
||||||
|
},
|
||||||
"workspace_name": {
|
"workspace_name": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
|
|
|
@ -4889,6 +4889,12 @@
|
||||||
"$ref": "#/definitions/codersdk.CreateParameterRequest"
|
"$ref": "#/definitions/codersdk.CreateParameterRequest"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"rich_parameter_values": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"$ref": "#/definitions/codersdk.WorkspaceBuildParameter"
|
||||||
|
}
|
||||||
|
},
|
||||||
"workspace_name": {
|
"workspace_name": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
}
|
}
|
||||||
|
|
|
@ -235,7 +235,8 @@ func (server *Server) AcquireJob(ctx context.Context, _ *proto.Empty) (*proto.Ac
|
||||||
|
|
||||||
protoJob.Type = &proto.AcquiredJob_TemplateDryRun_{
|
protoJob.Type = &proto.AcquiredJob_TemplateDryRun_{
|
||||||
TemplateDryRun: &proto.AcquiredJob_TemplateDryRun{
|
TemplateDryRun: &proto.AcquiredJob_TemplateDryRun{
|
||||||
ParameterValues: protoParameters,
|
ParameterValues: protoParameters,
|
||||||
|
RichParameterValues: convertRichParameterValues(input.RichParameterValues),
|
||||||
Metadata: &sdkproto.Provision_Metadata{
|
Metadata: &sdkproto.Provision_Metadata{
|
||||||
CoderUrl: server.AccessURL.String(),
|
CoderUrl: server.AccessURL.String(),
|
||||||
WorkspaceName: input.WorkspaceName,
|
WorkspaceName: input.WorkspaceName,
|
||||||
|
@ -1175,9 +1176,10 @@ type WorkspaceProvisionJob struct {
|
||||||
|
|
||||||
// TemplateVersionDryRunJob is the payload for the "template_version_dry_run" job type.
|
// TemplateVersionDryRunJob is the payload for the "template_version_dry_run" job type.
|
||||||
type TemplateVersionDryRunJob struct {
|
type TemplateVersionDryRunJob struct {
|
||||||
TemplateVersionID uuid.UUID `json:"template_version_id"`
|
TemplateVersionID uuid.UUID `json:"template_version_id"`
|
||||||
WorkspaceName string `json:"workspace_name"`
|
WorkspaceName string `json:"workspace_name"`
|
||||||
ParameterValues []database.ParameterValue `json:"parameter_values"`
|
ParameterValues []database.ParameterValue `json:"parameter_values"`
|
||||||
|
RichParameterValues []database.WorkspaceBuildParameter `json:"rich_parameter_values"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProvisionerJobLogsNotifyMessage is the payload published on
|
// ProvisionerJobLogsNotifyMessage is the payload published on
|
||||||
|
|
|
@ -362,12 +362,22 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
richParameterValues := make([]database.WorkspaceBuildParameter, len(req.RichParameterValues))
|
||||||
|
for i, v := range req.RichParameterValues {
|
||||||
|
richParameterValues[i] = database.WorkspaceBuildParameter{
|
||||||
|
WorkspaceBuildID: uuid.Nil,
|
||||||
|
Name: v.Name,
|
||||||
|
Value: v.Value,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Marshal template version dry-run job with the parameters from the
|
// Marshal template version dry-run job with the parameters from the
|
||||||
// request.
|
// request.
|
||||||
input, err := json.Marshal(provisionerdserver.TemplateVersionDryRunJob{
|
input, err := json.Marshal(provisionerdserver.TemplateVersionDryRunJob{
|
||||||
TemplateVersionID: templateVersion.ID,
|
TemplateVersionID: templateVersion.ID,
|
||||||
WorkspaceName: req.WorkspaceName,
|
WorkspaceName: req.WorkspaceName,
|
||||||
ParameterValues: parameterValues,
|
ParameterValues: parameterValues,
|
||||||
|
RichParameterValues: richParameterValues,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||||
|
|
|
@ -377,11 +377,6 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
|
||||||
state = createBuild.ProvisionerState
|
state = createBuild.ProvisionerState
|
||||||
}
|
}
|
||||||
|
|
||||||
var parameters []codersdk.WorkspaceBuildParameter
|
|
||||||
if createBuild.RichParameterValues != nil {
|
|
||||||
parameters = createBuild.RichParameterValues
|
|
||||||
}
|
|
||||||
|
|
||||||
if createBuild.Orphan {
|
if createBuild.Orphan {
|
||||||
if createBuild.Transition != codersdk.WorkspaceTransitionDelete {
|
if createBuild.Transition != codersdk.WorkspaceTransitionDelete {
|
||||||
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||||
|
@ -454,21 +449,42 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
|
||||||
state = priorHistory.ProvisionerState
|
state = priorHistory.ProvisionerState
|
||||||
}
|
}
|
||||||
|
|
||||||
if parameters == nil {
|
templateVersionParameters, err := api.Database.GetTemplateVersionParameters(ctx, createBuild.TemplateVersionID)
|
||||||
buildParameters, err := api.Database.GetWorkspaceBuildParameters(ctx, priorHistory.ID)
|
if err != nil {
|
||||||
if err != nil {
|
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||||
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
Message: "Internal error fetching template version parameters.",
|
||||||
Message: "Internal error fetching prior workspace build parameters.",
|
Detail: err.Error(),
|
||||||
Detail: err.Error(),
|
})
|
||||||
})
|
return
|
||||||
return
|
}
|
||||||
|
|
||||||
|
lastBuildParameters, err := api.Database.GetWorkspaceBuildParameters(ctx, priorHistory.ID)
|
||||||
|
if err != nil {
|
||||||
|
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
|
||||||
|
Message: "Internal error fetching prior workspace build parameters.",
|
||||||
|
Detail: err.Error(),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
apiLastBuildParameters := convertWorkspaceBuildParameters(lastBuildParameters)
|
||||||
|
|
||||||
|
var parameters []codersdk.WorkspaceBuildParameter
|
||||||
|
for _, templateVersionParameter := range templateVersionParameters {
|
||||||
|
// Check if parameter value is in request
|
||||||
|
if buildParameter, found := findWorkspaceBuildParameter(createBuild.RichParameterValues, templateVersionParameter.Name); found {
|
||||||
|
if !templateVersionParameter.Mutable {
|
||||||
|
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
|
||||||
|
Message: fmt.Sprintf("Parameter %q is mutable, so it can't be updated after creating workspace.", templateVersionParameter.Name),
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
parameters = append(parameters, *buildParameter)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
parameters = make([]codersdk.WorkspaceBuildParameter, 0, len(buildParameters))
|
|
||||||
for _, param := range buildParameters {
|
// Check if parameter is defined in previous build
|
||||||
parameters = append(parameters, codersdk.WorkspaceBuildParameter{
|
if buildParameter, found := findWorkspaceBuildParameter(apiLastBuildParameters, templateVersionParameter.Name); found {
|
||||||
Name: param.Name,
|
parameters = append(parameters, *buildParameter)
|
||||||
Value: param.Value,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,7 +583,7 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
|
||||||
Value: values,
|
Value: values,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return xerrors.Errorf("insert workspace build parameter: %w", err)
|
return xerrors.Errorf("insert workspace build parameters: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
@ -1171,3 +1187,12 @@ func convertWorkspaceBuildParameters(parameters []database.WorkspaceBuildParamet
|
||||||
}
|
}
|
||||||
return apiParameters
|
return apiParameters
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func findWorkspaceBuildParameter(params []codersdk.WorkspaceBuildParameter, parameterName string) (*codersdk.WorkspaceBuildParameter, bool) {
|
||||||
|
for _, p := range params {
|
||||||
|
if p.Name == parameterName {
|
||||||
|
return &p, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, false
|
||||||
|
}
|
||||||
|
|
|
@ -644,11 +644,16 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
|
||||||
secondParameterName = "second_parameter"
|
secondParameterName = "second_parameter"
|
||||||
secondParameterDescription = "This is second parameter"
|
secondParameterDescription = "This is second parameter"
|
||||||
secondParameterValue = "2"
|
secondParameterValue = "2"
|
||||||
|
|
||||||
|
immutableParameterName = "immutable_parameter"
|
||||||
|
immutableParameterDescription = "This is immutable parameter"
|
||||||
|
immutableParameterValue = "3"
|
||||||
)
|
)
|
||||||
|
|
||||||
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
|
initialBuildParameters := []codersdk.WorkspaceBuildParameter{
|
||||||
{Name: firstParameterName, Value: firstParameterValue},
|
{Name: firstParameterName, Value: firstParameterValue},
|
||||||
{Name: secondParameterName, Value: secondParameterValue},
|
{Name: secondParameterName, Value: secondParameterValue},
|
||||||
|
{Name: immutableParameterName, Value: immutableParameterValue},
|
||||||
}
|
}
|
||||||
|
|
||||||
echoResponses := &echo.Responses{
|
echoResponses := &echo.Responses{
|
||||||
|
@ -658,8 +663,9 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
|
||||||
Type: &proto.Provision_Response_Complete{
|
Type: &proto.Provision_Response_Complete{
|
||||||
Complete: &proto.Provision_Complete{
|
Complete: &proto.Provision_Complete{
|
||||||
Parameters: []*proto.RichParameter{
|
Parameters: []*proto.RichParameter{
|
||||||
{Name: firstParameterName, Description: firstParameterDescription},
|
{Name: firstParameterName, Description: firstParameterDescription, Mutable: true},
|
||||||
{Name: secondParameterName, Description: secondParameterDescription},
|
{Name: secondParameterName, Description: secondParameterDescription, Mutable: true},
|
||||||
|
{Name: immutableParameterName, Description: immutableParameterDescription, Mutable: false},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -705,7 +711,12 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
|
||||||
|
|
||||||
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
|
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.ElementsMatch(t, nextBuildParameters, workspaceBuildParameters)
|
|
||||||
|
expected := append(nextBuildParameters, codersdk.WorkspaceBuildParameter{
|
||||||
|
Name: immutableParameterName,
|
||||||
|
Value: immutableParameterValue,
|
||||||
|
})
|
||||||
|
require.ElementsMatch(t, expected, workspaceBuildParameters)
|
||||||
})
|
})
|
||||||
t.Run("UsePreviousParameterValues", func(t *testing.T) {
|
t.Run("UsePreviousParameterValues", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
|
@ -738,4 +749,34 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.ElementsMatch(t, initialBuildParameters, workspaceBuildParameters)
|
require.ElementsMatch(t, initialBuildParameters, workspaceBuildParameters)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("DoNotModifyImmutables", func(t *testing.T) {
|
||||||
|
t.Parallel()
|
||||||
|
|
||||||
|
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||||
|
user := coderdtest.CreateFirstUser(t, client)
|
||||||
|
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResponses)
|
||||||
|
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
|
||||||
|
|
||||||
|
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||||
|
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
|
||||||
|
cwr.RichParameterValues = initialBuildParameters
|
||||||
|
})
|
||||||
|
|
||||||
|
workspaceBuild := coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
|
||||||
|
require.Equal(t, codersdk.WorkspaceStatusRunning, workspaceBuild.Status)
|
||||||
|
|
||||||
|
// Update build parameters
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
nextBuildParameters := []codersdk.WorkspaceBuildParameter{
|
||||||
|
{Name: immutableParameterName, Value: "BAD"},
|
||||||
|
}
|
||||||
|
_, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
|
||||||
|
Transition: codersdk.WorkspaceTransitionStart,
|
||||||
|
RichParameterValues: nextBuildParameters,
|
||||||
|
})
|
||||||
|
require.Error(t, err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,8 +143,9 @@ func (c *Client) TemplateVersionLogsAfter(ctx context.Context, version uuid.UUID
|
||||||
// CreateTemplateVersionDryRunRequest defines the request parameters for
|
// CreateTemplateVersionDryRunRequest defines the request parameters for
|
||||||
// CreateTemplateVersionDryRun.
|
// CreateTemplateVersionDryRun.
|
||||||
type CreateTemplateVersionDryRunRequest struct {
|
type CreateTemplateVersionDryRunRequest struct {
|
||||||
WorkspaceName string `json:"workspace_name"`
|
WorkspaceName string `json:"workspace_name"`
|
||||||
ParameterValues []CreateParameterRequest `json:"parameter_values"`
|
ParameterValues []CreateParameterRequest `json:"parameter_values"`
|
||||||
|
RichParameterValues []WorkspaceBuildParameter `json:"rich_parameter_values"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateTemplateVersionDryRun begins a dry-run provisioner job against the
|
// CreateTemplateVersionDryRun begins a dry-run provisioner job against the
|
||||||
|
|
|
@ -760,16 +760,23 @@ CreateParameterRequest is a structure used to create a new parameter value for a
|
||||||
"source_value": "string"
|
"source_value": "string"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"rich_parameter_values": [
|
||||||
|
{
|
||||||
|
"name": "string",
|
||||||
|
"value": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
"workspace_name": "string"
|
"workspace_name": "string"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Properties
|
### Properties
|
||||||
|
|
||||||
| Name | Type | Required | Restrictions | Description |
|
| Name | Type | Required | Restrictions | Description |
|
||||||
| ------------------ | --------------------------------------------------------------------------- | -------- | ------------ | ---------------------------------------------------------------------------------- |
|
| ----------------------- | ----------------------------------------------------------------------------- | -------- | ------------ | ---------------------------------------------------------------------------------- |
|
||||||
| `parameter_values` | array of [codersdk.CreateParameterRequest](#codersdkcreateparameterrequest) | false | | Parameter values is a structure used to create a new parameter value for a scope.] |
|
| `parameter_values` | array of [codersdk.CreateParameterRequest](#codersdkcreateparameterrequest) | false | | Parameter values is a structure used to create a new parameter value for a scope.] |
|
||||||
| `workspace_name` | string | false | | |
|
| `rich_parameter_values` | array of [codersdk.WorkspaceBuildParameter](#codersdkworkspacebuildparameter) | false | | |
|
||||||
|
| `workspace_name` | string | false | | |
|
||||||
|
|
||||||
## codersdk.CreateTestAuditLogRequest
|
## codersdk.CreateTestAuditLogRequest
|
||||||
|
|
||||||
|
|
|
@ -406,6 +406,12 @@ curl -X POST http://coder-server:8080/api/v2/organizations/{organization}/templa
|
||||||
"source_value": "string"
|
"source_value": "string"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"rich_parameter_values": [
|
||||||
|
{
|
||||||
|
"name": "string",
|
||||||
|
"value": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
"workspace_name": "string"
|
"workspace_name": "string"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -1291,6 +1297,12 @@ curl -X POST http://coder-server:8080/api/v2/templateversions/{templateversion}/
|
||||||
"source_value": "string"
|
"source_value": "string"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"rich_parameter_values": [
|
||||||
|
{
|
||||||
|
"name": "string",
|
||||||
|
"value": "string"
|
||||||
|
}
|
||||||
|
],
|
||||||
"workspace_name": "string"
|
"workspace_name": "string"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
@ -12,6 +12,7 @@ import (
|
||||||
|
|
||||||
"github.com/coder/coder/provisionersdk"
|
"github.com/coder/coder/provisionersdk"
|
||||||
"github.com/coder/coder/provisionersdk/proto"
|
"github.com/coder/coder/provisionersdk/proto"
|
||||||
|
"github.com/coder/terraform-provider-coder/provider"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Provision executes `terraform apply` or `terraform plan` for dry runs.
|
// Provision executes `terraform apply` or `terraform plan` for dry runs.
|
||||||
|
@ -138,7 +139,7 @@ func (s *server) Provision(stream proto.DRPCProvisioner_ProvisionStream) error {
|
||||||
}
|
}
|
||||||
s.logger.Debug(ctx, "ran initialization")
|
s.logger.Debug(ctx, "ran initialization")
|
||||||
|
|
||||||
env, err := provisionEnv(config, request.GetPlan().GetParameterValues())
|
env, err := provisionEnv(config, request.GetPlan().GetParameterValues(), request.GetPlan().GetRichParameterValues())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -204,7 +205,7 @@ func planVars(plan *proto.Provision_Plan) ([]string, error) {
|
||||||
return vars, nil
|
return vars, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func provisionEnv(config *proto.Provision_Config, params []*proto.ParameterValue) ([]string, error) {
|
func provisionEnv(config *proto.Provision_Config, params []*proto.ParameterValue, richParams []*proto.RichParameterValue) ([]string, error) {
|
||||||
env := safeEnviron()
|
env := safeEnviron()
|
||||||
env = append(env,
|
env = append(env,
|
||||||
"CODER_AGENT_URL="+config.Metadata.CoderUrl,
|
"CODER_AGENT_URL="+config.Metadata.CoderUrl,
|
||||||
|
@ -228,6 +229,9 @@ func provisionEnv(config *proto.Provision_Config, params []*proto.ParameterValue
|
||||||
return nil, xerrors.Errorf("unsupported parameter type %q for %q", param.DestinationScheme, param.Name)
|
return nil, xerrors.Errorf("unsupported parameter type %q for %q", param.DestinationScheme, param.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, param := range richParams {
|
||||||
|
env = append(env, provider.ParameterEnvironmentVariable(param.Name)+"="+param.Value)
|
||||||
|
}
|
||||||
return env, nil
|
return env, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -320,6 +320,49 @@ func TestProvision(t *testing.T) {
|
||||||
},
|
},
|
||||||
ErrorContains: "unsupported parameter type",
|
ErrorContains: "unsupported parameter type",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "rich-parameter-with-value",
|
||||||
|
Files: map[string]string{
|
||||||
|
"main.tf": `terraform {
|
||||||
|
required_providers {
|
||||||
|
coder = {
|
||||||
|
source = "coder/coder"
|
||||||
|
version = "0.6.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data "coder_parameter" "example" {
|
||||||
|
name = "Example"
|
||||||
|
type = "string"
|
||||||
|
default = "foobar"
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "null_resource" "example" {
|
||||||
|
triggers = {
|
||||||
|
misc = "${data.coder_parameter.example.value}"
|
||||||
|
}
|
||||||
|
}`,
|
||||||
|
},
|
||||||
|
Request: &proto.Provision_Plan{
|
||||||
|
RichParameterValues: []*proto.RichParameterValue{
|
||||||
|
{
|
||||||
|
Name: "Example",
|
||||||
|
Value: "foobaz",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Response: &proto.Provision_Response{
|
||||||
|
Type: &proto.Provision_Response_Complete{
|
||||||
|
Complete: &proto.Provision_Complete{
|
||||||
|
Resources: []*proto.Resource{{
|
||||||
|
Name: "example",
|
||||||
|
Type: "null_resource",
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testCases {
|
for _, testCase := range testCases {
|
||||||
|
|
|
@ -924,8 +924,9 @@ type AcquiredJob_TemplateDryRun struct {
|
||||||
sizeCache protoimpl.SizeCache
|
sizeCache protoimpl.SizeCache
|
||||||
unknownFields protoimpl.UnknownFields
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
ParameterValues []*proto.ParameterValue `protobuf:"bytes,1,rep,name=parameter_values,json=parameterValues,proto3" json:"parameter_values,omitempty"`
|
ParameterValues []*proto.ParameterValue `protobuf:"bytes,1,rep,name=parameter_values,json=parameterValues,proto3" json:"parameter_values,omitempty"`
|
||||||
Metadata *proto.Provision_Metadata `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"`
|
RichParameterValues []*proto.RichParameterValue `protobuf:"bytes,2,rep,name=rich_parameter_values,json=richParameterValues,proto3" json:"rich_parameter_values,omitempty"`
|
||||||
|
Metadata *proto.Provision_Metadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (x *AcquiredJob_TemplateDryRun) Reset() {
|
func (x *AcquiredJob_TemplateDryRun) Reset() {
|
||||||
|
@ -967,6 +968,13 @@ func (x *AcquiredJob_TemplateDryRun) GetParameterValues() []*proto.ParameterValu
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (x *AcquiredJob_TemplateDryRun) GetRichParameterValues() []*proto.RichParameterValue {
|
||||||
|
if x != nil {
|
||||||
|
return x.RichParameterValues
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (x *AcquiredJob_TemplateDryRun) GetMetadata() *proto.Provision_Metadata {
|
func (x *AcquiredJob_TemplateDryRun) GetMetadata() *proto.Provision_Metadata {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
return x.Metadata
|
return x.Metadata
|
||||||
|
@ -1271,7 +1279,7 @@ var file_provisionerd_proto_provisionerd_proto_rawDesc = []byte{
|
||||||
0x6f, 0x6e, 0x65, 0x72, 0x64, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
0x6f, 0x6e, 0x65, 0x72, 0x64, 0x1a, 0x26, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
||||||
0x65, 0x72, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x76,
|
0x65, 0x72, 0x73, 0x64, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x76,
|
||||||
0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x07, 0x0a,
|
0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x07, 0x0a,
|
||||||
0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x81, 0x08, 0x0a, 0x0b, 0x41, 0x63, 0x71, 0x75, 0x69,
|
0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xd6, 0x08, 0x0a, 0x0b, 0x41, 0x63, 0x71, 0x75, 0x69,
|
||||||
0x72, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64,
|
0x72, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64,
|
||||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x1d, 0x0a,
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x1d, 0x0a,
|
||||||
0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
|
0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||||
|
@ -1325,156 +1333,161 @@ var file_provisionerd_proto_provisionerd_proto_rawDesc = []byte{
|
||||||
0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72,
|
0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72,
|
||||||
0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
|
||||||
0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x95, 0x01, 0x0a, 0x0e, 0x54,
|
0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0xea, 0x01, 0x0a, 0x0e, 0x54,
|
||||||
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x46, 0x0a,
|
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x46, 0x0a,
|
||||||
0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
|
||||||
0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
||||||
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56,
|
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56,
|
||||||
0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56,
|
0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56,
|
||||||
0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74,
|
0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x53, 0x0a, 0x15, 0x72, 0x69, 0x63, 0x68, 0x5f, 0x70, 0x61,
|
||||||
0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
|
||||||
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x2e,
|
|
||||||
0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61,
|
|
||||||
0x74, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x86, 0x03, 0x0a, 0x09, 0x46,
|
|
||||||
0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f,
|
|
||||||
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12,
|
|
||||||
0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
|
|
||||||
0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x51, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61,
|
|
||||||
0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26,
|
|
||||||
0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x46, 0x61,
|
|
||||||
0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
|
|
||||||
0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70,
|
|
||||||
0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x51, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70,
|
|
||||||
0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
|
|
||||||
0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64,
|
|
||||||
0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c,
|
|
||||||
0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x65, 0x6d,
|
|
||||||
0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x74,
|
|
||||||
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18,
|
|
||||||
0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f,
|
|
||||||
0x6e, 0x65, 0x72, 0x64, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x54,
|
|
||||||
0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x48, 0x00, 0x52,
|
|
||||||
0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x1a,
|
|
||||||
0x26, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c,
|
|
||||||
0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c,
|
|
||||||
0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x10, 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c,
|
|
||||||
0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x10, 0x0a, 0x0e, 0x54, 0x65, 0x6d,
|
|
||||||
0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x74,
|
|
||||||
0x79, 0x70, 0x65, 0x22, 0xaa, 0x05, 0x0a, 0x0c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
|
|
||||||
0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01,
|
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x54, 0x0a, 0x0f, 0x77,
|
|
||||||
0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02,
|
|
||||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
|
||||||
0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62,
|
|
||||||
0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48,
|
|
||||||
0x00, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c,
|
|
||||||
0x64, 0x12, 0x54, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6d,
|
|
||||||
0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f,
|
|
||||||
0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
|
|
||||||
0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49,
|
|
||||||
0x6d, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74,
|
|
||||||
0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x55, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c,
|
|
||||||
0x61, 0x74, 0x65, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
|
|
||||||
0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64,
|
|
||||||
0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x65,
|
|
||||||
0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x48, 0x00, 0x52, 0x0e,
|
|
||||||
0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x1a, 0x5b,
|
|
||||||
0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64,
|
|
||||||
0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52,
|
|
||||||
0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
|
||||||
0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76,
|
|
||||||
0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
|
|
||||||
0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x1a, 0xd3, 0x01, 0x0a, 0x0e,
|
|
||||||
0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x3e,
|
|
||||||
0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
|
|
||||||
0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
|
||||||
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0e,
|
|
||||||
0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x3c,
|
|
||||||
0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
|
|
||||||
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
|
||||||
0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, 0x73,
|
|
||||||
0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x0f,
|
|
||||||
0x72, 0x69, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18,
|
|
||||||
0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f,
|
|
||||||
0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
|
|
||||||
0x72, 0x52, 0x0e, 0x72, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
|
|
||||||
0x73, 0x1a, 0x45, 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79,
|
|
||||||
0x52, 0x75, 0x6e, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
|
|
||||||
0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
|
||||||
0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72,
|
|
||||||
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
|
|
||||||
0x22, 0xb0, 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72,
|
|
||||||
0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
|
||||||
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63,
|
|
||||||
0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x6c, 0x65, 0x76,
|
|
||||||
0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
|
||||||
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52,
|
|
||||||
0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
|
|
||||||
0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61,
|
|
||||||
0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x18, 0x04,
|
|
||||||
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6f,
|
|
||||||
0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74,
|
|
||||||
0x70, 0x75, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f,
|
|
||||||
0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f,
|
|
||||||
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12,
|
|
||||||
0x25, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e,
|
|
||||||
0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x4c, 0x6f, 0x67,
|
|
||||||
0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
|
|
||||||
0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
|
|
||||||
0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e,
|
|
||||||
0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x52,
|
|
||||||
0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61,
|
|
||||||
0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
|
|
||||||
0x0c, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x22, 0x77, 0x0a, 0x11, 0x55, 0x70, 0x64,
|
|
||||||
0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a,
|
|
||||||
0x0a, 0x08, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08,
|
|
||||||
0x52, 0x08, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x12, 0x46, 0x0a, 0x10, 0x70, 0x61,
|
|
||||||
0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02,
|
0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02,
|
||||||
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
||||||
0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75,
|
0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72,
|
||||||
0x65, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75,
|
0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x13, 0x72, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d,
|
||||||
0x65, 0x73, 0x22, 0x4a, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74,
|
0x65, 0x74, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x6d, 0x65,
|
||||||
0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f,
|
0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70,
|
||||||
0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12,
|
0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69,
|
||||||
0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20,
|
0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d,
|
||||||
0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x22, 0x68,
|
0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22,
|
||||||
0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x52, 0x65, 0x73,
|
0x86, 0x03, 0x0a, 0x09, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a,
|
||||||
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28,
|
0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a,
|
||||||
0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73,
|
0x6f, 0x62, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20,
|
||||||
0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52,
|
0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x51, 0x0a, 0x0f, 0x77, 0x6f,
|
||||||
0x0f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64,
|
0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20,
|
||||||
0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05,
|
0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65,
|
||||||
0x52, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x2a, 0x34, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53,
|
0x72, 0x64, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x57, 0x6f, 0x72,
|
||||||
0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49,
|
0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x77,
|
||||||
0x4f, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0f, 0x0a,
|
0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x51, 0x0a,
|
||||||
0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x32, 0xec,
|
0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74,
|
||||||
0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x44, 0x61,
|
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
||||||
0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4a,
|
0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e,
|
||||||
0x6f, 0x62, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72,
|
0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00,
|
||||||
0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74,
|
||||||
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x41, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x4a,
|
0x12, 0x52, 0x0a, 0x10, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x72, 0x79,
|
||||||
0x6f, 0x62, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74,
|
0x5f, 0x72, 0x75, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
0x61, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64,
|
0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64,
|
||||||
0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75,
|
0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52,
|
||||||
0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65,
|
0x75, 0x6e, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72,
|
||||||
0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x52, 0x65,
|
0x79, 0x52, 0x75, 0x6e, 0x1a, 0x26, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
|
||||||
0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
|
0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18,
|
||||||
0x4a, 0x6f, 0x62, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65,
|
0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x1a, 0x10, 0x0a, 0x0e,
|
||||||
0x72, 0x64, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75,
|
0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x1a, 0x10,
|
||||||
0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65,
|
0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e,
|
||||||
0x72, 0x64, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70,
|
0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xaa, 0x05, 0x0a, 0x0c, 0x43, 0x6f, 0x6d,
|
||||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x46, 0x61, 0x69, 0x6c, 0x4a, 0x6f, 0x62, 0x12,
|
0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62,
|
||||||
0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x46,
|
0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64,
|
||||||
0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
0x12, 0x54, 0x0a, 0x0f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x62, 0x75,
|
||||||
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a,
|
0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76,
|
||||||
0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1a, 0x2e, 0x70,
|
0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74,
|
||||||
0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70,
|
0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x42,
|
||||||
0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
0x75, 0x69, 0x6c, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63,
|
||||||
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x2b, 0x5a,
|
0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x54, 0x0a, 0x0f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
|
||||||
0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x64, 0x65,
|
0x74, 0x65, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||||
0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f,
|
0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43,
|
||||||
0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
|
0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x2e, 0x54, 0x65, 0x6d, 0x70,
|
||||||
0x6f, 0x33,
|
0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x65,
|
||||||
|
0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x55, 0x0a, 0x10,
|
||||||
|
0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e,
|
||||||
|
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
||||||
|
0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a,
|
||||||
|
0x6f, 0x62, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75,
|
||||||
|
0x6e, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x44, 0x72, 0x79,
|
||||||
|
0x52, 0x75, 0x6e, 0x1a, 0x5b, 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65,
|
||||||
|
0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01,
|
||||||
|
0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x72,
|
||||||
|
0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15,
|
||||||
|
0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73,
|
||||||
|
0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73,
|
||||||
|
0x1a, 0xd3, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6d, 0x70,
|
||||||
|
0x6f, 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73,
|
||||||
|
0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70,
|
||||||
|
0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75,
|
||||||
|
0x72, 0x63, 0x65, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
|
0x63, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x6f,
|
||||||
|
0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
|
0x63, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
|
||||||
|
0x73, 0x12, 0x43, 0x0a, 0x0f, 0x72, 0x69, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65,
|
||||||
|
0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f,
|
||||||
|
0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72,
|
||||||
|
0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x72, 0x69, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61,
|
||||||
|
0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61,
|
||||||
|
0x74, 0x65, 0x44, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f,
|
||||||
|
0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72,
|
||||||
|
0x63, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x42, 0x06, 0x0a,
|
||||||
|
0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x2f, 0x0a,
|
||||||
|
0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x4c, 0x6f, 0x67,
|
||||||
|
0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2b,
|
||||||
|
0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x67, 0x4c,
|
||||||
|
0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x63,
|
||||||
|
0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
|
||||||
|
0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74,
|
||||||
|
0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65,
|
||||||
|
0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
|
||||||
|
0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x10, 0x55, 0x70, 0x64,
|
||||||
|
0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a,
|
||||||
|
0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a,
|
||||||
|
0x6f, 0x62, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03,
|
||||||
|
0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72,
|
||||||
|
0x64, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x49, 0x0a, 0x11, 0x70,
|
||||||
|
0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x73,
|
||||||
|
0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
||||||
|
0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x63,
|
||||||
|
0x68, 0x65, 0x6d, 0x61, 0x52, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53,
|
||||||
|
0x63, 0x68, 0x65, 0x6d, 0x61, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65,
|
||||||
|
0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x22, 0x77,
|
||||||
|
0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f,
|
||||||
|
0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x18,
|
||||||
|
0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x12,
|
||||||
|
0x46, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x6c,
|
||||||
|
0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x76,
|
||||||
|
0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
|
||||||
|
0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65,
|
||||||
|
0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x69,
|
||||||
|
0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a,
|
||||||
|
0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a,
|
||||||
|
0x6f, 0x62, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x63, 0x6f,
|
||||||
|
0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x43,
|
||||||
|
0x6f, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f,
|
||||||
|
0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x72,
|
||||||
|
0x65, 0x64, 0x69, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x18, 0x02,
|
||||||
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x63, 0x72, 0x65, 0x64, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6e,
|
||||||
|
0x73, 0x75, 0x6d, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18,
|
||||||
|
0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x2a, 0x34, 0x0a,
|
||||||
|
0x09, 0x4c, 0x6f, 0x67, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x52,
|
||||||
|
0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x52, 0x5f, 0x44, 0x41, 0x45, 0x4d, 0x4f, 0x4e,
|
||||||
|
0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45,
|
||||||
|
0x52, 0x10, 0x01, 0x32, 0xec, 0x02, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f,
|
||||||
|
0x6e, 0x65, 0x72, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0a, 0x41, 0x63, 0x71,
|
||||||
|
0x75, 0x69, 0x72, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73,
|
||||||
|
0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x70,
|
||||||
|
0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x41, 0x63, 0x71, 0x75,
|
||||||
|
0x69, 0x72, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x69,
|
||||||
|
0x74, 0x51, 0x75, 0x6f, 0x74, 0x61, 0x12, 0x20, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69,
|
||||||
|
0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75, 0x6f, 0x74,
|
||||||
|
0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
||||||
|
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x51, 0x75,
|
||||||
|
0x6f, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x55,
|
||||||
|
0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f, 0x62, 0x12, 0x1e, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
||||||
|
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f,
|
||||||
|
0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69,
|
||||||
|
0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4a, 0x6f,
|
||||||
|
0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x46, 0x61, 0x69,
|
||||||
|
0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e,
|
||||||
|
0x65, 0x72, 0x64, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x45, 0x6d, 0x70,
|
||||||
|
0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4a, 0x6f,
|
||||||
|
0x62, 0x12, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64,
|
||||||
|
0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x1a, 0x13, 0x2e,
|
||||||
|
0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2e, 0x45, 0x6d, 0x70,
|
||||||
|
0x74, 0x79, 0x42, 0x2b, 0x5a, 0x29, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d,
|
||||||
|
0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f,
|
||||||
|
0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x72, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
|
||||||
|
0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -1539,27 +1552,28 @@ var file_provisionerd_proto_provisionerd_proto_depIdxs = []int32{
|
||||||
23, // 16: provisionerd.AcquiredJob.WorkspaceBuild.metadata:type_name -> provisioner.Provision.Metadata
|
23, // 16: provisionerd.AcquiredJob.WorkspaceBuild.metadata:type_name -> provisioner.Provision.Metadata
|
||||||
23, // 17: provisionerd.AcquiredJob.TemplateImport.metadata:type_name -> provisioner.Provision.Metadata
|
23, // 17: provisionerd.AcquiredJob.TemplateImport.metadata:type_name -> provisioner.Provision.Metadata
|
||||||
21, // 18: provisionerd.AcquiredJob.TemplateDryRun.parameter_values:type_name -> provisioner.ParameterValue
|
21, // 18: provisionerd.AcquiredJob.TemplateDryRun.parameter_values:type_name -> provisioner.ParameterValue
|
||||||
23, // 19: provisionerd.AcquiredJob.TemplateDryRun.metadata:type_name -> provisioner.Provision.Metadata
|
22, // 19: provisionerd.AcquiredJob.TemplateDryRun.rich_parameter_values:type_name -> provisioner.RichParameterValue
|
||||||
24, // 20: provisionerd.CompletedJob.WorkspaceBuild.resources:type_name -> provisioner.Resource
|
23, // 20: provisionerd.AcquiredJob.TemplateDryRun.metadata:type_name -> provisioner.Provision.Metadata
|
||||||
24, // 21: provisionerd.CompletedJob.TemplateImport.start_resources:type_name -> provisioner.Resource
|
24, // 21: provisionerd.CompletedJob.WorkspaceBuild.resources:type_name -> provisioner.Resource
|
||||||
24, // 22: provisionerd.CompletedJob.TemplateImport.stop_resources:type_name -> provisioner.Resource
|
24, // 22: provisionerd.CompletedJob.TemplateImport.start_resources:type_name -> provisioner.Resource
|
||||||
25, // 23: provisionerd.CompletedJob.TemplateImport.rich_parameters:type_name -> provisioner.RichParameter
|
24, // 23: provisionerd.CompletedJob.TemplateImport.stop_resources:type_name -> provisioner.Resource
|
||||||
24, // 24: provisionerd.CompletedJob.TemplateDryRun.resources:type_name -> provisioner.Resource
|
25, // 24: provisionerd.CompletedJob.TemplateImport.rich_parameters:type_name -> provisioner.RichParameter
|
||||||
1, // 25: provisionerd.ProvisionerDaemon.AcquireJob:input_type -> provisionerd.Empty
|
24, // 25: provisionerd.CompletedJob.TemplateDryRun.resources:type_name -> provisioner.Resource
|
||||||
8, // 26: provisionerd.ProvisionerDaemon.CommitQuota:input_type -> provisionerd.CommitQuotaRequest
|
1, // 26: provisionerd.ProvisionerDaemon.AcquireJob:input_type -> provisionerd.Empty
|
||||||
6, // 27: provisionerd.ProvisionerDaemon.UpdateJob:input_type -> provisionerd.UpdateJobRequest
|
8, // 27: provisionerd.ProvisionerDaemon.CommitQuota:input_type -> provisionerd.CommitQuotaRequest
|
||||||
3, // 28: provisionerd.ProvisionerDaemon.FailJob:input_type -> provisionerd.FailedJob
|
6, // 28: provisionerd.ProvisionerDaemon.UpdateJob:input_type -> provisionerd.UpdateJobRequest
|
||||||
4, // 29: provisionerd.ProvisionerDaemon.CompleteJob:input_type -> provisionerd.CompletedJob
|
3, // 29: provisionerd.ProvisionerDaemon.FailJob:input_type -> provisionerd.FailedJob
|
||||||
2, // 30: provisionerd.ProvisionerDaemon.AcquireJob:output_type -> provisionerd.AcquiredJob
|
4, // 30: provisionerd.ProvisionerDaemon.CompleteJob:input_type -> provisionerd.CompletedJob
|
||||||
9, // 31: provisionerd.ProvisionerDaemon.CommitQuota:output_type -> provisionerd.CommitQuotaResponse
|
2, // 31: provisionerd.ProvisionerDaemon.AcquireJob:output_type -> provisionerd.AcquiredJob
|
||||||
7, // 32: provisionerd.ProvisionerDaemon.UpdateJob:output_type -> provisionerd.UpdateJobResponse
|
9, // 32: provisionerd.ProvisionerDaemon.CommitQuota:output_type -> provisionerd.CommitQuotaResponse
|
||||||
1, // 33: provisionerd.ProvisionerDaemon.FailJob:output_type -> provisionerd.Empty
|
7, // 33: provisionerd.ProvisionerDaemon.UpdateJob:output_type -> provisionerd.UpdateJobResponse
|
||||||
1, // 34: provisionerd.ProvisionerDaemon.CompleteJob:output_type -> provisionerd.Empty
|
1, // 34: provisionerd.ProvisionerDaemon.FailJob:output_type -> provisionerd.Empty
|
||||||
30, // [30:35] is the sub-list for method output_type
|
1, // 35: provisionerd.ProvisionerDaemon.CompleteJob:output_type -> provisionerd.Empty
|
||||||
25, // [25:30] is the sub-list for method input_type
|
31, // [31:36] is the sub-list for method output_type
|
||||||
25, // [25:25] is the sub-list for extension type_name
|
26, // [26:31] is the sub-list for method input_type
|
||||||
25, // [25:25] is the sub-list for extension extendee
|
26, // [26:26] is the sub-list for extension type_name
|
||||||
0, // [0:25] is the sub-list for field type_name
|
26, // [26:26] is the sub-list for extension extendee
|
||||||
|
0, // [0:26] is the sub-list for field type_name
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() { file_provisionerd_proto_provisionerd_proto_init() }
|
func init() { file_provisionerd_proto_provisionerd_proto_init() }
|
||||||
|
|
|
@ -24,7 +24,8 @@ message AcquiredJob {
|
||||||
}
|
}
|
||||||
message TemplateDryRun {
|
message TemplateDryRun {
|
||||||
repeated provisioner.ParameterValue parameter_values = 1;
|
repeated provisioner.ParameterValue parameter_values = 1;
|
||||||
provisioner.Provision.Metadata metadata = 2;
|
repeated provisioner.RichParameterValue rich_parameter_values = 2;
|
||||||
|
provisioner.Provision.Metadata metadata = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
string job_id = 1;
|
string job_id = 1;
|
||||||
|
|
|
@ -427,6 +427,7 @@ func (r *Runner) do(ctx context.Context) (*proto.CompletedJob, *proto.FailedJob)
|
||||||
r.logger.Debug(context.Background(), "acquired job is template dry-run",
|
r.logger.Debug(context.Background(), "acquired job is template dry-run",
|
||||||
slog.F("workspace_name", jobType.TemplateDryRun.Metadata.WorkspaceName),
|
slog.F("workspace_name", jobType.TemplateDryRun.Metadata.WorkspaceName),
|
||||||
slog.F("parameters", jobType.TemplateDryRun.ParameterValues),
|
slog.F("parameters", jobType.TemplateDryRun.ParameterValues),
|
||||||
|
slog.F("rich_parameter_values", jobType.TemplateDryRun.RichParameterValues),
|
||||||
)
|
)
|
||||||
return r.runTemplateDryRun(ctx)
|
return r.runTemplateDryRun(ctx)
|
||||||
case *proto.AcquiredJob_WorkspaceBuild_:
|
case *proto.AcquiredJob_WorkspaceBuild_:
|
||||||
|
@ -646,9 +647,15 @@ func (r *Runner) runTemplateImportParse(ctx context.Context) ([]*sdkproto.Parame
|
||||||
}
|
}
|
||||||
|
|
||||||
// Performs a dry-run provision when importing a template.
|
// Performs a dry-run provision when importing a template.
|
||||||
// This is used to detect resources that would be provisioned
|
// This is used to detect resources that would be provisioned for a workspace in various states.
|
||||||
// for a workspace in various states.
|
// It doesn't define values for rich parameters as they're unknown during template import.
|
||||||
func (r *Runner) runTemplateImportProvision(ctx context.Context, values []*sdkproto.ParameterValue, metadata *sdkproto.Provision_Metadata) ([]*sdkproto.Resource, []*sdkproto.RichParameter, error) {
|
func (r *Runner) runTemplateImportProvision(ctx context.Context, values []*sdkproto.ParameterValue, metadata *sdkproto.Provision_Metadata) ([]*sdkproto.Resource, []*sdkproto.RichParameter, error) {
|
||||||
|
return r.runTemplateImportProvisionWithRichParameters(ctx, values, nil, metadata)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Performs a dry-run provision with provided rich parameters.
|
||||||
|
// This is used to detect resources that would be provisioned for a workspace in various states.
|
||||||
|
func (r *Runner) runTemplateImportProvisionWithRichParameters(ctx context.Context, values []*sdkproto.ParameterValue, richParameterValues []*sdkproto.RichParameterValue, metadata *sdkproto.Provision_Metadata) ([]*sdkproto.Resource, []*sdkproto.RichParameter, error) {
|
||||||
ctx, span := r.startTrace(ctx, tracing.FuncName())
|
ctx, span := r.startTrace(ctx, tracing.FuncName())
|
||||||
defer span.End()
|
defer span.End()
|
||||||
|
|
||||||
|
@ -685,7 +692,8 @@ func (r *Runner) runTemplateImportProvision(ctx context.Context, values []*sdkpr
|
||||||
Directory: r.workDirectory,
|
Directory: r.workDirectory,
|
||||||
Metadata: metadata,
|
Metadata: metadata,
|
||||||
},
|
},
|
||||||
ParameterValues: values,
|
ParameterValues: values,
|
||||||
|
RichParameterValues: richParameterValues,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -767,8 +775,9 @@ func (r *Runner) runTemplateDryRun(ctx context.Context) (*proto.CompletedJob, *p
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run the template import provision task since it's already a dry run.
|
// Run the template import provision task since it's already a dry run.
|
||||||
resources, _, err := r.runTemplateImportProvision(ctx,
|
resources, _, err := r.runTemplateImportProvisionWithRichParameters(ctx,
|
||||||
r.job.GetTemplateDryRun().GetParameterValues(),
|
r.job.GetTemplateDryRun().GetParameterValues(),
|
||||||
|
r.job.GetTemplateDryRun().GetRichParameterValues(),
|
||||||
metadata,
|
metadata,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -941,8 +950,9 @@ func (r *Runner) runWorkspaceBuild(ctx context.Context) (*proto.CompletedJob, *p
|
||||||
completedPlan, failed := r.buildWorkspace(ctx, "Planning infrastructure", &sdkproto.Provision_Request{
|
completedPlan, failed := r.buildWorkspace(ctx, "Planning infrastructure", &sdkproto.Provision_Request{
|
||||||
Type: &sdkproto.Provision_Request_Plan{
|
Type: &sdkproto.Provision_Request_Plan{
|
||||||
Plan: &sdkproto.Provision_Plan{
|
Plan: &sdkproto.Provision_Plan{
|
||||||
Config: config,
|
Config: config,
|
||||||
ParameterValues: r.job.GetWorkspaceBuild().ParameterValues,
|
ParameterValues: r.job.GetWorkspaceBuild().ParameterValues,
|
||||||
|
RichParameterValues: r.job.GetWorkspaceBuild().RichParameterValues,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -188,6 +188,7 @@ export interface CreateTemplateRequest {
|
||||||
export interface CreateTemplateVersionDryRunRequest {
|
export interface CreateTemplateVersionDryRunRequest {
|
||||||
readonly workspace_name: string
|
readonly workspace_name: string
|
||||||
readonly parameter_values: CreateParameterRequest[]
|
readonly parameter_values: CreateParameterRequest[]
|
||||||
|
readonly rich_parameter_values: WorkspaceBuildParameter[]
|
||||||
}
|
}
|
||||||
|
|
||||||
// From codersdk/organizations.go
|
// From codersdk/organizations.go
|
||||||
|
|
Loading…
Reference in New Issue