summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--heat/common/environment_util.py17
-rw-r--r--heat/tests/test_common_env_util.py11
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),