|
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