in ccmlib/common.py [0:0]
def merge_configuration(original, changes, delete_empty=True, delete_always=False):
if not isinstance(original, dict):
# if original is not a dictionary, assume changes override it.
new = changes
else:
# Copy original so we do not mutate it.
new = copy.deepcopy(original)
for k, v in changes.items():
# If the new value is None or an empty string, delete it if it's in the original data.
# We also ensure the backward compatibility of old and new names added as part of CASSANDRA-15234
if delete_empty and (v is None or (isinstance(v, str) and len(v) == 0)):
if k in new and new[k] is not None:
del new[k]
elif k in CCM_41_YAML_OPTIONS.keys() and \
CCM_41_YAML_OPTIONS[k] in new and \
new[CCM_41_YAML_OPTIONS[k]] is not None:
del new[CCM_41_YAML_OPTIONS[k]]
elif not delete_always:
new_value = v
# If key is in both dicts, update it with new values.
if k in new:
if isinstance(v, dict):
new_value = merge_configuration(new[k], v, delete_empty)
elif k in CCM_41_YAML_OPTIONS.keys() and CCM_41_YAML_OPTIONS[k] in new:
if isinstance(v, dict):
new_value = merge_configuration(new[k], v, delete_empty)
del new[CCM_41_YAML_OPTIONS[k]]
new[k] = new_value
return new