1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
17 from catalog.pub.utils.toscaparser.basemodel import BaseInfoModel
20 class EtsiNsdInfoModel(BaseInfoModel):
22 def __init__(self, path, params):
23 tosca = self.buildToscaTemplate(path, params)
24 self.parseModel(tosca)
26 def parseModel(self, tosca):
27 self.buidMetadata(tosca)
28 if hasattr(tosca, 'topology_template') and hasattr(tosca.topology_template, 'inputs'):
29 self.inputs = self.buildInputs(tosca.topology_template.inputs)
31 nodeTemplates = map(functools.partial(self.buildNode, inputs=tosca.inputs, parsed_params=tosca.parsed_params),
34 self.vnfs = self._get_all_vnf(nodeTemplates)
35 self.pnfs = self._get_all_pnf(nodeTemplates)
36 self.vls = self.get_all_vl(nodeTemplates)
37 self.cps = self.get_all_cp(nodeTemplates)
38 self.routers = self.get_all_router(nodeTemplates)
39 self.fps = self._get_all_fp(nodeTemplates)
40 self.vnffgs = self._get_all_vnffg(tosca.topology_template.groups)
41 self.server_groups = self.get_all_server_group(tosca.topology_template.groups)
44 def buildInputs(self, top_inputs):
46 for tmpinput in top_inputs:
48 tmp['type'] = tmpinput.type
49 tmp['description'] = tmpinput.description
50 tmp['default'] = tmpinput.default
52 ret[tmpinput.name] = tmp
55 def buildNode(self, nodeTemplate, inputs, parsed_params):
57 ret['name'] = nodeTemplate.name
58 ret['nodeType'] = nodeTemplate.type
59 if 'description' in nodeTemplate.entity_tpl:
60 ret['description'] = nodeTemplate.entity_tpl['description']
62 ret['description'] = ''
63 props = self.buildProperties(nodeTemplate, parsed_params)
64 ret['properties'] = self.verify_properties(props, inputs, parsed_params)
65 ret['requirements'] = self.build_requirements(nodeTemplate)
66 self.buildCapabilities(nodeTemplate, inputs, ret)
67 self.buildArtifacts(nodeTemplate, inputs, ret)
68 interfaces = self.build_interfaces(nodeTemplate)
69 if interfaces: ret['interfaces'] = interfaces
72 def _get_all_vnf(self, nodeTemplates):
74 for node in nodeTemplates:
77 vnf['vnf_id'] = node['name']
78 vnf['description'] = node['description']
79 vnf['properties'] = node['properties']
80 vnf['dependencies'] = map(lambda x: self.get_requirement_node_name(x), self.getNodeDependencys(node))
81 vnf['networks'] = self.get_networks(node)
86 def _get_all_pnf(self, nodeTemplates):
88 for node in nodeTemplates:
91 pnf['pnf_id'] = node['name']
92 pnf['description'] = node['description']
93 pnf['properties'] = node['properties']
94 pnf['cps'] = self.getVirtalBindingCpIds(node, nodeTemplates)
99 def getVirtalBindingCpIds(self, node, nodeTemplates):
100 return map(lambda x: x['name'], self.getVirtalBindingCps(node, nodeTemplates))
102 def getVirtalBindingCps(self, node, nodeTemplates):
104 for tmpnode in nodeTemplates:
105 if 'requirements' in tmpnode:
106 for item in tmpnode['requirements']:
107 for key, value in item.items():
108 if key.upper().startswith('VIRTUALBINDING'):
109 req_node_name = self.get_requirement_node_name(value)
110 if req_node_name != None and req_node_name == node['name']:
114 def get_all_vl(self, nodeTemplates):
116 for node in nodeTemplates:
119 vl['vl_id'] = node['name']
120 vl['description'] = node['description']
121 vl['properties'] = node['properties']
122 vl['route_external'] = False
123 vl['route_id'] = self._get_vl_route_id(node)
125 if self._isExternalVL(node):
127 vl['vl_id'] = node['name']
128 vl['description'] = node['description']
129 vl['properties'] = node['properties']
130 vl['route_external'] = True
134 def _get_vl_route_id(self, node):
135 route_ids = map(lambda x: self.get_requirement_node_name(x),
136 self.getRequirementByName(node, 'virtual_route'))
137 if len(route_ids) > 0:
141 def _isExternalVL(self, node):
142 return node['nodeType'].upper().find('.ROUTEEXTERNALVL') >= 0
144 def get_all_cp(self, nodeTemplates):
146 for node in nodeTemplates:
149 cp['cp_id'] = node['name']
150 cp['cpd_id'] = node['name']
151 cp['description'] = node['description']
152 cp['properties'] = node['properties']
153 cp['vl_id'] = self.get_node_vl_id(node)
154 binding_node_ids = map(lambda x: self.get_requirement_node_name(x), self.getVirtualbindings(node))
155 # cp['vnf_id'] = self._filter_vnf_id(binding_node_ids, nodeTemplates)
156 cp['pnf_id'] = self._filter_pnf_id(binding_node_ids, nodeTemplates)
157 vls = self.buil_cp_vls(node)
163 def buil_cp_vls(self, node):
164 return map(lambda x: self._build_cp_vl(x), self.getVirtualLinks(node))
166 def _build_cp_vl(self, req):
168 cp_vl['vl_id'] = self.get_prop_from_obj(req, 'node')
169 relationship = self.get_prop_from_obj(req, 'relationship')
170 if relationship != None:
171 properties = self.get_prop_from_obj(relationship, 'properties')
172 if properties != None and isinstance(properties, dict):
173 for key, value in properties.items():
177 def _filter_pnf_id(self, node_ids, node_templates):
178 for node_id in node_ids:
179 node = self.get_node_by_name(node_templates, node_id)
184 def get_all_router(self, nodeTemplates):
186 for node in nodeTemplates:
187 if self._isRouter(node):
189 ret['router_id'] = node['name']
190 ret['description'] = node['description']
191 ret['properties'] = node['properties']
192 ret['external_vl_id'] = self._get_router_external_vl_id(node)
193 ret['external_ip_addresses'] = self._get_external_ip_addresses(node)
198 def _isRouter(self, node):
199 return node['nodeType'].upper().find('.ROUTER.') >= 0 or node['nodeType'].upper().endswith('.ROUTER')
201 def _get_router_external_vl(self, node):
202 return self.getRequirementByName(node, 'external_virtual_link')
204 def _get_router_external_vl_id(self, node):
205 ids = map(lambda x: self.get_requirement_node_name(x), self._get_router_external_vl(node))
210 def _get_external_ip_addresses(self, node):
211 external_vls = self._get_router_external_vl(node)
212 if len(external_vls) > 0:
213 if 'relationship' in external_vls[0] and 'properties' in external_vls[0]['relationship'] and 'router_ip_address' in external_vls[0]['relationship']['properties']:
214 return external_vls[0]['relationship']['properties']['router_ip_address']
217 def _get_all_fp(self, nodeTemplates):
219 for node in nodeTemplates:
222 fp['fp_id'] = node['name']
223 fp['description'] = node['description']
224 fp['properties'] = node['properties']
225 fp['forwarder_list'] = self._getForwarderList(node, nodeTemplates)
230 def _isFp(self, node):
231 return node['nodeType'].upper().find('.FP.') >= 0 or node['nodeType'].upper().find('.SFP.') >= 0 or node[
232 'nodeType'].upper().endswith('.FP') or node['nodeType'].upper().endswith('.SFP')
234 def _getForwarderList(self, node, node_templates):
236 if 'requirements' in node:
237 for item in node['requirements']:
238 for key, value in item.items():
239 if key == 'forwarder':
240 tmpnode = self.get_node_by_req(node_templates, value)
241 type = 'cp' if self.isCp(tmpnode) else 'vnf'
242 req_node_name = self.get_requirement_node_name(value)
243 if isinstance(value, dict) and 'capability' in value:
244 forwarderList.append(
245 {"type": type, "node_name": req_node_name, "capability": value['capability']})
247 forwarderList.append({"type": type, "node_name": req_node_name, "capability": ""})
251 def get_node_by_req(self, node_templates, req):
252 req_node_name = self.get_requirement_node_name(req)
253 return self.get_node_by_name(node_templates, req_node_name)
255 def _get_all_vnffg(self, groups):
258 if self._isVnffg(group):
260 vnffg['vnffg_id'] = group.name
261 vnffg['description'] = group.description
262 if 'properties' in group.tpl:
263 vnffg['properties'] = group.tpl['properties']
264 vnffg['members'] = group.members
269 def _isVnffg(self, group):
270 return group.type.upper().find('.VNFFG.') >= 0 or group.type.upper().find(
271 '.SFC.') >= 0 or group.type.upper().endswith('.VNFFG') or group.type.upper().endswith('.SFC')
273 def get_all_server_group(self, groups):
276 if self._isServerGroup(group):
278 ret['group_id'] = group.name
279 ret['description'] = group.description
280 if 'properties' in group.tpl:
281 ret['properties'] = group.tpl['properties']
282 ret['members'] = group.members
287 def _isServerGroup(self, group):
288 return group.type.upper().find('.AFFINITYORANTIAFFINITYGROUP.') >= 0 or group.type.upper().endswith(
289 '.AFFINITYORANTIAFFINITYGROUP')