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

fix: 修复配置模版文件元数据缺少字段与多余字段以及脚本管理功能优化 #3342

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
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,62 @@ func (s *Service) GetTemplateRevision(ctx context.Context, req *pbcs.GetTemplate
Creator: tr.GetDetail().GetCreator(),
CreateAt: tr.GetDetail().GetCreateAt(),
Md5: tr.GetDetail().GetMd5(),
IsLatest: tr.GetDetail().GetIsLatest(),
},
}, nil
}

// UpdateTemplateRevision implements pbcs.ConfigServer.
func (s *Service) UpdateTemplateRevision(ctx context.Context, req *pbcs.UpdateTemplateRevisionReq) (
*pbcs.UpdateTemplateRevisionResp, error) {
grpcKit := kit.FromGrpcContext(ctx)

res := []*meta.ResourceAttribute{
{Basic: meta.Basic{Type: meta.Biz, Action: meta.FindBusinessResource}, BizID: req.BizId},
}
if err := s.authorizer.Authorize(grpcKit, res...); err != nil {
return nil, err
}

metadata, err := s.client.provider.Metadata(grpcKit, req.Sign)
if err != nil {
logs.Errorf("validate file content uploaded failed, err: %v, rid: %s", err, grpcKit.Rid)
return nil, err
}

r := &pbds.UpdateTemplateRevisionReq{
Attachment: &pbtr.TemplateRevisionAttachment{
BizId: grpcKit.BizID,
TemplateSpaceId: req.TemplateSpaceId,
TemplateId: req.TemplateId,
},
Spec: &pbtr.TemplateRevisionSpec{
RevisionName: req.RevisionName,
RevisionMemo: req.RevisionMemo,
Name: req.Name,
Path: req.Path,
FileType: req.FileType,
FileMode: req.FileMode,
Permission: &pbci.FilePermission{
User: req.User,
UserGroup: req.UserGroup,
Privilege: req.Privilege,
},
ContentSpec: &pbcontent.ContentSpec{
Signature: req.Sign,
ByteSize: req.ByteSize,
Md5: metadata.Md5,
},
},
}
rp, err := s.client.DS.UpdateTemplateRevision(grpcKit.RpcCtx(), r)
if err != nil {
logs.Errorf("update template Revision failed, err: %v, rid: %s", err, grpcKit.Rid)
return nil, err
}

resp := &pbcs.UpdateTemplateRevisionResp{
Id: rp.Id,
}
return resp, nil
}
102 changes: 100 additions & 2 deletions bcs-services/bcs-bscp/cmd/data-service/service/template_revision.go
Original file line number Diff line number Diff line change
Expand Up @@ -264,13 +264,21 @@ func (s *Service) GetTemplateRevision(ctx context.Context, req *pbds.GetTemplate

var revision *table.TemplateRevision
var err error
var isLatest bool
if req.RevisionName == "" {
revision, err = s.dao.TemplateRevision().GetLatesTemplateRevision(kt, req.GetBizId(), req.GetTemplateId())
revision, err = s.dao.TemplateRevision().GetLatestTemplateRevision(kt, req.GetBizId(), req.GetTemplateId())
isLatest = true
} else {
revision, err = s.dao.TemplateRevision().GetByUniqueKey(kt, req.GetBizId(), req.GetTemplateId(),
req.GetRevisionName())
latestRevision, errL := s.dao.TemplateRevision().GetLatestTemplateRevision(kt, req.GetBizId(), req.GetTemplateId())
if errL != nil {
return nil, errL
}
if latestRevision.ID <= revision.ID {
isLatest = true
}
}

if err != nil {
return nil, errf.Errorf(errf.DBOpFailed, i18n.T(kt, fmt.Sprintf("get template revision failed, err: %v", err)))
}
Expand All @@ -293,6 +301,96 @@ func (s *Service) GetTemplateRevision(ctx context.Context, req *pbds.GetTemplate
Creator: revision.Revision.Creator,
CreateAt: revision.Revision.CreatedAt.Format(time.RFC3339),
Md5: revision.Spec.ContentSpec.Md5,
IsLatest: isLatest,
},
}, nil
}

// UpdateTemplateRevision implements pbds.DataServer.
func (s *Service) UpdateTemplateRevision(ctx context.Context, req *pbds.UpdateTemplateRevisionReq) (
*pbds.CreateResp, error) {
kt := kit.FromGrpcContext(ctx)

if _, err := s.dao.TemplateRevision().GetByUniqueKey(kt, req.Attachment.BizId, req.Attachment.TemplateId,
req.Spec.RevisionName); err == nil {
return nil, fmt.Errorf("template revision's same revision name %s already exists", req.Spec.RevisionName)
}

template, err := s.dao.Template().GetByID(kt, req.Attachment.BizId, req.Attachment.TemplateId)
if err != nil {
logs.Errorf("get template by id failed, err: %v, rid: %s", err, kt.Rid)
return nil, err
}

tx := s.dao.GenQuery().Begin()

// 1. create template revision
spec := req.Spec.TemplateRevisionSpec()
// if no revision name is specified, generate it by system
if spec.RevisionName == "" {
spec.RevisionName = tools.GenerateRevisionName()
}
spec.RevisionMemo = ""
// keep the revision's name and path same with template
spec.Name = template.Spec.Name
spec.Path = template.Spec.Path
templateRevision := &table.TemplateRevision{
Spec: spec,
Attachment: req.Attachment.TemplateRevisionAttachment(),
Revision: &table.CreatedRevision{
Creator: kt.User,
},
}
id, err := s.dao.TemplateRevision().CreateWithTx(kt, tx, templateRevision)
if err != nil {
logs.Errorf("create template revision failed, err: %v, rid: %s", err, kt.Rid)
if rErr := tx.Rollback(); rErr != nil {
logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid)
}
return nil, err
}

// update template
err = s.dao.Template().UpdateWithTx(kt, tx, &table.Template{
ID: template.ID,
Spec: &table.TemplateSpec{
Memo: req.Spec.RevisionMemo,
},
Attachment: template.Attachment,
Revision: &table.Revision{
Reviser: kt.User,
UpdatedAt: time.Now().UTC(),
},
})
if err != nil {
if rErr := tx.Rollback(); rErr != nil {
logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid)
}
return nil, err
}

// 2. update app template bindings if necessary
atbs, err := s.dao.TemplateBindingRelation().
ListLatestTmplBoundUnnamedApps(kt, req.Attachment.BizId, req.Attachment.TemplateId)
if err != nil {
logs.Errorf("list latest template bound app template bindings failed, err: %v, rid: %s", err, kt.Rid)
return nil, err
}
if len(atbs) > 0 {
for _, atb := range atbs {
if e := s.CascadeUpdateATB(kt, tx, atb); e != nil {
logs.Errorf("cascade update app template binding failed, err: %v, rid: %s", e, kt.Rid)
if rErr := tx.Rollback(); rErr != nil {
logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, kt.Rid)
}
return nil, e
}
}
}

if e := tx.Commit(); e != nil {
logs.Errorf("commit transaction failed, err: %v, rid: %s", e, kt.Rid)
return nil, e
}
return &pbds.CreateResp{Id: id}, nil
}
3 changes: 2 additions & 1 deletion bcs-services/bcs-bscp/pkg/dal/dao/hook.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ func (dao *hookDao) ListWithRefer(kit *kit.Kit, opt *types.ListHooksWithReferOpt
q = q.Where(rawgen.Cond(datatypes.JSONArrayQuery("tags").Contains(opt.Tag))...)
} else if opt.NotTag {
// when the length of tags is 2, it must be '[]'
q = q.Where(h.Tags.Length().Eq(2))
// It could also be null
q = q.Where(h.Tags.Length().Eq(2)).Or(h.Tags.Length().Eq(4))
}

if opt.SearchKey != "" {
Expand Down
41 changes: 41 additions & 0 deletions bcs-services/bcs-bscp/pkg/dal/dao/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ type Template interface {
CreateWithTx(kit *kit.Kit, tx *gen.QueryTx, template *table.Template) (uint32, error)
// Update one template's info.
Update(kit *kit.Kit, template *table.Template) error
// UpdateWithTx Update one template instance with transaction.
UpdateWithTx(kit *kit.Kit, tx *gen.QueryTx, template *table.Template) error
// List templates with options.
List(kit *kit.Kit, bizID, templateSpaceID uint32, s search.Searcher,
opt *types.BasePage, topIds []uint32, searchValue string) ([]*table.Template, int64, error)
Expand Down Expand Up @@ -69,6 +71,45 @@ type templateDao struct {
auditDao AuditDao
}

// UpdateWithTx Update one template instance with transaction.
func (dao *templateDao) UpdateWithTx(kit *kit.Kit, tx *gen.QueryTx, g *table.Template) error {
if err := g.ValidateUpdate(); err != nil {
return err
}

// 更新操作, 获取当前记录做审计
m := tx.Template
q := tx.Template.WithContext(kit.Ctx)
oldOne, err := q.Where(m.ID.Eq(g.ID), m.BizID.Eq(g.Attachment.BizID)).Take()
if err != nil {
return err
}

ad := dao.auditDao.DecoratorV2(kit, g.Attachment.BizID).PrepareUpdate(g, oldOne)
if err := ad.Do(tx.Query); err != nil {
return err
}

if _, err := q.Where(m.BizID.Eq(g.Attachment.BizID), m.ID.Eq(g.ID)).
Select(m.Memo, m.Reviser, m.UpdatedAt).Updates(g); err != nil {
return err
}

return nil
}

// ListByExclusionIDs list templates by template exclusion ids.
func (dao *templateDao) ListByExclusionIDs(kit *kit.Kit, ids []uint32) ([]*table.Template, error) {
m := dao.genQ.Template
q := dao.genQ.Template.WithContext(kit.Ctx)
result, err := q.Where(m.ID.NotIn(ids...)).Find()
if err != nil {
return nil, err
}

return result, nil
}

// ListTemplateByTuple 按照多个字段in查询template 列表
func (dao *templateDao) ListTemplateByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.Template, error) {
m := dao.genQ.Template
Expand Down
8 changes: 4 additions & 4 deletions bcs-services/bcs-bscp/pkg/dal/dao/template_revision.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ type TemplateRevision interface {
BatchCreateWithTx(kit *kit.Kit, tx *gen.QueryTx, revisions []*table.TemplateRevision) error
// ListLatestRevisionsGroupByTemplateIds Lists the latest version groups by template ids
ListLatestRevisionsGroupByTemplateIds(kit *kit.Kit, templateIDs []uint32) ([]*table.TemplateRevision, error)
// GetLatesTemplateRevision get lates template revision.
GetLatesTemplateRevision(kit *kit.Kit, bizID, templateID uint32) (*table.TemplateRevision, error)
// GetLatestTemplateRevision get latest template revision.
GetLatestTemplateRevision(kit *kit.Kit, bizID, templateID uint32) (*table.TemplateRevision, error)
}

var _ TemplateRevision = new(templateRevisionDao)
Expand All @@ -66,8 +66,8 @@ type templateRevisionDao struct {
auditDao AuditDao
}

// GetLatesTemplateRevision get lates template revision.
func (dao *templateRevisionDao) GetLatesTemplateRevision(kit *kit.Kit, bizID uint32, templateID uint32) (
// GetLatestTemplateRevision get latest template revision.
func (dao *templateRevisionDao) GetLatestTemplateRevision(kit *kit.Kit, bizID uint32, templateID uint32) (
*table.TemplateRevision, error) {
m := dao.genQ.TemplateRevision
q := dao.genQ.TemplateRevision.WithContext(kit.Ctx)
Expand Down
Loading
Loading