|
|
@ -20,6 +20,7 @@ import (
|
|
|
|
"bytes"
|
|
|
|
"bytes"
|
|
|
|
"errors"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"io"
|
|
|
|
"log"
|
|
|
|
"log"
|
|
|
|
"path"
|
|
|
|
"path"
|
|
|
|
"regexp"
|
|
|
|
"regexp"
|
|
|
@ -324,7 +325,8 @@ func (s *ReleaseServer) performUpdate(originalRelease, updatedRelease *release.R
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err := s.performKubeUpdate(originalRelease, updatedRelease, req.Recreate, req.Timeout, req.Wait); err != nil {
|
|
|
|
eventsLog := bytes.NewBuffer(nil)
|
|
|
|
|
|
|
|
if err := s.performKubeUpdate(originalRelease, updatedRelease, eventsLog, req.Recreate, req.Timeout, req.Wait); err != nil {
|
|
|
|
msg := fmt.Sprintf("Upgrade %q failed: %s", updatedRelease.Name, err)
|
|
|
|
msg := fmt.Sprintf("Upgrade %q failed: %s", updatedRelease.Name, err)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
originalRelease.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
|
originalRelease.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
@ -332,7 +334,12 @@ func (s *ReleaseServer) performUpdate(originalRelease, updatedRelease *release.R
|
|
|
|
updatedRelease.Info.Description = msg
|
|
|
|
updatedRelease.Info.Description = msg
|
|
|
|
s.recordRelease(originalRelease, true)
|
|
|
|
s.recordRelease(originalRelease, true)
|
|
|
|
s.recordRelease(updatedRelease, false)
|
|
|
|
s.recordRelease(updatedRelease, false)
|
|
|
|
return res, err
|
|
|
|
return res, fmt.Errorf(
|
|
|
|
|
|
|
|
"\nTiller log:\n%s\nupdate %s failed: %s",
|
|
|
|
|
|
|
|
eventsLog,
|
|
|
|
|
|
|
|
originalRelease.Name,
|
|
|
|
|
|
|
|
err,
|
|
|
|
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// post-upgrade hooks
|
|
|
|
// post-upgrade hooks
|
|
|
@ -511,7 +518,8 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err := s.performKubeUpdate(currentRelease, targetRelease, req.Recreate, req.Timeout, req.Wait); err != nil {
|
|
|
|
eventsLog := bytes.NewBuffer(nil)
|
|
|
|
|
|
|
|
if err := s.performKubeUpdate(currentRelease, targetRelease, eventsLog, req.Recreate, req.Timeout, req.Wait); err != nil {
|
|
|
|
msg := fmt.Sprintf("Rollback %q failed: %s", targetRelease.Name, err)
|
|
|
|
msg := fmt.Sprintf("Rollback %q failed: %s", targetRelease.Name, err)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
currentRelease.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
|
currentRelease.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
@ -519,7 +527,12 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R
|
|
|
|
targetRelease.Info.Description = msg
|
|
|
|
targetRelease.Info.Description = msg
|
|
|
|
s.recordRelease(currentRelease, true)
|
|
|
|
s.recordRelease(currentRelease, true)
|
|
|
|
s.recordRelease(targetRelease, false)
|
|
|
|
s.recordRelease(targetRelease, false)
|
|
|
|
return res, err
|
|
|
|
return res, fmt.Errorf(
|
|
|
|
|
|
|
|
"\nTiller log:\n%s\nrollback %s failed: %s",
|
|
|
|
|
|
|
|
eventsLog,
|
|
|
|
|
|
|
|
currentRelease.Name,
|
|
|
|
|
|
|
|
err,
|
|
|
|
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// post-rollback hooks
|
|
|
|
// post-rollback hooks
|
|
|
@ -537,11 +550,11 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R
|
|
|
|
return res, nil
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *ReleaseServer) performKubeUpdate(currentRelease, targetRelease *release.Release, recreate bool, timeout int64, shouldWait bool) error {
|
|
|
|
func (s *ReleaseServer) performKubeUpdate(currentRelease, targetRelease *release.Release, writer io.Writer, recreate bool, timeout int64, shouldWait bool) error {
|
|
|
|
kubeCli := s.env.KubeClient
|
|
|
|
kubeCli := s.env.KubeClient
|
|
|
|
current := bytes.NewBufferString(currentRelease.Manifest)
|
|
|
|
current := bytes.NewBufferString(currentRelease.Manifest)
|
|
|
|
target := bytes.NewBufferString(targetRelease.Manifest)
|
|
|
|
target := bytes.NewBufferString(targetRelease.Manifest)
|
|
|
|
return kubeCli.Update(targetRelease.Namespace, current, target, recreate, timeout, shouldWait)
|
|
|
|
return kubeCli.Update(targetRelease.Namespace, current, target, writer, recreate, timeout, shouldWait)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// prepareRollback finds the previous release and prepares a new release object with
|
|
|
|
// prepareRollback finds the previous release and prepares a new release object with
|
|
|
@ -876,6 +889,7 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
eventsLog := bytes.NewBuffer(nil)
|
|
|
|
switch h, err := s.env.Releases.History(req.Name); {
|
|
|
|
switch h, err := s.env.Releases.History(req.Name); {
|
|
|
|
// if this is a replace operation, append to the release history
|
|
|
|
// if this is a replace operation, append to the release history
|
|
|
|
case req.ReuseName && err == nil && len(h) >= 1:
|
|
|
|
case req.ReuseName && err == nil && len(h) >= 1:
|
|
|
@ -893,7 +907,7 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install
|
|
|
|
// so as to append to the old release's history
|
|
|
|
// so as to append to the old release's history
|
|
|
|
r.Version = old.Version + 1
|
|
|
|
r.Version = old.Version + 1
|
|
|
|
|
|
|
|
|
|
|
|
if err := s.performKubeUpdate(old, r, false, req.Timeout, req.Wait); err != nil {
|
|
|
|
if err := s.performKubeUpdate(old, r, eventsLog, false, req.Timeout, req.Wait); err != nil {
|
|
|
|
msg := fmt.Sprintf("Release replace %q failed: %s", r.Name, err)
|
|
|
|
msg := fmt.Sprintf("Release replace %q failed: %s", r.Name, err)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
old.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
|
old.Info.Status.Code = release.Status_SUPERSEDED
|
|
|
@ -901,20 +915,30 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install
|
|
|
|
r.Info.Description = msg
|
|
|
|
r.Info.Description = msg
|
|
|
|
s.recordRelease(old, true)
|
|
|
|
s.recordRelease(old, true)
|
|
|
|
s.recordRelease(r, false)
|
|
|
|
s.recordRelease(r, false)
|
|
|
|
return res, err
|
|
|
|
return res, fmt.Errorf(
|
|
|
|
|
|
|
|
"\nTiller log:\n%s\nrelease %s failed: %s",
|
|
|
|
|
|
|
|
eventsLog,
|
|
|
|
|
|
|
|
r.Name,
|
|
|
|
|
|
|
|
err,
|
|
|
|
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
default:
|
|
|
|
// nothing to replace, create as normal
|
|
|
|
// nothing to replace, create as normal
|
|
|
|
// regular manifests
|
|
|
|
// regular manifests
|
|
|
|
b := bytes.NewBufferString(r.Manifest)
|
|
|
|
b := bytes.NewBufferString(r.Manifest)
|
|
|
|
if err := s.env.KubeClient.Create(r.Namespace, b, req.Timeout, req.Wait); err != nil {
|
|
|
|
if err := s.env.KubeClient.Create(r.Namespace, b, eventsLog, req.Timeout, req.Wait); err != nil {
|
|
|
|
msg := fmt.Sprintf("Release %q failed: %s", r.Name, err)
|
|
|
|
msg := fmt.Sprintf("Release %q failed: %s", r.Name, err)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
log.Printf("warning: %s", msg)
|
|
|
|
r.Info.Status.Code = release.Status_FAILED
|
|
|
|
r.Info.Status.Code = release.Status_FAILED
|
|
|
|
r.Info.Description = msg
|
|
|
|
r.Info.Description = msg
|
|
|
|
s.recordRelease(r, false)
|
|
|
|
s.recordRelease(r, false)
|
|
|
|
return res, fmt.Errorf("release %s failed: %s", r.Name, err)
|
|
|
|
return res, fmt.Errorf(
|
|
|
|
|
|
|
|
"\nTiller log:\n%s\nrelease %s failed: %s",
|
|
|
|
|
|
|
|
eventsLog,
|
|
|
|
|
|
|
|
r.Name,
|
|
|
|
|
|
|
|
err,
|
|
|
|
|
|
|
|
) // add resourse statuses here
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -966,7 +990,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin
|
|
|
|
for _, h := range executingHooks {
|
|
|
|
for _, h := range executingHooks {
|
|
|
|
|
|
|
|
|
|
|
|
b := bytes.NewBufferString(h.Manifest)
|
|
|
|
b := bytes.NewBufferString(h.Manifest)
|
|
|
|
if err := kubeCli.Create(namespace, b, timeout, false); err != nil {
|
|
|
|
if err := kubeCli.Create(namespace, b, nil, timeout, false); err != nil {
|
|
|
|
log.Printf("warning: Release %q %s %s failed: %s", name, hook, h.Path, err)
|
|
|
|
log.Printf("warning: Release %q %s %s failed: %s", name, hook, h.Path, err)
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|