diff --git a/cmd/helm/upgrade.go b/cmd/helm/upgrade.go index 989d73cdd..545f43c4e 100644 --- a/cmd/helm/upgrade.go +++ b/cmd/helm/upgrade.go @@ -17,10 +17,12 @@ limitations under the License. package main import ( + "errors" "fmt" "io" "strings" + "github.com/Masterminds/semver" "github.com/spf13/cobra" "k8s.io/helm/pkg/chartutil" @@ -180,6 +182,32 @@ func (u *upgradeCmd) run() error { // Check chart requirements to make sure all dependencies are present in /charts if ch, err := chartutil.Load(chartPath); err == nil { + res, err := u.client.ReleaseContent(u.release, helm.ContentReleaseVersion(0)) + if err != nil { + return prettyError(err) + } + if res.Release.Chart.Metadata.Name != ch.Metadata.Name { + return fmt.Errorf("%q is not a release for chart %q", u.release, u.chart) + } + fmt.Println("Version requested:", u.version, "\nversion of chart:", res.Release.Chart.Metadata.Version) + if u.version != "" { + releaseVersion, err := semver.NewVersion(res.Release.Chart.Metadata.Version) + if err != nil { + return fmt.Errorf("invalid release version %q, %s", res.Release.Chart.Metadata.Version, err) + } + upgradeVersion, err := semver.NewVersion(u.version) + if err != nil { + return fmt.Errorf("invalid upgrade version %q, %s", u.version, err) + } + if releaseVersion.Equal(upgradeVersion) && !u.force { + return errors.New("no version change requested") + } + + if releaseVersion.GreaterThan(upgradeVersion) && !u.force { + return fmt.Errorf("requested upgrade version %q is lower than current version of release %q.\nTIP: use force if want to downgrade the release", u.version, res.Release.Chart.Metadata.Version) + } + } + if req, err := chartutil.LoadRequirements(ch); err == nil { if err := checkDependencies(ch, req); err != nil { return err diff --git a/cmd/helm/upgrade_test.go b/cmd/helm/upgrade_test.go index 1c5d1c856..1f9ff592a 100644 --- a/cmd/helm/upgrade_test.go +++ b/cmd/helm/upgrade_test.go @@ -151,6 +151,40 @@ func TestUpgradeCmd(t *testing.T) { resp: releaseMock(&releaseOptions{name: "bonkers-bunny", version: 1, chart: ch3}), err: true, }, + { + name: "upgrade a release with different chart", + args: []string{"funny-bunny", chartPath}, + resp: releaseMock(&releaseOptions{name: "funny-bunny", chart: ch3}), + err: true, + }, + { + name: "upgrade a release with bad version", + args: []string{"funny-bunny", chartPath}, + flags: []string{"--version", "a.b"}, + resp: releaseMock(&releaseOptions{name: "funny-bunny", chart: ch}), + err: true, + }, + { + name: "upgrade a release with same version", + args: []string{"funny-bunny", chartPath}, + flags: []string{"--version", "0.1.0"}, + resp: releaseMock(&releaseOptions{name: "funny-bunny", chart: ch}), + err: true, + }, + { + name: "upgrade a release with lesser version", + args: []string{"funny-bunny", chartPath}, + flags: []string{"--version", "0.0.1"}, + resp: releaseMock(&releaseOptions{name: "funny-bunny", chart: ch}), + err: true, + }, + { + name: "force upgrade a release with lesser version", + args: []string{"funny-bunny", chartPath}, + flags: []string{"--version", "0.0.1", "--force"}, + resp: releaseMock(&releaseOptions{name: "funny-bunny", chart: ch}), + expected: "Release \"funny-bunny\" has been upgraded. Happy Helming!\n", + }, } cmd := func(c *helm.FakeClient, out io.Writer) *cobra.Command {