blob: 48ffcbc9c6c37e1fa0a57d32c4745f3891efb974 [file] [log] [blame]
#
# Copyright 2018 EveryUP Srl
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import logging
# from lib.rdcl_graph import RdclGraph
import copy
logging.basicConfig(level=logging.DEBUG)
log = logging.getLogger('OsmParser')
class RdclGraph(object):
""" Operates on the graph representation used for the GUI graph views """
node_ids = []
node_t3d_base = {
'info': {
'property': {
'custom_label': '',
},
'type': '',
'group': []
}
}
def __init__(self):
pass
def add_link(self, source, target, view, group, graph_object, optional={}):
if (source is None or source not in self.node_ids) or (target is None or target not in self.node_ids):
return
edge_obj = {
'source': source,
'target': target,
'view': view,
'group': [group],
}
edge_obj.update(optional)
#if edge_obj not in graph_object['edges']:
# graph_object['edges'].append(edge_obj)
graph_object['edges'].append(edge_obj)
def add_node(self, id, type, group, positions, graph_object, optional={}):
if id is None:
return
node = next((x for x in graph_object['vertices'] if x['id'] == id), None)
if node is not None:
node['info']['group'].append(group)
else:
node = copy.deepcopy(self.node_t3d_base)
node['id'] = id
node['info']['type'] = type
if group is not None:
node['info']['group'].append(group)
if positions and id in positions['vertices'] and 'x' in positions['vertices'][id] and 'y' in \
positions['vertices'][id]:
node['fx'] = positions['vertices'][id]['x']
node['fy'] = positions['vertices'][id]['y']
node['info'].update(optional)
graph_object['vertices'].append(node)
self.node_ids.append(id)
def is_directed_edge(self, source_type=None, target_type=None, layer=None, model={}):
if source_type is None or target_type is None or layer is None:
return None
if layer in model['layer'] and 'allowed_edges' in model['layer'][layer]:
if source_type in model['layer'][layer]['allowed_edges'] and target_type in \
model['layer'][layer]['allowed_edges'][source_type]['destination']:
edge_pro = model['layer'][layer]['allowed_edges'][source_type]['destination'][target_type]
return edge_pro['direct_edge'] if 'direct_edge' in edge_pro else False
return None
class OsmParser(RdclGraph):
""" Operates on the graph representation used for the GUI graph views """
def nsr_to_graph(self, nsr_full):
graph = {'vertices': [], 'edges': [], 'model': {
"layer": {
"nsr": {
"nodes": {
"vnfr": {
"addable": {},
"removable": {},
"expands": "vnfr"
},
"ns_vl": {
"addable": {},
"removable": {}
},
"ns_cp": {
"addable": {},
"removable": {}
},
},
"allowed_edges": {
"ns_vl": {
"destination": {
"vnfr": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
}
}
},
"vnfr": {
"destination": {
"ns_vl": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
},
}
}
}
},
"vnfr": {
"nodes": {
"vdur": {},
"cp": {},
"int_cp": {},
"vnf_vl": {}
},
"allowed_edges": {
"vdur": {
"destination": {
"cp": {
"direct_edge": False,
},
"int_cp": {
"direct_edge": False,
},
"vnf_vl": {
"direct_edge": False,
}
}
},
"cp": {
"destination": {
"vdur": {
"direct_edge": False,
}
}
},
"int_cp": {
"destination": {
"vdur": {
"direct_edge": False,
},
"vnf_vl": {
"direct_edge": False,
}
}
},
"vnf_vl": {
"destination": {
"vdur": {
"direct_edge": False
}
}
}
}
},
"name": "OSM",
"version": 1,
"description": "osm"
}
}, 'graph_parameters': {'view': {'nsr': {}, 'vnfr': {}}}}
nsr = nsr_full['nsr']
graph['graph_parameters']['view']['nsr'] = {}
nsr_graph_param = graph['graph_parameters']['view']['nsr']
nsr_graph_param['id'] = nsr['_id'] if '_id' in nsr else None
nsr_graph_param['nsdId'] = nsr['nsdId'] if 'nsdId' in nsr else None
nsr_graph_param['name-ref'] = nsr['name-ref'] if 'name-ref' in nsr else None
nsr_graph_param['operational-status'] = nsr['operational-status'] if 'operational-status' in nsr else None
nsr_graph_param['config-status'] = nsr['config-status'] if 'config-status' in nsr else None
nsr_graph_param['detailed-status'] = nsr['detailed-status'] if 'detailed-status' in nsr else None
nsr_graph_param['create-time'] = nsr['create-time'] if 'create-time' in nsr else None
nsr_graph_param['instantiate_params'] = nsr['instantiate_params'] if 'instantiate_params' in nsr else None
map_vnf_index_to_id = {}
for vnfr_id in nsr['constituent-vnfr-ref']:
current_vnfr = nsr_full['vnfr'][vnfr_id]
graph['graph_parameters']['view']['vnfr'][vnfr_id] = {}
vnfr_graph_param = graph['graph_parameters']['view']['vnfr'][vnfr_id]
vnfr_graph_param['id'] = vnfr_id
vnfr_graph_param['vnfd-id'] = current_vnfr['vnfd-id']
vnfr_graph_param['vnfd-ref'] = current_vnfr['vnfd-ref']
vnfr_graph_param['member-vnf-index-ref'] = current_vnfr['member-vnf-index-ref']
vnfr_graph_param['vim-account-id'] = current_vnfr['vim-account-id']
vnfr_graph_param['created-time'] = current_vnfr['created-time']
vnfr_label = current_vnfr['vnfd-ref'] + ':' + current_vnfr['member-vnf-index-ref']
map_vnf_index_to_id[current_vnfr['member-vnf-index-ref']] = vnfr_id
self.add_node(vnfr_id, 'vnfr', None, None, graph,
{'property': {'custom_label': vnfr_label}, 'osm': current_vnfr})
for cp in current_vnfr['connection-point']:
if cp['id']:
cp_id = vnfr_label + ':' + cp['id']
self.add_node(cp_id, 'cp', vnfr_id, None, graph, {'osm': cp})
for vdur in current_vnfr['vdur']:
vdur_id = vnfr_label + ':' + vdur['vdu-id-ref']
self.add_node(vdur_id, 'vdur', vnfr_id, None, graph, {'osm': vdur})
if current_vnfr['vnfd-id'] in nsr_full['vnfd']:
for vdu in nsr_full['vnfd'][current_vnfr['vnfd-id']]['vdu']:
if vdu['id'] == vdur['vdu-id-ref']:
if 'internal-connection-point' in vdu:
for int_cp in vdu['internal-connection-point']:
cp_id = vnfr_label + ':' + int_cp['id']
self.add_node(cp_id, 'int_cp', vnfr_id, None, graph, {'osm': int_cp})
for interface in vdu['interface']:
if interface['type'] == "EXTERNAL":
cp_id = vnfr_label + ':' + interface['external-connection-point-ref']
self.add_link(cp_id, vdur_id, 'vnfr', vnfr_id, graph)
elif interface['type'] == "INTERNAL":
cp_id = vnfr_label + ':' + interface['internal-connection-point-ref']
self.add_link(cp_id, vdur_id, 'vnfr', vnfr_id, graph)
if current_vnfr['vnfd-id'] in nsr_full['vnfd'] and 'internal-vld' in nsr_full['vnfd'][
current_vnfr['vnfd-id']]:
for vnfd_vld in nsr_full['vnfd'][current_vnfr['vnfd-id']]['internal-vld']:
vld_id = vnfr_label + ':' + vnfd_vld['id']
self.add_node(vld_id, 'vnf_vl', vnfr_id, None, graph, {'osm': vnfd_vld})
if vnfd_vld['internal-connection-point']:
for int_cp in vnfd_vld['internal-connection-point']:
int_cp_id = vnfr_label + ':' + int_cp['id-ref']
self.add_link(vld_id, int_cp_id, 'vnfr', vnfr_id, graph)
for ns_vld in nsr['nsd']['vld']:
self.add_node(ns_vld['id'], 'ns_vl', None, None, graph,
{'property': {'custom_label': ns_vld['name']}, 'osm': ns_vld})
for cp_ref in ns_vld['vnfd-connection-point-ref']:
ns_vld['id']+ ':' + str(cp_ref['member-vnf-index-ref']) + ':' + cp_ref['vnfd-connection-point-ref']
cp_id = ns_vld['id']+ ':' + str(cp_ref['member-vnf-index-ref']) + ':' + cp_ref['vnfd-connection-point-ref']
cp_label = str(cp_ref['vnfd-connection-point-ref'])
self.add_node(cp_id,'ns_cp','nsd',None,graph, {'property': {'custom_label': cp_label}, 'osm': cp_ref})
self.add_link(cp_id, ns_vld['id'], 'nsr', None, graph)
self.add_link(cp_id, map_vnf_index_to_id[str(cp_ref['member-vnf-index-ref'])], 'nsr', None, graph)
return graph
def vnfd_to_graph(self, vnfd_catalog):
graph = {'vertices': [], 'edges': [], 'model': {
"layer": {
"vnfd": {
"nodes": {
"vdu": {
"addable": {
"callback": "addNode"
},
"removable": {
"callback": "removeNode"
}
},
"cp": {
"addable": {
"callback": "addNode"
},
"removable": {
"callback": "removeNode"
}
},
"int_cp": {
"removable": {
"callback": "removeNode"
}
},
"vnf_vl": {
"addable": {
"callback": "addNode"
},
"removable": {
"callback": "removeNode"
}
}
},
"allowed_edges": {
"vdu": {
"destination": {
"cp": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
},
"vnf_vl": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
}
}
},
"cp": {
"destination": {
"vdu": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
}
}
},
# "int_cp": {
# "destination": {
# "vdu": {
# "direct_edge": False,
# },
# "vnf_vl": {
# "direct_edge": False,
# }
# }
# },
"vnf_vl": {
"destination": {
"int_cp": {
"direct_edge": False
},
"vdu": {
"callback": "addLink",
"direct_edge": False,
"removable": {}
}
}
}
}
},
"name": "OSM",
"version": 1,
"description": "osm"
}, "callback": {"addNode": {"class": "OSMController"}, "removeNode": {"class": "OSMController"},
"removeLink": {"class": "OSMController"}, "addLink": {"class": "OSMController"}}
}, 'graph_parameters': {'view': {'vnfd': {}}}}
if 'vnfd-catalog' in vnfd_catalog:
vnfd = vnfd_catalog['vnfd-catalog']['vnfd'][0]
elif 'vnfd:vnfd-catalog' in vnfd_catalog:
vnfd = vnfd_catalog['vnfd:vnfd-catalog']['vnfd'][0]
else:
return graph
vnfd_graph_param = graph['graph_parameters']['view']['vnfd']
vnfd_graph_param['id'] = vnfd['id'] if 'id' in vnfd else None
vnfd_graph_param['name'] = vnfd['name'] if 'name' in vnfd else None
vnfd_graph_param['short-name'] = vnfd['short-name'] if 'short-name' in vnfd else None
vnfd_graph_param['description'] = vnfd['description'] if 'description' in vnfd else None
vnfd_graph_param['version'] = vnfd['version'] if 'version' in vnfd else None
vnfd_graph_param['vendor'] = vnfd['vendor'] if 'vendor' in vnfd else None
if 'connection-point' in vnfd:
for extCp in vnfd['connection-point']:
self.add_node(extCp['name'], 'cp', vnfd['id'], None, graph,
{'property': {'custom_label': extCp['name']}, 'osm': extCp})
if 'vdu' in vnfd:
for vdu in vnfd['vdu']:
self.add_node(vdu['id'], 'vdu', vnfd['id'], None, graph,
{'property': {'custom_label': vdu['id']}, 'osm': vdu})
if 'internal-connection-point' in vdu:
for intCp in vdu['internal-connection-point']:
self.add_node(intCp['id'], 'int_cp', vnfd['id'], None, graph,
{'property': {'custom_label': intCp['id']}, 'osm': intCp})
if 'interface' in vdu:
for interface in vdu['interface']:
if interface['type'] == "EXTERNAL":
self.add_link(vdu['id'], interface['external-connection-point-ref'], 'vnfd', vnfd['id'], graph)
elif interface['type'] == "INTERNAL":
self.add_link(vdu['id'], interface['internal-connection-point-ref'], 'vnfd', vnfd['id'], graph, {'short': True})
if 'internal-vld' in vnfd:
for intVl in vnfd['internal-vld']:
self.add_node(intVl['id'], 'vnf_vl', intVl['id'], None, graph,
{'property': {'custom_label': intVl['id']}, 'osm': intVl})
for intCp in intVl['internal-connection-point']:
self.add_link(intVl['id'], intCp['id-ref'], 'vnfd', vnfd['id'], graph)
return graph
def nsd_to_graph(self, nsd_catalog):
graph = {'vertices': [], 'edges': [], 'model': {
"layer": {
"nsd": {
"nodes": {
"vnf": {
"addable": {"callback": "addNode"},
"removable": {"callback": "removeNode"}
},
"ns_cp": {
"removable": {"callback": "removeNode"}
},
"ns_vl": {
"addable": {
"callback": "addNode"
},
"removable": {
"callback": "removeNode"
}
}
},
"allowed_edges": {
"vnf":{
"destination": {
"ns_cp": {
"direct_edge": False,
"removable" : {
"callback": "removeLink",
}
},
"ns_vl": {
"direct_edge": False,
"callback": "addLink",
}
}
},
"ns_vl": {
"destination": {
"ns_cp": {
"direct_edge": False,
"removable": {
"callback": "removeLink",
}
},
"vnf": {
"direct_edge": False,
"callback": "addLink",
}
}
},
"ns_cp": {
"destination": {
"ns_vl": {
"direct_edge": False,
"removable": {
"callback": "removeLink",
}
},
"vnf": {
"direct_edge": False,
"removable": {
"callback": "removeLink",
}
}
}
}
}
},
"vnfd": {
"nodes": {
"vdu": {},
"cp": {},
"int_cp": {},
"vnf_vl": {}
},
"allowed_edges": {
"vdu": {
"destination": {
"cp": {
"direct_edge": False,
},
"int_cp": {
"direct_edge": False,
},
"vnf_vl": {
"direct_edge": False,
}
}
},
"cp": {
"destination": {
"vdu": {
"direct_edge": False,
}
}
},
"int_cp": {
"destination": {
"vdu": {
"direct_edge": False,
},
"vnf_vl": {
"direct_edge": False,
}
}
},
"vnf_vl": {
"destination": {
"vdu": {
"direct_edge": False
}
}
}
}
},
"name": "OSM",
"version": 1,
"description": "osm"
}, "callback": {"addNode": {"class": "OSMController"}, "removeNode": {"class": "OSMController"},
"removeLink": {"class": "OSMController"}, "addLink": {"class": "OSMController"}}
}, 'graph_parameters': {'view': {'nsd': {}}}}
if 'nsd-catalog' in nsd_catalog:
nsd = nsd_catalog['nsd-catalog']['nsd'][0]
elif 'nsd:nsd-catalog' in nsd_catalog:
nsd = nsd_catalog['nsd:nsd-catalog']['nsd'][0]
else:
return graph
nsd_graph_param = graph['graph_parameters']['view']['nsd']
nsd_graph_param['id'] = nsd['id'] if 'id' in nsd else None
nsd_graph_param['name'] = nsd['name'] if 'name' in nsd else None
nsd_graph_param['short-name'] = nsd['short-name'] if 'short-name' in nsd else None
nsd_graph_param['description'] = nsd['description'] if 'description' in nsd else None
nsd_graph_param['version'] = nsd['version'] if 'version' in nsd else None
nsd_graph_param['vendor'] = nsd['vendor'] if 'vendor' in nsd else None
if 'constituent-vnfd' in nsd:
for vnfd in nsd['constituent-vnfd']:
costinuent_id = vnfd['vnfd-id-ref']+":"+str(vnfd['member-vnf-index'])
self.add_node(costinuent_id, 'vnf', None, None, graph,
{'property': {'custom_label': costinuent_id}, 'osm': vnfd})
if 'vld' in nsd:
for vld in nsd['vld']:
self.add_node(vld['id'], 'ns_vl', None, None, graph,
{'property': {'custom_label': vld['id']}, 'osm': vld})
if 'vnfd-connection-point-ref' in vld:
for cp_ref in vld['vnfd-connection-point-ref']:
vnfd_id = cp_ref['vnfd-id-ref'] + ':' + str(cp_ref['member-vnf-index-ref'])
cp_id = vld['id']+ ':' + str(cp_ref['member-vnf-index-ref']) + ':' + cp_ref['vnfd-connection-point-ref']
cp_label = vld['id']+ ':' + cp_ref['vnfd-connection-point-ref']
node_payload = {'vld_id': vld['id']}
node_payload.update(cp_ref)
self.add_node(cp_id,'ns_cp',None,None,graph,
{'property': {'custom_label': cp_label}, 'osm': node_payload})
self.add_link(cp_id, vld['id'], 'nsd', None, graph)
self.add_link(cp_id, vnfd_id, 'nsd', None, graph)
return graph
if __name__ == '__main__':
parser = OsmParser()
print parser.nsr_to_graph({})