Enhance support for kube-version and api-versions (#2121)
This adds support for `kube-version` and `api-versions` to be available to `chartify` so that it works even if your release requires `chartify` due to that you use features like `forceNamespace`, `jsonPatches`, `strategicMergePatches`, and so on. This also enhances `ReleaseSpec` which corresponds to each item of `releases[]` in your `helmfile.yaml` to also accept `kubeVersion` and `apiVersions`, in addition to the top-level `kubeVersion` and `apiVersions` we have today. The top-level ones works as the default values for release-specific ones. If you have been using the top-level ones, keep using it. It is backward-compatible. If you want to specify it per release, because, for example, your releases are deployed across clusters(in case you differentiate `kubeContext` fields), try the new fields added to the release spec. Resolves #1864
This commit is contained in:
		
							parent
							
								
									ed436ba68b
								
							
						
					
					
						commit
						be5af8e3b7
					
				| 
						 | 
					@ -60,7 +60,11 @@ type ReleaseSetSpec struct {
 | 
				
			||||||
	CommonLabels        map[string]string `yaml:"commonLabels,omitempty"`
 | 
						CommonLabels        map[string]string `yaml:"commonLabels,omitempty"`
 | 
				
			||||||
	Releases            []ReleaseSpec     `yaml:"releases,omitempty"`
 | 
						Releases            []ReleaseSpec     `yaml:"releases,omitempty"`
 | 
				
			||||||
	Selectors           []string          `yaml:"-"`
 | 
						Selectors           []string          `yaml:"-"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Capabilities.APIVersions
 | 
				
			||||||
	ApiVersions []string `yaml:"apiVersions,omitempty"`
 | 
						ApiVersions []string `yaml:"apiVersions,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Capabilities.KubeVersion
 | 
				
			||||||
	KubeVersion string `yaml:"kubeVersion,omitempty"`
 | 
						KubeVersion string `yaml:"kubeVersion,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Hooks is a list of extension points paired with operations, that are executed in specific points of the lifecycle of releases defined in helmfile
 | 
						// Hooks is a list of extension points paired with operations, that are executed in specific points of the lifecycle of releases defined in helmfile
 | 
				
			||||||
| 
						 | 
					@ -249,6 +253,12 @@ type ReleaseSpec struct {
 | 
				
			||||||
	ValuesTemplate    []interface{} `yaml:"valuesTemplate,omitempty"`
 | 
						ValuesTemplate    []interface{} `yaml:"valuesTemplate,omitempty"`
 | 
				
			||||||
	SetValuesTemplate []SetValue    `yaml:"setTemplate,omitempty"`
 | 
						SetValuesTemplate []SetValue    `yaml:"setTemplate,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Capabilities.APIVersions
 | 
				
			||||||
 | 
						ApiVersions []string `yaml:"apiVersions,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Capabilities.KubeVersion
 | 
				
			||||||
 | 
						KubeVersion string `yaml:"kubeVersion,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// The 'env' section is not really necessary any longer, as 'set' would now provide the same functionality
 | 
						// The 'env' section is not really necessary any longer, as 'set' would now provide the same functionality
 | 
				
			||||||
	EnvValues []SetValue `yaml:"env,omitempty"`
 | 
						EnvValues []SetValue `yaml:"env,omitempty"`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1121,6 +1131,9 @@ func (st *HelmState) PrepareCharts(helm helmexec.Interface, dir string, concurre
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					chartifyOpts.Validate = opts.Validate
 | 
										chartifyOpts.Validate = opts.Validate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										chartifyOpts.KubeVersion = release.KubeVersion
 | 
				
			||||||
 | 
										chartifyOpts.ApiVersions = release.ApiVersions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					out, err := c.Chartify(release.Name, chartPath, chartify.WithChartifyOpts(chartifyOpts))
 | 
										out, err := c.Chartify(release.Name, chartPath, chartify.WithChartifyOpts(chartifyOpts))
 | 
				
			||||||
					if err != nil {
 | 
										if err != nil {
 | 
				
			||||||
						results <- &chartPrepareResult{err: err}
 | 
											results <- &chartPrepareResult{err: err}
 | 
				
			||||||
| 
						 | 
					@ -2471,10 +2484,7 @@ func (st *HelmState) flagsForTemplate(helm helmexec.Interface, release *ReleaseS
 | 
				
			||||||
		return nil, nil, err
 | 
							return nil, nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	flags = st.appendApiVersionsFlags(flags)
 | 
						flags = st.appendApiVersionsFlags(flags, release)
 | 
				
			||||||
	if st.KubeVersion != "" {
 | 
					 | 
				
			||||||
		flags = append(flags, "--kube-version", st.KubeVersion)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	common, files, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
 | 
						common, files, err := st.namespaceAndValuesFlags(helm, release, workerIndex)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -2536,10 +2546,15 @@ func (st *HelmState) chartVersionFlags(release *ReleaseSpec) []string {
 | 
				
			||||||
	return flags
 | 
						return flags
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (st *HelmState) appendApiVersionsFlags(flags []string) []string {
 | 
					func (st *HelmState) appendApiVersionsFlags(flags []string, r *ReleaseSpec) []string {
 | 
				
			||||||
	for _, a := range st.ApiVersions {
 | 
						for _, a := range r.ApiVersions {
 | 
				
			||||||
		flags = append(flags, "--api-versions", a)
 | 
							flags = append(flags, "--api-versions", a)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if r.KubeVersion != "" {
 | 
				
			||||||
 | 
							flags = append(flags, "--kube-version", st.KubeVersion)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return flags
 | 
						return flags
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,6 +100,13 @@ func (st *HelmState) ExecuteTemplates() (*HelmState, error) {
 | 
				
			||||||
		for k, v := range st.CommonLabels {
 | 
							for k, v := range st.CommonLabels {
 | 
				
			||||||
			release.Labels[k] = v
 | 
								release.Labels[k] = v
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if len(release.ApiVersions) == 0 {
 | 
				
			||||||
 | 
								release.ApiVersions = st.ApiVersions
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if release.KubeVersion == "" {
 | 
				
			||||||
 | 
								release.KubeVersion = st.KubeVersion
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		successFlag := false
 | 
							successFlag := false
 | 
				
			||||||
		for it, prev := 0, &release; it < 6; it++ {
 | 
							for it, prev := 0, &release; it < 6; it++ {
 | 
				
			||||||
			tmplData := st.createReleaseTemplateData(prev, vals)
 | 
								tmplData := st.createReleaseTemplateData(prev, vals)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,39 +38,39 @@ func TestGenerateID(t *testing.T) {
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "baseline",
 | 
							subject: "baseline",
 | 
				
			||||||
		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
							release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
				
			||||||
		want:    "foo-values-779795898b",
 | 
							want:    "foo-values-6d97d4c7ff",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "different bytes content",
 | 
							subject: "different bytes content",
 | 
				
			||||||
		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
							release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
				
			||||||
		data:    []byte(`{"k":"v"}`),
 | 
							data:    []byte(`{"k":"v"}`),
 | 
				
			||||||
		want:    "foo-values-6b7ffbccc",
 | 
							want:    "foo-values-74fcbfbd68",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "different map content",
 | 
							subject: "different map content",
 | 
				
			||||||
		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
							release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"},
 | 
				
			||||||
		data:    map[string]interface{}{"k": "v"},
 | 
							data:    map[string]interface{}{"k": "v"},
 | 
				
			||||||
		want:    "foo-values-6d57bbfccf",
 | 
							want:    "foo-values-7b954b6b6b",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "different chart",
 | 
							subject: "different chart",
 | 
				
			||||||
		release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"},
 | 
							release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"},
 | 
				
			||||||
		want:    "foo-values-5c45b58947",
 | 
							want:    "foo-values-5c54676568",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "different name",
 | 
							subject: "different name",
 | 
				
			||||||
		release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"},
 | 
							release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"},
 | 
				
			||||||
		want:    "bar-values-99d5fdbcc",
 | 
							want:    "bar-values-5fff459546",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	run(testcase{
 | 
						run(testcase{
 | 
				
			||||||
		subject: "specific ns",
 | 
							subject: "specific ns",
 | 
				
			||||||
		release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"},
 | 
							release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"},
 | 
				
			||||||
		want:    "myns-foo-values-544cb97d7f",
 | 
							want:    "myns-foo-values-cfd9959dd",
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for id, n := range ids {
 | 
						for id, n := range ids {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue