Skip to content

Commit

Permalink
feat: 支持配置文件恢复
Browse files Browse the repository at this point in the history
  • Loading branch information
Ambition9186 committed Feb 22, 2024
1 parent 30d3a24 commit 51df6ae
Show file tree
Hide file tree
Showing 12 changed files with 7,480 additions and 6,865 deletions.
28 changes: 28 additions & 0 deletions bcs-services/bcs-bscp/cmd/config-server/service/config_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -531,3 +531,31 @@ func (s *Service) ListConfigItemByTuple(ctx context.Context, req *pbcs.ListConfi
resp := &pbcs.ListConfigItemByTupleResp{Details: tuple.GetConfigItems()}
return resp, nil
}

// UnDeleteConfigItem 配置项未命名版本恢复
func (s *Service) UnDeleteConfigItem(ctx context.Context, req *pbcs.UnDeleteConfigItemReq) (
*pbcs.UnDeleteConfigItemResp, error) {
grpcKit := kit.FromGrpcContext(ctx)

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

_, err = s.client.DS.UnDeleteConfigItem(grpcKit.RpcCtx(), &pbds.UnDeleteConfigItemReq{
Id: req.Id,
Attachment: &pbci.ConfigItemAttachment{
BizId: req.BizId,
AppId: req.AppId,
},
})
if err != nil {
return nil, err
}

return &pbcs.UnDeleteConfigItemResp{}, nil
}
51 changes: 51 additions & 0 deletions bcs-services/bcs-bscp/cmd/data-service/service/config_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@ package service

import (
"context"
"errors"
"fmt"
"path"
"reflect"
"sort"
"strings"
"time"

"gorm.io/gorm"

"github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/gen"
"github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/dal/table"
"github.com/TencentBlueKing/bk-bcs/bcs-services/bcs-bscp/pkg/kit"
Expand Down Expand Up @@ -730,3 +733,51 @@ func (s *Service) ListConfigItemByTuple(ctx context.Context, req *pbds.ListConfi
resp := &pbds.ListConfigItemByTupleResp{ConfigItems: configItems}
return resp, nil
}

// UnDeleteConfigItem 配置项未命名版本恢复
func (s *Service) UnDeleteConfigItem(ctx context.Context, req *pbds.UnDeleteConfigItemReq) (*pbbase.EmptyResp, error) {
grpcKit := kit.FromGrpcContext(ctx)

// 判断是否需要恢复
configItem, err := s.dao.ConfigItem().Get(grpcKit, req.GetId(), req.Attachment.BizId)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}
if configItem != nil && configItem.ID != 0 {
return nil, errors.New("The data has not been deleted")
}

// 获取该服务最新发布的 release_id
release, err := s.dao.Release().GetReleaseLately(grpcKit, req.Attachment.BizId, req.Attachment.AppId)
if err != nil {
return nil, err
}

// 通过最新发布 release_id + config_item_id 获取需要恢复的数据
releaseCi, err := s.dao.ReleasedCI().Get(grpcKit, req.Attachment.BizId,
release.Attachment.AppID, release.ID, req.GetId())
if err != nil {
return nil, err
}

ci := &table.ConfigItem{
ID: releaseCi.ConfigItemID,
Spec: releaseCi.ConfigItemSpec,
Attachment: releaseCi.Attachment,
Revision: releaseCi.Revision,
}
tx := s.dao.GenQuery().Begin()
if err = s.dao.ConfigItem().RecoverConfigItem(grpcKit, tx, ci); err != nil {
logs.Errorf("recover config item failed, err: %v, rid: %s", err, grpcKit.Rid)
if rErr := tx.Rollback(); rErr != nil {
logs.Errorf("transaction rollback failed, err: %v, rid: %s", rErr, grpcKit.Rid)
}
return nil, err
}
if e := tx.Commit(); e != nil {
logs.Errorf("commit transaction failed, err: %v, rid: %s", e, grpcKit.Rid)
return nil, e
}

return new(pbbase.EmptyResp), nil
}
29 changes: 29 additions & 0 deletions bcs-services/bcs-bscp/pkg/dal/dao/config_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ type ConfigItem interface {
GetCount(kit *kit.Kit, bizID uint32, appId []uint32) ([]*table.ListConfigItemCounts, error)
// ListConfigItemByTuple 按照多个字段in查询config item 列表
ListConfigItemByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.ConfigItem, error)
// RecoverConfigItem 恢复单个配置项(恢复的配置项使用原来的ID)
RecoverConfigItem(kit *kit.Kit, tx *gen.QueryTx, configItem *table.ConfigItem) error
}

var _ ConfigItem = new(configItemDao)
Expand All @@ -69,6 +71,33 @@ type configItemDao struct {
lock LockDao
}

// RecoverConfigItem 恢复单个配置项(恢复的配置项使用原来的ID)
func (dao *configItemDao) RecoverConfigItem(kit *kit.Kit, tx *gen.QueryTx, ci *table.ConfigItem) error {
if ci == nil {
return errors.New("config item is nil")
}

if err := ci.ValidateRecover(); err != nil {
return err
}

if err := dao.validateAttachmentResExist(kit, ci.Attachment); err != nil {
return err
}

ad := dao.auditDao.DecoratorV2(kit, ci.Attachment.BizID).PrepareCreate(ci)

if err := tx.ConfigItem.WithContext(kit.Ctx).Create(ci); err != nil {
return err
}

if err := ad.Do(tx.Query); err != nil {
return fmt.Errorf("audit recover config item failed, err: %v", err)
}

return nil
}

// ListConfigItemByTuple 按照多个字段in查询config item 列表
func (dao *configItemDao) ListConfigItemByTuple(kit *kit.Kit, data [][]interface{}) ([]*table.ConfigItem, error) {
m := dao.genQ.ConfigItem
Expand Down
8 changes: 8 additions & 0 deletions bcs-services/bcs-bscp/pkg/dal/dao/release.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ type Release interface {
UpdateDeprecated(kit *kit.Kit, bizID, appID, releaseID uint32, deprecated bool) error
// DeleteWithTx delete release with tx.
DeleteWithTx(kit *kit.Kit, tx *gen.QueryTx, bizID, appID, releaseID uint32) error
// GetReleaseLately get release lately info
GetReleaseLately(kit *kit.Kit, bizID uint32, appID uint32) (*table.Release, error)
}

var _ Release = new(releaseDao)
Expand All @@ -53,6 +55,12 @@ type releaseDao struct {
auditDao AuditDao
}

// GetReleaseLately get release lately info
func (dao *releaseDao) GetReleaseLately(kit *kit.Kit, bizID uint32, appID uint32) (*table.Release, error) {
m := dao.genQ.Release
return m.WithContext(kit.Ctx).Where(m.AppID.Eq(appID), m.BizID.Eq(bizID)).Order(m.ID.Desc()).Take()
}

// CreateWithTx create one release instance with tx.
func (dao *releaseDao) CreateWithTx(kit *kit.Kit, tx *gen.QueryTx, g *table.Release) (uint32, error) {
if g == nil {
Expand Down
33 changes: 33 additions & 0 deletions bcs-services/bcs-bscp/pkg/dal/table/config_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,39 @@ func (c ConfigItem) ValidateDelete() error {
return nil
}

// ValidateRecover validate the config item's specific when recover it.
func (c ConfigItem) ValidateRecover() error {
if c.ID == 0 {
return errors.New("config item id can not be set")
}

if c.Spec == nil {
return errors.New("spec should be set")
}

if err := c.Spec.ValidateCreate(); err != nil {
return err
}

if c.Attachment == nil {
return errors.New("attachment should be set")
}

if err := c.Attachment.Validate(); err != nil {
return err
}

if c.Revision == nil {
return errors.New("revision should be set")
}

if err := c.Revision.ValidateCreate(); err != nil {
return err
}

return nil
}

// ConfigItemSpecColumns defines commit attachment's columns
var ConfigItemSpecColumns = mergeColumns(CISpecColumnDescriptor)

Expand Down
Loading

0 comments on commit 51df6ae

Please sign in to comment.