summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorying.yunlong <ying.yunlong@zte.com.cn>2017-08-21 09:40:19 +0800
committerying.yunlong <ying.yunlong@zte.com.cn>2017-08-21 09:40:19 +0800
commit8107557f8ab5272fcf83a38d95fe4f2e129061e8 (patch)
tree43e7bd4a1170fe689d45b03ea7f5f2c247d1bb4a
parentd190033854fc5708c848081ffa06181d793c0bc9 (diff)
Add convert vnfs and pnfs logic
After parse the nsd package, add _get_all_vnf and _get_all_pnf function to convert the vnfs and pnfs info. Change-Id: I9136785c67f19bd6ac3d08dbfa95036d18aa2aae Issue-ID: VFC-120 Signed-off-by: ying.yunlong <ying.yunlong@zte.com.cn>
-rw-r--r--lcm/pub/utils/toscaparser/basemodel.py40
-rw-r--r--lcm/pub/utils/toscaparser/nsdmodel.py46
2 files changed, 83 insertions, 3 deletions
diff --git a/lcm/pub/utils/toscaparser/basemodel.py b/lcm/pub/utils/toscaparser/basemodel.py
index 254a326d..e1f841ff 100644
--- a/lcm/pub/utils/toscaparser/basemodel.py
+++ b/lcm/pub/utils/toscaparser/basemodel.py
@@ -190,4 +190,42 @@ class BaseInfoModel(object):
def build_interfaces(self, node_template):
if 'interfaces' in node_template.entity_tpl:
return node_template.entity_tpl['interfaces']
- return None \ No newline at end of file
+ return None
+
+ def isVnf(self, node):
+ return node['nodeType'].upper().find('.VNF.') >= 0 or node['nodeType'].upper().endswith('.VNF')
+
+ def isPnf(self, node):
+ return node['nodeType'].upper().find('.PNF.') >= 0 or node['nodeType'].upper().endswith('.PNF')
+
+ def get_requirement_node_name(self, req_value):
+ return self.get_prop_from_obj(req_value, 'node')
+
+ def get_prop_from_obj(self, obj, prop):
+ if isinstance(obj, str):
+ return obj
+ if (isinstance(obj, dict) and prop in obj):
+ return obj[prop]
+ return None
+
+ def getNodeDependencys(self, node):
+ return self.getRequirementByName(node, 'dependency')
+
+ def getRequirementByName(self, node, requirementName):
+ requirements = []
+ if 'requirements' in node:
+ for item in node['requirements']:
+ for key, value in item.items():
+ if key == requirementName:
+ requirements.append(value)
+ return requirements
+
+ def get_networks(self, node):
+ rets = []
+ if 'requirements' in node:
+ for item in node['requirements']:
+ for key, value in item.items():
+ if key.upper().find('VIRTUALLINK') >=0:
+ rets.append({"key_name":key, "vl_id":self.get_requirement_node_name(value)})
+ return rets
+
diff --git a/lcm/pub/utils/toscaparser/nsdmodel.py b/lcm/pub/utils/toscaparser/nsdmodel.py
index c6e49430..7d7dafad 100644
--- a/lcm/pub/utils/toscaparser/nsdmodel.py
+++ b/lcm/pub/utils/toscaparser/nsdmodel.py
@@ -17,8 +17,8 @@ class EtsiNsdInfoModel(BaseInfoModel):
nodeTemplates = map(functools.partial(self.buildNode, inputs=tosca.inputs, parsed_params=tosca.parsed_params),
tosca.nodetemplates)
- # self.vnfs = self._get_all_vnf(nodeTemplates)
- # self.pnfs = self._get_all_pnf(nodeTemplates)
+ self.vnfs = self._get_all_vnf(nodeTemplates)
+ self.pnfs = self._get_all_pnf(nodeTemplates)
# self.vls = self.get_all_vl(nodeTemplates)
# self.cps = self.get_all_cp(nodeTemplates)
# self.routers = self.get_all_router(nodeTemplates)
@@ -57,3 +57,45 @@ class EtsiNsdInfoModel(BaseInfoModel):
interfaces = self.build_interfaces(nodeTemplate)
if interfaces: ret['interfaces'] = interfaces
return ret
+
+ def _get_all_vnf(self, nodeTemplates):
+ vnfs = []
+ for node in nodeTemplates:
+ if self.isVnf(node):
+ vnf = {}
+ vnf['vnf_id'] = node['name']
+ vnf['description'] = node['description']
+ vnf['properties'] = node['properties']
+ vnf['dependencies'] = map(lambda x: self.get_requirement_node_name(x), self.getNodeDependencys(node))
+ vnf['networks'] = self.get_networks(node)
+
+ vnfs.append(vnf)
+ return vnfs
+
+ def _get_all_pnf(self, nodeTemplates):
+ pnfs = []
+ for node in nodeTemplates:
+ if self.isPnf(node):
+ pnf = {}
+ pnf['pnf_id'] = node['name']
+ pnf['description'] = node['description']
+ pnf['properties'] = node['properties']
+ pnf['cps'] = self.getVirtalBindingCpIds(node, nodeTemplates)
+
+ pnfs.append(pnf)
+ return pnfs
+
+ def getVirtalBindingCpIds(self, node, nodeTemplates):
+ return map(lambda x: x['name'], self.getVirtalBindingCps(node, nodeTemplates))
+
+ def getVirtalBindingCps(self, node, nodeTemplates):
+ cps = []
+ for tmpnode in nodeTemplates:
+ if 'requirements' in tmpnode:
+ for item in tmpnode['requirements']:
+ for key, value in item.items():
+ if key.upper().startswith('VIRTUALBINDING'):
+ req_node_name = self.get_requirement_node_name(value)
+ if req_node_name != None and req_node_name == node['name']:
+ cps.append(tmpnode)
+ return cps \ No newline at end of file