* YANG to TOSCA VNFFG Support
[osm/SO.git] / common / python / rift / mano / tosca_translator / rwmano / tosca / tosca_forwarding_path.py
1 from rift.mano.tosca_translator.rwmano.syntax.mano_resource import ManoResource
2 import uuid
3
4
5 TARGET_CLASS_NAME = 'ToscaForwardingPath'
6 class ToscaForwardingPath(ManoResource):
7 '''Translate TOSCA node type tosca.nodes.nfv.FP'''
8
9 toscatype = 'tosca.nodes.nfv.FP'
10
11
12 def __init__(self, log, node, metadata=None):
13 super(ToscaForwardingPath, self).__init__(log, node, type_='forwarding_path', metadata=metadata)
14 self.metadata = metadata
15 self.classifier = None
16 self.rsp = None
17 self.cp = None
18 self.properties = {}
19
20 def handle_forwarding_path_dependencies(self, nodes, vnf_type_to_capability_substitution_mapping):
21
22 def get_classifier(specs):
23 classifier_prop = {}
24 classifier_prop['name'] = 'VNFFG -' + str(self.name)
25 classifier_prop['id'] = self.id
26 if 'policy' in specs:
27 classifier_prop['match_attributes'] = []
28 policy = specs['policy']
29 if 'criteria' in policy:
30 match_prop = {}
31 match_prop['id'] = str(uuid.uuid1())
32 for criteria in policy['criteria']:
33 if 'ip_dst_prefix' in criteria:
34 match_prop['destination_ip_address'] = criteria['ip_dst_prefix']
35 if 'ip_proto' in criteria:
36 match_prop['ip_proto'] = criteria['ip_proto']
37 if 'source_port_range' in criteria:
38 match_prop['source_port'] = int(criteria['source_port_range'])
39 if 'destination_port_range' in criteria:
40 match_prop['destination_port'] = int(criteria['destination_port_range'])
41 classifier_prop['match_attributes'].append(match_prop)
42 if 'cp' in specs:
43 cp_node_name = specs['cp']['capability']
44 cp_node = self.get_node_with_name(cp_node_name, nodes)
45 if cp_node:
46 classifier_prop['vnfd_connection_point_ref'] = cp_node.cp_name
47 if 'cp' in specs:
48 vnf_node_name = specs['cp']['forwarder']
49 vnf_node = self.get_node_with_name(vnf_node_name, nodes)
50 if vnf_node:
51 classifier_prop['vnfd_id_ref'] = vnf_node.id
52 classifier_prop['member_vnf_index_ref'] = vnf_node.get_member_vnf_index()
53 return classifier_prop
54
55 def get_rsp(specs):
56 rsp = {}
57 rsp['id'] = str(uuid.uuid1())
58 rsp['name'] = 'VNFFG-RSP-' + str(self.name)
59 rsp['vnfd_connection_point_ref'] = []
60 if 'path' in specs:
61 fp_connection_point = []
62 vnf_index = 1
63 order_index = 1
64 visited_cps = []
65 for rsp_item in specs['path']:
66 vnf_node_name = rsp_item['forwarder']
67 conn_forwarder = rsp_item['capability']
68 vnf_node = self.get_node_with_name(vnf_node_name, nodes)
69
70 for subs_mapping in vnf_type_to_capability_substitution_mapping[vnf_node.vnf_type]:
71 prop = {}
72 if conn_forwarder in subs_mapping:
73 fp_connection_point.append(subs_mapping[conn_forwarder])
74 cp_node_name = subs_mapping[conn_forwarder]
75 cp_node = self.get_node_with_name(cp_node_name, nodes)
76 if cp_node.cp_name not in visited_cps:
77 prop['vnfd_connection_point_ref'] = cp_node.cp_name
78 prop['vnfd_id_ref'] = vnf_node.id
79 prop['member_vnf_index_ref'] = vnf_node.get_member_vnf_index()
80 prop['order'] = order_index
81 rsp['vnfd_connection_point_ref'].append(prop)
82 vnf_index = vnf_index + 1
83 order_index = order_index + 1
84 visited_cps.append(cp_node.cp_name)
85 return rsp
86
87 tosca_props = self.get_tosca_props()
88 self.classifier = get_classifier(tosca_props)
89 self.rsp = get_rsp(tosca_props)
90 if self.classifier and self.rsp:
91 self.classifier['rsp_id_ref'] = self.rsp['id']