diff options
-rw-r--r-- | heat/common/environment_util.py | 17 | ||||
-rw-r--r-- | heat/tests/test_common_env_util.py | 11 |
2 files changed, 25 insertions, 3 deletions
diff --git a/heat/common/environment_util.py b/heat/common/environment_util.py index 8a6ed4393..eb3b8cde1 100644 --- a/heat/common/environment_util.py +++ b/heat/common/environment_util.py @@ -12,6 +12,7 @@ # under the License. import collections +from oslo_log import log as logging from oslo_serialization import jsonutils from heat.common import environment_format as env_fmt @@ -21,15 +22,22 @@ from heat.common.i18n import _ ALLOWED_PARAM_MERGE_STRATEGIES = (OVERWRITE, MERGE, DEEP_MERGE) = ( 'overwrite', 'merge', 'deep_merge') +LOG = logging.getLogger(__name__) -def get_param_merge_strategy(merge_strategies, param_key): + +def get_param_merge_strategy(merge_strategies, param_key, + available_strategies=None): + if not available_strategies: + available_strategies = {} if merge_strategies is None: return OVERWRITE env_default = merge_strategies.get('default', OVERWRITE) + merge_strategy = merge_strategies.get( + param_key, available_strategies.get( + param_key, env_default)) - merge_strategy = merge_strategies.get(param_key, env_default) if merge_strategy in ALLOWED_PARAM_MERGE_STRATEGIES: return merge_strategy @@ -114,7 +122,7 @@ def merge_parameters(old, new, param_schemata, strategies_in_file, # if key not in param_schemata ignore it if key in param_schemata and value is not None: param_merge_strategy = get_param_merge_strategy( - strategies_in_file, key) + strategies_in_file, key, available_strategies) if key not in available_strategies: new_strategies[key] = param_merge_strategy @@ -124,12 +132,15 @@ def merge_parameters(old, new, param_schemata, strategies_in_file, param=key, env_file=env_file) if param_merge_strategy == DEEP_MERGE: + LOG.debug("Deep Merging Parameter: %s", key) param_merge(key, value, param_schemata[key], deep_merge=True) elif param_merge_strategy == MERGE: + LOG.debug("Merging Parameter: %s", key) param_merge(key, value, param_schemata[key]) else: + LOG.debug("Overriding Parameter: %s", key) old[key] = value return old, new_strategies diff --git a/heat/tests/test_common_env_util.py b/heat/tests/test_common_env_util.py index dff4c9c3d..fca3a9b34 100644 --- a/heat/tests/test_common_env_util.py +++ b/heat/tests/test_common_env_util.py @@ -202,7 +202,13 @@ class TestMergeEnvironments(common.HeatTestCase): 'lst_value1': "merge", 'json_value1': "deep_merge"} + env3_merge_strategies = { + 'default': "overwrite", + 'lst_value1': "deep_merge", + 'json_value1': "merge"} + self.env_2['parameter_merge_strategies'] = merge_strategies + self.env_3['parameter_merge_strategies'] = env3_merge_strategies files = {'env_1': json.dumps(self.env_1), 'env_2': json.dumps(self.env_2), @@ -221,7 +227,12 @@ class TestMergeEnvironments(common.HeatTestCase): 'default': "overwrite", 'lst_value2': "merge"} + env4_merge_strategies = { + 'default': "overwrite", + 'lst_value2': "overwrite"} + self.env_2['parameter_merge_strategies'] = merge_strategies + self.env_4['parameter_merge_strategies'] = env4_merge_strategies files = {'env_1': json.dumps(self.env_1), 'env_2': json.dumps(self.env_2), |