def merge_configuration()

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