From 93db1f982e1d63c7759f1e3f4e366fabc95b466d Mon Sep 17 00:00:00 2001 From: runzexia Date: Wed, 28 Aug 2019 15:47:15 +0800 Subject: [PATCH 1/2] get devops count by username Signed-off-by: runzexia --- pkg/apis/network/v1alpha1/common.go | 2 +- pkg/apis/tenant/v1alpha2/register.go | 8 +++++++ pkg/apiserver/tenant/tenant.go | 13 ++++++++++++ pkg/models/tenant/devops.go | 31 ++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/pkg/apis/network/v1alpha1/common.go b/pkg/apis/network/v1alpha1/common.go index d19a03710..50fa9f706 100644 --- a/pkg/apis/network/v1alpha1/common.go +++ b/pkg/apis/network/v1alpha1/common.go @@ -1,8 +1,8 @@ package v1alpha1 import ( - "kubesphere.io/kubesphere/pkg/apis/network/v1alpha1/numorstring" corev1 "k8s.io/api/core/v1" + "kubesphere.io/kubesphere/pkg/apis/network/v1alpha1/numorstring" ) // A Rule encapsulates a set of match criteria and an action. Both selector-based security Policy diff --git a/pkg/apis/tenant/v1alpha2/register.go b/pkg/apis/tenant/v1alpha2/register.go index 7e148b30e..f9dfab8a5 100644 --- a/pkg/apis/tenant/v1alpha2/register.go +++ b/pkg/apis/tenant/v1alpha2/register.go @@ -134,6 +134,14 @@ func addWebService(c *restful.Container) error { Returns(http.StatusOK, ok, models.PageableResponse{}). Doc("List the devops projects for the workspace member"). Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) + ws.Route(ws.GET("/devopscount"). + To(tenant.GetDevOpsProjectsCount). + Param(ws.PathParameter("member", "workspace member's username")). + Returns(http.StatusOK, ok, struct { + Count uint32 `json:"count"` + }{}). + Doc("Get the devops projects count for the member"). + Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) ws.Route(ws.POST("/workspaces/{workspace}/devops"). To(tenant.CreateDevopsProject). Param(ws.PathParameter("workspace", "workspace name")). diff --git a/pkg/apiserver/tenant/tenant.go b/pkg/apiserver/tenant/tenant.go index 4e7e52d7f..c4f5fb8ef 100644 --- a/pkg/apiserver/tenant/tenant.go +++ b/pkg/apiserver/tenant/tenant.go @@ -244,6 +244,19 @@ func ListDevopsProjects(req *restful.Request, resp *restful.Response) { resp.WriteAsJson(result) } +func GetDevOpsProjectsCount(req *restful.Request, resp *restful.Response) { + username := req.HeaderParameter(constants.UserNameHeader) + + result, err := tenant.GetDevOpsProjectsCount(username) + if err != nil { + glog.Errorf("%+v", err) + errors.ParseSvcErr(err, resp) + return + } + resp.WriteAsJson(struct { + Count uint32 `json:"count"` + }{Count: result}) +} func DeleteDevopsProject(req *restful.Request, resp *restful.Response) { projectId := req.PathParameter("devops") workspaceName := req.PathParameter("workspace") diff --git a/pkg/models/tenant/devops.go b/pkg/models/tenant/devops.go index bd2927405..90b2e048d 100644 --- a/pkg/models/tenant/devops.go +++ b/pkg/models/tenant/devops.go @@ -22,6 +22,7 @@ import ( "github.com/emicklei/go-restful" "github.com/gocraft/dbr" "github.com/golang/glog" + "k8s.io/klog" "kubesphere.io/kubesphere/pkg/db" "kubesphere.io/kubesphere/pkg/gojenkins" "kubesphere.io/kubesphere/pkg/gojenkins/utils" @@ -105,6 +106,36 @@ func ListDevopsProjects(workspace, username string, conditions *params.Condition return &models.PageableResponse{Items: result, TotalCount: int(count)}, nil } +func GetDevOpsProjectsCount(username string) (uint32, error) { + dbconn := devops_mysql.OpenDatabase() + + query := dbconn.Select(devops.GetColumnsFromStructWithPrefix(devops.DevOpsProjectTableName, devops.DevOpsProject{})...). + From(devops.DevOpsProjectTableName) + var sqconditions []dbr.Builder + + switch username { + case devops.KS_ADMIN: + default: + onCondition := fmt.Sprintf("%s = %s", devops.DevOpsProjectMembershipProjectIdColumn, devops.DevOpsProjectIdColumn) + query.Join(devops.DevOpsProjectMembershipTableName, onCondition) + sqconditions = append(sqconditions, db.Eq(devops.DevOpsProjectMembershipUsernameColumn, username)) + sqconditions = append(sqconditions, db.Eq( + devops.DevOpsProjectMembershipTableName+"."+devops.StatusColumn, devops.StatusActive)) + } + + sqconditions = append(sqconditions, db.Eq( + devops.DevOpsProjectTableName+"."+devops.StatusColumn, devops.StatusActive)) + if len(sqconditions) > 0 { + query.Where(db.And(sqconditions...)) + } + count, err := query.Count() + if err != nil { + klog.Errorf("%+v", err) + return 0, restful.NewError(http.StatusInternalServerError, err.Error()) + } + return count, nil +} + func DeleteDevOpsProject(projectId, username string) error { err := devops.CheckProjectUserInRole(username, projectId, []string{devops.ProjectOwner}) if err != nil { From 003bba5b62846720ee80953620319784d9a311a6 Mon Sep 17 00:00:00 2001 From: runzexia Date: Mon, 2 Sep 2019 12:58:47 +0800 Subject: [PATCH 2/2] fix comment Signed-off-by: runzexia --- pkg/apis/tenant/v1alpha2/register.go | 1 - pkg/apiserver/tenant/tenant.go | 3 ++- pkg/models/tenant/devops.go | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/apis/tenant/v1alpha2/register.go b/pkg/apis/tenant/v1alpha2/register.go index f9dfab8a5..379897c56 100644 --- a/pkg/apis/tenant/v1alpha2/register.go +++ b/pkg/apis/tenant/v1alpha2/register.go @@ -136,7 +136,6 @@ func addWebService(c *restful.Container) error { Metadata(restfulspec.KeyOpenAPITags, []string{constants.TenantResourcesTag})) ws.Route(ws.GET("/devopscount"). To(tenant.GetDevOpsProjectsCount). - Param(ws.PathParameter("member", "workspace member's username")). Returns(http.StatusOK, ok, struct { Count uint32 `json:"count"` }{}). diff --git a/pkg/apiserver/tenant/tenant.go b/pkg/apiserver/tenant/tenant.go index c4f5fb8ef..23557d075 100644 --- a/pkg/apiserver/tenant/tenant.go +++ b/pkg/apiserver/tenant/tenant.go @@ -24,6 +24,7 @@ import ( rbacv1 "k8s.io/api/rbac/v1" k8serr "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/util/net" + "k8s.io/klog" "kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1" "kubesphere.io/kubesphere/pkg/apiserver/logging" "kubesphere.io/kubesphere/pkg/constants" @@ -249,7 +250,7 @@ func GetDevOpsProjectsCount(req *restful.Request, resp *restful.Response) { result, err := tenant.GetDevOpsProjectsCount(username) if err != nil { - glog.Errorf("%+v", err) + klog.Errorf("%+v", err) errors.ParseSvcErr(err, resp) return } diff --git a/pkg/models/tenant/devops.go b/pkg/models/tenant/devops.go index 90b2e048d..ba287e326 100644 --- a/pkg/models/tenant/devops.go +++ b/pkg/models/tenant/devops.go @@ -113,9 +113,7 @@ func GetDevOpsProjectsCount(username string) (uint32, error) { From(devops.DevOpsProjectTableName) var sqconditions []dbr.Builder - switch username { - case devops.KS_ADMIN: - default: + if username != devops.KS_ADMIN { onCondition := fmt.Sprintf("%s = %s", devops.DevOpsProjectMembershipProjectIdColumn, devops.DevOpsProjectIdColumn) query.Join(devops.DevOpsProjectMembershipTableName, onCondition) sqconditions = append(sqconditions, db.Eq(devops.DevOpsProjectMembershipUsernameColumn, username))