mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Updating federation namespace controller to share namespaced resources deletion code with kube namespace controller
This commit is contained in:
		@@ -24,6 +24,7 @@ import (
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/runtime"
 | 
			
		||||
	"k8s.io/apimachinery/pkg/watch"
 | 
			
		||||
	"k8s.io/client-go/dynamic"
 | 
			
		||||
	clientv1 "k8s.io/client-go/pkg/api/v1"
 | 
			
		||||
	"k8s.io/client-go/tools/cache"
 | 
			
		||||
	"k8s.io/client-go/tools/record"
 | 
			
		||||
@@ -37,6 +38,7 @@ import (
 | 
			
		||||
	apiv1 "k8s.io/kubernetes/pkg/api/v1"
 | 
			
		||||
	kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/controller"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/controller/namespace/deletion"
 | 
			
		||||
 | 
			
		||||
	"github.com/golang/glog"
 | 
			
		||||
)
 | 
			
		||||
@@ -75,6 +77,9 @@ type NamespaceController struct {
 | 
			
		||||
 | 
			
		||||
	deletionHelper *deletionhelper.DeletionHelper
 | 
			
		||||
 | 
			
		||||
	// Helper to delete all resources in a namespace.
 | 
			
		||||
	namespacedResourcesDeleter deletion.NamespacedResourcesDeleterInterface
 | 
			
		||||
 | 
			
		||||
	namespaceReviewDelay  time.Duration
 | 
			
		||||
	clusterAvailableDelay time.Duration
 | 
			
		||||
	smallDelay            time.Duration
 | 
			
		||||
@@ -82,7 +87,7 @@ type NamespaceController struct {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewNamespaceController returns a new namespace controller
 | 
			
		||||
func NewNamespaceController(client federationclientset.Interface) *NamespaceController {
 | 
			
		||||
func NewNamespaceController(client federationclientset.Interface, dynamicClientPool dynamic.ClientPool) *NamespaceController {
 | 
			
		||||
	broadcaster := record.NewBroadcaster()
 | 
			
		||||
	broadcaster.StartRecordingToSink(eventsink.NewFederatedEventSink(client))
 | 
			
		||||
	recorder := broadcaster.NewRecorder(api.Scheme, clientv1.EventSource{Component: "federated-namespace-controller"})
 | 
			
		||||
@@ -180,6 +185,11 @@ func NewNamespaceController(client federationclientset.Interface) *NamespaceCont
 | 
			
		||||
		nc.namespaceFederatedInformer,
 | 
			
		||||
		nc.federatedUpdater,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	discoverResourcesFn := nc.federatedApiClient.Discovery().ServerPreferredNamespacedResources
 | 
			
		||||
	nc.namespacedResourcesDeleter = deletion.NewNamespacedResourcesDeleter(
 | 
			
		||||
		client.Core().Namespaces(), dynamicClientPool, nil,
 | 
			
		||||
		discoverResourcesFn, apiv1.FinalizerKubernetes, false)
 | 
			
		||||
	return nc
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -463,11 +473,16 @@ func (nc *NamespaceController) delete(namespace *apiv1.Namespace) error {
 | 
			
		||||
 | 
			
		||||
	if nc.hasFinalizerFuncInSpec(updatedNamespace, apiv1.FinalizerKubernetes) {
 | 
			
		||||
		// Delete resources in this namespace.
 | 
			
		||||
		updatedNamespace, err = nc.removeKubernetesFinalizer(updatedNamespace)
 | 
			
		||||
		err = nc.namespacedResourcesDeleter.Delete(updatedNamespace.Name)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("error in deleting resources in namespace %s: %v", namespace.Name, err)
 | 
			
		||||
		}
 | 
			
		||||
		glog.V(2).Infof("Removed kubernetes finalizer from ns %s", namespace.Name)
 | 
			
		||||
		// Fetch the updated Namespace.
 | 
			
		||||
		updatedNamespace, err = nc.federatedApiClient.Core().Namespaces().Get(updatedNamespace.Name, metav1.GetOptions{})
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return fmt.Errorf("error in fetching updated namespace %s: %s", updatedNamespace.Name, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Delete the namespace from all underlying clusters.
 | 
			
		||||
@@ -487,44 +502,3 @@ func (nc *NamespaceController) delete(namespace *apiv1.Namespace) error {
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Ensures that all resources in this namespace are deleted and then removes the kubernetes finalizer.
 | 
			
		||||
func (nc *NamespaceController) removeKubernetesFinalizer(namespace *apiv1.Namespace) (*apiv1.Namespace, error) {
 | 
			
		||||
	// Right now there are just 7 types of objects: Deployments, DaemonSets, ReplicaSet, Secret, Ingress, Events and Service.
 | 
			
		||||
	// Temporarily these items are simply deleted one by one to squeeze this code into 1.4.
 | 
			
		||||
	// TODO: Make it generic (like in the regular namespace controller) and parallel.
 | 
			
		||||
	err := nc.federatedApiClient.Core().Services(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete service list: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Extensions().ReplicaSets(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete replicaset list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Core().Secrets(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete secret list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Extensions().Ingresses(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete ingresses list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Extensions().DaemonSets(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete daemonsets list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Extensions().Deployments(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete deployments list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	err = nc.federatedApiClient.Core().Events(namespace.Name).DeleteCollection(&metav1.DeleteOptions{}, metav1.ListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("failed to delete events list from namespace: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Remove kube_api.FinalizerKubernetes
 | 
			
		||||
	if len(namespace.Spec.Finalizers) != 0 {
 | 
			
		||||
		return nc.removeFinalizerFromSpec(namespace, apiv1.FinalizerKubernetes)
 | 
			
		||||
	}
 | 
			
		||||
	return namespace, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user