Skip to content

Commit 959ddda

Browse files
authored
Fix executing interpolation when skip_interpolations is True (#113)
1 parent b7311ba commit 959ddda

File tree

1 file changed

+45
-23
lines changed

1 file changed

+45
-23
lines changed

himl/config_generator.py

+45-23
Original file line numberDiff line numberDiff line change
@@ -27,55 +27,73 @@
2727

2828
class ConfigProcessor(object):
2929

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"]):
3346

3447
path = self.get_relative_path(path)
3548

36-
if skip_interpolations:
37-
skip_interpolation_validation = True
38-
39-
elif skip_secrets:
49+
if skip_interpolations or skip_secrets:
4050
skip_interpolation_validation = True
4151

4252
if cwd is None:
4353
cwd = os.getcwd()
4454

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)
4657
generator.generate_hierarchy()
4758
generator.process_hierarchy()
4859

60+
# Exclude data before interpolations
4961
if len(exclude_keys) > 0:
50-
generator.exclude_keys(exclude_keys)
62+
generator.exclude_keys(exclude_keys)
5163

64+
# Resolve multiple levels of interpolations:
5265
if not skip_interpolations:
5366
generator.resolve_interpolations()
54-
# Perform another resolving, in case some secrets are used as interpolations.
67+
68+
# Resolve nested interpolations:
5569
# Example:
5670
# map1:
5771
# key1: value1
5872
# map2: "{{map1.key1}}"
5973
# value: "something-{{map2.key1}} <--- this will be resolved at this step
6074
generator.resolve_interpolations()
75+
76+
# Add dynamic data and resolve interpolations using dynamic data:
6177
generator.add_dynamic_data()
6278
generator.resolve_interpolations()
6379

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()
7182
generator.resolve_interpolations()
7283

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
7695
if len(filters) > 0:
7796
generator.filter_data(filters)
78-
7997
if not skip_interpolation_validation:
8098
generator.validate_interpolations()
8199

@@ -154,12 +172,14 @@ def dict_constructor(loader, node):
154172
def str_representer_pipestyle(dumper, data):
155173
style = '|' if '\n' in data else None
156174
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style=style)
175+
157176
Dumper.add_representer(str, str_representer_pipestyle)
158177

159178
if not PY3:
160179
def unicode_representer_pipestyle(dumper, data):
161180
style = u'|' if u'\n' in data else None
162181
return dumper.represent_scalar(u'tag:yaml.org,2002:str', data, style=style)
182+
163183
Dumper.add_representer(unicode, unicode_representer_pipestyle)
164184

165185
return Dumper
@@ -194,7 +214,8 @@ def merge_yamls(values, yaml_content, type_strategies, fallback_strategies, type
194214
raise Exception("Failed to merge key '{}', because of mismatch in type: {} vs {}"
195215
.format(key, type(values[key]), type(value)))
196216
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)
198219
else:
199220
values[key] = value
200221

@@ -227,7 +248,8 @@ def process_hierarchy(self):
227248
for yaml_files in self.hierarchy:
228249
for yaml_file in yaml_files:
229250
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)
231253
self.resolve_simple_interpolations(merged_values, yaml_file)
232254
self.generated_data = merged_values
233255

0 commit comments

Comments
 (0)