ref(pkg/tiller): simplify exported methods

pull/3945/head
Adam Reese 8 years ago
parent 7f6fa70a91
commit 883371b8ce
No known key found for this signature in database
GPG Key ID: 06F35E60A7A18DD6

@ -17,6 +17,7 @@ limitations under the License.
package tiller package tiller
import ( import (
"bytes"
"fmt" "fmt"
"strings" "strings"
@ -169,7 +170,7 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install
Timeout: req.Timeout, Timeout: req.Timeout,
} }
s.recordRelease(r, false) s.recordRelease(r, false)
if err := s.Update(old, r, updateReq, s.env); err != nil { if err := s.Update(old, r, updateReq); err != nil {
msg := fmt.Sprintf("Release replace %q failed: %s", r.Name, err) msg := fmt.Sprintf("Release replace %q failed: %s", r.Name, err)
s.Log("warning: %s", msg) s.Log("warning: %s", msg)
old.Info.Status.Code = release.Status_SUPERSEDED old.Info.Status.Code = release.Status_SUPERSEDED
@ -184,7 +185,8 @@ func (s *ReleaseServer) performRelease(r *release.Release, req *services.Install
// nothing to replace, create as normal // nothing to replace, create as normal
// regular manifests // regular manifests
s.recordRelease(r, false) s.recordRelease(r, false)
if err := s.Create(r, req, s.env); err != nil { b := bytes.NewBufferString(r.Manifest)
if err := s.env.KubeClient.Create(r.Namespace, b, 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)
s.Log("warning: %s", msg) s.Log("warning: %s", msg)
r.Info.Status.Code = release.Status_FAILED r.Info.Status.Code = release.Status_FAILED

@ -17,6 +17,7 @@ limitations under the License.
package tiller package tiller
import ( import (
"bytes"
"fmt" "fmt"
"k8s.io/helm/pkg/hooks" "k8s.io/helm/pkg/hooks"
@ -125,7 +126,9 @@ func (s *ReleaseServer) performRollback(currentRelease, targetRelease *release.R
s.Log("rollback hooks disabled for %s", req.Name) s.Log("rollback hooks disabled for %s", req.Name)
} }
if err := s.Rollback(currentRelease, targetRelease, req, s.env); err != nil { c := bytes.NewBufferString(currentRelease.Manifest)
t := bytes.NewBufferString(targetRelease.Manifest)
if err := s.env.KubeClient.Update(targetRelease.Namespace, c, t, req.Force, 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)
s.Log("warning: %s", msg) s.Log("warning: %s", msg)
currentRelease.Info.Status.Code = release.Status_SUPERSEDED currentRelease.Info.Status.Code = release.Status_SUPERSEDED

@ -37,7 +37,6 @@ import (
"k8s.io/helm/pkg/proto/hapi/release" "k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/proto/hapi/services" "k8s.io/helm/pkg/proto/hapi/services"
relutil "k8s.io/helm/pkg/releaseutil" relutil "k8s.io/helm/pkg/releaseutil"
"k8s.io/helm/pkg/storage"
"k8s.io/helm/pkg/tiller/environment" "k8s.io/helm/pkg/tiller/environment"
"k8s.io/helm/pkg/timeconv" "k8s.io/helm/pkg/timeconv"
"k8s.io/helm/pkg/version" "k8s.io/helm/pkg/version"
@ -97,10 +96,6 @@ func NewReleaseServer(env *environment.Environment, discovery discovery.Discover
} }
} }
func (s *ReleaseServer) Storage() *storage.Storage {
return s.env.Releases
}
// reuseValues copies values from the current release to a new release if the // reuseValues copies values from the current release to a new release if the
// new release does not have any values. // new release does not have any values.
// //
@ -339,7 +334,6 @@ func (s *ReleaseServer) recordRelease(r *release.Release, reuse bool) {
} }
func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook string, timeout int64) error { func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook string, timeout int64) error {
kubeCli := s.env.KubeClient
code, ok := events[hook] code, ok := events[hook]
if !ok { if !ok {
return fmt.Errorf("unknown hook %s", hook) return fmt.Errorf("unknown hook %s", hook)
@ -358,12 +352,12 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin
executingHooks = sortByHookWeight(executingHooks) executingHooks = sortByHookWeight(executingHooks)
for _, h := range executingHooks { for _, h := range executingHooks {
if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.BeforeHookCreation, name, namespace, hook, kubeCli); err != nil { if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.BeforeHookCreation, name, namespace, hook, s.env.KubeClient); err != nil {
return err return err
} }
b := bytes.NewBufferString(h.Manifest) b := bytes.NewBufferString(h.Manifest)
if err := kubeCli.Create(namespace, b, timeout, false); err != nil { if err := s.env.KubeClient.Create(namespace, b, timeout, false); err != nil {
s.Log("warning: Release %s %s %s failed: %s", name, hook, h.Path, err) s.Log("warning: Release %s %s %s failed: %s", name, hook, h.Path, err)
return err return err
} }
@ -371,11 +365,11 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin
b.Reset() b.Reset()
b.WriteString(h.Manifest) b.WriteString(h.Manifest)
if err := kubeCli.WatchUntilReady(namespace, b, timeout, false); err != nil { if err := s.env.KubeClient.WatchUntilReady(namespace, b, timeout, false); err != nil {
s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err) s.Log("warning: Release %s %s %s could not complete: %s", name, hook, h.Path, err)
// If a hook is failed, checkout the annotation of the hook to determine whether the hook should be deleted // If a hook is failed, checkout the annotation of the hook to determine whether the hook should be deleted
// under failed condition. If so, then clear the corresponding resource object in the hook // under failed condition. If so, then clear the corresponding resource object in the hook
if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookFailed, name, namespace, hook, kubeCli); err != nil { if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookFailed, name, namespace, hook, s.env.KubeClient); err != nil {
return err return err
} }
return err return err
@ -386,7 +380,7 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin
// If all hooks are succeeded, checkout the annotation of each hook to determine whether the hook should be deleted // If all hooks are succeeded, checkout the annotation of each hook to determine whether the hook should be deleted
// under succeeded condition. If so, then clear the corresponding resource object in each hook // under succeeded condition. If so, then clear the corresponding resource object in each hook
for _, h := range executingHooks { for _, h := range executingHooks {
if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookSucceeded, name, namespace, hook, kubeCli); err != nil { if err := s.deleteHookIfShouldBeDeletedByDeletePolicy(h, hooks.HookSucceeded, name, namespace, hook, s.env.KubeClient); err != nil {
return err return err
} }
h.LastRun = timeconv.Now() h.LastRun = timeconv.Now()
@ -438,42 +432,20 @@ func hookHasDeletePolicy(h *release.Hook, policy string) bool {
return false return false
} }
// Create creates a release via kubeclient from provided environment
func (m *ReleaseServer) Create(r *release.Release, req *services.InstallReleaseRequest, env *environment.Environment) error {
b := bytes.NewBufferString(r.Manifest)
return env.KubeClient.Create(r.Namespace, b, req.Timeout, req.Wait)
}
// Update performs an update from current to target release // Update performs an update from current to target release
func (m *ReleaseServer) Update(current, target *release.Release, req *services.UpdateReleaseRequest, env *environment.Environment) error { func (s *ReleaseServer) Update(current, target *release.Release, req *services.UpdateReleaseRequest) error {
c := bytes.NewBufferString(current.Manifest) c := bytes.NewBufferString(current.Manifest)
t := bytes.NewBufferString(target.Manifest) t := bytes.NewBufferString(target.Manifest)
return env.KubeClient.Update(target.Namespace, c, t, req.Force, req.Recreate, req.Timeout, req.Wait) return s.env.KubeClient.Update(target.Namespace, c, t, req.Force, req.Recreate, req.Timeout, req.Wait)
}
// Rollback performs a rollback from current to target release
func (m *ReleaseServer) Rollback(current, target *release.Release, req *services.RollbackReleaseRequest, env *environment.Environment) error {
c := bytes.NewBufferString(current.Manifest)
t := bytes.NewBufferString(target.Manifest)
return env.KubeClient.Update(target.Namespace, c, t, req.Force, req.Recreate, req.Timeout, req.Wait)
}
// Status returns kubectl-like formatted status of release objects
func (m *ReleaseServer) Status(r *release.Release, req *services.GetReleaseStatusRequest, env *environment.Environment) (string, error) {
return env.KubeClient.Get(r.Namespace, bytes.NewBufferString(r.Manifest))
} }
// Delete deletes the release and returns manifests that were kept in the deletion process // Delete deletes the release and returns manifests that were kept in the deletion process
func (m *ReleaseServer) Delete(rel *release.Release, req *services.UninstallReleaseRequest, env *environment.Environment) (kept string, errs []error) { func (s *ReleaseServer) Delete(rel *release.Release, req *services.UninstallReleaseRequest) (kept string, errs []error) {
vs, err := GetVersionSet(m.discovery) vs, err := GetVersionSet(s.discovery)
if err != nil { if err != nil {
return rel.Manifest, []error{fmt.Errorf("Could not get apiVersions from Kubernetes: %v", err)} return rel.Manifest, []error{fmt.Errorf("Could not get apiVersions from Kubernetes: %v", err)}
} }
return DeleteRelease(rel, vs, env.KubeClient)
}
// DeleteRelease is a helper that allows Rudder to delete a release without exposing most of Tiller inner functions
func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient environment.KubeClient) (kept string, errs []error) {
manifests := relutil.SplitManifests(rel.Manifest) manifests := relutil.SplitManifests(rel.Manifest)
_, files, err := sortManifests(manifests, vs, UninstallOrder) _, files, err := sortManifests(manifests, vs, UninstallOrder)
if err != nil { if err != nil {
@ -486,7 +458,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env
filesToKeep, filesToDelete := filterManifestsToKeep(files) filesToKeep, filesToDelete := filterManifestsToKeep(files)
if len(filesToKeep) > 0 { if len(filesToKeep) > 0 {
kept = summarizeKeptManifests(filesToKeep, kubeClient, rel.Namespace) kept = summarizeKeptManifests(filesToKeep, s.env.KubeClient, rel.Namespace)
} }
for _, file := range filesToDelete { for _, file := range filesToDelete {
@ -494,7 +466,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env
if b.Len() == 0 { if b.Len() == 0 {
continue continue
} }
if err := kubeClient.Delete(rel.Namespace, b); err != nil { if err := s.env.KubeClient.Delete(rel.Namespace, b); err != nil {
log.Printf("uninstall: Failed deletion of %q: %s", rel.Name, err) log.Printf("uninstall: Failed deletion of %q: %s", rel.Name, err)
if err == kube.ErrNoObjectsVisited { if err == kube.ErrNoObjectsVisited {
// Rewrite the message from "no objects visited" // Rewrite the message from "no objects visited"

@ -300,7 +300,7 @@ func TestValidName(t *testing.T) {
"abcdefghi-abcdefghi-abcdefghi-abcdefghi-abcdefghi-abcd": errInvalidName, "abcdefghi-abcdefghi-abcdefghi-abcdefghi-abcdefghi-abcd": errInvalidName,
} { } {
if valid != validateReleaseName(name) { if valid != validateReleaseName(name) {
t.Errorf("Expected %q to be %t", name, valid) t.Errorf("Expected %q to be %s", name, valid)
} }
} }
} }

@ -17,6 +17,7 @@ limitations under the License.
package tiller package tiller
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
@ -62,7 +63,7 @@ func (s *ReleaseServer) GetReleaseStatus(req *services.GetReleaseStatusRequest)
// Ok, we got the status of the release as we had jotted down, now we need to match the // Ok, we got the status of the release as we had jotted down, now we need to match the
// manifest we stashed away with reality from the cluster. // manifest we stashed away with reality from the cluster.
resp, err := s.Status(rel, req, s.env) resp, err := s.env.KubeClient.Get(rel.Namespace, bytes.NewBufferString(rel.Manifest))
if sc == release.Status_DELETED || sc == release.Status_FAILED { if sc == release.Status_DELETED || sc == release.Status_FAILED {
// Skip errors if this is already deleted or failed. // Skip errors if this is already deleted or failed.
return statusResp, nil return statusResp, nil

@ -79,18 +79,12 @@ func (s *ReleaseServer) UninstallRelease(req *services.UninstallReleaseRequest)
s.Log("uninstall: Failed to store updated release: %s", err) s.Log("uninstall: Failed to store updated release: %s", err)
} }
kept, errs := s.Delete(rel, req, s.env) kept, errs := s.Delete(rel, req)
res.Info = kept res.Info = kept
es := make([]string, 0, len(errs))
for _, e := range errs {
s.Log("error: %v", e)
es = append(es, e.Error())
}
if !req.DisableHooks { if !req.DisableHooks {
if err := s.execHook(rel.Hooks, rel.Name, rel.Namespace, hooks.PostDelete, req.Timeout); err != nil { if err := s.execHook(rel.Hooks, rel.Name, rel.Namespace, hooks.PostDelete, req.Timeout); err != nil {
es = append(es, err.Error()) errs = append(errs, err)
} }
} }
@ -110,12 +104,20 @@ func (s *ReleaseServer) UninstallRelease(req *services.UninstallReleaseRequest)
s.Log("uninstall: Failed to store updated release: %s", err) s.Log("uninstall: Failed to store updated release: %s", err)
} }
if len(es) > 0 { if len(errs) > 0 {
return res, fmt.Errorf("deletion completed with %d error(s): %s", len(es), strings.Join(es, "; ")) return res, fmt.Errorf("deletion completed with %d error(s): %s", len(errs), joinErrors(errs))
} }
return res, nil return res, nil
} }
func joinErrors(errs []error) string {
es := make([]string, 0, len(errs))
for _, e := range errs {
es = append(es, e.Error())
}
return strings.Join(es, "; ")
}
func (s *ReleaseServer) purgeReleases(rels ...*release.Release) error { func (s *ReleaseServer) purgeReleases(rels ...*release.Release) error {
for _, rel := range rels { for _, rel := range rels {
if _, err := s.env.Releases.Delete(rel.Name, rel.Version); err != nil { if _, err := s.env.Releases.Delete(rel.Name, rel.Version); err != nil {

@ -186,19 +186,14 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) (
} }
// delete manifests from the old release // delete manifests from the old release
_, errs := s.Delete(oldRelease, nil, s.env) _, errs := s.Delete(oldRelease, nil)
oldRelease.Info.Status.Code = release.Status_DELETED oldRelease.Info.Status.Code = release.Status_DELETED
oldRelease.Info.Description = "Deletion complete" oldRelease.Info.Description = "Deletion complete"
s.recordRelease(oldRelease, true) s.recordRelease(oldRelease, true)
if len(errs) > 0 { if len(errs) > 0 {
es := make([]string, 0, len(errs)) return newRelease, fmt.Errorf("Upgrade --force successfully deleted the previous release, but encountered %d error(s) and cannot continue: %s", len(errs), joinErrors(errs))
for _, e := range errs {
s.Log("error: %v", e)
es = append(es, e.Error())
}
return newRelease, fmt.Errorf("Upgrade --force successfully deleted the previous release, but encountered %d error(s) and cannot continue: %s", len(es), strings.Join(es, "; "))
} }
// post-delete hooks // post-delete hooks
@ -218,7 +213,7 @@ func (s *ReleaseServer) performUpdateForce(req *services.UpdateReleaseRequest) (
// update new release with next revision number so as to append to the old release's history // update new release with next revision number so as to append to the old release's history
newRelease.Version = oldRelease.Version + 1 newRelease.Version = oldRelease.Version + 1
s.recordRelease(newRelease, false) s.recordRelease(newRelease, false)
if err := s.Update(oldRelease, newRelease, req, s.env); err != nil { if err := s.Update(oldRelease, newRelease, req); err != nil {
msg := fmt.Sprintf("Upgrade %q failed: %s", newRelease.Name, err) msg := fmt.Sprintf("Upgrade %q failed: %s", newRelease.Name, err)
s.Log("warning: %s", msg) s.Log("warning: %s", msg)
newRelease.Info.Status.Code = release.Status_FAILED newRelease.Info.Status.Code = release.Status_FAILED
@ -262,7 +257,7 @@ func (s *ReleaseServer) performUpdate(originalRelease, updatedRelease *release.R
} else { } else {
s.Log("update hooks disabled for %s", req.Name) s.Log("update hooks disabled for %s", req.Name)
} }
if err := s.Update(originalRelease, updatedRelease, req, s.env); err != nil { if err := s.Update(originalRelease, updatedRelease, req); err != nil {
msg := fmt.Sprintf("Upgrade %q failed: %s", updatedRelease.Name, err) msg := fmt.Sprintf("Upgrade %q failed: %s", updatedRelease.Name, err)
s.Log("warning: %s", msg) s.Log("warning: %s", msg)
updatedRelease.Info.Status.Code = release.Status_FAILED updatedRelease.Info.Status.Code = release.Status_FAILED

Loading…
Cancel
Save