Proper phase/finalizer logic in federated namespace controller

pull/6/head
Marcin Wielgus 2016-08-25 18:11:21 +02:00
parent 99f77f42e2
commit 31dd5e8d91
1 changed files with 51 additions and 7 deletions

View File

@ -31,6 +31,7 @@ import (
"k8s.io/kubernetes/pkg/controller/framework" "k8s.io/kubernetes/pkg/controller/framework"
pkg_runtime "k8s.io/kubernetes/pkg/runtime" pkg_runtime "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/flowcontrol" "k8s.io/kubernetes/pkg/util/flowcontrol"
"k8s.io/kubernetes/pkg/util/sets"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
"github.com/golang/glog" "github.com/golang/glog"
@ -237,13 +238,8 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) {
return return
} }
baseNamespace := baseNamespaceObj.(*api_v1.Namespace) baseNamespace := baseNamespaceObj.(*api_v1.Namespace)
if baseNamespace.Status.Phase == api_v1.NamespaceTerminating { if baseNamespace.DeletionTimestamp != nil {
// TODO: What about namespaces in subclusters ??? nc.delete(baseNamespace)
err = nc.federatedApiClient.Core().Namespaces().Delete(baseNamespace.Name, &api.DeleteOptions{})
if err != nil {
glog.Errorf("Failed to delete namespace %s: %v", baseNamespace.Name, err)
nc.deliverNamespace(namespace, 0, true)
}
return return
} }
@ -302,3 +298,51 @@ func (nc *NamespaceController) reconcileNamespace(namespace string) {
// Evertyhing is in order but lets be double sure // Evertyhing is in order but lets be double sure
nc.deliverNamespace(namespace, nc.namespaceReviewDelay, false) nc.deliverNamespace(namespace, nc.namespaceReviewDelay, false)
} }
func (nc *NamespaceController) delete(namespace *api_v1.Namespace) {
// Set Terminating status.
updatedNamespace := &api_v1.Namespace{
ObjectMeta: namespace.ObjectMeta,
Spec: namespace.Spec,
Status: api_v1.NamespaceStatus{
Phase: api_v1.NamespaceTerminating,
},
}
if namespace.Status.Phase != api_v1.NamespaceTerminating {
_, err := nc.federatedApiClient.Core().Namespaces().Update(updatedNamespace)
if err != nil {
glog.Errorf("Failed to update namespace %s: %v", updatedNamespace.Name, err)
nc.deliverNamespace(namespace.Name, 0, true)
return
}
}
// TODO: delete all namespace content.
// Remove kube_api.FinalzerKubernetes
if len(updatedNamespace.Spec.Finalizers) != 0 {
finalizerSet := sets.NewString()
for i := range namespace.Spec.Finalizers {
if namespace.Spec.Finalizers[i] != api_v1.FinalizerKubernetes {
finalizerSet.Insert(string(namespace.Spec.Finalizers[i]))
}
}
updatedNamespace.Spec.Finalizers = make([]api_v1.FinalizerName, 0, len(finalizerSet))
for _, value := range finalizerSet.List() {
updatedNamespace.Spec.Finalizers = append(updatedNamespace.Spec.Finalizers, api_v1.FinalizerName(value))
}
_, err := nc.federatedApiClient.Core().Namespaces().Finalize(updatedNamespace)
if err != nil {
glog.Errorf("Failed to update namespace %s: %v", updatedNamespace.Name, err)
nc.deliverNamespace(namespace.Name, 0, true)
return
}
}
// TODO: What about namespaces in subclusters ???
err := nc.federatedApiClient.Core().Namespaces().Delete(updatedNamespace.Name, &api.DeleteOptions{})
if err != nil {
glog.Errorf("Failed to delete namespace %s: %v", namespace.Name, err)
nc.deliverNamespace(namespace.Name, 0, true)
}
}