From 3387c9da502e3889f70a6160ae3ed587878bdc7c Mon Sep 17 00:00:00 2001 From: hongming Date: Tue, 11 Feb 2020 15:03:58 +0800 Subject: [PATCH] fix: remove owner reference when unbind workspace Signed-off-by: hongming --- .../namespace/namespace_controller.go | 26 +++++++++++++++++-- pkg/models/workspaces/workspaces.go | 22 +++++++++++----- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/pkg/controller/namespace/namespace_controller.go b/pkg/controller/namespace/namespace_controller.go index 0f23c88e8..96bfd68a7 100644 --- a/pkg/controller/namespace/namespace_controller.go +++ b/pkg/controller/namespace/namespace_controller.go @@ -170,9 +170,15 @@ func (r *ReconcileNamespace) Reconcile(request reconcile.Request) (reconcile.Res if !controlledByWorkspace { - err = r.deleteRoleBindings(instance) + if err = r.unbindWorkspace(instance); err != nil { + return reconcile.Result{}, err + } - return reconcile.Result{}, err + if err = r.deleteRoleBindings(instance); err != nil { + return reconcile.Result{}, err + } + + return reconcile.Result{}, nil } if err = r.checkAndBindWorkspace(instance); err != nil { @@ -220,6 +226,7 @@ func (r *ReconcileNamespace) checkAndCreateRoles(namespace *corev1.Namespace) er klog.Error(err) return err } + found = role } else { klog.Error(err) return err @@ -451,6 +458,21 @@ func (r *ReconcileNamespace) deleteRuntime(namespace *corev1.Namespace) error { return nil } +func (r *ReconcileNamespace) unbindWorkspace(instance *corev1.Namespace) error { + ownerReferences := make([]metav1.OwnerReference, 0) + + for _, ref := range instance.OwnerReferences { + if ref.Kind != v1alpha1.ResourceKindWorkspace { + ownerReferences = append(ownerReferences, ref) + } + } + + if len(ownerReferences) != len(instance.OwnerReferences) { + instance.OwnerReferences = ownerReferences + return r.Update(context.TODO(), instance) + } + return nil +} // Create openpitrix runtime func (r *ReconcileNamespace) checkAndBindWorkspace(namespace *corev1.Namespace) error { diff --git a/pkg/models/workspaces/workspaces.go b/pkg/models/workspaces/workspaces.go index 47df460f0..04572ab2b 100644 --- a/pkg/models/workspaces/workspaces.go +++ b/pkg/models/workspaces/workspaces.go @@ -156,16 +156,26 @@ func DeleteWorkspaceRoleBinding(workspace, username string, role string) error { } workspaceRoleBinding = workspaceRoleBinding.DeepCopy() - for i, v := range workspaceRoleBinding.Subjects { - if v.Kind == v1.UserKind && v.Name == username { - workspaceRoleBinding.Subjects = append(workspaceRoleBinding.Subjects[:i], workspaceRoleBinding.Subjects[i+1:]...) - i-- + subjects := make([]v1.Subject, 0) + + for _, subject := range workspaceRoleBinding.Subjects { + if subject.Kind != v1.UserKind || subject.Name != username { + subjects = append(subjects, subject) } } - workspaceRoleBinding, err = clientset.ClientSets().K8s().Kubernetes().RbacV1().ClusterRoleBindings().Update(workspaceRoleBinding) + if len(subjects) != len(workspaceRoleBinding.Subjects) { + workspaceRoleBinding.Subjects = subjects - return err + _, err = clientset.ClientSets().K8s().Kubernetes().RbacV1().ClusterRoleBindings().Update(workspaceRoleBinding) + + if err != nil { + klog.Errorln(err) + return err + } + } + + return nil } func GetDevOpsProjectsCount(workspaceName string) (int, error) {