2 # Copyright 2018 EveryUP Srl
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
19 # from lib.rdcl_graph import RdclGraph
22 logging
.basicConfig(level
=logging
.DEBUG
)
23 log
= logging
.getLogger('OsmParser')
26 class RdclGraph(object):
27 """ Operates on the graph representation used for the GUI graph views """
42 def add_link(self
, source
, target
, view
, group
, graph_object
, optional
={}):
43 if (source
is None or source
not in self
.node_ids
) or (target
is None or target
not in self
.node_ids
):
52 edge_obj
.update(optional
)
53 #if edge_obj not in graph_object['edges']:
54 # graph_object['edges'].append(edge_obj)
55 graph_object
['edges'].append(edge_obj
)
57 def add_node(self
, id, type, group
, positions
, graph_object
, optional
={}):
60 node
= next((x
for x
in graph_object
['vertices'] if x
['id'] == id), None)
62 node
['info']['group'].append(group
)
64 node
= copy
.deepcopy(self
.node_t3d_base
)
66 node
['info']['type'] = type
68 node
['info']['group'].append(group
)
69 if positions
and id in positions
['vertices'] and 'x' in positions
['vertices'][id] and 'y' in \
70 positions
['vertices'][id]:
71 node
['fx'] = positions
['vertices'][id]['x']
72 node
['fy'] = positions
['vertices'][id]['y']
73 node
['info'].update(optional
)
74 graph_object
['vertices'].append(node
)
75 self
.node_ids
.append(id)
77 def is_directed_edge(self
, source_type
=None, target_type
=None, layer
=None, model
={}):
78 if source_type
is None or target_type
is None or layer
is None:
80 if layer
in model
['layer'] and 'allowed_edges' in model
['layer'][layer
]:
81 if source_type
in model
['layer'][layer
]['allowed_edges'] and target_type
in \
82 model
['layer'][layer
]['allowed_edges'][source_type
]['destination']:
83 edge_pro
= model
['layer'][layer
]['allowed_edges'][source_type
]['destination'][target_type
]
84 return edge_pro
['direct_edge'] if 'direct_edge' in edge_pro
else False
89 class OsmParser(RdclGraph
):
90 """ Operates on the graph representation used for the GUI graph views """
92 def nsr_to_graph(self
, nsr_full
):
94 graph
= {'vertices': [], 'edges': [], 'model': {
118 "callback": "addLink",
119 "direct_edge": False,
127 "callback": "addLink",
128 "direct_edge": False,
150 "direct_edge": False,
153 "direct_edge": False,
156 "direct_edge": False,
163 "direct_edge": False,
170 "direct_edge": False,
173 "direct_edge": False,
190 }, 'graph_parameters': {'view': {'nsr': {}, 'vnfr': {}}}}
192 nsr
= nsr_full
['nsr']
194 graph
['graph_parameters']['view']['nsr'] = {}
195 nsr_graph_param
= graph
['graph_parameters']['view']['nsr']
196 nsr_graph_param
['id'] = nsr
['_id'] if '_id' in nsr
else None
197 nsr_graph_param
['nsdId'] = nsr
['nsdId'] if 'nsdId' in nsr
else None
198 nsr_graph_param
['name-ref'] = nsr
['name-ref'] if 'name-ref' in nsr
else None
199 nsr_graph_param
['operational-status'] = nsr
['operational-status'] if 'operational-status' in nsr
else None
200 nsr_graph_param
['config-status'] = nsr
['config-status'] if 'config-status' in nsr
else None
201 nsr_graph_param
['detailed-status'] = nsr
['detailed-status'] if 'detailed-status' in nsr
else None
202 nsr_graph_param
['create-time'] = nsr
['create-time'] if 'create-time' in nsr
else None
203 nsr_graph_param
['instantiate_params'] = nsr
['instantiate_params'] if 'instantiate_params' in nsr
else None
205 map_vnf_index_to_id
= {}
206 for vnfr_id
in nsr
['constituent-vnfr-ref']:
207 current_vnfr
= nsr_full
['vnfr'][vnfr_id
]
209 graph
['graph_parameters']['view']['vnfr'][vnfr_id
] = {}
210 vnfr_graph_param
= graph
['graph_parameters']['view']['vnfr'][vnfr_id
]
211 vnfr_graph_param
['id'] = vnfr_id
212 vnfr_graph_param
['vnfd-id'] = current_vnfr
['vnfd-id']
213 vnfr_graph_param
['vnfd-ref'] = current_vnfr
['vnfd-ref']
214 vnfr_graph_param
['member-vnf-index-ref'] = current_vnfr
['member-vnf-index-ref']
215 vnfr_graph_param
['vim-account-id'] = current_vnfr
['vim-account-id']
216 vnfr_graph_param
['created-time'] = current_vnfr
['created-time']
218 vnfr_label
= current_vnfr
['vnfd-ref'] + ':' + current_vnfr
['member-vnf-index-ref']
219 map_vnf_index_to_id
[current_vnfr
['member-vnf-index-ref']] = vnfr_id
220 self
.add_node(vnfr_id
, 'vnfr', None, None, graph
,
221 {'property': {'custom_label': vnfr_label
}, 'osm': current_vnfr
})
223 for cp
in current_vnfr
['connection-point']:
225 cp_id
= vnfr_label
+ ':' + cp
['id']
226 self
.add_node(cp_id
, 'cp', vnfr_id
, None, graph
, {'osm': cp
})
228 for vdur
in current_vnfr
['vdur']:
229 vdur_id
= vnfr_label
+ ':' + vdur
['vdu-id-ref']
230 self
.add_node(vdur_id
, 'vdur', vnfr_id
, None, graph
, {'osm': vdur
})
231 if current_vnfr
['vnfd-id'] in nsr_full
['vnfd']:
232 for vdu
in nsr_full
['vnfd'][current_vnfr
['vnfd-id']]['vdu']:
233 if vdu
['id'] == vdur
['vdu-id-ref']:
234 if 'internal-connection-point' in vdu
:
235 for int_cp
in vdu
['internal-connection-point']:
236 cp_id
= vnfr_label
+ ':' + int_cp
['id']
237 self
.add_node(cp_id
, 'int_cp', vnfr_id
, None, graph
, {'osm': int_cp
})
238 for interface
in vdu
['interface']:
239 if interface
['type'] == "EXTERNAL":
240 cp_id
= vnfr_label
+ ':' + interface
['external-connection-point-ref']
241 self
.add_link(cp_id
, vdur_id
, 'vnfr', vnfr_id
, graph
)
242 elif interface
['type'] == "INTERNAL":
243 cp_id
= vnfr_label
+ ':' + interface
['internal-connection-point-ref']
244 self
.add_link(cp_id
, vdur_id
, 'vnfr', vnfr_id
, graph
)
246 if current_vnfr
['vnfd-id'] in nsr_full
['vnfd'] and 'internal-vld' in nsr_full
['vnfd'][
247 current_vnfr
['vnfd-id']]:
248 for vnfd_vld
in nsr_full
['vnfd'][current_vnfr
['vnfd-id']]['internal-vld']:
249 vld_id
= vnfr_label
+ ':' + vnfd_vld
['id']
250 self
.add_node(vld_id
, 'vnf_vl', vnfr_id
, None, graph
, {'osm': vnfd_vld
})
251 if vnfd_vld
['internal-connection-point']:
252 for int_cp
in vnfd_vld
['internal-connection-point']:
253 int_cp_id
= vnfr_label
+ ':' + int_cp
['id-ref']
254 self
.add_link(vld_id
, int_cp_id
, 'vnfr', vnfr_id
, graph
)
256 for ns_vld
in nsr
['nsd']['vld']:
257 self
.add_node(ns_vld
['id'], 'ns_vl', None, None, graph
,
258 {'property': {'custom_label': ns_vld
['name']}, 'osm': ns_vld
})
259 for cp_ref
in ns_vld
['vnfd-connection-point-ref']:
260 self
.add_link(map_vnf_index_to_id
[str(cp_ref
['member-vnf-index-ref'])], ns_vld
['id'], 'nsr', None,
265 def vnfd_to_graph(self
, vnfd_catalog
):
266 graph
= {'vertices': [], 'edges': [], 'model': {
272 "callback": "addNode"
275 "callback": "removeNode"
280 "callback": "addNode"
283 "callback": "removeNode"
288 "callback": "removeNode"
293 "callback": "addNode"
296 "callback": "removeNode"
304 "callback": "addLink",
305 "direct_edge": False,
309 "callback": "addLink",
310 "direct_edge": False,
318 "callback": "addLink",
319 "direct_edge": False,
327 # "direct_edge": False,
330 # "direct_edge": False,
340 "callback": "addLink",
341 "direct_edge": False,
351 }, "callback": {"addNode": {"class": "OSMController"}, "removeNode": {"class": "OSMController"},
352 "removeLink": {"class": "OSMController"}, "addLink": {"class": "OSMController"}}
353 }, 'graph_parameters': {'view': {'vnfd': {}}}}
354 if 'vnfd-catalog' in vnfd_catalog
:
355 vnfd
= vnfd_catalog
['vnfd-catalog']['vnfd'][0]
356 elif 'vnfd:vnfd-catalog' in vnfd_catalog
:
357 vnfd
= vnfd_catalog
['vnfd:vnfd-catalog']['vnfd'][0]
360 vnfd_graph_param
= graph
['graph_parameters']['view']['vnfd']
361 vnfd_graph_param
['id'] = vnfd
['id'] if 'id' in vnfd
else None
362 vnfd_graph_param
['name'] = vnfd
['name'] if 'name' in vnfd
else None
363 vnfd_graph_param
['short-name'] = vnfd
['short-name'] if 'short-name' in vnfd
else None
364 vnfd_graph_param
['description'] = vnfd
['description'] if 'description' in vnfd
else None
365 vnfd_graph_param
['version'] = vnfd
['version'] if 'version' in vnfd
else None
366 vnfd_graph_param
['vendor'] = vnfd
['vendor'] if 'vendor' in vnfd
else None
367 if 'connection-point' in vnfd
:
368 for extCp
in vnfd
['connection-point']:
369 self
.add_node(extCp
['name'], 'cp', vnfd
['id'], None, graph
,
370 {'property': {'custom_label': extCp
['name']}, 'osm': extCp
})
372 for vdu
in vnfd
['vdu']:
373 self
.add_node(vdu
['id'], 'vdu', vnfd
['id'], None, graph
,
374 {'property': {'custom_label': vdu
['id']}, 'osm': vdu
})
375 if 'internal-connection-point' in vdu
:
376 for intCp
in vdu
['internal-connection-point']:
377 self
.add_node(intCp
['id'], 'int_cp', vnfd
['id'], None, graph
,
378 {'property': {'custom_label': intCp
['id']}, 'osm': intCp
})
379 if 'interface' in vdu
:
380 for interface
in vdu
['interface']:
381 if interface
['type'] == "EXTERNAL":
382 self
.add_link(vdu
['id'], interface
['external-connection-point-ref'], 'vnfd', vnfd
['id'], graph
)
383 elif interface
['type'] == "INTERNAL":
384 self
.add_link(vdu
['id'], interface
['internal-connection-point-ref'], 'vnfd', vnfd
['id'], graph
, {'short': True})
385 if 'internal-vld' in vnfd
:
386 for intVl
in vnfd
['internal-vld']:
387 self
.add_node(intVl
['id'], 'vnf_vl', intVl
['id'], None, graph
,
388 {'property': {'custom_label': intVl
['id']}, 'osm': intVl
})
389 for intCp
in intVl
['internal-connection-point']:
390 self
.add_link(intVl
['id'], intCp
['id-ref'], 'vnfd', vnfd
['id'], graph
)
394 def nsd_to_graph(self
, nsd_catalog
):
395 graph
= {'vertices': [], 'edges': [], 'model': {
400 "addable": {"callback": "addNode"},
401 "removable": {"callback": "removeNode"}
406 "callback": "addNode"
409 "callback": "removeNode"
417 "direct_edge": False,
424 "direct_edge": False,
425 "callback": "addLink",
427 "callback": "removeLink",
435 "direct_edge": False,
436 "callback": "addLink",
438 "callback": "removeLink",
456 "direct_edge": False,
459 "direct_edge": False,
462 "direct_edge": False,
469 "direct_edge": False,
476 "direct_edge": False,
479 "direct_edge": False,
495 }, "callback": {"addNode": {"class": "OSMController"}, "removeNode": {"class": "OSMController"},
496 "removeLink": {"class": "OSMController"}, "addLink": {"class": "OSMController"}}
497 }, 'graph_parameters': {'view': {'nsd': {}}}}
498 if 'nsd-catalog' in nsd_catalog
:
499 nsd
= nsd_catalog
['nsd-catalog']['nsd'][0]
500 elif 'nsd:nsd-catalog' in nsd_catalog
:
501 nsd
= nsd_catalog
['nsd:nsd-catalog']['nsd'][0]
505 nsd_graph_param
= graph
['graph_parameters']['view']['nsd']
506 nsd_graph_param
['id'] = nsd
['id'] if 'id' in nsd
else None
507 nsd_graph_param
['name'] = nsd
['name'] if 'name' in nsd
else None
508 nsd_graph_param
['short-name'] = nsd
['short-name'] if 'short-name' in nsd
else None
509 nsd_graph_param
['description'] = nsd
['description'] if 'description' in nsd
else None
510 nsd_graph_param
['version'] = nsd
['version'] if 'version' in nsd
else None
511 nsd_graph_param
['vendor'] = nsd
['vendor'] if 'vendor' in nsd
else None
513 if 'constituent-vnfd' in nsd
:
514 for vnfd
in nsd
['constituent-vnfd']:
515 costinuent_id
= vnfd
['vnfd-id-ref']+":"+str(vnfd
['member-vnf-index'])
516 self
.add_node(costinuent_id
, 'vnf', None, None, graph
,
517 {'property': {'custom_label': costinuent_id
}, 'osm': vnfd
})
520 for vld
in nsd
['vld']:
521 self
.add_node(vld
['id'], 'ns_vl', None, None, graph
,
522 {'property': {'custom_label': vld
['id']}, 'osm': vld
})
523 if 'vnfd-connection-point-ref' in vld
:
524 for cp_ref
in vld
['vnfd-connection-point-ref']:
525 vnfd_id
= cp_ref
['vnfd-id-ref'] + ':' + str(cp_ref
['member-vnf-index-ref'])
526 self
.add_link(vld
['id'], vnfd_id
, 'nsd', None, graph
)
530 if __name__
== '__main__':
532 print parser
.nsr_to_graph({})