From 14d2128238636c3649c4faf2492cec32a14ea430 Mon Sep 17 00:00:00 2001 From: derekwaynecarr Date: Wed, 3 Jun 2015 22:59:07 -0400 Subject: [PATCH] Fix namespace controller on delete to not care if item not found --- pkg/namespace/namespace_controller.go | 40 +++++++++++++------ pkg/registry/namespace/etcd/etcd.go | 2 +- .../namespace/lifecycle/admission.go | 2 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pkg/namespace/namespace_controller.go b/pkg/namespace/namespace_controller.go index 1913457d45f..191c0c2bd7b 100644 --- a/pkg/namespace/namespace_controller.go +++ b/pkg/namespace/namespace_controller.go @@ -20,6 +20,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/client/cache" "github.com/GoogleCloudPlatform/kubernetes/pkg/controller/framework" @@ -28,6 +29,8 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/watch" + + "github.com/golang/glog" ) // NamespaceManager is responsible for performing actions dependent upon a namespace phase @@ -52,11 +55,17 @@ func NewNamespaceManager(kubeClient client.Interface, resyncPeriod time.Duration framework.ResourceEventHandlerFuncs{ AddFunc: func(obj interface{}) { namespace := obj.(*api.Namespace) - syncNamespace(kubeClient, *namespace) + err := syncNamespace(kubeClient, *namespace) + if err != nil { + glog.Error(err) + } }, UpdateFunc: func(oldObj, newObj interface{}) { namespace := newObj.(*api.Namespace) - syncNamespace(kubeClient, *namespace) + err := syncNamespace(kubeClient, *namespace) + if err != nil { + glog.Error(err) + } }, }, ) @@ -169,7 +178,10 @@ func syncNamespace(kubeClient client.Interface, namespace api.Namespace) (err er // if the namespace is already finalized, delete it if finalized(namespace) { err = kubeClient.Namespaces().Delete(namespace.Name) - return err + if err != nil && !errors.IsNotFound(err) { + return err + } + return nil } // there may still be content for us to remove @@ -187,7 +199,9 @@ func syncNamespace(kubeClient client.Interface, namespace api.Namespace) (err er // now check if all finalizers have reported that we delete now if finalized(*result) { err = kubeClient.Namespaces().Delete(namespace.Name) - return err + if err != nil && !errors.IsNotFound(err) { + return err + } } return nil @@ -200,7 +214,7 @@ func deleteLimitRanges(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.LimitRanges(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -214,7 +228,7 @@ func deleteResourceQuotas(kubeClient client.Interface, ns string) error { } for i := range resourceQuotas.Items { err := kubeClient.ResourceQuotas(ns).Delete(resourceQuotas.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -228,7 +242,7 @@ func deleteServiceAccounts(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.ServiceAccounts(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -242,7 +256,7 @@ func deleteServices(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.Services(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -256,7 +270,7 @@ func deleteReplicationControllers(kubeClient client.Interface, ns string) error } for i := range items.Items { err := kubeClient.ReplicationControllers(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -270,7 +284,7 @@ func deletePods(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.Pods(ns).Delete(items.Items[i].Name, nil) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -284,7 +298,7 @@ func deleteEvents(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.Events(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -298,7 +312,7 @@ func deleteSecrets(kubeClient client.Interface, ns string) error { } for i := range items.Items { err := kubeClient.Secrets(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } @@ -312,7 +326,7 @@ func deletePersistentVolumeClaims(kubeClient client.Interface, ns string) error } for i := range items.Items { err := kubeClient.PersistentVolumeClaims(ns).Delete(items.Items[i].Name) - if err != nil { + if err != nil && !errors.IsNotFound(err) { return err } } diff --git a/pkg/registry/namespace/etcd/etcd.go b/pkg/registry/namespace/etcd/etcd.go index b9dfdcbfbb7..864dd564845 100644 --- a/pkg/registry/namespace/etcd/etcd.go +++ b/pkg/registry/namespace/etcd/etcd.go @@ -102,7 +102,7 @@ func (r *REST) Delete(ctx api.Context, name string, options *api.DeleteOptions) // prior to final deletion, we must ensure that finalizers is empty if len(namespace.Spec.Finalizers) != 0 { - err = apierrors.NewConflict("Namespace", namespace.Name, fmt.Errorf("Termination is in progress, waiting for %v", namespace.Spec.Finalizers)) + err = apierrors.NewConflict("Namespace", namespace.Name, fmt.Errorf("The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.")) return nil, err } return r.Etcd.Delete(ctx, name, nil) diff --git a/plugin/pkg/admission/namespace/lifecycle/admission.go b/plugin/pkg/admission/namespace/lifecycle/admission.go index d6530a8297c..71c1e8bdd8d 100644 --- a/plugin/pkg/admission/namespace/lifecycle/admission.go +++ b/plugin/pkg/admission/namespace/lifecycle/admission.go @@ -75,7 +75,7 @@ func (l *lifecycle) Admit(a admission.Attributes) (err error) { return nil } - return admission.NewForbidden(a, fmt.Errorf("Namespace %s is terminating", a.GetNamespace())) + return admission.NewForbidden(a, fmt.Errorf("Unable to create new content in namespace %s because it is being terminated.", a.GetNamespace())) } // NewLifecycle creates a new namespace lifecycle admission control handler