mirror of https://github.com/k3s-io/k3s
Proper phase/finalizer logic in federated namespace controller
parent
99f77f42e2
commit
31dd5e8d91
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue