diff --git a/pkg/generator/credentials.go b/pkg/generator/credentials.go index e2d22c129..b2b1d0fbe 100644 --- a/pkg/generator/credentials.go +++ b/pkg/generator/credentials.go @@ -53,7 +53,7 @@ func genCredentialSet(namespace string, name string, creds map[string]bundle.Cre sort.Strings(credentialNames) for _, name := range credentialNames { - c, err := fn(name, surveyCredentials) + c, err := fn(name, surveyCredentials, withRequired(creds[name].Required)) if err != nil { return cs, err } diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index c3d69e34a..2b4a76ed5 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -33,26 +33,48 @@ const ( questionEnvVar = "environment variable" questionPath = "file path" questionCommand = "shell command" + questionSkip = "skip" ) -type generator func(name string, surveyType SurveyType) (secrets.SourceMap, error) +type surveyOptions struct { + required bool +} + +type surveyOption func(*surveyOptions) + +func withRequired(required bool) surveyOption { + return func(s *surveyOptions) { + s.required = required + } +} + +type generator func(name string, surveyType SurveyType, opts ...surveyOption) (secrets.SourceMap, error) -func genEmptySet(name string, surveyType SurveyType) (secrets.SourceMap, error) { +func genEmptySet(name string, surveyType SurveyType, opts ...surveyOption) (secrets.SourceMap, error) { return secrets.SourceMap{ Name: name, Source: secrets.Source{Hint: "TODO"}, }, nil } -func genSurvey(name string, surveyType SurveyType) (secrets.SourceMap, error) { +func genSurvey(name string, surveyType SurveyType, opts ...surveyOption) (secrets.SourceMap, error) { if surveyType != surveyCredentials && surveyType != surveyParameters { return secrets.SourceMap{}, fmt.Errorf("unsupported survey type: %s", surveyType) } + surveyOptions := &surveyOptions{} + for _, opt := range opts { + opt(surveyOptions) + } + + selectOptions := []string{questionSecret, questionValue, questionEnvVar, questionPath, questionCommand} + if !surveyOptions.required { + selectOptions = append(selectOptions, questionSkip) + } // extra space-suffix to align question and answer. Unfortunately misaligns help text sourceTypePrompt := &survey.Select{ Message: fmt.Sprintf("How would you like to set %s %q\n ", surveyType, name), - Options: []string{questionSecret, questionValue, questionEnvVar, questionPath, questionCommand}, + Options: selectOptions, Default: "environment variable", } @@ -78,6 +100,12 @@ func genSurvey(name string, surveyType SurveyType) (secrets.SourceMap, error) { promptMsg = fmt.Sprintf(sourceValuePromptTemplate, "path", surveyType, name) case questionCommand: promptMsg = fmt.Sprintf(sourceValuePromptTemplate, "command", surveyType, name) + case questionSkip: + promptMsg = fmt.Sprintf(sourceValuePromptTemplate, "skip", surveyType, name) + } + + if source == questionSkip { + return secrets.SourceMap{}, nil } sourceValuePrompt := &survey.Input{ diff --git a/pkg/generator/parameters.go b/pkg/generator/parameters.go index 3007fabc8..4bf05c2ca 100644 --- a/pkg/generator/parameters.go +++ b/pkg/generator/parameters.go @@ -54,7 +54,7 @@ func (opts *GenerateParametersOptions) genParameterSet(fn generator) (storage.Pa if opts.Bundle.IsInternalParameter(name) { continue } - c, err := fn(name, surveyParameters) + c, err := fn(name, surveyParameters, withRequired(opts.Bundle.Parameters[name].Required)) if err != nil { return pset, err } diff --git a/pkg/porter/credentials.go b/pkg/porter/credentials.go index 8dcf261b1..1678f3cb8 100644 --- a/pkg/porter/credentials.go +++ b/pkg/porter/credentials.go @@ -155,6 +155,10 @@ func (p *Porter) GenerateCredentials(ctx context.Context, opts CredentialOptions return span.Error(fmt.Errorf("unable to generate credentials: %w", err)) } + if len(cs.Credentials) == 0 { + return nil + } + cs.Status.Created = time.Now() cs.Status.Modified = cs.Status.Created diff --git a/pkg/porter/parameters.go b/pkg/porter/parameters.go index c2f27445f..18e086593 100644 --- a/pkg/porter/parameters.go +++ b/pkg/porter/parameters.go @@ -164,6 +164,10 @@ func (p *Porter) GenerateParameters(ctx context.Context, opts ParameterOptions) return fmt.Errorf("unable to generate parameter set: %w", err) } + if len(pset.Parameters) == 0 { + return nil + } + pset.Status.Created = time.Now() pset.Status.Modified = pset.Status.Created