func createOrUpdateCondition()

in pkg/admin/services/traffic/generic_rule_operation.go [177:228]


func createOrUpdateCondition(key string, newRule model.ConditionRoute) error {
	var mergedRule string
	newRuleByte, _ := yaml.Marshal(newRule)

	oldRule, err := config.Governance.GetConfig(key)
	if err != nil {
		if _, ok := err.(*config.RuleNotFound); ok {
			logger.Infof("No existing configuration found, will create a new one directly!")
			err := config.Governance.SetConfig(key, string(newRuleByte))
			if err != nil {
				logger.Errorf("Failed to save configuration status, please try again!", err)
				return err
			}
			return nil
		} else {
			logger.Errorf("Failed to check previous configuration status, please try again!", err)
		}
		return err
	}

	if oldRule != "" {
		route := &model.ConditionRoute{}
		_ = yaml.Unmarshal([]byte(oldRule), route)

		exist := false
		for _, c := range route.Conditions {
			if c == newRule.Conditions[0] {
				exist = true
			}
		}
		if !exist {
			route.Conditions = append(route.Conditions, newRule.Conditions[0])
		}

		route.Force = newRule.Force
		route.Enabled = newRule.Enabled
		route.Runtime = newRule.Runtime
		mergedRuleByte, err := yaml.Marshal(route)
		if err != nil {
			return err
		}
		mergedRule = string(mergedRuleByte)
	} else {
		mergedRule = string(newRuleByte)
	}

	err = config.Governance.SetConfig(key, mergedRule)
	if err != nil {
		logger.Errorf("Failed to save region condition rule!", err)
	}
	return nil
}