Skip to content

Commit

Permalink
bug(tiller): set status correctly in performUpdate
Browse files Browse the repository at this point in the history
Handling release status updates on errors better
resolves #1137
  • Loading branch information
Michelle Noorali committed Oct 13, 2016
1 parent 36ec190 commit 57b2e64
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 6 deletions.
15 changes: 9 additions & 6 deletions cmd/tiller/release_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -278,12 +278,12 @@ func (s *releaseServer) UpdateRelease(c ctx.Context, req *services.UpdateRelease

res, err := s.performUpdate(currentRelease, updatedRelease, req)
if err != nil {
return nil, err
return res, err
}

if !req.DryRun {
if err := s.env.Releases.Create(updatedRelease); err != nil {
return nil, err
return res, err
}
}

Expand All @@ -306,7 +306,12 @@ func (s *releaseServer) performUpdate(originalRelease, updatedRelease *release.R
}

if err := s.performKubeUpdate(originalRelease, updatedRelease); err != nil {
return nil, err
log.Printf("warning: Release Upgrade %q failed: %s", updatedRelease.Name, err)
originalRelease.Info.Status.Code = release.Status_SUPERSEDED
updatedRelease.Info.Status.Code = release.Status_FAILED
s.recordRelease(originalRelease, true)
s.recordRelease(updatedRelease, false)
return res, err
}

// post-upgrade hooks
Expand All @@ -317,9 +322,7 @@ func (s *releaseServer) performUpdate(originalRelease, updatedRelease *release.R
}

originalRelease.Info.Status.Code = release.Status_SUPERSEDED
if err := s.env.Releases.Update(originalRelease); err != nil {
return nil, fmt.Errorf("Update of %s failed: %s", originalRelease.Name, err)
}
s.recordRelease(originalRelease, true)

updatedRelease.Info.Status.Code = release.Status_DEPLOYED

Expand Down
51 changes: 51 additions & 0 deletions cmd/tiller/release_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,42 @@ func TestUpdateRelease(t *testing.T) {
}
}

func TestUpdateReleaseFailure(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
rel := releaseStub()
rs.env.Releases.Create(rel)
rs.env.KubeClient = newUpdateFailingKubeClient()

req := &services.UpdateReleaseRequest{
Name: rel.Name,
DisableHooks: true,
Chart: &chart.Chart{
Metadata: &chart.Metadata{Name: "hello"},
Templates: []*chart.Template{
{Name: "something", Data: []byte("hello: world")},
},
},
}

res, err := rs.UpdateRelease(c, req)
if err == nil {
t.Error("Expected failed update")
}

if updatedStatus := res.Release.Info.Status.Code; updatedStatus != release.Status_FAILED {
t.Errorf("Expected FAILED release. Got %d", updatedStatus)
}

oldRelease, err := rs.env.Releases.Get(rel.Name, rel.Version)
if err != nil {
t.Errorf("Expected to be able to get previous release")
}
if oldStatus := oldRelease.Info.Status.Code; oldStatus != release.Status_SUPERSEDED {
t.Errorf("Expected SUPERSEDED status on previous Release version. Got %v", oldStatus)
}
}

func TestUpdateReleaseNoHooks(t *testing.T) {
c := helm.NewContext()
rs := rsFixture()
Expand Down Expand Up @@ -1136,6 +1172,21 @@ func mockEnvironment() *environment.Environment {
return e
}

func newUpdateFailingKubeClient() *updateFailingKubeClient {
return &updateFailingKubeClient{
PrintingKubeClient: environment.PrintingKubeClient{Out: os.Stdout},
}

}

type updateFailingKubeClient struct {
environment.PrintingKubeClient
}

func (u *updateFailingKubeClient) Update(namespace string, originalReader, modifiedReader io.Reader) error {
return errors.New("Failed update in kube client")
}

func newHookFailingKubeClient() *hookFailingKubeClient {
return &hookFailingKubeClient{
PrintingKubeClient: environment.PrintingKubeClient{Out: os.Stdout},
Expand Down

0 comments on commit 57b2e64

Please sign in to comment.