From 0ccbbb2636b8989d96dd4d9cc897b2aa6040528b Mon Sep 17 00:00:00 2001 From: barnettZQG Date: Wed, 1 Jun 2022 19:43:13 +0800 Subject: [PATCH] Fix: the new default values do not take effect when upgrading the vela core Signed-off-by: barnettZQG --- pkg/utils/helm/helm_helper.go | 11 ++--- pkg/utils/helm/helm_helper_test.go | 41 +++++++++++++++++- .../helm/testdata/autoscalertrait-0.1.0.tgz | Bin 4855 -> 4852 bytes .../helm/testdata/autoscalertrait-0.2.0.tgz | Bin 0 -> 4905 bytes 4 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 pkg/utils/helm/testdata/autoscalertrait-0.2.0.tgz diff --git a/pkg/utils/helm/helm_helper.go b/pkg/utils/helm/helm_helper.go index d47899c09..d871426fd 100644 --- a/pkg/utils/helm/helm_helper.go +++ b/pkg/utils/helm/helm_helper.go @@ -140,20 +140,16 @@ func (h *Helper) UpgradeChart(ch *chart.Chart, releaseName, namespace string, va r.Info.Status == release.StatusPendingRollback { return nil, fmt.Errorf("previous installation (e.g., using vela install or helm upgrade) is still in progress. Please try again in %d minutes", timeoutInMinutes) } - } // merge un-existing values into the values as user-input, because the helm chart upgrade didn't handle the new default values in the chart. + // the new default values <= the old custom values <= the new custom values if config.ReuseValues { // sort will sort the release by revision from old to new relutil.SortByRevision(releases) rel := releases[len(releases)-1] - // merge new chart values into old values, the values of old chart has the high priority - mergedWithNewValues := chartutil.CoalesceTables(rel.Chart.Values, ch.Values) - // merge the chart with the released chart config but follow the old config - mergeWithConfigs := chartutil.CoalesceTables(rel.Config, mergedWithNewValues) // merge new values as the user input, follow the new user input for --set - values = chartutil.CoalesceTables(values, mergeWithConfigs) + values = chartutil.CoalesceTables(values, rel.Config) } // overwrite existing installation @@ -161,7 +157,8 @@ func (h *Helper) UpgradeChart(ch *chart.Chart, releaseName, namespace string, va install.Namespace = namespace install.Wait = config.Wait install.Timeout = time.Duration(timeoutInMinutes) * time.Minute - install.ReuseValues = config.ReuseValues + // use the new default value set. + install.ReuseValues = false newRelease, err = install.Run(releaseName, ch, values) } // check if install/upgrade worked diff --git a/pkg/utils/helm/helm_helper_test.go b/pkg/utils/helm/helm_helper_test.go index f32f4142f..ad70b2a8a 100644 --- a/pkg/utils/helm/helm_helper_test.go +++ b/pkg/utils/helm/helm_helper_test.go @@ -49,7 +49,10 @@ var _ = Describe("Test helm helper", func() { helper := NewHelper() chart, err := helper.LoadCharts("./testdata/autoscalertrait-0.1.0.tgz", nil) Expect(err).Should(BeNil()) - release, err := helper.UpgradeChart(chart, "autoscalertrait", "default", nil, UpgradeChartOptions{ + release, err := helper.UpgradeChart(chart, "autoscalertrait", "default", map[string]interface{}{ + "replicaCount": 2, + "image.tag": "0.1.0", + }, UpgradeChartOptions{ Config: cfg, Detail: false, Logging: util.IOStreams{Out: os.Stdout, ErrOut: os.Stderr}, @@ -58,6 +61,42 @@ var _ = Describe("Test helm helper", func() { crds := GetCRDFromChart(release.Chart) Expect(cmp.Diff(len(crds), 1)).Should(BeEmpty()) Expect(err).Should(BeNil()) + deployments := GetDeploymentsFromManifest(release.Manifest) + Expect(cmp.Diff(len(deployments), 1)).Should(BeEmpty()) + Expect(cmp.Diff(*deployments[0].Spec.Replicas, int32(2))).Should(BeEmpty()) + containers := deployments[0].Spec.Template.Spec.Containers + Expect(cmp.Diff(len(containers), 1)).Should(BeEmpty()) + + // add new default value + Expect(cmp.Diff(containers[0].Image, "ghcr.io/oam-dev/catalog/autoscalertrait:0.1.0")).Should(BeEmpty()) + + chartNew, err := helper.LoadCharts("./testdata/autoscalertrait-0.2.0.tgz", nil) + Expect(err).Should(BeNil()) + + // the new custom values should override the last release custom values + releaseNew, err := helper.UpgradeChart(chartNew, "autoscalertrait", "default", map[string]interface{}{ + "image.tag": "0.2.0", + }, UpgradeChartOptions{ + Config: cfg, + Detail: false, + ReuseValues: true, + Logging: util.IOStreams{Out: os.Stdout, ErrOut: os.Stderr}, + Wait: false, + }) + Expect(err).Should(BeNil()) + deployments = GetDeploymentsFromManifest(releaseNew.Manifest) + Expect(cmp.Diff(len(deployments), 1)).Should(BeEmpty()) + // keep the custom values + Expect(cmp.Diff(*deployments[0].Spec.Replicas, int32(2))).Should(BeEmpty()) + containers = deployments[0].Spec.Template.Spec.Containers + Expect(cmp.Diff(len(containers), 1)).Should(BeEmpty()) + + // change the default value + Expect(cmp.Diff(containers[0].Image, "ghcr.io/oam-dev/catalog/autoscalertrait:0.2.0")).Should(BeEmpty()) + + // add new default value + Expect(cmp.Diff(len(containers[0].Env), 1)).Should(BeEmpty()) + Expect(cmp.Diff(containers[0].Env[0].Name, "env1")).Should(BeEmpty()) }) It("Test UninstallRelease", func() { diff --git a/pkg/utils/helm/testdata/autoscalertrait-0.1.0.tgz b/pkg/utils/helm/testdata/autoscalertrait-0.1.0.tgz index 7c2412ac502e89d5e6b65de6fa467497569143a7..3d912de2b0113cf4e536fb08be4ad217b0c5ec2a 100644 GIT binary patch delta 4817 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 bAId{{C=cbKbj$w+00960YljzW0AK(Bf8m3A literal 0 HcmV?d00001