diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index 5863f9bc7..43f05beac 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -300,7 +300,7 @@ func (u *Upgrade) upgradeRelease(current, target *release.Release) error { // request values are not altered. func (u *Upgrade) reuseValues(chart *chart.Chart, current *release.Release) error { if u.ResetValues { - // If ResetValues is set, we comletely ignore current.Config. + // If ResetValues is set, we completely ignore current.Config. u.cfg.Log("resetting values to the chart's original version") return nil } @@ -315,7 +315,7 @@ func (u *Upgrade) reuseValues(chart *chart.Chart, current *release.Release) erro return errors.Wrap(err, "failed to rebuild old values") } - u.rawValues = chartutil.CoalesceTables(current.Config, u.rawValues) + u.rawValues = chartutil.CoalesceTables(u.rawValues, current.Config) chart.Values = oldVals diff --git a/pkg/action/upgrade_test.go b/pkg/action/upgrade_test.go index 92e9393fb..5e1913c15 100644 --- a/pkg/action/upgrade_test.go +++ b/pkg/action/upgrade_test.go @@ -107,3 +107,53 @@ func TestUpgradeRelease_Atomic(t *testing.T) { is.Contains(err.Error(), "an error occurred while rolling back the release") }) } + +func TestUpgradeRelease_ReuseValues(t *testing.T) { + is := assert.New(t) + + t.Run("reuse values should work with values", func(t *testing.T) { + upAction := upgradeAction(t) + + existingValues := map[string]interface{}{ + "name": "value", + "maxHeapSize": "128m", + "replicas": 2, + } + newValues := map[string]interface{}{ + "name": "newValue", + "maxHeapSize": "512m", + "cpu": "12m", + } + expectedValues := map[string]interface{}{ + "name": "newValue", + "maxHeapSize": "512m", + "cpu": "12m", + "replicas": 2, + } + + rel := releaseStub() + rel.Name = "nuketown" + rel.Info.Status = release.StatusDeployed + rel.Config = existingValues + + err := upAction.cfg.Releases.Create(rel) + is.NoError(err) + + upAction.ReuseValues = true + // setting newValues and upgrading + upAction.rawValues = newValues + res, err := upAction.Run(rel.Name, buildChart()) + is.NoError(err) + + // Now make sure it is actually upgraded + updatedRes, err := upAction.cfg.Releases.Get(res.Name, 2) + is.NoError(err) + + if updatedRes == nil { + is.Fail("Updated Release is nil") + return + } + is.Equal(release.StatusDeployed, updatedRes.Info.Status) + is.Equal(expectedValues, updatedRes.Config) + }) +}