diff --git a/controllers/operandconfig.go b/controllers/operandconfig.go index e14340e9d..4d680cf02 100644 --- a/controllers/operandconfig.go +++ b/controllers/operandconfig.go @@ -164,7 +164,7 @@ func mergeCSCRs(csSummary, csCR, ruleSlice []interface{}, serviceControllerMappi } newResource := getItemByGVKNameNamespace(summaryCR.(map[string]interface{})["resources"].([]interface{}), opconNs, apiVersion, kind, name, namespace) if newResource != nil { - operator.(map[string]interface{})["resources"].([]interface{})[i] = mergeCRsIntoOperandConfigWithDefaultRules(opResource.(map[string]interface{}), newResource.(map[string]interface{}), true) + operator.(map[string]interface{})["resources"].([]interface{})[i] = mergeCRsIntoOperandConfigWithDefaultRules(opResource.(map[string]interface{}), newResource.(map[string]interface{}), false) } } csSummary = setResByName(csSummary, operator.(map[string]interface{})["name"].(string), operator.(map[string]interface{})["resources"].([]interface{})) @@ -175,7 +175,6 @@ func mergeCSCRs(csSummary, csCR, ruleSlice []interface{}, serviceControllerMappi // mergeCRsIntoOperandConfig merges CRs by specific rules func mergeCRsIntoOperandConfigWithDefaultRules(defaultMap map[string]interface{}, changedMap map[string]interface{}, directAssign bool) map[string]interface{} { - // TODO: Apply default rules for key := range defaultMap { if reflect.DeepEqual(defaultMap[key], changedMap[key]) { continue @@ -233,12 +232,13 @@ func mergeChangedMap(key string, defaultMap interface{}, changedMap interface{}, changedMapRef := changedMap.([]interface{}) for i := range defaultMapRef { if _, ok := defaultMapRef[i].(map[string]interface{}); ok { - for newKey := range defaultMapRef[i].(map[string]interface{}) { - // check if the changedMapRef[i] is nil - if changedMapRef[i] == nil { - changedMapRef[i] = map[string]interface{}{} + if len(changedMapRef) <= i { + finalMap[key] = append(finalMap[key].([]interface{}), defaultMapRef[i]) + } else { + + for newKey := range defaultMapRef[i].(map[string]interface{}) { + mergeChangedMap(newKey, defaultMapRef[i].(map[string]interface{})[newKey], changedMapRef[i].(map[string]interface{})[newKey], finalMap[key].([]interface{})[i].(map[string]interface{}), directAssign) } - mergeChangedMap(newKey, defaultMapRef[i].(map[string]interface{})[newKey], changedMapRef[i].(map[string]interface{})[newKey], finalMap[key].([]interface{})[i].(map[string]interface{}), directAssign) } } } @@ -342,12 +342,13 @@ func deepMergeTwoMaps(key string, defaultMap interface{}, changedMap interface{} changedMapRef := changedMap.([]interface{}) for i := range defaultMapRef { if _, ok := defaultMapRef[i].(map[string]interface{}); ok { - for newKey := range defaultMapRef[i].(map[string]interface{}) { - // check if the changedMapRef[i] is nil - if changedMapRef[i] == nil { - changedMapRef[i] = map[string]interface{}{} + if len(changedMapRef) <= i { + finalMap[key] = append(finalMap[key].([]interface{}), defaultMapRef[i]) + } else { + + for newKey := range defaultMapRef[i].(map[string]interface{}) { + deepMergeTwoMaps(newKey, defaultMapRef[i].(map[string]interface{})[newKey], changedMapRef[i].(map[string]interface{})[newKey], finalMap[key].([]interface{})[i].(map[string]interface{})) } - deepMergeTwoMaps(newKey, defaultMapRef[i].(map[string]interface{})[newKey], changedMapRef[i].(map[string]interface{})[newKey], finalMap[key].([]interface{})[i].(map[string]interface{})) } } }