Skip to content
Merged
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
88 changes: 88 additions & 0 deletions bcs-services/cluster-resources/pkg/action/template/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@ package template
import (
"context"
"path"
"path/filepath"
"regexp"
"sort"
"strings"

"github.com/Tencent/bk-bcs/bcs-common/pkg/odm/operator"
"github.com/coreos/go-semver/semver"
"github.com/feiin/go-xss"
"go.mongodb.org/mongo-driver/bson/primitive"
"gopkg.in/yaml.v2"
Expand Down Expand Up @@ -214,6 +217,91 @@ func (t *TemplateAction) List(ctx context.Context, templateSpaceID string) ([]ma
return m, nil
}

// ListTemplateMetadataVersions 通过模板文件夹 ID 获取模板文件列表(含版本 ID 和版本号)
func (t *TemplateAction) ListTemplateMetadataVersions(ctx context.Context, spaceID string) (
[]map[string]interface{}, error) {
if err := t.checkAccess(ctx); err != nil {
return nil, err
}

p, err := project.FromContext(ctx)
if err != nil {
return nil, err
}

templateSpace, err := t.model.GetTemplateSpace(ctx, spaceID)
if err != nil {
return nil, err
}

// 权限校验
if templateSpace.ProjectCode != p.Code {
return nil, errorx.New(errcode.NoPerm, i18n.GetMsg(ctx, "无权限访问"))
}

// 通过项目编码、文件夹名称检索模板元数据
cond := operator.NewLeafCondition(operator.Eq, operator.M{
entity.FieldKeyProjectCode: p.Code,
entity.FieldKeyTemplateSpace: templateSpace.Name,
})
templates, err := t.model.ListTemplate(ctx, cond)
if err != nil {
return nil, err
}

// 获取该文件夹下所有版本信息
versions, err := t.model.ListTemplateVersion(ctx, operator.NewLeafCondition(operator.Eq, operator.M{
entity.FieldKeyProjectCode: p.Code,
entity.FieldKeyTemplateSpace: templateSpace.Name,
}))
if err != nil {
return nil, err
}

// 存放模板文件,及版本号列表
m := make([]map[string]interface{}, 0)
for _, value := range templates {
mm := map[string]interface{}{
"templateName": filepath.Join(templateSpace.Name, value.Name),
"latestVersion": value.Version,
"versionList": []map[string]interface{}{},
}
// 匹配当前模板的版本信息,填充 versionID 和 version
var versionList []map[string]interface{}
for _, v := range versions {
if v.TemplateName == value.Name {
versionList = append(versionList, map[string]interface{}{
"version": v.Version,
"versionID": v.ID.Hex(),
"createAt": v.CreateAt,
})
}
}
// 区分语义化版本及非语义化版本排序
var semVersion []map[string]interface{}
var nonSemVersion []map[string]interface{}
for _, vl := range versionList {
if _, err = semver.NewVersion(vl["version"].(string)); err != nil {
nonSemVersion = append(nonSemVersion, vl)
continue
}
semVersion = append(semVersion, vl)
}
sort.Slice(semVersion, func(i, j int) bool {
v1, _ := semver.NewVersion(semVersion[i]["version"].(string))
v2, _ := semver.NewVersion(semVersion[j]["version"].(string))
return v2.LessThan(*v1)
})
// 非语义化版本按时间倒序排序
sort.Slice(nonSemVersion, func(i, j int) bool {
return nonSemVersion[i]["createAt"].(int64) > nonSemVersion[j]["createAt"].(int64)
})
mm["versionList"] = append(semVersion, nonSemVersion...)
m = append(m, mm)
}
return m, nil
}

// Create xxx
// nolint:funlen
func (t *TemplateAction) Create(ctx context.Context, req *clusterRes.CreateTemplateMetadataReq) (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,20 @@ func (h *Handler) ListTemplateMetadata(
return nil
}

// ListTemplateMetadataVersions 通过模板文件夹 ID 获取模板文件列表(含版本信息)
func (h *Handler) ListTemplateMetadataVersions(
ctx context.Context, in *clusterRes.ListTemplateMetadataVersionsReq, out *clusterRes.CommonListResp) error {
action := template.NewTemplateAction(h.model)
data, err := action.ListTemplateMetadataVersions(ctx, in.GetTemplateSpaceID())
if err != nil {
return err
}
if out.Data, err = pbstruct.MapSlice2ListValue(data); err != nil {
return err
}
return nil
}

// CreateTemplateMetadata 创建模板文件元数据
func (h *Handler) CreateTemplateMetadata(
ctx context.Context, in *clusterRes.CreateTemplateMetadataReq, out *clusterRes.CommonResp) error {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func ParsePoSpec(manifest map[string]interface{}, spec *model.PoSpec) {
func ParseNodeSelect(podSpec map[string]interface{}, nodeSelect *model.NodeSelect) {
nodeSelect.Type = resCsts.NodeSelectTypeAnyAvailable
nodeSelector := mapx.GetMap(podSpec, "nodeSelector")
if nodeSelector != nil {
if len(nodeSelector) != 0 {
nodeSelect.Type = resCsts.NodeSelectTypeSchedulingRule
for k := range nodeSelector {
nodeSelect.Selector = append(nodeSelect.Selector,
Expand Down
Loading
Loading