Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2020fengziyang
kubesphere
提交
b982f133
K
kubesphere
项目概览
2020fengziyang
/
kubesphere
与 Fork 源项目一致
Fork自
KubeSphere / kubesphere
通知
1
Star
1
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b982f133
编写于
10月 15, 2018
作者:
R
richardxz
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update job's "rerun" function
上级
0b648032
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
81 addition
and
38 deletion
+81
-38
pkg/models/controllers/jobs.go
pkg/models/controllers/jobs.go
+78
-36
pkg/models/controllers/types.go
pkg/models/controllers/types.go
+3
-2
未找到文件。
pkg/models/controllers/jobs.go
浏览文件 @
b982f133
...
...
@@ -29,11 +29,16 @@ import (
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/cache"
"reflect"
"strings"
"kubesphere.io/kubesphere/pkg/client"
)
var
k8sClient
*
kubernetes
.
Clientset
const
retryTimes
=
3
func
(
ctl
*
JobCtl
)
generateObject
(
item
v1
.
Job
)
*
Job
{
var
status
,
displayName
string
...
...
@@ -134,11 +139,13 @@ func (ctl *JobCtl) initListerAndInformer() {
object
:=
obj
.
(
*
v1
.
Job
)
mysqlObject
:=
ctl
.
generateObject
(
*
object
)
ctl
.
makeRevision
(
object
)
db
.
Create
(
mysqlObject
)
},
UpdateFunc
:
func
(
old
,
new
interface
{})
{
object
:=
new
.
(
*
v1
.
Job
)
mysqlObject
:=
ctl
.
generateObject
(
*
object
)
ctl
.
makeRevision
(
object
)
db
.
Save
(
mysqlObject
)
},
DeleteFunc
:
func
(
obj
interface
{})
{
...
...
@@ -186,41 +193,41 @@ func getRevisions(job v1.Job) (JobRevisions, error) {
err
:=
json
.
Unmarshal
([]
byte
(
revisionsStr
),
&
revisions
)
if
err
!=
nil
{
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
err
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to rerun job %s"
,
job
.
Name
)
return
nil
,
fmt
.
Errorf
(
"failed to get job %s's revisions, reason: %s"
,
job
.
Name
,
err
)
}
}
return
revisions
,
nil
}
func
get
Status
(
item
*
v1
.
Job
)
JobStatus
{
var
status
JobStatus
func
get
CurrentRevision
(
item
*
v1
.
Job
)
JobRevision
{
var
revision
JobRevision
for
_
,
condition
:=
range
item
.
Status
.
Conditions
{
if
condition
.
Type
==
"Failed"
&&
condition
.
Status
==
"True"
{
status
.
Status
=
Failed
status
.
Reasons
=
append
(
status
.
Reasons
,
condition
.
Reason
)
status
.
Messages
=
append
(
status
.
Messages
,
condition
.
Message
)
revision
.
Status
=
Failed
revision
.
Reasons
=
append
(
revision
.
Reasons
,
condition
.
Reason
)
revision
.
Messages
=
append
(
revision
.
Messages
,
condition
.
Message
)
}
if
condition
.
Type
==
"Complete"
&&
condition
.
Status
==
"True"
{
status
.
Status
=
Completed
revision
.
Status
=
Completed
}
}
if
len
(
status
.
Status
)
==
0
{
status
.
Status
=
Unfinished
if
len
(
revision
.
Status
)
==
0
{
revision
.
Status
=
Running
}
status
.
DesirePodNum
=
*
item
.
Spec
.
Completions
status
.
Succeed
=
item
.
Status
.
Succeeded
status
.
Failed
=
item
.
Status
.
Failed
status
.
StartTime
=
item
.
Status
.
StartTime
.
Time
revision
.
DesirePodNum
=
*
item
.
Spec
.
Completions
revision
.
Succeed
=
item
.
Status
.
Succeeded
revision
.
Failed
=
item
.
Status
.
Failed
revision
.
StartTime
=
item
.
CreationTimestamp
.
Time
revision
.
Uid
=
string
(
item
.
UID
)
if
item
.
Status
.
CompletionTime
!=
nil
{
status
.
CompletionTime
=
item
.
Status
.
CompletionTime
.
Time
revision
.
CompletionTime
=
item
.
Status
.
CompletionTime
.
Time
}
return
status
return
revision
}
func
deleteJob
(
namespace
,
job
string
)
error
{
...
...
@@ -229,46 +236,81 @@ func deleteJob(namespace, job string) error {
return
err
}
func
(
ctl
*
JobCtl
)
makeRevision
(
job
*
v1
.
Job
)
{
revisionIndex
:=
-
1
revisions
,
err
:=
getRevisions
(
*
job
)
if
err
!=
nil
{
glog
.
Error
(
err
)
return
}
uid
:=
job
.
UID
for
index
,
revision
:=
range
revisions
{
if
revision
.
Uid
==
string
(
uid
)
{
currentRevision
:=
getCurrentRevision
(
job
)
if
reflect
.
DeepEqual
(
currentRevision
,
revision
)
{
return
}
else
{
revisionIndex
=
index
break
}
}
}
if
revisionIndex
==
-
1
{
revisionIndex
=
len
(
revisions
)
+
1
}
revisions
[
revisionIndex
]
=
getCurrentRevision
(
job
)
revisionsByte
,
err
:=
json
.
Marshal
(
revisions
)
if
err
!=
nil
{
glog
.
Error
(
err
)
}
if
job
.
Annotations
==
nil
{
job
.
Annotations
=
make
(
map
[
string
]
string
)
}
job
.
Annotations
[
"revisions"
]
=
string
(
revisionsByte
)
ctl
.
K8sClient
.
BatchV1
()
.
Jobs
(
job
.
Namespace
)
.
Update
(
job
)
}
func
JobReRun
(
namespace
,
jobName
string
)
(
string
,
error
)
{
k8sClient
=
client
.
NewK8sClient
()
job
,
err
:=
k8sClient
.
BatchV1
()
.
Jobs
(
namespace
)
.
Get
(
jobName
,
metav1
.
GetOptions
{})
if
err
!=
nil
{
return
""
,
err
}
newJob
:=
*
job
newJob
.
ResourceVersion
=
""
newJob
.
Status
=
v1
.
JobStatus
{}
newJob
.
ObjectMeta
.
UID
=
""
newJob
.
Annotations
[
"revisions"
]
=
strings
.
Replace
(
job
.
Annotations
[
"revisions"
],
Running
,
Unfinished
,
-
1
)
delete
(
newJob
.
Spec
.
Selector
.
MatchLabels
,
"controller-uid"
)
delete
(
newJob
.
Spec
.
Template
.
ObjectMeta
.
Labels
,
"controller-uid"
)
revisions
,
err
:=
getRevisions
(
*
job
)
if
err
!=
nil
{
return
""
,
err
}
index
:=
len
(
revisions
)
+
1
value
:=
getStatus
(
job
)
revisions
[
index
]
=
value
revisionsByte
,
err
:=
json
.
Marshal
(
revisions
)
err
=
deleteJob
(
namespace
,
jobName
)
if
err
!=
nil
{
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
err
,
err
)
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
jobName
,
err
)
return
""
,
fmt
.
Errorf
(
"failed to rerun job %s"
,
jobName
)
}
newJob
.
Annotations
[
"revisions"
]
=
string
(
revisionsByte
)
err
=
deleteJob
(
job
.
Namespace
,
job
.
Name
)
if
err
!=
nil
{
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
err
,
err
)
return
""
,
fmt
.
Errorf
(
"failed to rerun job %s"
,
jobName
)
for
i
:=
0
;
i
<
retryTimes
;
i
++
{
_
,
err
=
k8sClient
.
BatchV1
()
.
Jobs
(
namespace
)
.
Create
(
&
newJob
)
if
err
!=
nil
{
time
.
Sleep
(
time
.
Second
)
continue
}
break
}
_
,
err
=
k8sClient
.
BatchV1
()
.
Jobs
(
namespace
)
.
Create
(
&
newJob
)
if
err
!=
nil
{
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
err
,
err
)
glog
.
Errorf
(
"failed to rerun job %s, reason: %s"
,
jobName
,
err
)
return
""
,
fmt
.
Errorf
(
"failed to rerun job %s"
,
jobName
)
}
...
...
pkg/models/controllers/types.go
浏览文件 @
b982f133
...
...
@@ -284,15 +284,16 @@ type StorageClass struct {
Provisioner
string
`json:"provisioner"`
}
type
JobRevisions
map
[
int
]
Job
Status
type
JobRevisions
map
[
int
]
Job
Revision
type
Job
Status
struct
{
type
Job
Revision
struct
{
Status
string
`json:"status"`
Reasons
[]
string
`json:"reasons"`
Messages
[]
string
`json:"messages"`
Succeed
int32
`json:"succeed"`
DesirePodNum
int32
`json:"desire"`
Failed
int32
`json:"failed"`
Uid
string
`json:"uid"`
StartTime
time
.
Time
`json:"start-time"`
CompletionTime
time
.
Time
`json:"completion-time"`
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录