Add kube version flag (#804)

* add --kube-version flag into template cmd

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>

* add test

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>

* modify flag description

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>

* use switch

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>

* add comment

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>

---------

Signed-off-by: FeLvi-zzz <34182539+FeLvi-zzz@users.noreply.github.com>
This commit is contained in:
Soh Takada 2023-04-16 08:05:23 +09:00 committed by GitHub
parent 0012e7e5a1
commit a8a0a33c33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 93 additions and 13 deletions

View File

@ -45,6 +45,7 @@ func NewTemplateCmd(globalCfg *config.GlobalImpl) *cobra.Command {
f.BoolVar(&templateOptions.IncludeTransitiveNeeds, "include-transitive-needs", false, `like --include-needs, but also includes transitive needs (needs of needs). Does nothing when --selector/-l flag is not provided. Overrides exclusions of other selectors and conditions.`)
f.BoolVar(&templateOptions.SkipCleanup, "skip-cleanup", false, "Stop cleaning up temporary values generated by helmfile and helm-secrets. Useful for debugging. Don't use in production for security")
f.StringVar(&templateOptions.PostRenderer, "post-renderer", "", `pass --post-renderer to "helm template" or "helm upgrade --install"`)
f.StringVar(&templateOptions.KubeVersion, "kube-version", "", `pass --kube-version to "helm template". Overrides kubeVersion in helmfile.yaml`)
return cmd
}

View File

@ -1884,6 +1884,7 @@ func (a *App) template(r *Run, c TemplateConfigProvider) (bool, []error) {
SkipCleanup: c.SkipCleanup(),
SkipTests: c.SkipTests(),
PostRenderer: c.PostRenderer(),
KubeVersion: c.KubeVersion(),
}
return st.TemplateReleases(helm, c.OutputDir(), c.Values(), args, c.Concurrency(), c.Validate(), opts)
})

View File

@ -2097,6 +2097,7 @@ type configImpl struct {
includeNeeds bool
includeTransitiveNeeds bool
skipCharts bool
kubeVersion string
}
func (c configImpl) Selectors() []string {
@ -2179,6 +2180,10 @@ func (c configImpl) PostRenderer() string {
return ""
}
func (c configImpl) KubeVersion() string {
return c.kubeVersion
}
type applyConfig struct {
args string
values []string
@ -2213,6 +2218,7 @@ type applyConfig struct {
waitForJobs bool
reuseValues bool
postRenderer string
kubeVersion string
// template-only options
includeCRDs, skipTests bool
@ -2361,6 +2367,10 @@ func (a applyConfig) PostRenderer() string {
return a.postRenderer
}
func (a applyConfig) KubeVersion() string {
return a.kubeVersion
}
type depsConfig struct {
skipRepos bool
includeTransitiveNeeds bool

View File

@ -208,6 +208,7 @@ type TemplateConfigProvider interface {
SkipTests() bool
OutputDir() string
IncludeCRDs() bool
KubeVersion() string
DAGConfig

View File

@ -34,6 +34,8 @@ type TemplateOptions struct {
SkipCleanup bool
// Propagate '--post-renderer' to helmv3 template and helm install
PostRenderer string
// KubeVersion is the kube-version flag
KubeVersion string
}
// NewTemplateOptions creates a new Apply
@ -123,3 +125,8 @@ func (t *TemplateImpl) Values() []string {
func (t *TemplateImpl) PostRenderer() string {
return t.TemplateOptions.PostRenderer
}
// KubeVersion returns the the KubeVersion.
func (t *TemplateImpl) KubeVersion() string {
return t.TemplateOptions.KubeVersion
}

View File

@ -1040,6 +1040,7 @@ type ChartPrepareOptions struct {
OutputDirTemplate string
IncludeTransitiveNeeds bool
Concurrency int
KubeVersion string
}
type chartPrepareResult struct {
@ -1384,6 +1385,7 @@ type TemplateOpts struct {
IncludeCRDs bool
SkipTests bool
PostRenderer string
KubeVersion string
}
type TemplateOpt interface{ Apply(*TemplateOpts) }
@ -2540,13 +2542,14 @@ func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseS
flags = st.appendHelmXFlags(flags, release)
flags = st.appendApiVersionsFlags(flags, release)
postRenderer := ""
kubeVersion := ""
if opt != nil {
postRenderer = opt.PostRenderer
kubeVersion = opt.KubeVersion
}
flags = st.appendPostRenderFlags(flags, release, postRenderer)
flags = st.appendApiVersionsFlags(flags, release, kubeVersion)
common, files, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
if err != nil {
@ -2579,7 +2582,11 @@ func (st *HelmState) flagsForDiff(helm helmexec.Interface, release *ReleaseSpec,
flags = append(flags, "--disable-validation")
}
flags = st.appendApiVersionsFlags(flags, release)
// TODO:
// `helm diff` has `--kube-version` flag from v3.5.0, but only respected when `helm diff upgrade --disable-validation`.
// `helm template --validate` and `helm upgrade --dry-run` ignore `--kube-version` flag.
// For the moment, not specifying kubeVersion.
flags = st.appendApiVersionsFlags(flags, release, "")
flags = st.appendConnectionFlags(flags, release)
@ -2622,7 +2629,7 @@ func (st *HelmState) appendValuesControlModeFlag(flags []string, reuseValues boo
return flags
}
func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec) []string {
func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec, kubeVersion string) []string {
if len(r.ApiVersions) != 0 {
for _, a := range r.ApiVersions {
flags = append(flags, "--api-versions", a)
@ -2633,9 +2640,12 @@ func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec) []st
}
}
if r.KubeVersion != "" {
switch {
case kubeVersion != "":
flags = append(flags, "--kube-version", kubeVersion)
case r.KubeVersion != "":
flags = append(flags, "--kube-version", r.KubeVersion)
} else if st.KubeVersion != "" {
case st.KubeVersion != "":
flags = append(flags, "--kube-version", st.KubeVersion)
}

View File

@ -736,12 +736,13 @@ func TestHelmState_flagsForTemplate(t *testing.T) {
postRendererRelease := "foo-release.sh"
tests := []struct {
name string
version *semver.Version
defaults HelmSpec
release *ReleaseSpec
want []string
wantErr string
name string
version *semver.Version
defaults HelmSpec
release *ReleaseSpec
templateOpts TemplateOpts
want []string
wantErr string
}{
{
name: "post-renderer-flags-use-helmdefault",
@ -810,6 +811,55 @@ func TestHelmState_flagsForTemplate(t *testing.T) {
"--namespace", "test-namespace",
},
},
{
name: "kube-version-flag-should-be-used",
defaults: HelmSpec{
Verify: false,
CreateNamespace: &enable,
},
version: semver.MustParse("3.10.0"),
release: &ReleaseSpec{
Chart: "test/chart",
Version: "0.1",
Verify: &disable,
Name: "test-charts",
Namespace: "test-namespace",
CreateNamespace: &disable,
},
templateOpts: TemplateOpts{
KubeVersion: "1.100",
},
want: []string{
"--version", "0.1",
"--kube-version", "1.100",
"--namespace", "test-namespace",
},
},
{
name: "kube-version-flag-should-be-respected",
defaults: HelmSpec{
Verify: false,
CreateNamespace: &enable,
},
version: semver.MustParse("3.10.0"),
release: &ReleaseSpec{
Chart: "test/chart",
Version: "0.1",
Verify: &disable,
Name: "test-charts",
Namespace: "test-namespace",
CreateNamespace: &disable,
KubeVersion: "1.25",
},
templateOpts: TemplateOpts{
KubeVersion: "1.100",
},
want: []string{
"--version", "0.1",
"--kube-version", "1.100",
"--namespace", "test-namespace",
},
},
}
for i := range tests {
tt := tests[i]
@ -827,7 +877,7 @@ func TestHelmState_flagsForTemplate(t *testing.T) {
Version: tt.version,
}
args, _, err := state.flagsForTemplate(helm, tt.release, 0, &TemplateOpts{})
args, _, err := state.flagsForTemplate(helm, tt.release, 0, &(tt.templateOpts))
if err != nil && tt.wantErr == "" {
t.Errorf("unexpected error flagsForUpgrade: %v", err)
}