Skip to content

Commit 07204e7

Browse files
committed
change merging behavior for specific keys
needs a more general solution
1 parent f06bc1c commit 07204e7

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

devcluster/config.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,8 @@ def deep_merge(obj1: T, obj2: T, predicate) -> T:
569569
def deep_merge_dict(dict1, dict2, predicate):
570570
result = dict1.copy()
571571
for key, value in dict2.items():
572-
if key in dict1:
572+
override_no_merge = ["resource_manager"]
573+
if key in dict1 and not key in override_no_merge:
573574
result[key] = deep_merge(dict1[key], value, predicate)
574575
else:
575576
result[key] = value
@@ -588,25 +589,28 @@ def deep_merge_list(list1, list2, predicate):
588589

589590

590591
def deep_merge_configs(configs: typing.List[dict]) -> typing.Dict:
591-
def should_merge(d1: dict, d2: dict) -> bool:
592+
def should_merge(base: dict, override: dict) -> bool:
593+
"""compare same level keys"""
592594
# is a stage
593-
if d1.keys() == d2.keys() and len(d1.keys()) == 1:
595+
if base.keys() == override.keys() and len(base.keys()) == 1:
594596
return True
595597

596598
# is a rp
597-
if d1.get("pool_name") is not None and d1.get("pool_name") == d2.get("pool_name"):
599+
if base.get("pool_name") is not None and base.get("pool_name") == override.get("pool_name"):
598600
return True
599601

600602
return False
601603

602-
return functools.reduce(lambda x, y: deep_merge(x, y, should_merge), configs)
604+
return functools.reduce(lambda base, override: deep_merge(base, override, should_merge), configs)
603605

604606

605607
class Config:
606608
def __init__(self, *configs: typing.Any) -> None:
607609
assert len(configs) > 0, "must provide at least one config"
608610
if len(configs) > 1:
609611
config = deep_merge_configs(list(configs))
612+
print("merged config:")
613+
print(yaml.dump(config))
610614
else:
611615
config = configs[0]
612616
assert isinstance(config, dict), "config must be a dict"

0 commit comments

Comments
 (0)