fix bug: rolebinding cannot delete

This commit is contained in:
hongming
2018-11-22 16:53:57 +08:00
parent 49d40f48f7
commit a908757cfb
5 changed files with 102 additions and 65 deletions

View File

@@ -55,7 +55,7 @@ func RoleHandler(req *restful.Request, resp *restful.Response) {
workspaceName := req.PathParameter("name") workspaceName := req.PathParameter("name")
roleName := req.PathParameter("role") roleName := req.PathParameter("role")
if !slice.ContainsString(workspaces.WorkSpaceRoles, roleName, nil) { if !slice.ContainsString(constants.WorkSpaceRoles, roleName, nil) {
resp.WriteHeaderAndEntity(http.StatusNotFound, constants.MessageResponse{Message: fmt.Sprintf("role %s not found", roleName)}) resp.WriteHeaderAndEntity(http.StatusNotFound, constants.MessageResponse{Message: fmt.Sprintf("role %s not found", roleName)})
return return
} }

View File

@@ -44,6 +44,10 @@ const (
AccountAPIServerEnv = "ACCOUNT_API_SERVER" AccountAPIServerEnv = "ACCOUNT_API_SERVER"
DevopsProxyTokenEnv = "DEVOPS_PROXY_TOKEN" DevopsProxyTokenEnv = "DEVOPS_PROXY_TOKEN"
OpenPitrixProxyTokenEnv = "OPENPITRIX_PROXY_TOKEN" OpenPitrixProxyTokenEnv = "OPENPITRIX_PROXY_TOKEN"
WorkspaceLabelKey = "kubesphere.io/workspace"
WorkspaceAdmin = "workspace-admin"
WorkspaceRegular = "workspace-regular"
WorkspaceViewer = "workspace-viewer"
) )
var ( var (
@@ -51,6 +55,7 @@ var (
AccountAPIServer = "ks-account.kubesphere-system.svc" AccountAPIServer = "ks-account.kubesphere-system.svc"
DevopsProxyToken = "" DevopsProxyToken = ""
OpenPitrixProxyToken = "" OpenPitrixProxyToken = ""
WorkSpaceRoles = []string{WorkspaceAdmin, WorkspaceRegular, WorkspaceViewer}
) )
func init() { func init() {

View File

@@ -22,6 +22,8 @@ import (
"fmt" "fmt"
"regexp" "regexp"
"strings"
"github.com/golang/glog" "github.com/golang/glog"
"github.com/pkg/errors" "github.com/pkg/errors"
rbac "k8s.io/api/rbac/v1" rbac "k8s.io/api/rbac/v1"
@@ -29,6 +31,8 @@ import (
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/cache"
"kubesphere.io/kubesphere/pkg/constants"
) )
func (ctl *ClusterRoleBindingCtl) Name() string { func (ctl *ClusterRoleBindingCtl) Name() string {
@@ -43,14 +47,14 @@ func (ctl *ClusterRoleBindingCtl) sync(stopChan chan struct{}) {
func (ctl *ClusterRoleBindingCtl) total() int { func (ctl *ClusterRoleBindingCtl) total() int {
list, err := ctl.lister.List(labels.Everything()) list, err := ctl.lister.List(labels.Everything())
if err != nil { if err != nil {
glog.Errorf("count %s falied, reason:%s", err, ctl.Name()) glog.Errorf("count %s failed, reason:%s", ctl.Name(), err)
return 0 return 0
} }
return len(list) return len(list)
} }
func (ctl *ClusterRoleBindingCtl) handleWorkspaceRoleChange(clusterRole *rbac.ClusterRoleBinding) { func (ctl *ClusterRoleBindingCtl) handleWorkspaceRoleChange(clusterRole *rbac.ClusterRoleBinding) {
if groups := regexp.MustCompile(`^system:(\S+):(admin|operator|viewer)$`).FindStringSubmatch(clusterRole.Name); len(groups) == 3 { if groups := regexp.MustCompile(fmt.Sprintf(`^system:(\S+):(%s)$`, strings.Join(constants.WorkSpaceRoles, "|"))).FindStringSubmatch(clusterRole.Name); len(groups) == 3 {
workspace := groups[1] workspace := groups[1]
go ctl.restNamespaceRoleBinding(workspace) go ctl.restNamespaceRoleBinding(workspace)
} }

View File

@@ -46,7 +46,7 @@ import (
const ( const (
provider = "kubernetes" provider = "kubernetes"
admin = "admin" admin = "admin"
editor = "operator" operator = "operator"
viewer = "viewer" viewer = "viewer"
kubectlNamespace = constants.KubeSphereControlNamespace kubectlNamespace = constants.KubeSphereControlNamespace
kubectlConfigKey = "config" kubectlConfigKey = "config"
@@ -133,13 +133,10 @@ func (ctl *NamespaceCtl) createOpRuntime(namespace string) ([]byte, error) {
return makeHttpRequest("POST", url, string(body)) return makeHttpRequest("POST", url, string(body))
} }
func (ctl *NamespaceCtl) createDefaultRoleBinding(namespace *v1.Namespace) error { func (ctl *NamespaceCtl) updateSystemRoleBindings(namespace *v1.Namespace) error {
workspace := "" workspace := ""
creator := ""
if namespace.Annotations != nil {
creator = namespace.Annotations[creatorAnnotateKey]
}
if namespace.Labels != nil { if namespace.Labels != nil {
workspace = namespace.Labels[workspaceLabelKey] workspace = namespace.Labels[workspaceLabelKey]
} }
@@ -159,12 +156,8 @@ func (ctl *NamespaceCtl) createDefaultRoleBinding(namespace *v1.Namespace) error
adminBinding.Subjects = make([]rbac.Subject, 0) adminBinding.Subjects = make([]rbac.Subject, 0)
if creator != "" {
adminBinding.Subjects = append(adminBinding.Subjects, rbac.Subject{Name: creator, Kind: rbac.UserKind})
}
if workspace != "" { if workspace != "" {
workspaceAdmin, err := ctl.K8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:admin", workspace), metaV1.GetOptions{}) workspaceAdmin, err := ctl.K8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace, constants.WorkspaceAdmin), metaV1.GetOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -197,7 +190,7 @@ func (ctl *NamespaceCtl) createDefaultRoleBinding(namespace *v1.Namespace) error
viewerBinding.Subjects = make([]rbac.Subject, 0) viewerBinding.Subjects = make([]rbac.Subject, 0)
if workspace != "" { if workspace != "" {
workspaceViewer, err := ctl.K8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:viewer", workspace), metaV1.GetOptions{}) workspaceViewer, err := ctl.K8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace, constants.WorkspaceViewer), metaV1.GetOptions{})
if err != nil { if err != nil {
return err return err
} }
@@ -217,24 +210,64 @@ func (ctl *NamespaceCtl) createDefaultRoleBinding(namespace *v1.Namespace) error
return nil return nil
} }
func (ctl *NamespaceCtl) createDefaultRole(ns string) error { func (ctl *NamespaceCtl) createDefaultRoleBinding(namespace *v1.Namespace) error {
adminRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: admin, Namespace: ns, Annotations: map[string]string{"creator": "system"}}, Rules: adminRules} creator := ""
editorRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: editor, Namespace: ns, Annotations: map[string]string{"creator": "system"}}, Rules: editorRules} if namespace.Annotations != nil {
viewerRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: viewer, Namespace: ns, Annotations: map[string]string{"creator": "system"}}, Rules: viewerRules} creator = namespace.Annotations[creatorAnnotateKey]
}
// create once
if creator != "" {
creatorBindingName := fmt.Sprintf("%s-admin", creator)
creatorBinding, err := ctl.K8sClient.RbacV1().RoleBindings(namespace.Name).Get(creatorBindingName, metaV1.GetOptions{})
if err != nil {
if errors.IsNotFound(err) {
creatorBinding = new(rbac.RoleBinding)
creatorBinding.Name = creatorBindingName
creatorBinding.Namespace = namespace.Name
creatorBinding.RoleRef = rbac.RoleRef{Kind: "Role", Name: admin}
} else {
return err
}
}
_, err := ctl.K8sClient.RbacV1().Roles(ns).Create(adminRole) creatorBinding.Subjects = []rbac.Subject{{Kind: rbac.UserKind, Name: creator}}
if creatorBinding.ResourceVersion == "" {
_, err = ctl.K8sClient.RbacV1().RoleBindings(namespace.Name).Create(creatorBinding)
} else {
_, err = ctl.K8sClient.RbacV1().RoleBindings(namespace.Name).Update(creatorBinding)
}
if err != nil {
return err
}
}
return nil
}
func (ctl *NamespaceCtl) CreateDefaultRoleAndRoleBinding(namespace *v1.Namespace) error {
adminRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: admin, Namespace: namespace.Name, Annotations: map[string]string{creatorAnnotateKey: "system"}}, Rules: adminRules}
operatorRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: operator, Namespace: namespace.Name, Annotations: map[string]string{creatorAnnotateKey: "system"}}, Rules: editorRules}
viewerRole := &rbac.Role{ObjectMeta: metaV1.ObjectMeta{Name: viewer, Namespace: namespace.Name, Annotations: map[string]string{creatorAnnotateKey: "system"}}, Rules: viewerRules}
_, err := ctl.K8sClient.RbacV1().Roles(namespace.Name).Create(adminRole)
if err != nil && !errors.IsAlreadyExists(err) {
return err
} else if err == nil {
if err := ctl.createDefaultRoleBinding(namespace); err != nil {
glog.Warning("default role binding create failed", namespace.Name)
}
}
_, err = ctl.K8sClient.RbacV1().Roles(namespace.Name).Create(operatorRole)
if err != nil && !errors.IsAlreadyExists(err) { if err != nil && !errors.IsAlreadyExists(err) {
return err return err
} }
_, err = ctl.K8sClient.RbacV1().Roles(ns).Create(editorRole) _, err = ctl.K8sClient.RbacV1().Roles(namespace.Name).Create(viewerRole)
if err != nil && !errors.IsAlreadyExists(err) {
return err
}
_, err = ctl.K8sClient.RbacV1().Roles(ns).Create(viewerRole)
if err != nil && !errors.IsAlreadyExists(err) { if err != nil && !errors.IsAlreadyExists(err) {
return err return err
@@ -254,27 +287,22 @@ func (ctl *NamespaceCtl) createRoleAndRuntime(namespace *v1.Namespace) {
componentsNamespaces := []string{constants.KubeSystemNamespace, constants.OpenPitrixNamespace, constants.IstioNamespace, constants.KubeSphereNamespace} componentsNamespaces := []string{constants.KubeSystemNamespace, constants.OpenPitrixNamespace, constants.IstioNamespace, constants.KubeSphereNamespace}
if runtime == "" && !slice.ContainsString(componentsNamespaces, namespace.Name, nil) { if runtime == "" && !slice.ContainsString(componentsNamespaces, namespace.Name, nil) {
glog.Infoln("create runtime:", namespace.Name)
_, runtimeCreateError := ctl.createOpRuntime(namespace.Name) _, runtimeCreateError := ctl.createOpRuntime(namespace.Name)
if runtimeCreateError != nil { if runtimeCreateError != nil {
glog.Error("runtime create error:", runtimeCreateError) glog.Error("runtime create error:", runtimeCreateError)
} }
} }
if initTime == "" { if initTime == "" {
err := ctl.createDefaultRole(namespace.Name) err := ctl.CreateDefaultRoleAndRoleBinding(namespace)
glog.Infoln("create default role:", namespace.Name)
if err == nil { if err == nil {
err = ctl.createDefaultRoleBinding(namespace) err = ctl.updateSystemRoleBindings(namespace)
glog.Infoln("create default role binding:", namespace.Name)
if err != nil { if err != nil {
glog.Error("default role binding create error:", err) glog.Error("role binding update error:", err)
} }
} else { } else {
glog.Error("default role create error:", err) glog.Error("default role create error:", err)
} }
if err == nil { if err == nil {
pathJson := fmt.Sprintf(`{"metadata":{"annotations":{"%s":"%s"}}}`, initTimeAnnotateKey, time.Now().UTC().Format("2006-01-02T15:04:05Z")) pathJson := fmt.Sprintf(`{"metadata":{"annotations":{"%s":"%s"}}}`, initTimeAnnotateKey, time.Now().UTC().Format("2006-01-02T15:04:05Z"))
_, err = ctl.K8sClient.CoreV1().Namespaces().Patch(namespace.Name, "application/strategic-merge-patch+json", []byte(pathJson)) _, err = ctl.K8sClient.CoreV1().Namespaces().Patch(namespace.Name, "application/strategic-merge-patch+json", []byte(pathJson))

View File

@@ -35,12 +35,6 @@ import (
ksErr "kubesphere.io/kubesphere/pkg/util/errors" ksErr "kubesphere.io/kubesphere/pkg/util/errors"
) )
const (
WorkspaceKey = "kubesphere.io/workspace"
)
var WorkSpaceRoles = []string{"admin", "operator", "viewer"}
func UnBindDevopsProject(workspace string, devops string) error { func UnBindDevopsProject(workspace string, devops string) error {
db := client.NewSharedDBClient() db := client.NewSharedDBClient()
defer db.Close() defer db.Close()
@@ -283,7 +277,7 @@ func DeleteNamespace(workspace string, namespaceName string) error {
return err return err
} }
if namespace.Labels != nil && namespace.Labels["kubesphere.io/workspace"] == workspace { if namespace.Labels != nil && namespace.Labels["kubesphere.io/workspace"] == workspace {
deletePolicy := meta_v1.DeletePropagationBackground deletePolicy := meta_v1.DeletePropagationForeground
return client.NewK8sClient().CoreV1().Namespaces().Delete(namespaceName, &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy}) return client.NewK8sClient().CoreV1().Namespaces().Delete(namespaceName, &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy})
} else { } else {
return errors.New("resource not found") return errors.New("resource not found")
@@ -347,7 +341,7 @@ func workspaceRoleRelease(workspace string) error {
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
deletePolicy := meta_v1.DeletePropagationForeground deletePolicy := meta_v1.DeletePropagationForeground
for _, role := range WorkSpaceRoles { for _, role := range constants.WorkSpaceRoles {
err := k8sClient.RbacV1().ClusterRoles().Delete(fmt.Sprintf("system:%s:%s", workspace, role), &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy}) err := k8sClient.RbacV1().ClusterRoles().Delete(fmt.Sprintf("system:%s:%s", workspace, role), &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy})
if err != nil && !apierrors.IsNotFound(err) { if err != nil && !apierrors.IsNotFound(err) {
@@ -355,7 +349,7 @@ func workspaceRoleRelease(workspace string) error {
} }
} }
for _, role := range WorkSpaceRoles { for _, role := range constants.WorkSpaceRoles {
err := k8sClient.RbacV1().ClusterRoleBindings().Delete(fmt.Sprintf("system:%s:%s", workspace, role), &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy}) err := k8sClient.RbacV1().ClusterRoleBindings().Delete(fmt.Sprintf("system:%s:%s", workspace, role), &meta_v1.DeleteOptions{PropagationPolicy: &deletePolicy})
if err != nil && !apierrors.IsNotFound(err) { if err != nil && !apierrors.IsNotFound(err) {
@@ -516,7 +510,7 @@ func ListWorkspaceByUser(username string, keyword string) ([]*Workspace, error)
} else { } else {
workspaceNames := make([]string, 0) workspaceNames := make([]string, 0)
for _, clusterRole := range clusterRoles { for _, clusterRole := range clusterRoles {
if groups := regexp.MustCompile(`^system:(\S+):(admin|operator|viewer)$`).FindStringSubmatch(clusterRole.Name); len(groups) == 3 { if groups := regexp.MustCompile(fmt.Sprintf(`^system:(\S+):(%s)$`, strings.Join(constants.WorkSpaceRoles, "|"))).FindStringSubmatch(clusterRole.Name); len(groups) == 3 {
if !slice.ContainsString(workspaceNames, groups[1], nil) { if !slice.ContainsString(workspaceNames, groups[1], nil) {
workspaceNames = append(workspaceNames, groups[1]) workspaceNames = append(workspaceNames, groups[1])
} }
@@ -721,12 +715,18 @@ func CreateNamespace(namespace *core.Namespace) (*core.Namespace, error) {
return nil, err return nil, err
} }
if ctl, ok := controllers.ResourceControllers.Controllers[controllers.Namespaces]; ok {
if nsCtl, ok := ctl.(*controllers.NamespaceCtl); ok {
nsCtl.CreateDefaultRoleAndRoleBinding(ns)
}
}
return ns, nil return ns, nil
} }
func Invite(workspaceName string, users []UserInvite) error { func Invite(workspaceName string, users []UserInvite) error {
for _, user := range users { for _, user := range users {
if !slice.ContainsString(WorkSpaceRoles, user.Role, nil) { if !slice.ContainsString(constants.WorkSpaceRoles, user.Role, nil) {
return fmt.Errorf("role %s not exist", user.Role) return fmt.Errorf("role %s not exist", user.Role)
} }
} }
@@ -807,7 +807,7 @@ func Roles(workspace *Workspace) ([]*v1.ClusterRole, error) {
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
for _, name := range WorkSpaceRoles { for _, name := range constants.WorkSpaceRoles {
role, err := k8sClient.RbacV1().ClusterRoles().Get(fmt.Sprintf("system:%s:%s", workspace.Name, name), meta_v1.GetOptions{}) role, err := k8sClient.RbacV1().ClusterRoles().Get(fmt.Sprintf("system:%s:%s", workspace.Name, name), meta_v1.GetOptions{})
if err != nil { if err != nil {
@@ -859,7 +859,7 @@ func WorkspaceRoleInit(workspace *Workspace) error {
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
admin := new(v1.ClusterRole) admin := new(v1.ClusterRole)
admin.Name = fmt.Sprintf("system:%s:admin", workspace.Name) admin.Name = fmt.Sprintf("system:%s:%s", workspace.Name, constants.WorkspaceAdmin)
admin.Kind = iam.ClusterRoleKind admin.Kind = iam.ClusterRoleKind
admin.Rules = []v1.PolicyRule{ admin.Rules = []v1.PolicyRule{
{ {
@@ -899,10 +899,10 @@ func WorkspaceRoleInit(workspace *Workspace) error {
admin.Labels = map[string]string{"creator": "system"} admin.Labels = map[string]string{"creator": "system"}
operator := new(v1.ClusterRole) regular := new(v1.ClusterRole)
operator.Name = fmt.Sprintf("system:%s:operator", workspace.Name) regular.Name = fmt.Sprintf("system:%s:%s", workspace.Name, constants.WorkspaceRegular)
operator.Kind = iam.ClusterRoleKind regular.Kind = iam.ClusterRoleKind
operator.Rules = []v1.PolicyRule{ regular.Rules = []v1.PolicyRule{
{ {
Verbs: []string{"get"}, Verbs: []string{"get"},
APIGroups: []string{"kubesphere.io"}, APIGroups: []string{"kubesphere.io"},
@@ -948,10 +948,10 @@ func WorkspaceRoleInit(workspace *Workspace) error {
}, },
} }
operator.Labels = map[string]string{"creator": "system"} regular.Labels = map[string]string{"creator": "system"}
viewer := new(v1.ClusterRole) viewer := new(v1.ClusterRole)
viewer.Name = fmt.Sprintf("system:%s:viewer", workspace.Name) viewer.Name = fmt.Sprintf("system:%s:%s", workspace.Name, constants.WorkspaceViewer)
viewer.Kind = iam.ClusterRoleKind viewer.Kind = iam.ClusterRoleKind
viewer.Rules = []v1.PolicyRule{ viewer.Rules = []v1.PolicyRule{
{ {
@@ -1011,7 +1011,7 @@ func WorkspaceRoleInit(workspace *Workspace) error {
} }
} }
_, err = k8sClient.RbacV1().ClusterRoles().Create(operator) _, err = k8sClient.RbacV1().ClusterRoles().Create(regular)
if err != nil { if err != nil {
if !apierrors.IsAlreadyExists(err) { if !apierrors.IsAlreadyExists(err) {
log.Println("cluster role create failed", viewer.Name, err) log.Println("cluster role create failed", viewer.Name, err)
@@ -1019,14 +1019,14 @@ func WorkspaceRoleInit(workspace *Workspace) error {
} }
} }
operatorRoleBinding := new(v1.ClusterRoleBinding) regularRoleBinding := new(v1.ClusterRoleBinding)
operatorRoleBinding.Name = operator.Name regularRoleBinding.Name = regular.Name
operatorRoleBinding.RoleRef = v1.RoleRef{Kind: "ClusterRole", Name: operator.Name} regularRoleBinding.RoleRef = v1.RoleRef{Kind: "ClusterRole", Name: regular.Name}
operatorRoleBinding.Subjects = make([]v1.Subject, 0) regularRoleBinding.Subjects = make([]v1.Subject, 0)
_, err = k8sClient.RbacV1().ClusterRoleBindings().Create(operatorRoleBinding) _, err = k8sClient.RbacV1().ClusterRoleBindings().Create(regularRoleBinding)
if err != nil { if err != nil {
if !apierrors.IsAlreadyExists(err) { if !apierrors.IsAlreadyExists(err) {
log.Println("cluster rolebinding create failed", operatorRoleBinding.Name, err) log.Println("cluster rolebinding create failed", regularRoleBinding.Name, err)
return err return err
} }
} }
@@ -1057,7 +1057,7 @@ func WorkspaceRoleInit(workspace *Workspace) error {
func unbindWorkspaceRole(workspace string, users []string) error { func unbindWorkspaceRole(workspace string, users []string) error {
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
for _, name := range WorkSpaceRoles { for _, name := range constants.WorkSpaceRoles {
roleBinding, err := k8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace, name), meta_v1.GetOptions{}) roleBinding, err := k8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace, name), meta_v1.GetOptions{})
if err != nil { if err != nil {
@@ -1137,7 +1137,7 @@ func CreateWorkspaceRoleBinding(workspace *Workspace, username string, role stri
k8sClient := client.NewK8sClient() k8sClient := client.NewK8sClient()
for _, roleName := range WorkSpaceRoles { for _, roleName := range constants.WorkSpaceRoles {
roleBinding, err := k8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace.Name, roleName), meta_v1.GetOptions{}) roleBinding, err := k8sClient.RbacV1().ClusterRoleBindings().Get(fmt.Sprintf("system:%s:%s", workspace.Name, roleName), meta_v1.GetOptions{})
if err != nil { if err != nil {
@@ -1215,7 +1215,7 @@ func GetOrgMembers(workspace string) ([]string, error) {
} }
func GetOrgRoles(name string) ([]string, error) { func GetOrgRoles(name string) ([]string, error) {
return []string{"admin", "operator", "user"}, nil return constants.WorkSpaceRoles, nil
} }
func WorkspaceNamespaces(workspaceName string) ([]string, error) { func WorkspaceNamespaces(workspaceName string) ([]string, error) {
@@ -1348,7 +1348,7 @@ func GetAllOrgAndProjList() (map[string][]string, map[string]string, error) {
var namespaceWorkspaceMap = make(map[string]string) var namespaceWorkspaceMap = make(map[string]string)
for _, item := range nsList.Items { for _, item := range nsList.Items {
ws, exist := item.Labels[WorkspaceKey] ws, exist := item.Labels[constants.WorkspaceLabelKey]
ns := item.Name ns := item.Name
if exist { if exist {
if nsArray, exist := workspaceNamespaceMap[ws]; exist { if nsArray, exist := workspaceNamespaceMap[ws]; exist {