mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 04:08:16 +00:00 
			
		
		
		
	Proper phase/finalizer logic in federated namespace controller
This commit is contained in:
		@@ -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)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user