Dhruvaraj Subhashchandran | a03c56d | 2017-07-12 06:45:14 -0500 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | """Copied from phosphor-settings-manager |
| 3 | Loads a "target" YAML file and overwrites its values with values from |
| 4 | "override" YAML files. |
| 5 | |
| 6 | Override files are processed in the order given. |
| 7 | |
| 8 | Usage: |
| 9 | merge_settings.py <target yaml> [override yamls] |
| 10 | """ |
| 11 | import sys |
| 12 | import yaml |
| 13 | import copy |
| 14 | |
| 15 | def dict_merge(target, source): |
| 16 | """Deep merge for dicts. |
| 17 | |
| 18 | Works like dict.update() that recursively updates any dict values present in |
| 19 | both parameters. |
| 20 | |
| 21 | Args: |
| 22 | target (dict): Values to be overwritten by corresponding values from |
| 23 | `source`. |
| 24 | source (dict): Overriding values. Not changed by call. |
| 25 | |
| 26 | Returns: |
| 27 | `target` with values overwritten from those in `source` at any and all |
| 28 | levels of nested dicts. |
| 29 | """ |
| 30 | if not isinstance(source, dict): |
| 31 | return source |
| 32 | for k, v in source.iteritems(): |
| 33 | if k in target and isinstance(target[k], dict): |
| 34 | dict_merge(target[k], v) |
| 35 | else: |
| 36 | target[k] = copy.deepcopy(v) |
| 37 | return target |
| 38 | |
| 39 | if len(sys.argv) < 2: |
| 40 | sys.exit('Argument required: target yaml') |
| 41 | |
| 42 | if len(sys.argv) == 2: |
| 43 | # No overrides to handle |
| 44 | sys.exit(0) |
| 45 | |
Dhruvaraj Subhashchandran | a03c56d | 2017-07-12 06:45:14 -0500 | [diff] [blame] | 46 | target_filename = sys.argv[1] |
| 47 | with open(target_filename) as target_file: |
| 48 | data = yaml.safe_load(target_file) |
| 49 | print('Loaded target YAML file ' + target_filename) |
| 50 | |
| 51 | for override_filename in sys.argv[2:]: |
| 52 | with open(override_filename) as override_file: |
| 53 | override = yaml.safe_load(override_file) |
| 54 | dict_merge(data, override) |
| 55 | print('Merged override YAML file ' + override_filename) |
| 56 | |
| 57 | with open(target_filename, 'w') as target_file: |
| 58 | yaml.dump(data, target_file, default_flow_style=False) |
| 59 | print('Wrote merged target YAML file ' + target_filename) |