支持已存在命名空间,覆盖性迁移

This commit is contained in:
白茶清欢 2021-11-30 18:09:36 +08:00
parent 6c31164c37
commit f1fe0cfe88

View File

@ -61,49 +61,83 @@ func Migrate(dataDriver ITransform, optionList ...SetMigrateOption) error {
} }
var ( var (
sourceData map[string]string sourceData map[string]string
err error err error
namespaceDetail *model.Namespace namespaceDetail *model.Namespace
hasCreateConfigList []*model.Config
) )
if sourceData, err = dataDriver.GetSourceData(); nil != err { if sourceData, err = dataDriver.GetSourceData(); nil != err {
return err return err
} }
namespaceID := int64(0)
if namespaceDetail, err = manager.Namespace.GetNamespaceDetail(0, namespace); nil == err && nil != namespaceDetail { if namespaceDetail, err = manager.Namespace.GetNamespaceDetail(0, namespace); nil == err && nil != namespaceDetail {
namespaceID = namespaceDetail.ID
if !mo.Force { if !mo.Force {
// 非强制迁移, 报错 // 非强制迁移, 报错
return fmt.Errorf("当前命名空间 %s(%v) 已存在, 迁移存在风险, 若要强制迁移, 请使用force=true", namespace, namespaceDetail.ID) return fmt.Errorf("当前命名空间 %s(%v) 已存在, 迁移存在风险, 若要强制迁移, 请使用force=true", namespace, namespaceDetail.ID)
} }
// 强制迁移, 需要查询已有的key, 用于判断后续是 // 强制迁移, 需要查询已有的key, 用于判断后续是
if hasCreateConfigList, err = manager.Config.GetNamespaceConfig(namespaceDetail.ID); nil != err {
return fmt.Errorf("当前命名空间 %s(%v) 已存在, 强制迁移查询已存在的配置失败: %s", namespace, namespaceDetail.ID, err.Error())
}
} }
// 创建命名空间 if namespaceID == 0 {
if err = manager.Namespace.Create(&form.CreateNamespace{ // 创建命名空间
Namespace: namespace, if err = manager.Namespace.Create(&form.CreateNamespace{
Name: "apollo迁移-" + namespace, Namespace: namespace,
Description: "从apollo迁移过来的配置", Name: "apollo迁移-" + namespace,
CreateUserID: "migrate-script", Description: "从apollo迁移过来的配置",
}); nil != err { CreateUserID: "migrate-script",
return errors.New("创建命名空间失败 : " + err.Error()) }); 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())
} }
if nil != namespaceDetail && namespaceDetail.Status != model.NamespaceStatusNormal {
// 激活命名空间
if err = manager.Namespace.Active(&form.ActiveNamespace{
NamespaceID: 0,
Namespace: namespace,
UpdateUserID: "system-script",
}); nil != err {
return errors.New("激活命名空间失败 : " + err.Error())
}
}
hasCreateConfigTable := make(map[string]*model.Config)
for _, item := range hasCreateConfigList {
hasCreateConfigTable[item.Field] = item
}
// 迁移配置 // 迁移配置
for key, value := range sourceData { for key, value := range sourceData {
if err = manager.Config.Create(&form.CreateOrUpdateConfig{ hasSetConfig, exist := hasCreateConfigTable[key]
NamespaceID: 0, if !exist {
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)
}
continue
}
// 已存在更新,执行下面的逻辑
if hasSetConfig.Value == value {
// 已存在值和目标值一致,无需处理
continue
}
if err = manager.Config.Update(&form.CreateOrUpdateConfig{
NamespaceID: namespaceDetail.ID,
Namespace: namespace, Namespace: namespace,
Key: key, Key: key,
Value: value, Value: value,
OperateUserID: "system-script", OperateUserID: "system-script",
Description: fmt.Sprintf("从apollo-%s-%s迁移过来的配置", namespace, key), Description: fmt.Sprintf("从apollo-%s-%s迁移过来的配置", namespace, key),
}, namespaceDetail); nil != err { }, namespaceDetail, hasSetConfig); nil != err {
dataDriver.MigrateKeyFailCallback(namespace, key, value, err) dataDriver.MigrateKeyFailCallback(namespace, key, value, err)
} }
} }