Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 资源视图查询支持根据来源过滤 #3560

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions bcs-services/cluster-resources/pkg/action/view/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,10 +378,28 @@ func protoFilterToFilter(filter *clusterRes.ViewFilter) *entity.ViewFilter {
Values: v.GetValues(),
})
}

createSource := &entity.CreateSource{
Source: "",
Template: &entity.CreateSourceTemplate{},
Chart: &entity.CreateSourceChart{},
}
if filter.GetCreateSource() != nil {
createSource.Source = filter.GetCreateSource().Source
if filter.GetCreateSource().Template != nil {
createSource.Template.TemplateName = filter.GetCreateSource().GetTemplate().GetTemplateName()
createSource.Template.TemplateVersion = filter.GetCreateSource().GetTemplate().GetTemplateVersion()
}
if filter.GetCreateSource().Chart != nil {
createSource.Chart.ChartName = filter.GetCreateSource().GetChart().GetChartName()
}
}

return &entity.ViewFilter{
Name: filter.GetName(),
Creator: filter.GetCreator(),
LabelSelector: ls,
CreateSource: createSource,
}
}

Expand Down
89 changes: 89 additions & 0 deletions bcs-services/cluster-resources/pkg/handler/multicluster/filter.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"

resCsts "github.com/Tencent/bk-bcs/bcs-services/cluster-resources/pkg/resource/constants"
"github.com/Tencent/bk-bcs/bcs-services/cluster-resources/pkg/resource/formatter"
"github.com/Tencent/bk-bcs/bcs-services/cluster-resources/pkg/storage"
"github.com/Tencent/bk-bcs/bcs-services/cluster-resources/pkg/util/mapx"
Expand Down Expand Up @@ -71,6 +72,7 @@ type Order string
type QueryFilter struct {
Creator []string // -- 代表无创建者
Name string
CreateSource *clusterRes.CreateSource
LabelSelector []*clusterRes.LabelSelector
IP string // IP 过滤条件,包括IPV4、IPV6、HostIP,目前仅 Pod 支持
Status []string // 状态过滤条件,目前仅 Deployment 支持
Expand Down Expand Up @@ -231,6 +233,93 @@ func (f *QueryFilter) NameFilter(resources []*storage.Resource) []*storage.Resou
return result
}

// CreateSourceFilter 创建来源过滤器
func (f *QueryFilter) CreateSourceFilter(resources []*storage.Resource) []*storage.Resource {
if f.CreateSource == nil {
return resources
}

resources = f.createSourceSourceFilter(resources)
resources = f.createSourceTemplateNameFilter(resources)
resources = f.createSourceTemplateVersionFilter(resources)
resources = f.createSourceChartNameFilter(resources)

return resources
}

// createSourceSourceFilter 来源过滤器
func (f *QueryFilter) createSourceSourceFilter(resources []*storage.Resource) []*storage.Resource {
result := []*storage.Resource{}
if f.CreateSource.Source == "" {
return resources
}

for _, v := range resources {
createSource, _ := formatter.ParseCreateSource(v.Data)
if strings.Contains(createSource, f.CreateSource.Source) {
result = append(result, v)
}
}
return result
}

// createSourceTemplateNameFilter 模板名称来源过滤器
func (f *QueryFilter) createSourceTemplateNameFilter(resources []*storage.Resource) []*storage.Resource {
result := []*storage.Resource{}
if f.CreateSource.Template == nil {
return resources
}
if f.CreateSource.Template.TemplateName == "" {
return resources
}

for _, v := range resources {
templateName := mapx.GetStr(v.Data, []string{"metadata", "annotations", resCsts.TemplateNameAnnoKey})
if strings.Contains(templateName, f.CreateSource.Template.TemplateName) {
result = append(result, v)
}
}
return result
}

// createSourceTemplateNameFilter 模板名称来源过滤器
func (f *QueryFilter) createSourceTemplateVersionFilter(resources []*storage.Resource) []*storage.Resource {
result := []*storage.Resource{}
if f.CreateSource.Template == nil {
return resources
}
if f.CreateSource.Template.TemplateVersion == "" {
return resources
}

for _, v := range resources {
templateVersion := mapx.GetStr(v.Data, []string{"metadata", "annotations", resCsts.TemplateVersionAnnoKey})
if strings.Contains(templateVersion, f.CreateSource.Template.TemplateVersion) {
result = append(result, v)
}
}
return result
}

// createSourceChartNameFilter ChartName来源过滤器
func (f *QueryFilter) createSourceChartNameFilter(resources []*storage.Resource) []*storage.Resource {
result := []*storage.Resource{}
if f.CreateSource.Chart == nil {
return resources
}
if f.CreateSource.Chart.ChartName == "" {
return resources
}

for _, v := range resources {
chartName := mapx.GetStr(v.Data, []string{"metadata", "labels", resCsts.HelmChartAnnoKey})
if strings.Contains(chartName, f.CreateSource.Chart.ChartName) {
result = append(result, v)
}
}
return result
}

// LabelSelectorFilter 标签选择器过滤器
func (f *QueryFilter) LabelSelectorFilter(resources []*storage.Resource) []*storage.Resource {
result := []*storage.Resource{}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ func (h *Handler) FetchMultiClusterResource(ctx context.Context, req *clusterRes
filter := QueryFilter{
Creator: req.GetCreator(),
Name: req.GetName(),
CreateSource: req.GetCreateSource(),
LabelSelector: req.GetLabelSelector(),
IP: req.GetIp(),
Status: req.GetStatus(),
Expand Down Expand Up @@ -146,6 +147,7 @@ func (h *Handler) FetchMultiClusterCustomResource(ctx context.Context,
filter := QueryFilter{
Creator: req.GetCreator(),
Name: req.GetName(),
CreateSource: req.GetCreateSource(),
LabelSelector: req.GetLabelSelector(),
IP: req.GetIp(),
Status: req.GetStatus(),
Expand Down Expand Up @@ -190,6 +192,7 @@ func (h *Handler) MultiClusterResourceCount(ctx context.Context, req *clusterRes
Name: req.GetName(),
LabelSelector: req.GetLabelSelector(),
Limit: 1,
CreateSource: req.GetCreateSource(),
}
var err error

Expand Down
28 changes: 25 additions & 3 deletions bcs-services/cluster-resources/pkg/handler/multicluster/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,8 @@ func (q *StorageQuery) Fetch(ctx context.Context, groupVersion, kind string) (ma
}
// 第二次过滤
resources = ApplyFilter(resources, q.QueryFilter.CreatorFilter, q.QueryFilter.NameFilter,
q.QueryFilter.StatusFilter, q.QueryFilter.LabelSelectorFilter, q.QueryFilter.IPFilter)
q.QueryFilter.StatusFilter, q.QueryFilter.LabelSelectorFilter, q.QueryFilter.IPFilter,
q.QueryFilter.CreateSourceFilter)
total := len(resources)
resources = q.QueryFilter.Page(resources)
resp := buildList(ctx, resources)
Expand Down Expand Up @@ -132,10 +133,12 @@ func (q *APIServerQuery) Fetch(ctx context.Context, groupVersion, kind string) (
if err != nil {
return nil, err
}
resources = ApplyFilter(resources, q.ViewFilter.CreatorFilter, q.ViewFilter.NameFilter)
resources = ApplyFilter(resources, q.ViewFilter.CreatorFilter, q.ViewFilter.NameFilter,
q.ViewFilter.CreateSourceFilter)
// 第二次过滤
resources = ApplyFilter(resources, q.QueryFilter.CreatorFilter, q.QueryFilter.NameFilter,
q.QueryFilter.StatusFilter, q.QueryFilter.LabelSelectorFilter, q.QueryFilter.IPFilter)
q.QueryFilter.StatusFilter, q.QueryFilter.LabelSelectorFilter, q.QueryFilter.IPFilter,
q.QueryFilter.CreateSourceFilter)
total := len(resources)
resources = q.QueryFilter.Page(resources)
resp := buildList(ctx, resources)
Expand Down Expand Up @@ -533,10 +536,29 @@ func viewQueryToQueryFilter(filter *entity.ViewFilter) QueryFilter {
Values: v.Values,
})
}
var createSource *clusterRes.CreateSource
if filter.CreateSource != nil {
createSource = &clusterRes.CreateSource{
Source: filter.CreateSource.Source,
}
if filter.CreateSource.Template != nil {
createSource.Template = &clusterRes.Template{
TemplateName: filter.CreateSource.Template.TemplateName,
TemplateVersion: filter.CreateSource.Template.TemplateVersion,
}
}

if filter.CreateSource.Chart != nil {
createSource.Chart = &clusterRes.Chart{
ChartName: filter.CreateSource.Chart.ChartName,
}
}
}
return QueryFilter{
Creator: filter.Creator,
Name: filter.Name,
LabelSelector: ls,
CreateSource: createSource,
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import (
// CommonFormatRes 通用资源格式化
func CommonFormatRes(manifest map[string]interface{}) map[string]interface{} {
rawCreateTime := mapx.GetStr(manifest, "metadata.creationTimestamp")
createSource, immutable := parseCreateSource(manifest)
createSource, immutable := ParseCreateSource(manifest)
ret := map[string]interface{}{
"namespace": mapx.GetStr(manifest, []string{"metadata", "namespace"}),
"age": timex.CalcAge(rawCreateTime),
Expand Down Expand Up @@ -63,8 +63,8 @@ func GetPruneFunc(kind string) func(manifest map[string]interface{}) map[string]
return pruneFunc
}

// 解析创建来源,主要有:Template/Helm/Client/Web
func parseCreateSource(manifest map[string]interface{}) (string, bool) {
// ParseCreateSource 解析创建来源,主要有:Template/Helm/Client/Web
func ParseCreateSource(manifest map[string]interface{}) (string, bool) {
labels := mapx.GetMap(manifest, "metadata.labels")
// Helm创建来源:app.kubernetes.io/managed-by: Helm
if mapx.GetStr(labels, []string{resCsts.HelmSourceType}) == resCsts.HelmCreateSource {
Expand Down
38 changes: 38 additions & 0 deletions bcs-services/cluster-resources/pkg/store/entity/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,25 @@ type ViewFilter struct {
Name string `json:"name" bson:"name"`
Creator []string `json:"creator" bson:"creator"`
LabelSelector []LabelSelector `json:"labelSelector" bson:"labelSelector"`
CreateSource *CreateSource `json:"createSource" bson:"createSource"`
}

// CreateSource 具体创建来源
type CreateSource struct {
Source string `json:"source"`
Template *CreateSourceTemplate `json:"template"`
Chart *CreateSourceChart `json:"chart"`
}

// CreateSourceTemplate 创建来源模板集
type CreateSourceTemplate struct {
TemplateName string `json:"templateName"`
TemplateVersion string `json:"templateVersion"`
}

// CreateSourceChart 创建来源helm chart
type CreateSourceChart struct {
ChartName string `json:"chartName"`
}

// ViewScope 视图可见范围
Expand Down Expand Up @@ -103,6 +122,25 @@ func (v *View) ToMap() map[string]interface{} {
"creator": v.Filter.Creator,
"labelSelector": ls,
}
if v.Filter.CreateSource != nil {
createSource := map[string]interface{}{
"source": v.Filter.CreateSource.Source,
}
if v.Filter.CreateSource.Template != nil {
template := map[string]interface{}{
"templateName": v.Filter.CreateSource.Template.TemplateName,
"templateVersion": v.Filter.CreateSource.Template.TemplateVersion,
}
createSource["template"] = template
}
if v.Filter.CreateSource.Chart != nil {
chart := map[string]interface{}{
"chartName": v.Filter.CreateSource.Chart.ChartName,
}
createSource["chart"] = chart
}
m["filter"].(map[string]interface{})["createSource"] = createSource
}
}
return m
}
Loading
Loading