summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorying.yunlong <ying.yunlong@zte.com.cn>2017-08-21 12:03:39 +0800
committerying.yunlong <ying.yunlong@zte.com.cn>2017-08-21 12:03:39 +0800
commitd2aedc7ee520f9771b6ae44d2f0225070714ce3c (patch)
treec2b697abbaa3bc8dfef6f45d982e84f1d810ea25
parent8107557f8ab5272fcf83a38d95fe4f2e129061e8 (diff)
Add convert vls and cps logic
After parse the nsd package, add _get_all_vl and _get_all_cp function to convert the vls and cps info. Change-Id: I6b0af61d8716b454e18c1092e226ab3ec167e3f3 Issue-ID: VFC-121 Signed-off-by: ying.yunlong <ying.yunlong@zte.com.cn>
-rw-r--r--lcm/pub/utils/toscaparser/basemodel.py70
-rw-r--r--lcm/pub/utils/toscaparser/nsdmodel.py76
2 files changed, 126 insertions, 20 deletions
diff --git a/lcm/pub/utils/toscaparser/basemodel.py b/lcm/pub/utils/toscaparser/basemodel.py
index e1f841ff..e624bd08 100644
--- a/lcm/pub/utils/toscaparser/basemodel.py
+++ b/lcm/pub/utils/toscaparser/basemodel.py
@@ -105,23 +105,6 @@ class BaseInfoModel(object):
if 'metadata' in tosca.tpl:
self.metadata = copy.deepcopy(tosca.tpl['metadata'])
- def buildProperties(self, nodeTemplate, parsed_params):
- properties = {}
- isMappingParams = parsed_params and len(parsed_params) > 0
- for k, item in nodeTemplate.get_properties().items():
- properties[k] = item.value
- if isinstance(item.value, GetInput):
- if item.value.result() and isMappingParams:
- properties[k] = DataEntityExt.validate_datatype(item.type, item.value.result())
- else:
- tmp = {}
- tmp[item.value.name] = item.value.input_name
- properties[k] = tmp
- if 'attributes' in nodeTemplate.entity_tpl:
- for k, item in nodeTemplate.entity_tpl['attributes'].items():
- properties[k] = str(item)
- return properties
-
def buildProperties(self, nodeTemplate, parsed_params):
properties = {}
isMappingParams = parsed_params and len(parsed_params) > 0
@@ -198,6 +181,13 @@ class BaseInfoModel(object):
def isPnf(self, node):
return node['nodeType'].upper().find('.PNF.') >= 0 or node['nodeType'].upper().endswith('.PNF')
+ def isCp(self, node):
+ return node['nodeType'].upper().find('.CP.') >= 0 or node['nodeType'].upper().endswith('.CP')
+
+ def isVl(self, node):
+ return node['nodeType'].upper().find('.VIRTUALLINK.') >= 0 or node['nodeType'].upper().find('.VL.') >= 0 or \
+ node['nodeType'].upper().endswith('.VIRTUALLINK') or node['nodeType'].upper().endswith('.VL')
+
def get_requirement_node_name(self, req_value):
return self.get_prop_from_obj(req_value, 'node')
@@ -211,6 +201,13 @@ class BaseInfoModel(object):
def getNodeDependencys(self, node):
return self.getRequirementByName(node, 'dependency')
+ def getVirtualLinks(self, node):
+ return self.getRequirementByName(node, 'virtualLink')
+
+ def getVirtualbindings(self, node):
+ return self.getRequirementByName(node, 'virtualbinding')
+
+
def getRequirementByName(self, node, requirementName):
requirements = []
if 'requirements' in node:
@@ -229,3 +226,42 @@ class BaseInfoModel(object):
rets.append({"key_name":key, "vl_id":self.get_requirement_node_name(value)})
return rets
+ def _verify_value(self, value, inputs, parsed_params):
+ if isinstance(value, str):
+ return self._verify_string(inputs, parsed_params, value)
+ if isinstance(value, list) or isinstance(value, dict):
+ return self._verify_object(value, inputs, parsed_params)
+ return value
+
+ def _verify_object(self, value, inputs, parsed_params):
+ s = self._verify_string(inputs, parsed_params, json.dumps(value))
+ return json.loads(s)
+
+ def _get_input_name(self, getInput):
+ input_name = getInput.split(':')[1]
+ input_name = input_name.strip()
+ return input_name.replace('"', '').replace('}', '')
+
+ def _verify_string(self, inputs, parsed_params, value):
+ getInputs = re.findall(r'{"get_input": "[a-zA-Z_0-9]+"}', value)
+ for getInput in getInputs:
+ input_name = self._get_input_name(getInput)
+ if parsed_params and input_name in parsed_params:
+ value = value.replace(getInput, json.dumps(parsed_params[input_name]))
+ else:
+ for input_def in inputs:
+ if input_def.default and input_name == input_def.name:
+ value = value.replace(getInput, json.dumps(input_def.default))
+ return value
+
+ def get_node_vl_id(self, node):
+ vl_ids = map(lambda x: self.get_requirement_node_name(x), self.getVirtualLinks(node))
+ if len(vl_ids) > 0:
+ return vl_ids[0]
+ return ""
+
+ def get_node_by_name(self, node_templates, name):
+ for node in node_templates:
+ if node['name'] == name:
+ return node
+ return None \ No newline at end of file
diff --git a/lcm/pub/utils/toscaparser/nsdmodel.py b/lcm/pub/utils/toscaparser/nsdmodel.py
index 7d7dafad..ae902df6 100644
--- a/lcm/pub/utils/toscaparser/nsdmodel.py
+++ b/lcm/pub/utils/toscaparser/nsdmodel.py
@@ -19,8 +19,8 @@ class EtsiNsdInfoModel(BaseInfoModel):
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.vls = self.get_all_vl(nodeTemplates)
+ self.cps = self.get_all_cp(nodeTemplates)
# self.routers = self.get_all_router(nodeTemplates)
# self.fps = self._get_all_fp(nodeTemplates)
# self.vnffgs = self._get_all_vnffg(tosca.topology_template.groups)
@@ -98,4 +98,74 @@ class EtsiNsdInfoModel(BaseInfoModel):
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
+ return cps
+
+ def get_all_vl(self, nodeTemplates):
+ vls = []
+ for node in nodeTemplates:
+ if self.isVl(node):
+ vl = {}
+ vl['vl_id'] = node['name']
+ vl['description'] = node['description']
+ vl['properties'] = node['properties']
+ vl['route_external'] = False
+ vl['route_id'] = self._get_vl_route_id(node)
+ vls.append(vl)
+ if self._isExternalVL(node):
+ vl = {}
+ vl['vl_id'] = node['name']
+ vl['description'] = node['description']
+ vl['properties'] = node['properties']
+ vl['route_external'] = True
+ vls.append(vl)
+ return vls
+
+ def _get_vl_route_id(self, node):
+ route_ids = map(lambda x: self.get_requirement_node_name(x),
+ self.getRequirementByName(node, 'virtual_route'))
+ if len(route_ids) > 0:
+ return route_ids[0]
+ return ""
+
+ def _isExternalVL(self, node):
+ return node['nodeType'].upper().find('.ROUTEEXTERNALVL') >= 0
+
+ def get_all_cp(self, nodeTemplates):
+ cps = []
+ for node in nodeTemplates:
+ if self.isCp(node):
+ cp = {}
+ cp['cp_id'] = node['name']
+ cp['cpd_id'] = node['name']
+ cp['description'] = node['description']
+ cp['properties'] = node['properties']
+ cp['vl_id'] = self.get_node_vl_id(node)
+ binding_node_ids = map(lambda x: self.get_requirement_node_name(x), self.getVirtualbindings(node))
+ # cp['vnf_id'] = self._filter_vnf_id(binding_node_ids, nodeTemplates)
+ cp['pnf_id'] = self._filter_pnf_id(binding_node_ids, nodeTemplates)
+ vls = self.buil_cp_vls(node)
+ if len(vls) > 1:
+ cp['vls'] = vls
+ cps.append(cp)
+ return cps
+
+ def buil_cp_vls(self, node):
+ return map(lambda x: self._build_cp_vl(x), self.getVirtualLinks(node))
+
+ def _build_cp_vl(self, req):
+ cp_vl = {}
+ cp_vl['vl_id'] = self.get_prop_from_obj(req, 'node')
+ relationship = self.get_prop_from_obj(req, 'relationship')
+ if relationship != None:
+ properties = self.get_prop_from_obj(relationship, 'properties')
+ if properties != None and isinstance(properties, dict):
+ for key, value in properties.items():
+ cp_vl[key] = value
+ return cp_vl
+
+ def _filter_pnf_id(self, node_ids, node_templates):
+ for node_id in node_ids:
+ node = self.get_node_by_name(node_templates, node_id)
+ if self.isPnf(node):
+ return node_id
+ return "" \ No newline at end of file