From 13ffbe896883f79c79c007ea6acb5d9ee28abb1d Mon Sep 17 00:00:00 2001 From: hongming Date: Thu, 30 Jul 2020 11:48:55 +0800 Subject: [PATCH] fix tenant resource list API Signed-off-by: hongming --- pkg/kapis/tenant/v1alpha2/handler.go | 60 ++++++++++++++++----------- pkg/kapis/tenant/v1alpha2/register.go | 16 +++++++ 2 files changed, 52 insertions(+), 24 deletions(-) diff --git a/pkg/kapis/tenant/v1alpha2/handler.go b/pkg/kapis/tenant/v1alpha2/handler.go index d45a14c9..0214b181 100644 --- a/pkg/kapis/tenant/v1alpha2/handler.go +++ b/pkg/kapis/tenant/v1alpha2/handler.go @@ -5,6 +5,7 @@ import ( "github.com/emicklei/go-restful" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apiserver/pkg/authentication/user" "k8s.io/client-go/kubernetes" "k8s.io/klog" "kubesphere.io/kubesphere/pkg/api" @@ -56,9 +57,10 @@ func (h *tenantHandler) ListWorkspaces(req *restful.Request, resp *restful.Respo } func (h *tenantHandler) ListFederatedNamespaces(req *restful.Request, resp *restful.Response) { - user, ok := request.UserFrom(req.Request.Context()) + workspace := req.PathParameter("workspace") queryParam := query.ParseQueryParameter(req) + workspaceMember, ok := request.UserFrom(req.Request.Context()) if !ok { err := fmt.Errorf("cannot obtain user info") klog.Errorln(err) @@ -66,10 +68,7 @@ func (h *tenantHandler) ListFederatedNamespaces(req *restful.Request, resp *rest return } - workspace := req.PathParameter("workspace") - - result, err := h.tenant.ListFederatedNamespaces(user, workspace, queryParam) - + result, err := h.tenant.ListFederatedNamespaces(workspaceMember, workspace, queryParam) if err != nil { api.HandleInternalError(resp, nil, err) return @@ -79,20 +78,26 @@ func (h *tenantHandler) ListFederatedNamespaces(req *restful.Request, resp *rest } func (h *tenantHandler) ListNamespaces(req *restful.Request, resp *restful.Response) { - user, ok := request.UserFrom(req.Request.Context()) + workspace := req.PathParameter("workspace") queryParam := query.ParseQueryParameter(req) - if !ok { - err := fmt.Errorf("cannot obtain user info") - klog.Errorln(err) - api.HandleForbidden(resp, nil, err) - return + var workspaceMember user.Info + if username := req.PathParameter("workspacemember"); username != "" { + workspaceMember = &user.DefaultInfo{ + Name: username, + } + } else { + requestUser, ok := request.UserFrom(req.Request.Context()) + if !ok { + err := fmt.Errorf("cannot obtain user info") + klog.Errorln(err) + api.HandleForbidden(resp, nil, err) + return + } + workspaceMember = requestUser } - workspace := req.PathParameter("workspace") - - result, err := h.tenant.ListNamespaces(user, workspace, queryParam) - + result, err := h.tenant.ListNamespaces(workspaceMember, workspace, queryParam) if err != nil { api.HandleInternalError(resp, nil, err) return @@ -102,19 +107,26 @@ func (h *tenantHandler) ListNamespaces(req *restful.Request, resp *restful.Respo } func (h *tenantHandler) ListDevOpsProjects(req *restful.Request, resp *restful.Response) { - user, ok := request.UserFrom(req.Request.Context()) + workspace := req.PathParameter("workspace") queryParam := query.ParseQueryParameter(req) - if !ok { - err := fmt.Errorf("cannot obtain user info") - klog.Errorln(err) - api.HandleForbidden(resp, nil, err) - return + var workspaceMember user.Info + if username := req.PathParameter("workspacemember"); username != "" { + workspaceMember = &user.DefaultInfo{ + Name: username, + } + } else { + requestUser, ok := request.UserFrom(req.Request.Context()) + if !ok { + err := fmt.Errorf("cannot obtain user info") + klog.Errorln(err) + api.HandleForbidden(resp, nil, err) + return + } + workspaceMember = requestUser } - workspace := req.PathParameter("workspace") - - result, err := h.tenant.ListDevOpsProjects(user, workspace, queryParam) + result, err := h.tenant.ListDevOpsProjects(workspaceMember, workspace, queryParam) if err != nil { api.HandleInternalError(resp, nil, err) diff --git a/pkg/kapis/tenant/v1alpha2/register.go b/pkg/kapis/tenant/v1alpha2/register.go index 82365826..1d535f84 100644 --- a/pkg/kapis/tenant/v1alpha2/register.go +++ b/pkg/kapis/tenant/v1alpha2/register.go @@ -130,6 +130,14 @@ func AddToContainer(c *restful.Container, factory informers.InformerFactory, k8s Doc("List the devops projects of the specified workspace for the current user"). Returns(http.StatusOK, api.StatusOK, api.ListResult{}). Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) + ws.Route(ws.GET("/workspaces/{workspace}/workspacemembers/{workspacemember}/devops"). + To(handler.ListDevOpsProjects). + Param(ws.PathParameter("workspace", "workspace name")). + Param(ws.PathParameter("workspacemember", "workspacemember username")). + Doc("List the devops projects of specified workspace for the workspace member"). + Reads(corev1.Namespace{}). + Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) ws.Route(ws.GET("/workspaces/{workspace}/namespaces/{namespace}"). To(handler.DescribeNamespace). Param(ws.PathParameter("workspace", "workspace name")). @@ -149,6 +157,14 @@ func AddToContainer(c *restful.Container, factory informers.InformerFactory, k8s Reads(corev1.Namespace{}). Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}). Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) + ws.Route(ws.GET("/workspaces/{workspace}/workspacemembers/{workspacemember}/namespaces"). + To(handler.ListNamespaces). + Param(ws.PathParameter("workspace", "workspace name")). + Param(ws.PathParameter("workspacemember", "workspacemember username")). + Doc("List the namespaces of the specified workspace for the workspace member"). + Reads(corev1.Namespace{}). + Returns(http.StatusOK, api.StatusOK, corev1.Namespace{}). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) ws.Route(ws.PUT("/workspaces/{workspace}/namespaces/{namespace}"). To(handler.UpdateNamespace). Param(ws.PathParameter("workspace", "workspace name")). -- GitLab