Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2020fengziyang
kubesphere
提交
f908aa42
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,发现更多精彩内容 >>
提交
f908aa42
编写于
12月 11, 2020
作者:
LinuxSuRen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix devops project cannot be deleted due to mess up with finalizer control
Signed-off-by:
rick
<
rick@jenkins-zh.cn
>
上级
a314b31b
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
36 addition
and
23 deletion
+36
-23
pkg/controller/devopsproject/devopsproject_controller.go
pkg/controller/devopsproject/devopsproject_controller.go
+32
-16
pkg/simple/client/devops/jenkins/project.go
pkg/simple/client/devops/jenkins/project.go
+4
-7
未找到文件。
pkg/controller/devopsproject/devopsproject_controller.go
浏览文件 @
f908aa42
...
...
@@ -18,6 +18,7 @@ package devopsproject
import
(
"fmt"
"github.com/emicklei/go-restful"
v1
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1
"k8s.io/apimachinery/pkg/apis/meta/v1"
...
...
@@ -41,6 +42,7 @@ import (
devopsClient
"kubesphere.io/kubesphere/pkg/simple/client/devops"
"kubesphere.io/kubesphere/pkg/utils/k8sutil"
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
"net/http"
"reflect"
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
"time"
...
...
@@ -213,13 +215,14 @@ func (c *Controller) syncHandler(key string) error {
klog
.
V
(
8
)
.
Info
(
err
,
fmt
.
Sprintf
(
"could not get devopsproject %s "
,
key
))
return
err
}
//If the sync is successful, return handle
if
state
,
ok
:=
project
.
Annotations
[
devopsv1alpha3
.
DevOpeProjectSyncStatusAnnoKey
];
ok
&&
state
==
modelsdevops
.
StatusSuccessful
{
return
nil
}
copyProject
:=
project
.
DeepCopy
()
// DeletionTimestamp.IsZero() means DevOps project has not been deleted.
if
project
.
ObjectMeta
.
DeletionTimestamp
.
IsZero
()
{
//If the sync is successful, return handle
if
state
,
ok
:=
project
.
Annotations
[
devopsv1alpha3
.
DevOpeProjectSyncStatusAnnoKey
];
ok
&&
state
==
modelsdevops
.
StatusSuccessful
{
return
nil
}
// Use Finalizers to sync DevOps status when DevOps project was deleted
// https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#finalizers
if
!
sliceutil
.
HasString
(
project
.
ObjectMeta
.
Finalizers
,
devopsv1alpha3
.
DevOpsProjectFinalizerName
)
{
...
...
@@ -339,13 +342,31 @@ func (c *Controller) syncHandler(key string) error {
}
else
{
// Finalizers processing logic
if
sliceutil
.
HasString
(
project
.
ObjectMeta
.
Finalizers
,
devopsv1alpha3
.
DevOpsProjectFinalizerName
)
{
delSuccess
:=
false
if
err
:=
c
.
deleteDevOpsProjectInDevOps
(
project
);
err
!=
nil
{
// the status code should be 404 if the job does not exists
if
srvErr
,
ok
:=
err
.
(
restful
.
ServiceError
);
ok
{
delSuccess
=
srvErr
.
Code
==
http
.
StatusNotFound
}
else
if
srvErr
,
ok
:=
err
.
(
*
devopsClient
.
ErrorResponse
);
ok
{
delSuccess
=
srvErr
.
Response
.
StatusCode
==
http
.
StatusNotFound
}
else
{
klog
.
Error
(
fmt
.
Sprintf
(
"unexpected error type: %v, should be *restful.ServiceError"
,
err
))
}
klog
.
V
(
8
)
.
Info
(
err
,
fmt
.
Sprintf
(
"failed to delete resource %s in devops"
,
key
))
return
err
}
else
{
delSuccess
=
true
}
if
delSuccess
{
project
.
ObjectMeta
.
Finalizers
=
sliceutil
.
RemoveString
(
project
.
ObjectMeta
.
Finalizers
,
func
(
item
string
)
bool
{
return
item
==
devopsv1alpha3
.
DevOpsProjectFinalizerName
})
}
else
{
// make sure the corresponding Jenkins job can be clean
// You can remove the finalizer via kubectl manually in a very special case that Jenkins might be not able to available anymore
return
fmt
.
Errorf
(
"failed to remove devopsproject finalizer due to bad communication with Jenkins"
)
}
project
.
ObjectMeta
.
Finalizers
=
sliceutil
.
RemoveString
(
project
.
ObjectMeta
.
Finalizers
,
func
(
item
string
)
bool
{
return
item
==
devopsv1alpha3
.
DevOpsProjectFinalizerName
})
_
,
err
=
c
.
kubesphereClient
.
DevopsV1alpha3
()
.
DevOpsProjects
()
.
Update
(
project
)
if
err
!=
nil
{
...
...
@@ -390,14 +411,9 @@ func (c *Controller) bindWorkspace(project *devopsv1alpha3.DevOpsProject) (*devo
return
project
,
nil
}
func
(
c
*
Controller
)
deleteDevOpsProjectInDevOps
(
project
*
devopsv1alpha3
.
DevOpsProject
)
error
{
err
:=
c
.
devopsClient
.
DeleteDevOpsProject
(
project
.
Status
.
AdminNamespace
)
if
err
!=
nil
{
klog
.
Errorf
(
"error happened while deleting %s, %v"
,
project
.
Name
,
err
)
}
return
nil
func
(
c
*
Controller
)
deleteDevOpsProjectInDevOps
(
project
*
devopsv1alpha3
.
DevOpsProject
)
(
err
error
)
{
err
=
c
.
devopsClient
.
DeleteDevOpsProject
(
project
.
Status
.
AdminNamespace
)
return
}
func
(
c
*
Controller
)
generateNewNamespace
(
project
*
devopsv1alpha3
.
DevOpsProject
)
*
v1
.
Namespace
{
...
...
pkg/simple/client/devops/jenkins/project.go
浏览文件 @
f908aa42
...
...
@@ -20,7 +20,6 @@ import (
"github.com/emicklei/go-restful"
"k8s.io/klog"
"kubesphere.io/kubesphere/pkg/simple/client/devops"
"net/http"
)
type
DevOpsProjectRoleResponse
struct
{
...
...
@@ -37,14 +36,12 @@ func (j *Jenkins) CreateDevOpsProject(projectId string) (string, error) {
return
projectId
,
nil
}
func
(
j
*
Jenkins
)
DeleteDevOpsProject
(
projectId
string
)
error
{
_
,
err
:=
j
.
DeleteJob
(
projectId
)
if
err
!=
nil
&&
devops
.
GetDevOpsStatusCode
(
err
)
!=
http
.
StatusNotFound
{
klog
.
Errorf
(
"%+v"
,
err
)
func
(
j
*
Jenkins
)
DeleteDevOpsProject
(
projectId
string
)
(
err
error
)
{
_
,
err
=
j
.
DeleteJob
(
projectId
)
if
err
!=
nil
{
return
restful
.
NewError
(
devops
.
GetDevOpsStatusCode
(
err
),
err
.
Error
())
}
return
nil
return
}
func
(
j
*
Jenkins
)
GetDevOpsProject
(
projectId
string
)
(
string
,
error
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录