112 lines
2.9 KiB
Go
112 lines
2.9 KiB
Go
|
// Package transform ...
|
||
|
//
|
||
|
// Description : 数据迁移
|
||
|
//
|
||
|
// Author : go_developer@163.com<白茶清欢>
|
||
|
//
|
||
|
// Date : 2021-11-30 3:57 下午
|
||
|
package transform
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
|
||
|
"git.zhangdeman.cn/zhangdeman/center-config/define/form"
|
||
|
|
||
|
"git.zhangdeman.cn/zhangdeman/center-config/define/model"
|
||
|
"git.zhangdeman.cn/zhangdeman/center-config/manager"
|
||
|
)
|
||
|
|
||
|
// MigrateOption 迁移的配置选项
|
||
|
//
|
||
|
// Author : go_developer@163.com<白茶清欢>
|
||
|
//
|
||
|
// Date : 5:41 下午 2021/11/30
|
||
|
type MigrateOption struct {
|
||
|
Force bool // 强制迁移
|
||
|
}
|
||
|
|
||
|
// SetMigrateOption 设置迁移选项
|
||
|
type SetMigrateOption func(mo *MigrateOption)
|
||
|
|
||
|
// WithOptionForce 配置是否强制迁移
|
||
|
//
|
||
|
// Author : go_developer@163.com<白茶清欢>
|
||
|
//
|
||
|
// Date : 5:43 下午 2021/11/30
|
||
|
func WithOptionForce(force bool) SetMigrateOption {
|
||
|
return func(mo *MigrateOption) {
|
||
|
mo.Force = force
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Migrate 数据迁移
|
||
|
//
|
||
|
// Author : go_developer@163.com<白茶清欢>
|
||
|
//
|
||
|
// Date : 3:58 下午 2021/11/30
|
||
|
func Migrate(dataDriver ITransform, optionList ...SetMigrateOption) error {
|
||
|
if nil == dataDriver {
|
||
|
return errors.New("data driver is nil")
|
||
|
}
|
||
|
namespace := dataDriver.GetNamespace()
|
||
|
if len(namespace) == 0 {
|
||
|
return errors.New("数据驱动器中, 未设置namespace")
|
||
|
}
|
||
|
|
||
|
mo := &MigrateOption{}
|
||
|
|
||
|
for _, o := range optionList {
|
||
|
o(mo)
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
sourceData map[string]string
|
||
|
err error
|
||
|
namespaceDetail *model.Namespace
|
||
|
)
|
||
|
if sourceData, err = dataDriver.GetSourceData(); nil != err {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
if namespaceDetail, err = manager.Namespace.GetNamespaceDetail(0, namespace); nil == err && nil != namespaceDetail {
|
||
|
if !mo.Force {
|
||
|
// 非强制迁移, 报错
|
||
|
return fmt.Errorf("当前命名空间 %s(%v) 已存在, 迁移存在风险, 若要强制迁移, 请使用force=true", namespace, namespaceDetail.ID)
|
||
|
}
|
||
|
// 强制迁移, 需要查询已有的key, 用于判断后续是
|
||
|
}
|
||
|
// 创建命名空间
|
||
|
if err = manager.Namespace.Create(&form.CreateNamespace{
|
||
|
Namespace: namespace,
|
||
|
Name: "apollo迁移-" + namespace,
|
||
|
Description: "从apollo迁移过来的配置",
|
||
|
CreateUserID: "migrate-script",
|
||
|
}); nil != err {
|
||
|
return errors.New("创建命名空间失败 : " + err.Error())
|
||
|
}
|
||
|
// 激活命名空间
|
||
|
if err = manager.Namespace.Active(&form.ActiveNamespace{
|
||
|
NamespaceID: 0,
|
||
|
Namespace: namespace,
|
||
|
UpdateUserID: "system-script",
|
||
|
}); nil != err {
|
||
|
return errors.New("激活命名空间失败 : " + err.Error())
|
||
|
}
|
||
|
|
||
|
// 迁移配置
|
||
|
for key, value := range sourceData {
|
||
|
if err = manager.Config.Create(&form.CreateOrUpdateConfig{
|
||
|
NamespaceID: 0,
|
||
|
Namespace: namespace,
|
||
|
Key: key,
|
||
|
Value: value,
|
||
|
OperateUserID: "system-script",
|
||
|
Description: fmt.Sprintf("从apollo-%s-%s迁移过来的配置", namespace, key),
|
||
|
}, namespaceDetail); nil != err {
|
||
|
dataDriver.MigrateKeyFailCallback(namespace, key, value, err)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|