未验证 提交 43686395 编写于 作者: H hongming

feat: support horizontalpodautoscalers query

Signed-off-by: Nhongming <talonwan@yunify.com>
上级 9b7d4958
...@@ -176,6 +176,7 @@ func waitForResourceSync() { ...@@ -176,6 +176,7 @@ func waitForResourceSync() {
informerFactory.Batch().V1().Jobs().Lister() informerFactory.Batch().V1().Jobs().Lister()
informerFactory.Batch().V1beta1().CronJobs().Lister() informerFactory.Batch().V1beta1().CronJobs().Lister()
informerFactory.Extensions().V1beta1().Ingresses().Lister() informerFactory.Extensions().V1beta1().Ingresses().Lister()
informerFactory.Autoscaling().V2beta2().HorizontalPodAutoscalers().Lister()
informerFactory.Start(stopChan) informerFactory.Start(stopChan)
informerFactory.WaitForCacheSync(stopChan) informerFactory.WaitForCacheSync(stopChan)
......
/*
*
* 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 (
autoscalingv2beta2 "k8s.io/api/autoscaling/v2beta2"
"kubesphere.io/kubesphere/pkg/constants"
"kubesphere.io/kubesphere/pkg/informers"
"kubesphere.io/kubesphere/pkg/params"
"kubesphere.io/kubesphere/pkg/utils/sliceutil"
"sort"
"strings"
"k8s.io/apimachinery/pkg/labels"
)
type hpaSearcher struct {
}
func (*hpaSearcher) get(namespace, name string) (interface{}, error) {
return informers.SharedInformerFactory().Autoscaling().V2beta2().HorizontalPodAutoscalers().Lister().HorizontalPodAutoscalers(namespace).Get(name)
}
func hpaTargetMatch(item *autoscalingv2beta2.HorizontalPodAutoscaler, kind, name string) bool {
return item.Spec.ScaleTargetRef.Kind == kind && item.Spec.ScaleTargetRef.Name == name
}
// exactly Match
func (*hpaSearcher) match(match map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) bool {
for k, v := range match {
switch k {
case TargetKind:
fallthrough
case TargetName:
kind := match[TargetKind]
name := match[TargetName]
if !hpaTargetMatch(item, kind, name) {
return false
}
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:
if item.Labels[k] != v {
return false
}
}
}
return true
}
// Fuzzy searchInNamespace
func (*hpaSearcher) fuzzy(fuzzy map[string]string, item *autoscalingv2beta2.HorizontalPodAutoscaler) 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) && !searchFuzzy(item.Annotations, k, v) {
return false
}
}
}
return true
}
func (*hpaSearcher) compare(a, b *autoscalingv2beta2.HorizontalPodAutoscaler, 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 *hpaSearcher) search(namespace string, conditions *params.Conditions, orderBy string, reverse bool) ([]interface{}, error) {
horizontalPodAutoscalers, err := informers.SharedInformerFactory().Autoscaling().V2beta2().HorizontalPodAutoscalers().Lister().HorizontalPodAutoscalers(namespace).List(labels.Everything())
if err != nil {
return nil, err
}
result := make([]*autoscalingv2beta2.HorizontalPodAutoscaler, 0)
if len(conditions.Match) == 0 && len(conditions.Fuzzy) == 0 {
result = horizontalPodAutoscalers
} else {
for _, item := range horizontalPodAutoscalers {
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
}
...@@ -41,6 +41,7 @@ func init() { ...@@ -41,6 +41,7 @@ func init() {
resources[Roles] = &roleSearcher{} resources[Roles] = &roleSearcher{}
resources[S2iBuilders] = &s2iBuilderSearcher{} resources[S2iBuilders] = &s2iBuilderSearcher{}
resources[S2iRuns] = &s2iRunSearcher{} resources[S2iRuns] = &s2iRunSearcher{}
resources[HorizontalPodAutoscalers] = &hpaSearcher{}
resources[Nodes] = &nodeSearcher{} resources[Nodes] = &nodeSearcher{}
resources[Namespaces] = &namespaceSearcher{} resources[Namespaces] = &namespaceSearcher{}
...@@ -57,55 +58,58 @@ var ( ...@@ -57,55 +58,58 @@ var (
) )
const ( const (
Name = "name" Name = "name"
Label = "label" Label = "label"
OwnerKind = "ownerKind" OwnerKind = "ownerKind"
OwnerName = "ownerName" OwnerName = "ownerName"
Role = "role" TargetKind = "targetKind"
CreateTime = "createTime" TargetName = "targetName"
UpdateTime = "updateTime" Role = "role"
LastScheduleTime = "lastScheduleTime" CreateTime = "createTime"
chart = "chart" UpdateTime = "updateTime"
release = "release" LastScheduleTime = "lastScheduleTime"
annotation = "annotation" chart = "chart"
Keyword = "keyword" release = "release"
Status = "status" annotation = "annotation"
includeCronJob = "includeCronJob" Keyword = "keyword"
storageClassName = "storageClassName" Status = "status"
cronJobKind = "CronJob" includeCronJob = "includeCronJob"
s2iRunKind = "S2iRun" storageClassName = "storageClassName"
includeS2iRun = "includeS2iRun" cronJobKind = "CronJob"
StatusRunning = "running" s2iRunKind = "S2iRun"
StatusPaused = "paused" includeS2iRun = "includeS2iRun"
StatusPending = "pending" StatusRunning = "running"
StatusUpdating = "updating" StatusPaused = "paused"
StatusStopped = "stopped" StatusPending = "pending"
StatusFailed = "failed" StatusUpdating = "updating"
StatusBound = "bound" StatusStopped = "stopped"
StatusLost = "lost" StatusFailed = "failed"
StatusComplete = "complete" StatusBound = "bound"
app = "app" StatusLost = "lost"
Deployments = "deployments" StatusComplete = "complete"
DaemonSets = "daemonsets" app = "app"
Roles = "roles" Deployments = "deployments"
Workspaces = "workspaces" DaemonSets = "daemonsets"
WorkspaceRoles = "workspaceroles" Roles = "roles"
CronJobs = "cronjobs" Workspaces = "workspaces"
ConfigMaps = "configmaps" WorkspaceRoles = "workspaceroles"
Ingresses = "ingresses" CronJobs = "cronjobs"
Jobs = "jobs" ConfigMaps = "configmaps"
PersistentVolumeClaims = "persistentvolumeclaims" Ingresses = "ingresses"
Pods = "pods" Jobs = "jobs"
Secrets = "secrets" PersistentVolumeClaims = "persistentvolumeclaims"
Services = "services" Pods = "pods"
StatefulSets = "statefulsets" Secrets = "secrets"
Nodes = "nodes" Services = "services"
Namespaces = "namespaces" StatefulSets = "statefulsets"
StorageClasses = "storageclasses" HorizontalPodAutoscalers = "horizontalpodautoscalers"
ClusterRoles = "clusterroles" Nodes = "nodes"
S2iBuilderTemplates = "s2ibuildertemplates" Namespaces = "namespaces"
S2iBuilders = "s2ibuilders" StorageClasses = "storageclasses"
S2iRuns = "s2iruns" ClusterRoles = "clusterroles"
S2iBuilderTemplates = "s2ibuildertemplates"
S2iBuilders = "s2ibuilders"
S2iRuns = "s2iruns"
) )
type resourceSearchInterface interface { type resourceSearchInterface interface {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册