@ -37,7 +37,6 @@ import (
"k8s.io/helm/pkg/proto/hapi/release"
"k8s.io/helm/pkg/proto/hapi/services"
relutil "k8s.io/helm/pkg/releaseutil"
"k8s.io/helm/pkg/storage"
"k8s.io/helm/pkg/tiller/environment"
"k8s.io/helm/pkg/timeconv"
"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
// 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 {
kubeCli := s . env . KubeClient
code , ok := events [ hook ]
if ! ok {
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 )
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
}
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 )
return err
}
@ -371,11 +365,11 @@ func (s *ReleaseServer) execHook(hs []*release.Hook, name, namespace, hook strin
b . Reset ( )
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 )
// 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
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
@ -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
// under succeeded condition. If so, then clear the corresponding resource object in each hook
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
}
h . LastRun = timeconv . Now ( )
@ -438,42 +432,20 @@ func hookHasDeletePolicy(h *release.Hook, policy string) bool {
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
func ( m * ReleaseServer ) Update ( current , target * release . Release , req * services . UpdateReleaseReques t, env * environment . Environmen t) error {
func ( s * ReleaseServer ) Update ( current , target * release . Release , req * services . UpdateReleaseRequest ) 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 )
}
// 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 ) )
return s . env . KubeClient . Update ( target . Namespace , c , t , req . Force , req . Recreate , req . Timeout , req . Wait )
}
// Delete deletes the release and returns manifests that were kept in the deletion process
func ( m * ReleaseServer ) Delete ( rel * release . Release , req * services . UninstallReleaseReques t, env * environment . Environmen t) ( kept string , errs [ ] error ) {
vs , err := GetVersionSet ( m . discovery )
func ( s * ReleaseServer ) Delete ( rel * release . Release , req * services . UninstallReleaseRequest ) ( kept string , errs [ ] error ) {
vs , err := GetVersionSet ( s . discovery )
if err != nil {
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 )
_ , files , err := sortManifests ( manifests , vs , UninstallOrder )
if err != nil {
@ -486,7 +458,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env
filesToKeep , filesToDelete := filterManifestsToKeep ( files )
if len ( filesToKeep ) > 0 {
kept = summarizeKeptManifests ( filesToKeep , k ubeClient, rel . Namespace )
kept = summarizeKeptManifests ( filesToKeep , s. env . K ubeClient, rel . Namespace )
}
for _ , file := range filesToDelete {
@ -494,7 +466,7 @@ func DeleteRelease(rel *release.Release, vs chartutil.VersionSet, kubeClient env
if b . Len ( ) == 0 {
continue
}
if err := k ubeClient. Delete ( rel . Namespace , b ) ; err != nil {
if err := s. env . K ubeClient. Delete ( rel . Namespace , b ) ; err != nil {
log . Printf ( "uninstall: Failed deletion of %q: %s" , rel . Name , err )
if err == kube . ErrNoObjectsVisited {
// Rewrite the message from "no objects visited"