Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
水淹萌龙
kubesphere
提交
e1a70bc8
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看板
未验证
提交
e1a70bc8
编写于
10月 17, 2019
作者:
H
hongming
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: support app.k8s.io applications paging query
Signed-off-by:
N
hongming
<
talonwan@yunify.com
>
上级
90961a24
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
181 addition
and
0 deletion
+181
-0
cmd/ks-apiserver/app/server.go
cmd/ks-apiserver/app/server.go
+20
-0
pkg/informers/informers.go
pkg/informers/informers.go
+11
-0
pkg/models/resources/appplications.go
pkg/models/resources/appplications.go
+135
-0
pkg/models/resources/resources.go
pkg/models/resources/resources.go
+2
-0
pkg/simple/client/k8s/kubernetes.go
pkg/simple/client/k8s/kubernetes.go
+13
-0
未找到文件。
cmd/ks-apiserver/app/server.go
浏览文件 @
e1a70bc8
...
...
@@ -291,6 +291,26 @@ func WaitForResourceSync(stopCh <-chan struct{}) error {
ksInformerFactory
.
Start
(
stopCh
)
ksInformerFactory
.
WaitForCacheSync
(
stopCh
)
appInformerFactory
:=
informers
.
AppSharedInformerFactory
()
appGVRs
:=
[]
schema
.
GroupVersionResource
{
{
Group
:
"app.k8s.io"
,
Version
:
"v1beta1"
,
Resource
:
"applications"
},
}
for
_
,
gvr
:=
range
appGVRs
{
if
!
isResourceExists
(
gvr
)
{
klog
.
Warningf
(
"resource %s not exists in the cluster"
,
gvr
)
}
else
{
_
,
err
:=
appInformerFactory
.
ForResource
(
gvr
)
if
err
!=
nil
{
return
err
}
}
}
appInformerFactory
.
Start
(
stopCh
)
appInformerFactory
.
WaitForCacheSync
(
stopCh
)
klog
.
V
(
0
)
.
Info
(
"Finished caching objects"
)
return
nil
...
...
pkg/informers/informers.go
浏览文件 @
e1a70bc8
...
...
@@ -18,6 +18,7 @@
package
informers
import
(
applicationinformers
"github.com/kubernetes-sigs/application/pkg/client/informers/externalversions"
s2iinformers
"github.com/kubesphere/s2ioperator/pkg/client/informers/externalversions"
k8sinformers
"k8s.io/client-go/informers"
ksinformers
"kubesphere.io/kubesphere/pkg/client/informers/externalversions"
...
...
@@ -32,9 +33,11 @@ var (
k8sOnce
sync
.
Once
s2iOnce
sync
.
Once
ksOnce
sync
.
Once
appOnce
sync
.
Once
informerFactory
k8sinformers
.
SharedInformerFactory
s2iInformerFactory
s2iinformers
.
SharedInformerFactory
ksInformerFactory
ksinformers
.
SharedInformerFactory
appInformerFactory
applicationinformers
.
SharedInformerFactory
)
func
SharedInformerFactory
()
k8sinformers
.
SharedInformerFactory
{
...
...
@@ -60,3 +63,11 @@ func KsSharedInformerFactory() ksinformers.SharedInformerFactory {
})
return
ksInformerFactory
}
func
AppSharedInformerFactory
()
applicationinformers
.
SharedInformerFactory
{
appOnce
.
Do
(
func
()
{
appClient
:=
client
.
ClientSets
()
.
K8s
()
.
Application
()
appInformerFactory
=
applicationinformers
.
NewSharedInformerFactory
(
appClient
,
defaultResync
)
})
return
appInformerFactory
}
pkg/models/resources/appplications.go
0 → 100644
浏览文件 @
e1a70bc8
/*
*
* 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
resources
import
(
"github.com/kubernetes-sigs/application/pkg/apis/app/v1beta1"
"k8s.io/apimachinery/pkg/labels"
"kubesphere.io/kubesphere/pkg/constants"
"kubesphere.io/kubesphere/pkg/informers"
"kubesphere.io/kubesphere/pkg/server/params"
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
"sort"
"strings"
)
type
appSearcher
struct
{
}
func
(
*
appSearcher
)
get
(
namespace
,
name
string
)
(
interface
{},
error
)
{
return
informers
.
AppSharedInformerFactory
()
.
App
()
.
V1beta1
()
.
Applications
()
.
Lister
()
.
Applications
(
namespace
)
.
Get
(
name
)
}
// exactly Match
func
(
*
appSearcher
)
match
(
match
map
[
string
]
string
,
item
*
v1beta1
.
Application
)
bool
{
for
k
,
v
:=
range
match
{
switch
k
{
case
Name
:
names
:=
strings
.
Split
(
v
,
"|"
)
if
!
sliceutil
.
HasString
(
names
,
item
.
Name
)
{
return
false
}
case
Keyword
:
if
!
strings
.
Contains
(
item
.
Name
,
v
)
&&
!
searchFuzzy
(
item
.
Labels
,
""
,
v
)
&&
!
searchFuzzy
(
item
.
Annotations
,
""
,
v
)
{
return
false
}
default
:
// label not exist or value not equal
if
val
,
ok
:=
item
.
Labels
[
k
];
!
ok
||
val
!=
v
{
return
false
}
}
}
return
true
}
// Fuzzy searchInNamespace
func
(
*
appSearcher
)
fuzzy
(
fuzzy
map
[
string
]
string
,
item
*
v1beta1
.
Application
)
bool
{
for
k
,
v
:=
range
fuzzy
{
switch
k
{
case
Name
:
if
!
strings
.
Contains
(
item
.
Name
,
v
)
&&
!
strings
.
Contains
(
item
.
Annotations
[
constants
.
DisplayNameAnnotationKey
],
v
)
{
return
false
}
case
Label
:
if
!
searchFuzzy
(
item
.
Labels
,
""
,
v
)
{
return
false
}
case
annotation
:
if
!
searchFuzzy
(
item
.
Annotations
,
""
,
v
)
{
return
false
}
return
false
case
app
:
if
!
strings
.
Contains
(
item
.
Labels
[
chart
],
v
)
&&
!
strings
.
Contains
(
item
.
Labels
[
release
],
v
)
{
return
false
}
default
:
if
!
searchFuzzy
(
item
.
Labels
,
k
,
v
)
{
return
false
}
}
}
return
true
}
func
(
*
appSearcher
)
compare
(
a
,
b
*
v1beta1
.
Application
,
orderBy
string
)
bool
{
switch
orderBy
{
case
CreateTime
:
return
a
.
CreationTimestamp
.
Time
.
Before
(
b
.
CreationTimestamp
.
Time
)
case
Name
:
fallthrough
default
:
return
strings
.
Compare
(
a
.
Name
,
b
.
Name
)
<=
0
}
}
func
(
s
*
appSearcher
)
search
(
namespace
string
,
conditions
*
params
.
Conditions
,
orderBy
string
,
reverse
bool
)
([]
interface
{},
error
)
{
apps
,
err
:=
informers
.
AppSharedInformerFactory
()
.
App
()
.
V1beta1
()
.
Applications
()
.
Lister
()
.
Applications
(
namespace
)
.
List
(
labels
.
Everything
())
if
err
!=
nil
{
return
nil
,
err
}
result
:=
make
([]
*
v1beta1
.
Application
,
0
)
if
len
(
conditions
.
Match
)
==
0
&&
len
(
conditions
.
Fuzzy
)
==
0
{
result
=
apps
}
else
{
for
_
,
item
:=
range
apps
{
if
s
.
match
(
conditions
.
Match
,
item
)
&&
s
.
fuzzy
(
conditions
.
Fuzzy
,
item
)
{
result
=
append
(
result
,
item
)
}
}
}
sort
.
Slice
(
result
,
func
(
i
,
j
int
)
bool
{
if
reverse
{
tmp
:=
i
i
=
j
j
=
tmp
}
return
s
.
compare
(
result
[
i
],
result
[
j
],
orderBy
)
})
r
:=
make
([]
interface
{},
0
)
for
_
,
i
:=
range
result
{
r
=
append
(
r
,
i
)
}
return
r
,
nil
}
pkg/models/resources/resources.go
浏览文件 @
e1a70bc8
...
...
@@ -42,6 +42,7 @@ func init() {
resources
[
S2iBuilders
]
=
&
s2iBuilderSearcher
{}
resources
[
S2iRuns
]
=
&
s2iRunSearcher
{}
resources
[
HorizontalPodAutoscalers
]
=
&
hpaSearcher
{}
resources
[
Applications
]
=
&
appSearcher
{}
resources
[
Nodes
]
=
&
nodeSearcher
{}
resources
[
Namespaces
]
=
&
namespaceSearcher
{}
...
...
@@ -103,6 +104,7 @@ const (
Services
=
"services"
StatefulSets
=
"statefulsets"
HorizontalPodAutoscalers
=
"horizontalpodautoscalers"
Applications
=
"applications"
Nodes
=
"nodes"
Namespaces
=
"namespaces"
StorageClasses
=
"storageclasses"
...
...
pkg/simple/client/k8s/kubernetes.go
浏览文件 @
e1a70bc8
package
k8s
import
(
applicationclientset
"github.com/kubernetes-sigs/application/pkg/client/clientset/versioned"
s2i
"github.com/kubesphere/s2ioperator/pkg/client/clientset/versioned"
"k8s.io/client-go/discovery"
"k8s.io/client-go/kubernetes"
...
...
@@ -22,6 +23,8 @@ type KubernetesClient struct {
s2i
*
s2i
.
Clientset
application
*
applicationclientset
.
Clientset
master
string
config
*
rest
.
Config
...
...
@@ -42,6 +45,7 @@ func NewKubernetesClientOrDie(options *KubernetesOptions) *KubernetesClient {
discoveryClient
:
discovery
.
NewDiscoveryClientForConfigOrDie
(
config
),
ks
:
kubesphere
.
NewForConfigOrDie
(
config
),
s2i
:
s2i
.
NewForConfigOrDie
(
config
),
application
:
applicationclientset
.
NewForConfigOrDie
(
config
),
master
:
config
.
Host
,
config
:
config
,
}
...
...
@@ -84,6 +88,11 @@ func NewKubernetesClient(options *KubernetesOptions) (*KubernetesClient, error)
return
nil
,
err
}
k
.
application
,
err
=
applicationclientset
.
NewForConfig
(
config
)
if
err
!=
nil
{
return
nil
,
err
}
k
.
master
=
options
.
Master
k
.
config
=
config
...
...
@@ -106,6 +115,10 @@ func (k *KubernetesClient) S2i() s2i.Interface {
return
k
.
s2i
}
func
(
k
*
KubernetesClient
)
Application
()
applicationclientset
.
Interface
{
return
k
.
application
}
// master address used to generate kubeconfig for downloading
func
(
k
*
KubernetesClient
)
Master
()
string
{
return
k
.
master
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录