blob: 5e6c4b5e669dd33d1e686fc4bf5855a30deadb03 [file] [log] [blame]
Dhruvaraj Subhashchandrana03c56d2017-07-12 06:45:14 -05001#!/usr/bin/env python
2"""Copied from phosphor-settings-manager
3Loads a "target" YAML file and overwrites its values with values from
4"override" YAML files.
5
6Override files are processed in the order given.
7
8Usage:
9 merge_settings.py <target yaml> [override yamls]
10"""
11import sys
12import yaml
13import copy
14
15def 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
39if len(sys.argv) < 2:
40 sys.exit('Argument required: target yaml')
41
42if len(sys.argv) == 2:
43 # No overrides to handle
44 sys.exit(0)
45
46target_filename = sys.argv[1]
47with open(target_filename) as target_file:
48 data = yaml.safe_load(target_file)
49 print('Loaded target YAML file ' + target_filename)
50
51for 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
57with 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)