clean old devops code
todo impl use informer Signed-off-by: runzexia <runzexia@yunify.com>
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 The KubeSphere Authors.
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package devops
|
||||
|
||||
import "kubesphere.io/kubesphere/pkg/simple/client/devops"
|
||||
|
||||
const (
|
||||
ProjectMembershipTableName = "project_membership"
|
||||
ProjectMembershipUsernameColumn = "project_membership.username"
|
||||
ProjectMembershipProjectIdColumn = "project_membership.project_id"
|
||||
ProjectMembershipRoleColumn = "project_membership.role"
|
||||
)
|
||||
|
||||
var ProjectMembershipColumns = GetColumnsFromStruct(&devops.ProjectMembership{})
|
||||
|
||||
func NewDevOpsProjectMemberShip(username, projectId, role, grantBy string) *devops.ProjectMembership {
|
||||
return &devops.ProjectMembership{
|
||||
Username: username,
|
||||
ProjectId: projectId,
|
||||
Role: role,
|
||||
Status: StatusActive,
|
||||
GrantBy: grantBy,
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 The KubeSphere Authors.
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
package devops
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/asaskevich/govalidator"
|
||||
"github.com/emicklei/go-restful"
|
||||
"github.com/gocraft/dbr"
|
||||
"k8s.io/klog"
|
||||
"kubesphere.io/kubesphere/pkg/api/devops/v1alpha2"
|
||||
"kubesphere.io/kubesphere/pkg/db"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/devops"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/mysql"
|
||||
"kubesphere.io/kubesphere/pkg/utils/reflectutils"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type ProjectOperator interface {
|
||||
GetProject(projectId string) (*v1alpha2.DevOpsProject, error)
|
||||
UpdateProject(project *v1alpha2.DevOpsProject) (*v1alpha2.DevOpsProject, error)
|
||||
}
|
||||
|
||||
type projectOperator struct {
|
||||
db *mysql.Database
|
||||
}
|
||||
|
||||
func NewProjectOperator(dbClient *mysql.Database) ProjectOperator {
|
||||
return &projectOperator{db: dbClient}
|
||||
}
|
||||
|
||||
func (o *projectOperator) GetProject(projectId string) (*v1alpha2.DevOpsProject, error) {
|
||||
|
||||
project := &v1alpha2.DevOpsProject{}
|
||||
err := o.db.Select(DevOpsProjectColumns...).
|
||||
From(DevOpsProjectTableName).
|
||||
Where(db.Eq(DevOpsProjectIdColumn, projectId)).
|
||||
LoadOne(project)
|
||||
if err != nil && err != dbr.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if err == dbr.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
|
||||
return nil, restful.NewError(http.StatusNotFound, err.Error())
|
||||
}
|
||||
return project, nil
|
||||
}
|
||||
|
||||
func (o *projectOperator) UpdateProject(project *v1alpha2.DevOpsProject) (*v1alpha2.DevOpsProject, error) {
|
||||
|
||||
query := o.db.Update(DevOpsProjectTableName)
|
||||
if !govalidator.IsNull(project.Description) {
|
||||
query.Set(DevOpsProjectDescriptionColumn, project.Description)
|
||||
}
|
||||
if !govalidator.IsNull(project.Extra) {
|
||||
query.Set(DevOpsProjectExtraColumn, project.Extra)
|
||||
}
|
||||
if !govalidator.IsNull(project.Name) {
|
||||
query.Set(DevOpsProjectNameColumn, project.Name)
|
||||
}
|
||||
if len(query.UpdateStmt.Value) > 0 {
|
||||
_, err := query.
|
||||
Where(db.Eq(DevOpsProjectIdColumn, project.ProjectId)).Exec()
|
||||
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
}
|
||||
newProject := &v1alpha2.DevOpsProject{}
|
||||
err := o.db.Select(DevOpsProjectColumns...).
|
||||
From(DevOpsProjectTableName).
|
||||
Where(db.Eq(DevOpsProjectIdColumn, project.ProjectId)).
|
||||
LoadOne(newProject)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return newProject, nil
|
||||
}
|
||||
|
||||
func (o *projectOperator) CheckProjectUserInRole(username, projectId string, roles []string) error {
|
||||
if username == KS_ADMIN {
|
||||
return nil
|
||||
}
|
||||
membership := &devops.ProjectMembership{}
|
||||
err := o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipUsernameColumn, username),
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId))).LoadOne(membership)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !reflectutils.In(membership.Role, roles) {
|
||||
return fmt.Errorf("user [%s] in project [%s] role is not in %s", username, projectId, roles)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -1,255 +0,0 @@
|
||||
/*
|
||||
Copyright 2018 The KubeSphere Authors.
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
package devops
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"k8s.io/klog"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/devops"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/mysql"
|
||||
"net/http"
|
||||
|
||||
"github.com/emicklei/go-restful"
|
||||
"github.com/gocraft/dbr"
|
||||
"kubesphere.io/kubesphere/pkg/db"
|
||||
"kubesphere.io/kubesphere/pkg/models"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
)
|
||||
|
||||
type ProjectMemberOperator interface {
|
||||
GetProjectMembers(projectId string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error)
|
||||
GetProjectMember(projectId, username string) (*devops.ProjectMembership, error)
|
||||
AddProjectMember(projectId string, membership *devops.ProjectMembership) (*devops.ProjectMembership, error)
|
||||
UpdateProjectMember(projectId string, membership *devops.ProjectMembership) (*devops.ProjectMembership, error)
|
||||
DeleteProjectMember(projectId, username string) (string, error)
|
||||
}
|
||||
type projectMemberOperator struct {
|
||||
db *mysql.Database
|
||||
projectMemberOperator devops.ProjectMemberOperator
|
||||
}
|
||||
|
||||
func NewProjectMemberOperator(devopsClient devops.ProjectMemberOperator, dbClient *mysql.Database) ProjectMemberOperator {
|
||||
return &projectMemberOperator{
|
||||
db: dbClient,
|
||||
projectMemberOperator: devopsClient,
|
||||
}
|
||||
}
|
||||
|
||||
func (o *projectMemberOperator) GetProjectMembers(projectId string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error) {
|
||||
|
||||
memberships := make([]*devops.ProjectMembership, 0)
|
||||
var sqconditions []dbr.Builder
|
||||
sqconditions = append(sqconditions, db.Eq(ProjectMembershipProjectIdColumn, projectId))
|
||||
if keyword := conditions.Match["keyword"]; keyword != "" {
|
||||
sqconditions = append(sqconditions, db.Like(ProjectMembershipUsernameColumn, keyword))
|
||||
}
|
||||
query := *o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName)
|
||||
switch orderBy {
|
||||
case "name":
|
||||
if reverse {
|
||||
query.OrderDesc(ProjectMembershipUsernameColumn)
|
||||
} else {
|
||||
query.OrderAsc(ProjectMembershipUsernameColumn)
|
||||
}
|
||||
default:
|
||||
if reverse {
|
||||
query.OrderDesc(ProjectMembershipRoleColumn)
|
||||
} else {
|
||||
query.OrderAsc(ProjectMembershipRoleColumn)
|
||||
}
|
||||
}
|
||||
query.Limit(uint64(limit))
|
||||
query.Offset(uint64(offset))
|
||||
if len(sqconditions) > 1 {
|
||||
query.Where(db.And(sqconditions...))
|
||||
} else {
|
||||
query.Where(sqconditions[0])
|
||||
}
|
||||
_, err := query.Load(&memberships)
|
||||
if err != nil && err != dbr.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
count, err := query.Count()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
result := make([]interface{}, 0)
|
||||
for _, v := range memberships {
|
||||
result = append(result, v)
|
||||
}
|
||||
|
||||
return &models.PageableResponse{Items: result, TotalCount: int(count)}, nil
|
||||
}
|
||||
|
||||
func (o *projectMemberOperator) GetProjectMember(projectId, username string) (*devops.ProjectMembership, error) {
|
||||
|
||||
member := &devops.ProjectMembership{}
|
||||
err := o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
db.Eq(ProjectMembershipUsernameColumn, username))).
|
||||
LoadOne(&member)
|
||||
if err != nil && err != dbr.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if err == dbr.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusNotFound, err.Error())
|
||||
}
|
||||
return member, nil
|
||||
}
|
||||
|
||||
func (o *projectMemberOperator) AddProjectMember(projectId string, membership *devops.ProjectMembership) (*devops.ProjectMembership, error) {
|
||||
|
||||
dbmembership := &devops.ProjectMembership{}
|
||||
err := o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipUsernameColumn, membership.Username),
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId))).LoadOne(dbmembership)
|
||||
// if user could be founded in db, user have been added to project
|
||||
if err == nil {
|
||||
err = fmt.Errorf("user [%s] have been added to project", membership.Username)
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
if err != db.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
_, err = o.projectMemberOperator.AddProjectMember(membership)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, err
|
||||
}
|
||||
projectMembership := NewDevOpsProjectMemberShip(membership.Username, projectId, membership.Role, membership.GrantBy)
|
||||
_, err = o.db.
|
||||
InsertInto(ProjectMembershipTableName).
|
||||
Columns(ProjectMembershipColumns...).
|
||||
Record(projectMembership).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
_, err = o.projectMemberOperator.DeleteProjectMember(membership)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, err
|
||||
}
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return projectMembership, nil
|
||||
}
|
||||
|
||||
func (o *projectMemberOperator) UpdateProjectMember(projectId string, membership *devops.ProjectMembership) (*devops.ProjectMembership, error) {
|
||||
|
||||
oldMembership := &devops.ProjectMembership{}
|
||||
err := o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipUsernameColumn, membership.Username),
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
)).LoadOne(oldMembership)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
_, err = o.projectMemberOperator.UpdateProjectMember(oldMembership, membership)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, err
|
||||
}
|
||||
_, err = o.db.Update(ProjectMembershipTableName).
|
||||
Set(ProjectMembershipRoleColumn, membership.Role).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
db.Eq(ProjectMembershipUsernameColumn, membership.Username),
|
||||
)).Exec()
|
||||
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
responseMembership := &devops.ProjectMembership{}
|
||||
err = o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipUsernameColumn, membership.Username),
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
)).LoadOne(responseMembership)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return responseMembership, nil
|
||||
}
|
||||
|
||||
func (o *projectMemberOperator) DeleteProjectMember(projectId, username string) (string, error) {
|
||||
|
||||
oldMembership := &devops.ProjectMembership{}
|
||||
err := o.db.Select(ProjectMembershipColumns...).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipUsernameColumn, username),
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
)).LoadOne(oldMembership)
|
||||
if err != nil {
|
||||
if err != db.ErrNotFound {
|
||||
klog.Errorf("%+v", err)
|
||||
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
} else if err == db.ErrNotFound {
|
||||
klog.Warningf("user [%s] not found in project", username)
|
||||
return username, nil
|
||||
}
|
||||
}
|
||||
|
||||
if oldMembership.Role == devops.ProjectOwner {
|
||||
count, err := o.db.Select(ProjectMembershipProjectIdColumn).
|
||||
From(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
db.Eq(ProjectMembershipRoleColumn, devops.ProjectOwner))).Count()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
if count == 1 {
|
||||
err = fmt.Errorf("project must has at least one admin")
|
||||
klog.Errorf("%+v", err)
|
||||
return "", restful.NewError(http.StatusBadRequest, err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
_, err = o.projectMemberOperator.DeleteProjectMember(oldMembership)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return "", err
|
||||
}
|
||||
|
||||
_, err = o.db.DeleteFrom(ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(ProjectMembershipProjectIdColumn, projectId),
|
||||
db.Eq(ProjectMembershipUsernameColumn, username),
|
||||
)).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return "", restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return username, nil
|
||||
}
|
||||
@@ -18,202 +18,26 @@
|
||||
package tenant
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/emicklei/go-restful"
|
||||
"github.com/gocraft/dbr"
|
||||
"k8s.io/klog"
|
||||
"kubesphere.io/kubesphere/pkg/api/devops/v1alpha2"
|
||||
"kubesphere.io/kubesphere/pkg/db"
|
||||
"kubesphere.io/kubesphere/pkg/models"
|
||||
"kubesphere.io/kubesphere/pkg/models/devops"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
dsClient "kubesphere.io/kubesphere/pkg/simple/client/devops"
|
||||
"kubesphere.io/kubesphere/pkg/simple/client/mysql"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type DevOpsProjectOperator interface {
|
||||
ListDevOpsProjects(workspace, username string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error)
|
||||
CreateDevOpsProject(username string, workspace string, req *v1alpha2.DevOpsProject) (*v1alpha2.DevOpsProject, error)
|
||||
GetDevOpsProjectsCount(username string) (uint32, error)
|
||||
DeleteDevOpsProject(projectId, username string) error
|
||||
type DevOpsProjectLister interface {
|
||||
ListDevOpsProjects(workspace string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error)
|
||||
}
|
||||
|
||||
type devopsProjectOperator struct {
|
||||
ksProjectOperator devops.ProjectOperator
|
||||
db *mysql.Database
|
||||
dsProject dsClient.ProjectOperator
|
||||
type devopsProjectLister struct {
|
||||
dsProject dsClient.ProjectOperator
|
||||
}
|
||||
|
||||
func newProjectOperator(operator devops.ProjectOperator, db *mysql.Database, client dsClient.ProjectOperator) DevOpsProjectOperator {
|
||||
return &devopsProjectOperator{
|
||||
ksProjectOperator: operator,
|
||||
db: db,
|
||||
dsProject: client,
|
||||
func newProjectLister(client dsClient.ProjectOperator) DevOpsProjectLister {
|
||||
return &devopsProjectLister{
|
||||
dsProject: client,
|
||||
}
|
||||
}
|
||||
|
||||
func (o *devopsProjectOperator) ListDevOpsProjects(workspace, username string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error) {
|
||||
|
||||
query := o.db.Select(devops.GetColumnsFromStructWithPrefix(devops.DevOpsProjectTableName, v1alpha2.DevOpsProject{})...).
|
||||
From(devops.DevOpsProjectTableName)
|
||||
var sqconditions []dbr.Builder
|
||||
|
||||
sqconditions = append(sqconditions, db.Eq(devops.DevOpsProjectWorkSpaceColumn, workspace))
|
||||
|
||||
switch username {
|
||||
case devops.KS_ADMIN:
|
||||
default:
|
||||
onCondition := fmt.Sprintf("%s = %s", devops.ProjectMembershipProjectIdColumn, devops.DevOpsProjectIdColumn)
|
||||
query.Join(devops.ProjectMembershipTableName, onCondition)
|
||||
sqconditions = append(sqconditions, db.Eq(devops.ProjectMembershipUsernameColumn, username))
|
||||
sqconditions = append(sqconditions, db.Eq(
|
||||
devops.ProjectMembershipTableName+"."+devops.StatusColumn, devops.StatusActive))
|
||||
}
|
||||
|
||||
sqconditions = append(sqconditions, db.Eq(
|
||||
devops.DevOpsProjectTableName+"."+devops.StatusColumn, devops.StatusActive))
|
||||
if keyword := conditions.Match["keyword"]; keyword != "" {
|
||||
sqconditions = append(sqconditions, db.Like(devops.DevOpsProjectNameColumn, keyword))
|
||||
}
|
||||
projects := make([]*v1alpha2.DevOpsProject, 0)
|
||||
|
||||
if len(sqconditions) > 0 {
|
||||
query.Where(db.And(sqconditions...))
|
||||
}
|
||||
switch orderBy {
|
||||
case "name":
|
||||
if reverse {
|
||||
query.OrderDesc(devops.DevOpsProjectNameColumn)
|
||||
} else {
|
||||
query.OrderAsc(devops.DevOpsProjectNameColumn)
|
||||
}
|
||||
default:
|
||||
if reverse {
|
||||
query.OrderAsc(devops.DevOpsProjectCreateTimeColumn)
|
||||
} else {
|
||||
query.OrderDesc(devops.DevOpsProjectCreateTimeColumn)
|
||||
}
|
||||
|
||||
}
|
||||
query.Limit(uint64(limit))
|
||||
query.Offset(uint64(offset))
|
||||
_, err := query.Load(&projects)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
count, err := query.Count()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
result := make([]interface{}, 0)
|
||||
for _, v := range projects {
|
||||
result = append(result, v)
|
||||
}
|
||||
|
||||
return &models.PageableResponse{Items: result, TotalCount: int(count)}, nil
|
||||
}
|
||||
|
||||
func (o *devopsProjectOperator) GetDevOpsProjectsCount(username string) (uint32, error) {
|
||||
|
||||
query := o.db.Select(devops.GetColumnsFromStructWithPrefix(devops.DevOpsProjectTableName, v1alpha2.DevOpsProject{})...).
|
||||
From(devops.DevOpsProjectTableName)
|
||||
var sqconditions []dbr.Builder
|
||||
|
||||
if username != devops.KS_ADMIN {
|
||||
onCondition := fmt.Sprintf("%s = %s", devops.ProjectMembershipProjectIdColumn, devops.DevOpsProjectIdColumn)
|
||||
query.Join(devops.ProjectMembershipTableName, onCondition)
|
||||
sqconditions = append(sqconditions, db.Eq(devops.ProjectMembershipUsernameColumn, username))
|
||||
sqconditions = append(sqconditions, db.Eq(
|
||||
devops.ProjectMembershipTableName+"."+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 (o *devopsProjectOperator) DeleteDevOpsProject(projectId, username string) error {
|
||||
err := o.dsProject.DeleteDevOpsProject(projectId)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return err
|
||||
}
|
||||
_, err = o.db.DeleteFrom(devops.ProjectMembershipTableName).
|
||||
Where(db.Eq(devops.ProjectMembershipProjectIdColumn, projectId)).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return err
|
||||
}
|
||||
_, err = o.db.Update(devops.DevOpsProjectTableName).
|
||||
Set(devops.StatusColumn, devops.StatusDeleted).
|
||||
Where(db.Eq(devops.DevOpsProjectIdColumn, projectId)).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return err
|
||||
}
|
||||
project := &v1alpha2.DevOpsProject{}
|
||||
err = o.db.Select(devops.DevOpsProjectColumns...).
|
||||
From(devops.DevOpsProjectTableName).
|
||||
Where(db.Eq(devops.DevOpsProjectIdColumn, projectId)).
|
||||
LoadOne(project)
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *devopsProjectOperator) CreateDevOpsProject(username string, workspace string, req *v1alpha2.DevOpsProject) (*v1alpha2.DevOpsProject, error) {
|
||||
|
||||
project := devops.NewDevOpsProject(req.Name, req.Description, username, req.Extra, workspace)
|
||||
_, err := o.dsProject.CreateDevOpsProject(project.ProjectId)
|
||||
if err != nil {
|
||||
klog.Error(err)
|
||||
return nil, err
|
||||
}
|
||||
_, err = o.db.InsertInto(devops.DevOpsProjectTableName).
|
||||
Columns(devops.DevOpsProjectColumns...).Record(project).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
projectMembership := devops.NewDevOpsProjectMemberShip(username, project.ProjectId, dsClient.ProjectOwner, username)
|
||||
_, err = o.db.InsertInto(devops.ProjectMembershipTableName).
|
||||
Columns(devops.ProjectMembershipColumns...).Record(projectMembership).Exec()
|
||||
if err != nil {
|
||||
klog.Errorf("%+v", err)
|
||||
return nil, restful.NewError(http.StatusInternalServerError, err.Error())
|
||||
}
|
||||
return project, nil
|
||||
}
|
||||
|
||||
func (o *devopsProjectOperator) getProjectUserRole(username, projectId string) (string, error) {
|
||||
if username == devops.KS_ADMIN {
|
||||
return dsClient.ProjectOwner, nil
|
||||
}
|
||||
|
||||
membership := &dsClient.ProjectMembership{}
|
||||
err := o.db.Select(devops.ProjectMembershipColumns...).
|
||||
From(devops.ProjectMembershipTableName).
|
||||
Where(db.And(
|
||||
db.Eq(devops.ProjectMembershipUsernameColumn, username),
|
||||
db.Eq(devops.ProjectMembershipProjectIdColumn, projectId))).LoadOne(membership)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return membership.Role, nil
|
||||
func (o *devopsProjectLister) ListDevOpsProjects(workspace string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error) {
|
||||
//TODO: @runzexia use informer to impl it
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
@@ -35,32 +35,18 @@ type Interface interface {
|
||||
DescribeWorkspace(username, workspace string) (*v1alpha1.Workspace, error)
|
||||
ListWorkspaces(username string, conditions *params.Conditions, orderBy string, reverse bool, limit, offset int) (*models.PageableResponse, error)
|
||||
ListNamespaces(username string, conditions *params.Conditions, orderBy string, reverse bool, limit, offset int) (*models.PageableResponse, error)
|
||||
ListDevopsProjects(username string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error)
|
||||
CountDevOpsProjects(username string) (uint32, error)
|
||||
DeleteDevOpsProject(username, projectId string) error
|
||||
ListDevopsProjects(conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error)
|
||||
}
|
||||
|
||||
type tenantOperator struct {
|
||||
workspaces WorkspaceInterface
|
||||
namespaces NamespaceInterface
|
||||
am am.AccessManagementInterface
|
||||
devops DevOpsProjectOperator
|
||||
devops DevOpsProjectLister
|
||||
}
|
||||
|
||||
func (t *tenantOperator) CountDevOpsProjects(username string) (uint32, error) {
|
||||
return t.devops.GetDevOpsProjectsCount(username)
|
||||
}
|
||||
|
||||
func (t *tenantOperator) DeleteDevOpsProject(username, projectId string) error {
|
||||
return t.devops.DeleteDevOpsProject(projectId, username)
|
||||
}
|
||||
|
||||
func (t *tenantOperator) GetUserDevopsSimpleRules(username string, projectId string) (interface{}, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (t *tenantOperator) ListDevopsProjects(username string, conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error) {
|
||||
return t.devops.ListDevOpsProjects(conditions.Match["workspace"], username, conditions, orderBy, reverse, limit, offset)
|
||||
func (t *tenantOperator) ListDevopsProjects(conditions *params.Conditions, orderBy string, reverse bool, limit int, offset int) (*models.PageableResponse, error) {
|
||||
return t.devops.ListDevOpsProjects(conditions.Match["workspace"], conditions, orderBy, reverse, limit, offset)
|
||||
}
|
||||
|
||||
func (t *tenantOperator) DeleteNamespace(workspace, namespace string) error {
|
||||
|
||||
@@ -25,8 +25,6 @@ import (
|
||||
"kubesphere.io/kubesphere/pkg/apis/tenant/v1alpha1"
|
||||
"kubesphere.io/kubesphere/pkg/client/informers/externalversions"
|
||||
"kubesphere.io/kubesphere/pkg/constants"
|
||||
"kubesphere.io/kubesphere/pkg/db"
|
||||
"kubesphere.io/kubesphere/pkg/models/devops"
|
||||
"kubesphere.io/kubesphere/pkg/models/iam/am"
|
||||
"kubesphere.io/kubesphere/pkg/models/resources/v1alpha2"
|
||||
"kubesphere.io/kubesphere/pkg/server/params"
|
||||
@@ -115,17 +113,8 @@ func (w *workspaceOperator) AddUser(workspaceName string, user *InWorkspaceUser)
|
||||
}
|
||||
|
||||
func (w *workspaceOperator) CountDevopsProjectsInWorkspace(workspaceName string) (int, error) {
|
||||
query := w.db.Select(devops.DevOpsProjectIdColumn).
|
||||
From(devops.DevOpsProjectTableName).
|
||||
Where(db.And(db.Eq(devops.DevOpsProjectWorkSpaceColumn, workspaceName),
|
||||
db.Eq(devops.StatusColumn, devops.StatusActive)))
|
||||
|
||||
devOpsProjects := make([]string, 0)
|
||||
|
||||
if _, err := query.Load(&devOpsProjects); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return len(devOpsProjects), nil
|
||||
//TODO:runzexia use informer to impl it
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (w *workspaceOperator) CountUsersInWorkspace(workspace string) (int, error) {
|
||||
|
||||
Reference in New Issue
Block a user