未验证 提交 0d0b1d88 编写于 作者: K KubeSphere CI Bot 提交者: GitHub

Merge pull request #3098 from wansir/fix-2912

fix: cascade delete resources
...@@ -33,6 +33,7 @@ import ( ...@@ -33,6 +33,7 @@ import (
iamv1alpha2 "kubesphere.io/kubesphere/pkg/apis/iam/v1alpha2" iamv1alpha2 "kubesphere.io/kubesphere/pkg/apis/iam/v1alpha2"
tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1" tenantv1alpha1 "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
"kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/constants"
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
"kubesphere.io/kubesphere/pkg/utils/sliceutil" "kubesphere.io/kubesphere/pkg/utils/sliceutil"
"reflect" "reflect"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
...@@ -140,63 +141,59 @@ func (r *ReconcileNamespace) Reconcile(request reconcile.Request) (reconcile.Res ...@@ -140,63 +141,59 @@ func (r *ReconcileNamespace) Reconcile(request reconcile.Request) (reconcile.Res
return reconcile.Result{}, nil return reconcile.Result{}, nil
} }
if err = r.bindWorkspace(instance); err != nil { // initialize subresource if created by kubesphere
return reconcile.Result{}, err if workspace := instance.Labels[constants.WorkspaceLabelKey]; workspace != "" {
} if err = r.bindWorkspace(instance); err != nil {
return reconcile.Result{}, err
if err = r.initRoles(instance); err != nil { }
return reconcile.Result{}, err if err = r.initRoles(instance); err != nil {
} return reconcile.Result{}, err
}
if err = r.initCreatorRoleBinding(instance); err != nil { if err = r.initCreatorRoleBinding(instance); err != nil {
return reconcile.Result{}, err return reconcile.Result{}, err
}
} else {
r.unbindWorkspace(instance)
} }
return reconcile.Result{}, nil return reconcile.Result{}, nil
} }
func (r *ReconcileNamespace) isControlledByWorkspace(namespace *corev1.Namespace) (bool, error) {
workspaceName := namespace.Labels[constants.WorkspaceLabelKey]
// without workspace label
if workspaceName == "" {
return false, nil
}
return true, nil
}
func (r *ReconcileNamespace) bindWorkspace(namespace *corev1.Namespace) error { func (r *ReconcileNamespace) bindWorkspace(namespace *corev1.Namespace) error {
workspaceName := namespace.Labels[constants.WorkspaceLabelKey] workspaceName := namespace.Labels[constants.WorkspaceLabelKey]
if workspaceName == "" {
return nil
}
workspace := &tenantv1alpha1.Workspace{} workspace := &tenantv1alpha1.Workspace{}
if err := r.Get(context.TODO(), types.NamespacedName{Name: workspaceName}, workspace); err != nil {
err := r.Get(context.TODO(), types.NamespacedName{Name: workspaceName}, workspace)
if err != nil {
// skip if workspace not found // skip if workspace not found
if errors.IsNotFound(err) { if errors.IsNotFound(err) {
klog.Warning(err)
return nil return nil
} }
klog.Error(err) klog.Error(err)
return err return err
} }
// federated namespace not controlled by workspace if !metav1.IsControlledBy(namespace, workspace) {
if namespace.Labels[constants.KubefedManagedLabel] != "true" && !metav1.IsControlledBy(namespace, workspace) { workspace.OwnerReferences = removeWorkspaceOwnerReference(workspace.OwnerReferences)
namespace.OwnerReferences = nil
if err := controllerutil.SetControllerReference(workspace, namespace, r.scheme); err != nil { if err := controllerutil.SetControllerReference(workspace, namespace, r.scheme); err != nil {
klog.Error(err) klog.Error(err)
return err return err
} }
err = r.Update(context.TODO(), namespace)
if err != nil { if err := r.Update(context.TODO(), namespace); err != nil {
klog.Error(err)
return err
}
}
return nil
}
func (r *ReconcileNamespace) unbindWorkspace(namespace *corev1.Namespace) error {
if k8sutil.IsControlledBy(namespace.OwnerReferences, tenantv1alpha1.ResourceKindWorkspace, "") {
namespace := namespace.DeepCopy()
namespace.OwnerReferences = removeWorkspaceOwnerReference(namespace.OwnerReferences)
if err := r.Update(context.TODO(), namespace); err != nil {
klog.Error(err) klog.Error(err)
return err return err
} }
...@@ -205,6 +202,17 @@ func (r *ReconcileNamespace) bindWorkspace(namespace *corev1.Namespace) error { ...@@ -205,6 +202,17 @@ func (r *ReconcileNamespace) bindWorkspace(namespace *corev1.Namespace) error {
return nil return nil
} }
// Remove workspace kind owner reference of the namespace
func removeWorkspaceOwnerReference(ownerReferences []metav1.OwnerReference) []metav1.OwnerReference {
tmp := make([]metav1.OwnerReference, 0)
for _, owner := range ownerReferences {
if owner.Kind != tenantv1alpha1.ResourceKindWorkspace {
tmp = append(tmp, owner)
}
}
return tmp
}
func (r *ReconcileNamespace) deleteRouter(namespace string) error { func (r *ReconcileNamespace) deleteRouter(namespace string) error {
routerName := constants.IngressControllerPrefix + namespace routerName := constants.IngressControllerPrefix + namespace
// delete service first // delete service first
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册