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):
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()
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"] + "....")
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))
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"]):