@@ -569,7 +569,8 @@ def deep_merge(obj1: T, obj2: T, predicate) -> T:
569
569
def deep_merge_dict (dict1 , dict2 , predicate ):
570
570
result = dict1 .copy ()
571
571
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 :
573
574
result [key ] = deep_merge (dict1 [key ], value , predicate )
574
575
else :
575
576
result [key ] = value
@@ -588,25 +589,28 @@ def deep_merge_list(list1, list2, predicate):
588
589
589
590
590
591
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"""
592
594
# 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 :
594
596
return True
595
597
596
598
# 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" ):
598
600
return True
599
601
600
602
return False
601
603
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 )
603
605
604
606
605
607
class Config :
606
608
def __init__ (self , * configs : typing .Any ) -> None :
607
609
assert len (configs ) > 0 , "must provide at least one config"
608
610
if len (configs ) > 1 :
609
611
config = deep_merge_configs (list (configs ))
612
+ print ("merged config:" )
613
+ print (yaml .dump (config ))
610
614
else :
611
615
config = configs [0 ]
612
616
assert isinstance (config , dict ), "config must be a dict"
0 commit comments