|
27 | 27 |
|
28 | 28 | class ConfigProcessor(object):
|
29 | 29 |
|
30 |
| - def process(self, cwd=None, path=None, filters=(), exclude_keys=(), enclosing_key=None, remove_enclosing_key=None, output_format="yaml", |
31 |
| - print_data=False, output_file=None, skip_interpolations=False, skip_interpolation_validation=False, skip_secrets=False, multi_line_string=False, |
32 |
| - type_strategies = [(list, ["append"]), (dict, ["merge"])], fallback_strategies = ["override"], type_conflict_strategies = ["override"]): |
| 30 | + def process(self, cwd=None, |
| 31 | + path=None, |
| 32 | + filters=(), |
| 33 | + exclude_keys=(), |
| 34 | + enclosing_key=None, |
| 35 | + remove_enclosing_key=None, |
| 36 | + output_format="yaml", |
| 37 | + print_data=False, |
| 38 | + output_file=None, |
| 39 | + skip_interpolations=False, |
| 40 | + skip_interpolation_validation=False, |
| 41 | + skip_secrets=False, |
| 42 | + multi_line_string=False, |
| 43 | + type_strategies=[(list, ["append"]), (dict, ["merge"])], |
| 44 | + fallback_strategies=["override"], |
| 45 | + type_conflict_strategies=["override"]): |
33 | 46 |
|
34 | 47 | path = self.get_relative_path(path)
|
35 | 48 |
|
36 |
| - if skip_interpolations: |
37 |
| - skip_interpolation_validation = True |
38 |
| - |
39 |
| - elif skip_secrets: |
| 49 | + if skip_interpolations or skip_secrets: |
40 | 50 | skip_interpolation_validation = True
|
41 | 51 |
|
42 | 52 | if cwd is None:
|
43 | 53 | cwd = os.getcwd()
|
44 | 54 |
|
45 |
| - generator = ConfigGenerator(cwd, path, multi_line_string, type_strategies, fallback_strategies, type_conflict_strategies) |
| 55 | + generator = ConfigGenerator(cwd, path, multi_line_string, type_strategies, fallback_strategies, |
| 56 | + type_conflict_strategies) |
46 | 57 | generator.generate_hierarchy()
|
47 | 58 | generator.process_hierarchy()
|
48 | 59 |
|
| 60 | + # Exclude data before interpolations |
49 | 61 | if len(exclude_keys) > 0:
|
50 |
| - generator.exclude_keys(exclude_keys) |
| 62 | + generator.exclude_keys(exclude_keys) |
51 | 63 |
|
| 64 | + # Resolve multiple levels of interpolations: |
52 | 65 | if not skip_interpolations:
|
53 | 66 | generator.resolve_interpolations()
|
54 |
| - # Perform another resolving, in case some secrets are used as interpolations. |
| 67 | + |
| 68 | + # Resolve nested interpolations: |
55 | 69 | # Example:
|
56 | 70 | # map1:
|
57 | 71 | # key1: value1
|
58 | 72 | # map2: "{{map1.key1}}"
|
59 | 73 | # value: "something-{{map2.key1}} <--- this will be resolved at this step
|
60 | 74 | generator.resolve_interpolations()
|
| 75 | + |
| 76 | + # Add dynamic data and resolve interpolations using dynamic data: |
61 | 77 | generator.add_dynamic_data()
|
62 | 78 | generator.resolve_interpolations()
|
63 | 79 |
|
64 |
| - if not skip_secrets: |
65 |
| - default_aws_profile = self.get_default_aws_profile(generator.generated_data) |
66 |
| - generator.resolve_secrets(default_aws_profile) |
67 |
| - # Perform another resolving, in case some secrets are used as interpolations. |
68 |
| - # Example: |
69 |
| - # value1: "{{ssm.mysecret}}" |
70 |
| - # value2: "something-{{value1}} <--- this will be resolved at this step |
| 80 | + # Add env vars and resolve interpolations using env vars: |
| 81 | + generator.resolve_env() |
71 | 82 | generator.resolve_interpolations()
|
72 | 83 |
|
73 |
| - generator.resolve_env() |
74 |
| - generator.resolve_interpolations() |
75 |
| - |
| 84 | + # Add secrets and resolve interpolations using secrets: |
| 85 | + if not skip_secrets: |
| 86 | + default_aws_profile = self.get_default_aws_profile(generator.generated_data) |
| 87 | + generator.resolve_secrets(default_aws_profile) |
| 88 | + # Perform resolving in case some secrets are used in nested interpolations. |
| 89 | + # Example: |
| 90 | + # value1: "{{ssm.mysecret}}" |
| 91 | + # value2: "something-{{value1}} <--- this will be resolved at this step |
| 92 | + generator.resolve_interpolations() |
| 93 | + |
| 94 | + # Filter data before interpolation validation |
76 | 95 | if len(filters) > 0:
|
77 | 96 | generator.filter_data(filters)
|
78 |
| - |
79 | 97 | if not skip_interpolation_validation:
|
80 | 98 | generator.validate_interpolations()
|
81 | 99 |
|
@@ -154,12 +172,14 @@ def dict_constructor(loader, node):
|
154 | 172 | def str_representer_pipestyle(dumper, data):
|
155 | 173 | style = '|' if '\n' in data else None
|
156 | 174 | return dumper.represent_scalar('tag:yaml.org,2002:str', data, style=style)
|
| 175 | + |
157 | 176 | Dumper.add_representer(str, str_representer_pipestyle)
|
158 | 177 |
|
159 | 178 | if not PY3:
|
160 | 179 | def unicode_representer_pipestyle(dumper, data):
|
161 | 180 | style = u'|' if u'\n' in data else None
|
162 | 181 | return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style=style)
|
| 182 | + |
163 | 183 | Dumper.add_representer(unicode, unicode_representer_pipestyle)
|
164 | 184 |
|
165 | 185 | return Dumper
|
@@ -194,7 +214,8 @@ def merge_yamls(values, yaml_content, type_strategies, fallback_strategies, type
|
194 | 214 | raise Exception("Failed to merge key '{}', because of mismatch in type: {} vs {}"
|
195 | 215 | .format(key, type(values[key]), type(value)))
|
196 | 216 | if key in values and not isinstance(value, primitive_types):
|
197 |
| - values[key] = ConfigGenerator.merge_value(values[key], value, type_strategies, fallback_strategies, type_conflict_strategies) |
| 217 | + values[key] = ConfigGenerator.merge_value(values[key], value, type_strategies, fallback_strategies, |
| 218 | + type_conflict_strategies) |
198 | 219 | else:
|
199 | 220 | values[key] = value
|
200 | 221 |
|
@@ -227,7 +248,8 @@ def process_hierarchy(self):
|
227 | 248 | for yaml_files in self.hierarchy:
|
228 | 249 | for yaml_file in yaml_files:
|
229 | 250 | yaml_content = self.yaml_get_content(yaml_file)
|
230 |
| - self.merge_yamls(merged_values, yaml_content, self.type_strategies, self.fallback_strategies, self.type_conflict_strategies) |
| 251 | + self.merge_yamls(merged_values, yaml_content, self.type_strategies, self.fallback_strategies, |
| 252 | + self.type_conflict_strategies) |
231 | 253 | self.resolve_simple_interpolations(merged_values, yaml_file)
|
232 | 254 | self.generated_data = merged_values
|
233 | 255 |
|
|
0 commit comments