* add devops client interface Signed-off-by: runzexia <runzexia@yunify.com> * direct return jenkins Signed-off-by: runzexia <runzexia@yunify.com> * add some interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * update interface Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * credential op structs Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * credential handler Signed-off-by: runzexia <runzexia@yunify.com> * update devopsoperator func Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * get build sonar Signed-off-by: runzexia <runzexia@yunify.com> * sonar handler * mv code to cilent Signed-off-by: runzexia <runzexia@yunify.com> * update Signed-off-by: runzexia <runzexia@yunify.com> * project member handler Signed-off-by: runzexia <runzexia@yunify.com> * update pipeline operator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add tenant devops handler Signed-off-by: runzexia <runzexia@yunify.com> * update merge Signed-off-by: runzexia <runzexia@yunify.com> * clean Signed-off-by: runzexia <runzexia@yunify.com> * fmt Signed-off-by: runzexia <runzexia@yunify.com> * update ListPipelineRuns Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * complate pipelineOperator interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update HttpParameters Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add pipeline steps interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update pipeline GetNodesDetail Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2i api Signed-off-by: runzexia <runzexia@yunify.com> * add branch pipeline interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add scan branch interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add common interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add SCM interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add handler Signed-off-by: runzexia <runzexia@yunify.com> * add fake s3 Signed-off-by: runzexia <runzexia@yunify.com> * add webhook&check interface and update handler Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * clean Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * format Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some func Signed-off-by: runzexia <runzexia@yunify.com> * clean code Signed-off-by: runzexia <runzexia@yunify.com> * implement interface Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * fix interface GetBranchArtifacts Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add s2ibinary upload test Signed-off-by: runzexia <runzexia@yunify.com> * tenant devops Signed-off-by: runzexia <runzexia@yunify.com> * update tenant Signed-off-by: runzexia <runzexia@yunify.com> * fake Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add some unit test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * add devops tenant handler Signed-off-by: runzexia <runzexia@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * status Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update fake test Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update unit test and fake data Signed-off-by: zhuxiaoyang <sunzhu@yunify.com> * update Co-authored-by: Xiaoyang Zhu <sunzhu@yunify.com>
110 lines
3.5 KiB
Go
110 lines
3.5 KiB
Go
package jenkins
|
|
|
|
import (
|
|
"github.com/emicklei/go-restful"
|
|
"k8s.io/klog"
|
|
"kubesphere.io/kubesphere/pkg/api/devops/v1alpha2"
|
|
"kubesphere.io/kubesphere/pkg/simple/client/devops"
|
|
"net/http"
|
|
"sync"
|
|
)
|
|
|
|
type DevOpsProjectRoleResponse struct {
|
|
ProjectRole *ProjectRole
|
|
Err error
|
|
}
|
|
|
|
func (j *Jenkins) CreateDevOpsProject(username string, project *v1alpha2.DevOpsProject) (*v1alpha2.DevOpsProject, error) {
|
|
_, err := j.CreateFolder(project.ProjectId, project.Description)
|
|
if err != nil {
|
|
klog.Errorf("%+v", err)
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
var addRoleCh = make(chan *DevOpsProjectRoleResponse, 8)
|
|
var addRoleWg sync.WaitGroup
|
|
for role, permission := range JenkinsProjectPermissionMap {
|
|
addRoleWg.Add(1)
|
|
go func(role string, permission ProjectPermissionIds) {
|
|
_, err := j.AddProjectRole(GetProjectRoleName(project.ProjectId, role),
|
|
GetProjectRolePattern(project.ProjectId), permission, true)
|
|
addRoleCh <- &DevOpsProjectRoleResponse{nil, err}
|
|
addRoleWg.Done()
|
|
}(role, permission)
|
|
}
|
|
for role, permission := range JenkinsPipelinePermissionMap {
|
|
addRoleWg.Add(1)
|
|
go func(role string, permission ProjectPermissionIds) {
|
|
_, err := j.AddProjectRole(GetPipelineRoleName(project.ProjectId, role),
|
|
GetPipelineRolePattern(project.ProjectId), permission, true)
|
|
addRoleCh <- &DevOpsProjectRoleResponse{nil, err}
|
|
addRoleWg.Done()
|
|
}(role, permission)
|
|
}
|
|
addRoleWg.Wait()
|
|
close(addRoleCh)
|
|
for addRoleResponse := range addRoleCh {
|
|
if addRoleResponse.Err != nil {
|
|
klog.Errorf("%+v", addRoleResponse.Err)
|
|
return nil, restful.NewError(GetJenkinsStatusCode(addRoleResponse.Err), addRoleResponse.Err.Error())
|
|
}
|
|
}
|
|
|
|
globalRole, err := j.GetGlobalRole(JenkinsAllUserRoleName)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
if globalRole == nil {
|
|
_, err := j.AddGlobalRole(JenkinsAllUserRoleName, GlobalPermissionIds{
|
|
GlobalRead: true,
|
|
}, true)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
}
|
|
err = globalRole.AssignRole(username)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
projectRole, err := j.GetProjectRole(GetProjectRoleName(project.ProjectId, devops.ProjectOwner))
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
err = projectRole.AssignRole(username)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
pipelineRole, err := j.GetProjectRole(GetPipelineRoleName(project.ProjectId, devops.ProjectOwner))
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
err = pipelineRole.AssignRole(username)
|
|
if err != nil {
|
|
return nil, restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
return project, nil
|
|
}
|
|
|
|
func (j *Jenkins) DeleteDevOpsProject(projectId string) error {
|
|
_, err := j.DeleteJob(projectId)
|
|
|
|
if err != nil && GetJenkinsStatusCode(err) != http.StatusNotFound {
|
|
klog.Errorf("%+v", err)
|
|
return restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
|
|
roleNames := make([]string, 0)
|
|
for role := range JenkinsProjectPermissionMap {
|
|
roleNames = append(roleNames, GetProjectRoleName(projectId, role))
|
|
roleNames = append(roleNames, GetPipelineRoleName(projectId, role))
|
|
}
|
|
err = j.DeleteProjectRoles(roleNames...)
|
|
if err != nil {
|
|
klog.Errorf("%+v", err)
|
|
return restful.NewError(GetJenkinsStatusCode(err), err.Error())
|
|
}
|
|
return nil
|
|
}
|