Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
水淹萌龙
kubesphere
提交
df34ee99
K
kubesphere
项目概览
水淹萌龙
/
kubesphere
与 Fork 源项目一致
Fork自
KubeSphere / kubesphere
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kubesphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
df34ee99
编写于
11月 30, 2020
作者:
LinuxSuRen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Adding approvable field to indicate if current user can approve a particular step
Signed-off-by:
rick
<
rick@jenkins-zh.cn
>
上级
8f4a6d9b
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
82 addition
and
28 deletion
+82
-28
pkg/kapis/devops/v1alpha2/devops.go
pkg/kapis/devops/v1alpha2/devops.go
+41
-26
pkg/simple/client/devops/pipeline.go
pkg/simple/client/devops/pipeline.go
+40
-1
tools/cmd/doc-gen/main.go
tools/cmd/doc-gen/main.go
+1
-1
未找到文件。
pkg/kapis/devops/v1alpha2/devops.go
浏览文件 @
df34ee99
...
...
@@ -209,24 +209,49 @@ func (h *ProjectPipelineHandler) GetPipelineRunNodes(req *restful.Request, resp
resp
.
WriteAsJson
(
res
)
}
func
(
h
*
ProjectPipelineHandler
)
hasSubmitPermission
(
req
*
restful
.
Request
)
(
hasPermit
bool
,
err
error
)
{
var
currentUserName
string
func
(
h
*
ProjectPipelineHandler
)
approvableCheck
(
nodes
[]
clientDevOps
.
NodesDetail
,
req
*
restful
.
Request
)
{
currentUserName
,
roleName
:=
h
.
getCurrentUser
(
req
)
// check if current user belong to the admin group, grant it if it's true
isAdmin
:=
roleName
==
iamv1alpha2
.
PlatformAdmin
for
i
,
node
:=
range
nodes
{
if
node
.
State
!=
clientDevOps
.
StatePaused
{
continue
}
for
j
,
step
:=
range
node
.
Steps
{
if
step
.
State
!=
clientDevOps
.
StatePaused
||
step
.
Input
==
nil
{
continue
}
nodes
[
i
]
.
Steps
[
j
]
.
Approvable
=
isAdmin
||
step
.
Input
.
Approvable
(
currentUserName
)
}
}
}
func
(
h
*
ProjectPipelineHandler
)
getCurrentUser
(
req
*
restful
.
Request
)
(
username
,
roleName
string
)
{
var
userInfo
user
.
Info
var
ok
bool
var
err
error
ctx
:=
req
.
Request
.
Context
()
if
userInfo
,
ok
=
request
.
UserFrom
(
ctx
);
ok
{
// check if current user belong to the admin group, grant it if it's true
var
role
*
iamv1alpha2
.
GlobalRole
currentUserName
=
userInfo
.
GetName
()
if
role
,
err
=
h
.
abc
.
GetGlobalRoleOfUser
(
currentUserName
);
err
==
nil
{
if
role
.
Name
==
iamv1alpha2
.
PlatformAdmin
{
hasPermit
=
true
return
}
}
else
{
return
username
=
userInfo
.
GetName
()
if
role
,
err
=
h
.
abc
.
GetGlobalRoleOfUser
(
username
);
err
==
nil
{
roleName
=
role
.
Name
}
}
return
}
func
(
h
*
ProjectPipelineHandler
)
hasSubmitPermission
(
req
*
restful
.
Request
)
(
hasPermit
bool
,
err
error
)
{
currentUserName
,
roleName
:=
h
.
getCurrentUser
(
req
)
// check if current user belong to the admin group, grant it if it's true
if
roleName
==
iamv1alpha2
.
PlatformAdmin
{
hasPermit
=
true
return
}
// step 2, check if current user if was addressed
httpReq
:=
&
http
.
Request
{
...
...
@@ -242,8 +267,7 @@ func (h *ProjectPipelineHandler) hasSubmitPermission(req *restful.Request) (hasP
nodeId
:=
req
.
PathParameter
(
"node"
)
stepId
:=
req
.
PathParameter
(
"step"
)
// find the expected submitter list which separated by common
var
expectedSubmitter
string
// check if current user can approve this input
var
res
[]
clientDevOps
.
NodesDetail
if
res
,
err
=
h
.
devopsOperator
.
GetNodesDetail
(
projectName
,
pipelineName
,
runId
,
httpReq
);
err
==
nil
{
for
_
,
node
:=
range
res
{
...
...
@@ -256,7 +280,7 @@ func (h *ProjectPipelineHandler) hasSubmitPermission(req *restful.Request) (hasP
continue
}
expectedSubmitter
=
fmt
.
Sprintf
(
"%v"
,
step
.
Input
.
Submitter
)
hasPermit
=
step
.
Input
.
Approvable
(
currentUserName
)
break
}
break
...
...
@@ -266,18 +290,6 @@ func (h *ProjectPipelineHandler) hasSubmitPermission(req *restful.Request) (hasP
err
=
errors
.
New
(
"cannot get the submitters of current pipeline run"
)
return
}
// grant all users if there's no specific one
if
expectedSubmitter
==
""
{
hasPermit
=
true
}
else
{
for
_
,
submitter
:=
range
strings
.
Split
(
expectedSubmitter
,
","
)
{
if
strings
.
TrimSpace
(
submitter
)
==
currentUserName
{
hasPermit
=
true
break
}
}
}
return
}
...
...
@@ -321,6 +333,8 @@ func (h *ProjectPipelineHandler) GetNodesDetail(req *restful.Request, resp *rest
parseErr
(
err
,
resp
)
return
}
h
.
approvableCheck
(
res
,
req
)
resp
.
WriteAsJson
(
res
)
}
...
...
@@ -548,6 +562,7 @@ func (h *ProjectPipelineHandler) GetBranchNodesDetail(req *restful.Request, resp
parseErr
(
err
,
resp
)
return
}
h
.
approvableCheck
(
res
,
req
)
resp
.
WriteAsJson
(
res
)
}
...
...
pkg/simple/client/devops/pipeline.go
浏览文件 @
df34ee99
...
...
@@ -17,9 +17,11 @@ limitations under the License.
package
devops
import
(
"fmt"
"io"
"net/http"
"net/url"
"strings"
)
type
PipelineList
struct
{
...
...
@@ -979,6 +981,8 @@ type NodeSteps struct {
StartTime
string
`json:"startTime,omitempty" description:"the time of starts"`
State
string
`json:"state,omitempty" description:"run state. e.g. SKIPPED"`
Type
string
`json:"type,omitempty" description:"type"`
// Approvable indicates if this step can be approved by current user
Approvable
bool
`json:"aprovable" description:"indicate if this step can be approved by current user"`
}
// CheckScriptCompile
...
...
@@ -1075,6 +1079,11 @@ type NodesDetail struct {
Steps
[]
NodeSteps
`json:"steps,omitempty" description:"steps"`
}
const
(
// StatePaused indicates a node or a step was paused, for example it's waiting for an iput
StatePaused
=
"PAUSED"
)
type
NodesStepsIndex
struct
{
Id
int
`json:"id,omitempty" description:"id"`
Steps
[]
NodeSteps
`json:"steps,omitempty" description:"steps"`
...
...
@@ -1095,6 +1104,37 @@ type Input struct {
Submitter
interface
{}
`json:"submitter,omitempty" description:"check submitter"`
}
// GetSubmitters returns the all submitters related to this input
func
(
i
*
Input
)
GetSubmitters
()
(
submitters
[]
string
)
{
if
i
.
Submitter
==
nil
{
return
}
submitterArray
:=
strings
.
Split
(
fmt
.
Sprintf
(
"%v"
,
i
.
Submitter
),
","
)
submitters
=
make
([]
string
,
len
(
submitterArray
))
for
i
,
submitter
:=
range
submitterArray
{
submitters
[
i
]
=
strings
.
TrimSpace
(
submitter
)
}
return
}
// Approvable returns the result if the given identify (username or group name) can approve this input
func
(
i
*
Input
)
Approvable
(
identify
string
)
(
ok
bool
)
{
submitters
:=
i
.
GetSubmitters
()
// it means anyone can approve this if there's no specific one
if
len
(
submitters
)
==
0
{
ok
=
true
}
else
{
for
_
,
submitter
:=
range
submitters
{
if
submitter
==
identify
{
ok
=
true
}
}
}
return
}
type
HttpParameters
struct
{
Method
string
`json:"method,omitempty"`
Header
http
.
Header
`json:"header,omitempty"`
...
...
@@ -1105,7 +1145,6 @@ type HttpParameters struct {
}
type
PipelineOperator
interface
{
// Pipelinne operator interface
GetPipeline
(
projectName
,
pipelineName
string
,
httpParameters
*
HttpParameters
)
(
*
Pipeline
,
error
)
ListPipelines
(
httpParameters
*
HttpParameters
)
(
*
PipelineList
,
error
)
...
...
tools/cmd/doc-gen/main.go
浏览文件 @
df34ee99
...
...
@@ -119,7 +119,7 @@ func generateSwaggerJson() []byte {
urlruntime
.
Must
(
oauth
.
AddToContainer
(
container
,
nil
,
nil
,
nil
,
nil
,
nil
))
urlruntime
.
Must
(
clusterkapisv1alpha1
.
AddToContainer
(
container
,
informerFactory
.
KubernetesSharedInformerFactory
(),
informerFactory
.
KubeSphereSharedInformerFactory
(),
""
,
""
,
""
))
urlruntime
.
Must
(
devopsv1alpha2
.
AddToContainer
(
container
,
informerFactory
.
KubeSphereSharedInformerFactory
(),
&
fakedevops
.
Devops
{},
nil
,
clientsets
.
KubeSphere
(),
fakes3
.
NewFakeS3
(),
""
))
urlruntime
.
Must
(
devopsv1alpha2
.
AddToContainer
(
container
,
informerFactory
.
KubeSphereSharedInformerFactory
(),
&
fakedevops
.
Devops
{},
nil
,
clientsets
.
KubeSphere
(),
fakes3
.
NewFakeS3
(),
""
,
am
.
NewReadOnlyOperator
(
informerFactory
)
))
urlruntime
.
Must
(
devopsv1alpha3
.
AddToContainer
(
container
,
&
fakedevops
.
Devops
{},
clientsets
.
Kubernetes
(),
clientsets
.
KubeSphere
(),
informerFactory
.
KubeSphereSharedInformerFactory
(),
informerFactory
.
KubernetesSharedInformerFactory
()))
urlruntime
.
Must
(
iamv1alpha2
.
AddToContainer
(
container
,
im
.
NewOperator
(
clientsets
.
KubeSphere
(),
informerFactory
,
nil
),
am
.
NewReadOnlyOperator
(
informerFactory
),
group
.
New
(
informerFactory
,
clientsets
.
KubeSphere
(),
clientsets
.
Kubernetes
()),
authoptions
.
NewAuthenticateOptions
()))
urlruntime
.
Must
(
monitoringv1alpha3
.
AddToContainer
(
container
,
clientsets
.
Kubernetes
(),
nil
,
informerFactory
,
nil
))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录