支持已存在命名空间,覆盖性迁移
This commit is contained in:
		@ -61,49 +61,83 @@ func Migrate(dataDriver ITransform, optionList ...SetMigrateOption) error {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		sourceData      map[string]string
 | 
			
		||||
		err             error
 | 
			
		||||
		namespaceDetail *model.Namespace
 | 
			
		||||
		sourceData          map[string]string
 | 
			
		||||
		err                 error
 | 
			
		||||
		namespaceDetail     *model.Namespace
 | 
			
		||||
		hasCreateConfigList []*model.Config
 | 
			
		||||
	)
 | 
			
		||||
	if sourceData, err = dataDriver.GetSourceData(); nil != err {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	namespaceID := int64(0)
 | 
			
		||||
	if namespaceDetail, err = manager.Namespace.GetNamespaceDetail(0, namespace); nil == err && nil != namespaceDetail {
 | 
			
		||||
		namespaceID = namespaceDetail.ID
 | 
			
		||||
		if !mo.Force {
 | 
			
		||||
			// 非强制迁移, 报错
 | 
			
		||||
			return fmt.Errorf("当前命名空间 %s(%v) 已存在, 迁移存在风险, 若要强制迁移, 请使用force=true", namespace, namespaceDetail.ID)
 | 
			
		||||
		}
 | 
			
		||||
		// 强制迁移, 需要查询已有的key, 用于判断后续是
 | 
			
		||||
		if hasCreateConfigList, err = manager.Config.GetNamespaceConfig(namespaceDetail.ID); nil != err {
 | 
			
		||||
			return fmt.Errorf("当前命名空间 %s(%v) 已存在, 强制迁移查询已存在的配置失败: %s", namespace, namespaceDetail.ID, err.Error())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// 创建命名空间
 | 
			
		||||
	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())
 | 
			
		||||
	if namespaceID == 0 {
 | 
			
		||||
		// 创建命名空间
 | 
			
		||||
		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 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 {
 | 
			
		||||
		if err = manager.Config.Create(&form.CreateOrUpdateConfig{
 | 
			
		||||
			NamespaceID:   0,
 | 
			
		||||
		hasSetConfig, exist := hasCreateConfigTable[key]
 | 
			
		||||
		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,
 | 
			
		||||
			Key:           key,
 | 
			
		||||
			Value:         value,
 | 
			
		||||
			OperateUserID: "system-script",
 | 
			
		||||
			Description:   fmt.Sprintf("从apollo-%s-%s迁移过来的配置", namespace, key),
 | 
			
		||||
		}, namespaceDetail); nil != err {
 | 
			
		||||
		}, namespaceDetail, hasSetConfig); nil != err {
 | 
			
		||||
			dataDriver.MigrateKeyFailCallback(namespace, key, value, err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user