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..379897c56 100644 --- a/pkg/apis/tenant/v1alpha2/register.go +++ b/pkg/apis/tenant/v1alpha2/register.go @@ -134,6 +134,13 @@ 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). + 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..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" @@ -244,6 +245,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 { + klog.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..ba287e326 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,34 @@ 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 + + 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)) + 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 {