diff --git a/pkg/tiller/release_server.go b/pkg/tiller/release_server.go index db7c0b568..562555f1c 100644 --- a/pkg/tiller/release_server.go +++ b/pkg/tiller/release_server.go @@ -55,6 +55,8 @@ const notesFileSuffix = "NOTES.txt" var ( // errMissingChart indicates that a chart was not provided. errMissingChart = errors.New("no chart provided") + // errDifferntChart indicates use a different chart to update the current release. + errDifferentChart = errors.New("update release with different chart") // errMissingRelease indicates that a release (name) was not provided. errMissingRelease = errors.New("no release provided") // errInvalidRevision indicates that an invalid release revision number was provided. @@ -373,3 +375,10 @@ func validateReleaseName(releaseName string) error { return nil } + +func validateChartUpdate(curChart, newChart *chart.Chart) error { + if curChart.Metadata.Name != newChart.Metadata.Name { + return errDifferentChart + } + return nil +} diff --git a/pkg/tiller/release_update.go b/pkg/tiller/release_update.go index 2e68905f6..a96bffaa6 100644 --- a/pkg/tiller/release_update.go +++ b/pkg/tiller/release_update.go @@ -75,6 +75,10 @@ func (s *ReleaseServer) prepareUpdate(req *services.UpdateReleaseRequest) (*rele return nil, nil, err } + if err = validateChartUpdate(currentRelease.Chart, req.Chart); err != nil { + return nil, nil, err + } + // If new values were not supplied in the upgrade, re-use the existing values. if err := s.reuseValues(req, currentRelease); err != nil { return nil, nil, err diff --git a/pkg/tiller/release_update_test.go b/pkg/tiller/release_update_test.go index 7b1618b20..9bd68bc7c 100644 --- a/pkg/tiller/release_update_test.go +++ b/pkg/tiller/release_update_test.go @@ -239,6 +239,28 @@ func TestUpdateReleaseFailure(t *testing.T) { } } +func TestUpdateReleaseFailure_DifferentChart(t *testing.T) { + c := helm.NewContext() + rs := rsFixture() + rel := releaseStub() + rs.env.Releases.Create(rel) + + req := &services.UpdateReleaseRequest{ + Name: rel.Name, + Chart: &chart.Chart{ + Metadata: &chart.Metadata{Name: "hi"}, + Templates: []*chart.Template{ + {Name: "templates/hi", Data: []byte("hi: there")}, + {Name: "templates/hooks", Data: []byte(manifestWithUpgradeHooks)}, + }, + }, + } + _, err := rs.UpdateRelease(c, req) + if err == nil { + t.Fatalf("Expected failed update") + } +} + func TestUpdateReleaseNoHooks(t *testing.T) { c := helm.NewContext() rs := rsFixture()