Change prints from statements to function calls
[fuel.git] / deploy / deploy-config.py
index d87103b..8896080 100644 (file)
@@ -131,23 +131,10 @@ def merge_fuel_plugin_version_list(list1, list2):
     return final_list
 
 
-def merge_lists(list1, list2):
-    if list1 and list2:
-        if isinstance(list1[0], dict):
-            if 'plugin_version' in list1[0].get('metadata', {}):
-                return merge_fuel_plugin_version_list(list1, list2)
-            else:
-                warning("Lists with dictionary inside are not mergeable! "
-                        "List2 will overwrite List1. "
-                        "List1: %s\nList2: %s"
-                        % (list1, list2))
-                return list2
-        else:
-            return list2
-    elif list1:
-        return list1
-    else:
-        return list2
+def merge_networks(list_1, list_2):
+    new_nets = {x.get('name'): x for x in list_2}
+
+    return [new_nets.get(net.get('name'), net) for net in list_1]
 
 
 def merge_dicts(dict1, dict2):
@@ -155,17 +142,24 @@ def merge_dicts(dict1, dict2):
         if k in dict1 and k in dict2:
             if isinstance(dict1[k], dict) and isinstance(dict2[k], dict):
                 yield (k, dict(merge_dicts(dict1[k], dict2[k])))
-            elif isinstance(dict1[k], list) and isinstance(dict2[k], list):
-                yield (k, merge_lists(dict1[k], dict2[k]))
-            else:
-                # If one of the values is not a dict nor a list,
-                # you can't continue merging it.
-                # Value from second dict overrides one in first and we move on.
-                yield (k, dict2[k])
-        elif k in dict1:
-            yield (k, dict1[k])
-        else:
+                continue
+            if isinstance(dict1[k], list) and isinstance(dict2[k], list):
+                if k == 'versions':
+                    yield (k,
+                           merge_fuel_plugin_version_list(dict1[k], dict2[k]))
+                    continue
+                if k == 'networks':
+                    yield (k,
+                           merge_networks(dict1[k], dict2[k]))
+                    continue
+
+            # If one of the values is not a dict nor a list,
+            # you can't continue merging it.
+            # Value from second dict overrides one in first if exists.
+        if k in dict2:
             yield (k, dict2[k])
+        else:
+            yield (k, dict1[k])
 
 
 setup_yaml()
@@ -187,6 +181,7 @@ dea_base_sha = sha_uri(kwargs["dea_base_uri"])
 dea_base_comment = dea_base_conf['dea-base-config-metadata']['comment']
 dea_base_conf.pop('dea-base-config-metadata')
 final_dea_conf = dea_base_conf
+dea_pod_override_nodes = None
 
 # Fetch dea-pod-override, extract and purge meta-data, merge with previous dea data structure
 print('Parsing the dea-pod-override from: ' + kwargs["dea_pod_override_uri"] + "....")
@@ -200,6 +195,9 @@ if dea_pod_override_conf:
     dea_pod_comment = dea_pod_override_conf['dea-pod-override-config-metadata']['comment']
     print('Merging dea-base and dea-pod-override configuration ....')
     dea_pod_override_conf.pop('dea-pod-override-config-metadata')
+    # Copy the list of original nodes, which holds info on their transformations
+    if 'nodes' in dea_pod_override_conf:
+        dea_pod_override_nodes = list(dea_pod_override_conf['nodes'])
     if dea_pod_override_conf:
         final_dea_conf = dict(merge_dicts(final_dea_conf, dea_pod_override_conf))
 
@@ -285,6 +283,25 @@ if deploy_scenario_conf["stack-extensions"]:
             dea_scenario_module_override_conf['settings']['editable'][module["module"]] = scenario_module_override_conf
             final_dea_conf = dict(merge_dicts(final_dea_conf, dea_scenario_module_override_conf))
 
+def get_node_ifaces_and_trans(nodes, nid):
+    for node in nodes:
+        if node['id'] == nid:
+            if 'transformations' in node and 'interfaces' in node:
+                return (node['interfaces'], node['transformations'])
+            else:
+                return None
+
+    return None
+
+if dea_pod_override_nodes:
+    for node in final_dea_conf['nodes']:
+       data = get_node_ifaces_and_trans(dea_pod_override_nodes, node['id'])
+       if data:
+           print ("Honoring original interfaces and transformations for "
+                  "node %d to %s, %s" % (node['id'], data[0], data[1]))
+           node['interfaces'] = data[0]
+           node['transformations'] = data[1]
+
 # Dump final dea.yaml including configuration management meta-data to argument provided
 # directory
 if not os.path.exists(kwargs["output_path"]):