feat: support listing cluster that user has the cluster`s rolebinding (#6259)

This commit is contained in:
Wenhao Zhou
2024-10-31 17:31:07 +08:00
committed by GitHub
parent 5702930c08
commit c5e2800ab2
2 changed files with 56 additions and 3 deletions

View File

@@ -9,6 +9,7 @@ import (
"context" "context"
"encoding/json" "encoding/json"
"fmt" "fmt"
"strconv"
"strings" "strings"
"kubesphere.io/kubesphere/pkg/constants" "kubesphere.io/kubesphere/pkg/constants"
@@ -35,6 +36,7 @@ import (
"kubesphere.io/kubesphere/pkg/apiserver/authorization/authorizer" "kubesphere.io/kubesphere/pkg/apiserver/authorization/authorizer"
"kubesphere.io/kubesphere/pkg/apiserver/query" "kubesphere.io/kubesphere/pkg/apiserver/query"
"kubesphere.io/kubesphere/pkg/apiserver/request" "kubesphere.io/kubesphere/pkg/apiserver/request"
clusterutils "kubesphere.io/kubesphere/pkg/controller/cluster/utils"
"kubesphere.io/kubesphere/pkg/models/iam/am" "kubesphere.io/kubesphere/pkg/models/iam/am"
"kubesphere.io/kubesphere/pkg/models/iam/im" "kubesphere.io/kubesphere/pkg/models/iam/im"
resources "kubesphere.io/kubesphere/pkg/models/resources/v1alpha3" resources "kubesphere.io/kubesphere/pkg/models/resources/v1alpha3"
@@ -43,6 +45,10 @@ import (
jsonpatchutil "kubesphere.io/kubesphere/pkg/utils/josnpatchutil" jsonpatchutil "kubesphere.io/kubesphere/pkg/utils/josnpatchutil"
) )
const (
queryRoleBindingExists = "roleBindingExists"
)
type Interface interface { type Interface interface {
ListWorkspaces(user user.Info, queryParam *query.Query) (*api.ListResult, error) ListWorkspaces(user user.Info, queryParam *query.Query) (*api.ListResult, error)
GetWorkspace(workspace string) (*tenantv1beta1.Workspace, error) GetWorkspace(workspace string) (*tenantv1beta1.Workspace, error)
@@ -543,6 +549,27 @@ func (t *tenantOperator) ListClusters(user user.Info, queryParam *query.Query) (
items = append(items, cluster) items = append(items, cluster)
} }
clusterByRoleBinding := false
if v, ok := queryParam.Filters[queryRoleBindingExists]; ok && v != "" {
clusterByRoleBinding, err = strconv.ParseBool(string(v))
if err != nil {
return nil, err
}
}
if clusterByRoleBinding {
byRoleBinding, err := t.getClusterByRoleBinding(context.Background(), user)
if err != nil {
return nil, err
}
for _, cluster := range byRoleBinding {
// duplicate cluster will not append to results
if !grantedClusters.Has(cluster.Name) {
items = append(items, cluster)
}
}
}
// apply additional labelSelector // apply additional labelSelector
if queryParam.LabelSelector != "" { if queryParam.LabelSelector != "" {
queryParam.Filters[query.FieldLabel] = query.Value(queryParam.LabelSelector) queryParam.Filters[query.FieldLabel] = query.Value(queryParam.LabelSelector)
@@ -558,6 +585,35 @@ func (t *tenantOperator) ListClusters(user user.Info, queryParam *query.Query) (
return result, nil return result, nil
} }
func (t *tenantOperator) getClusterByRoleBinding(ctx context.Context, user user.Info) ([]*clusterv1alpha1.Cluster, error) {
result := []*clusterv1alpha1.Cluster{}
clusters, err := t.clusterClient.ListClusters(ctx)
if err != nil {
return nil, err
}
for _, cluster := range clusters {
if !clusterutils.IsClusterReady(&cluster) {
continue
}
rtClient, err := t.clusterClient.GetRuntimeClient(cluster.Name)
if err != nil {
return nil, err
}
rbList := &iamv1beta1.RoleBindingList{}
err = rtClient.List(ctx, rbList, runtimeclient.MatchingLabels{iamv1beta1.UserReferenceLabel: user.GetName()})
if err != nil {
return nil, err
}
if len(rbList.Items) != 0 {
result = append(result, &cluster)
}
}
return result, nil
}
func (t *tenantOperator) DeleteWorkspaceTemplate(workspaceName string, opts metav1.DeleteOptions) error { func (t *tenantOperator) DeleteWorkspaceTemplate(workspaceName string, opts metav1.DeleteOptions) error {
workspace := &tenantv1beta1.WorkspaceTemplate{} workspace := &tenantv1beta1.WorkspaceTemplate{}
if err := t.client.Get(context.Background(), types.NamespacedName{Name: workspaceName}, workspace); err != nil { if err := t.client.Get(context.Background(), types.NamespacedName{Name: workspaceName}, workspace); err != nil {

View File

@@ -125,9 +125,6 @@ func (c *clusterClients) addCluster(obj interface{}) (*ClusterClient, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
if err != nil {
return nil, err
}
client, err := runtimeclient.New(restConfig, runtimeclient.Options{ client, err := runtimeclient.New(restConfig, runtimeclient.Options{
HTTPClient: httpClient, HTTPClient: httpClient,
Scheme: scheme.Scheme, Scheme: scheme.Scheme,