From e1479cb1b99c51ecf3c47e68ca62fde22f5d9ea3 Mon Sep 17 00:00:00 2001 From: Kim Christensen Date: Tue, 7 May 2024 12:09:00 +0200 Subject: [PATCH 1/3] Support skipping parameters and credentials during generate Adds a `skip` option to the prompt allow users to skip parameter and credential generation of specific entries. Signed-off-by: Kim Christensen --- pkg/generator/generator.go | 9 ++++++++- pkg/porter/credentials.go | 4 ++++ pkg/porter/parameters.go | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index c3d69e34a..a3f14c659 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -33,6 +33,7 @@ const ( questionEnvVar = "environment variable" questionPath = "file path" questionCommand = "shell command" + questionSkip = "skip" ) type generator func(name string, surveyType SurveyType) (secrets.SourceMap, error) @@ -52,7 +53,7 @@ func genSurvey(name string, surveyType SurveyType) (secrets.SourceMap, error) { // 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: []string{questionSecret, questionValue, questionEnvVar, questionPath, questionCommand, questionSkip}, Default: "environment variable", } @@ -78,6 +79,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/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 From 08ea420604f79d1706aa724777ffee7b33f57a7c Mon Sep 17 00:00:00 2001 From: Kim Christensen Date: Wed, 8 May 2024 23:24:30 +0200 Subject: [PATCH 2/3] Only allow skipping parameter or credential if not required Signed-off-by: Kim Christensen --- pkg/generator/credentials.go | 2 +- pkg/generator/generator.go | 13 +++++++++---- pkg/generator/generator_test.go | 4 ++-- pkg/generator/parameters.go | 2 +- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pkg/generator/credentials.go b/pkg/generator/credentials.go index e2d22c129..232e49016 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, creds[name].Required) if err != nil { return cs, err } diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index a3f14c659..405fa6a6f 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -36,24 +36,29 @@ const ( questionSkip = "skip" ) -type generator func(name string, surveyType SurveyType) (secrets.SourceMap, error) +type generator func(name string, surveyType SurveyType, required bool) (secrets.SourceMap, error) -func genEmptySet(name string, surveyType SurveyType) (secrets.SourceMap, error) { +func genEmptySet(name string, surveyType SurveyType, required bool) (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, required bool) (secrets.SourceMap, error) { if surveyType != surveyCredentials && surveyType != surveyParameters { return secrets.SourceMap{}, fmt.Errorf("unsupported survey type: %s", surveyType) } + surveyOptions := []string{questionSecret, questionValue, questionEnvVar, questionPath, questionCommand} + if !required { + surveyOptions = append(surveyOptions, 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, questionSkip}, + Options: surveyOptions, Default: "environment variable", } diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 464fd2446..7ada6cb31 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -15,13 +15,13 @@ func Test_genEmptySet(t *testing.T) { Source: secrets.Source{Hint: "TODO"}, } - got, err := genEmptySet("emptyset", surveyParameters) + got, err := genEmptySet("emptyset", surveyParameters, false) require.NoError(t, err) require.Equal(t, expected, got) } func Test_genSurvey_unsupported(t *testing.T) { - got, err := genSurvey("myturtleset", SurveyType("turtles")) + got, err := genSurvey("myturtleset", SurveyType("turtles"), false) require.EqualError(t, err, "unsupported survey type: turtles") require.Equal(t, secrets.SourceMap{}, got) } diff --git a/pkg/generator/parameters.go b/pkg/generator/parameters.go index 3007fabc8..b878f3ddc 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, opts.Bundle.Parameters[name].Required) if err != nil { return pset, err } From e6e6e01420e9a109348bf7feae596d4473e7b39c Mon Sep 17 00:00:00 2001 From: Kim Christensen Date: Thu, 9 May 2024 22:04:10 +0200 Subject: [PATCH 3/3] Introduce options pattern Signed-off-by: Kim Christensen --- pkg/generator/credentials.go | 2 +- pkg/generator/generator.go | 30 +++++++++++++++++++++++------- pkg/generator/generator_test.go | 4 ++-- pkg/generator/parameters.go | 2 +- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/pkg/generator/credentials.go b/pkg/generator/credentials.go index 232e49016..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, creds[name].Required) + 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 405fa6a6f..2b4a76ed5 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -36,29 +36,45 @@ const ( questionSkip = "skip" ) -type generator func(name string, surveyType SurveyType, required bool) (secrets.SourceMap, error) +type surveyOptions struct { + required bool +} + +type surveyOption func(*surveyOptions) -func genEmptySet(name string, surveyType SurveyType, required bool) (secrets.SourceMap, error) { +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, opts ...surveyOption) (secrets.SourceMap, error) { return secrets.SourceMap{ Name: name, Source: secrets.Source{Hint: "TODO"}, }, nil } -func genSurvey(name string, surveyType SurveyType, required bool) (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) + } - surveyOptions := []string{questionSecret, questionValue, questionEnvVar, questionPath, questionCommand} - if !required { - surveyOptions = append(surveyOptions, questionSkip) + 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: surveyOptions, + Options: selectOptions, Default: "environment variable", } diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 7ada6cb31..464fd2446 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -15,13 +15,13 @@ func Test_genEmptySet(t *testing.T) { Source: secrets.Source{Hint: "TODO"}, } - got, err := genEmptySet("emptyset", surveyParameters, false) + got, err := genEmptySet("emptyset", surveyParameters) require.NoError(t, err) require.Equal(t, expected, got) } func Test_genSurvey_unsupported(t *testing.T) { - got, err := genSurvey("myturtleset", SurveyType("turtles"), false) + got, err := genSurvey("myturtleset", SurveyType("turtles")) require.EqualError(t, err, "unsupported survey type: turtles") require.Equal(t, secrets.SourceMap{}, got) } diff --git a/pkg/generator/parameters.go b/pkg/generator/parameters.go index b878f3ddc..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, opts.Bundle.Parameters[name].Required) + c, err := fn(name, surveyParameters, withRequired(opts.Bundle.Parameters[name].Required)) if err != nil { return pset, err }