diff options
author | maopengzhang <zhang.maopeng1@zte.com.cn> | 2018-04-13 21:27:49 +0800 |
---|---|---|
committer | maopengzhang <zhang.maopeng1@zte.com.cn> | 2018-04-13 21:42:57 +0800 |
commit | abbc35d1b9a65b833e245279370f34676c4b333a (patch) | |
tree | 863fd222b469983324b5fce1a4f46ce54b56f753 | |
parent | 296e1709b5ef2e6c909d1c089049242b57dbb9b3 (diff) |
Support concat function
Support concat function in basemodel
Change-Id: I4c0cbc936d94054ab3946e1e5e7f460f5e242309
Issue-ID: VFC-881
Signed-off-by: maopengzhang <zhang.maopeng1@zte.com.cn>
-rw-r--r-- | catalog/pub/utils/toscaparser/basemodel.py | 76 | ||||
-rw-r--r-- | catalog/pub/utils/toscaparser/nsdmodel.py | 8 | ||||
-rw-r--r-- | catalog/pub/utils/toscaparser/vnfdmodel.py | 2 |
3 files changed, 77 insertions, 9 deletions
diff --git a/catalog/pub/utils/toscaparser/basemodel.py b/catalog/pub/utils/toscaparser/basemodel.py index 5675404f..fd4d35c1 100644 --- a/catalog/pub/utils/toscaparser/basemodel.py +++ b/catalog/pub/utils/toscaparser/basemodel.py @@ -22,8 +22,9 @@ import shutil import urllib import paramiko -from toscaparser.functions import GetInput from toscaparser.tosca_template import ToscaTemplate +from toscaparser.properties import Property +from toscaparser.functions import Function, Concat, GetInput, get_function, function_mappings from catalog.pub.utils.toscaparser.dataentityext import DataEntityExt @@ -84,9 +85,9 @@ class BaseInfoModel(object): shutil.rmtree(tosca_tpl.temp_dir) except Exception as e: logger.error("Failed to create tosca template, error: %s", e.message) - print "-----------------------------" - print '\n'.join(['%s:%s' % item for item in tosca_tpl.__dict__.items()]) - print "-----------------------------" + print "-----------------------------" + print '\n'.join(['%s:%s' % item for item in tosca_tpl.__dict__.items()]) + print "-----------------------------" return tosca_tpl def _check_download_file(self, path): @@ -185,6 +186,71 @@ class BaseInfoModel(object): properties[k] = str(item) return properties + def buildProperties_ex(self, nodeTemplate, topology_template, properties=None): + if properties is None: + properties = nodeTemplate.get_properties() + _properties = {} + if isinstance(properties, dict): + for name, prop in properties.items(): + if isinstance(prop, Property): + if isinstance(prop.value, Function): + if isinstance(prop.value, Concat): # support one layer inner function. + value_str = '' + for arg in prop.value.args: + if isinstance(arg, str): + value_str += arg + elif isinstance(arg, dict): + raw_func = {} + for k, v in arg.items(): + func_args = [] + func_args.append(v) + raw_func[k] = func_args + func = get_function(topology_template, nodeTemplate, raw_func) + value_str += str(func.result()) + _properties[name] = value_str + else: + _properties[name] = prop.value.result() + elif isinstance(prop.value, dict) or isinstance(prop.value, list): + _properties[name] = self.buildProperties_ex(nodeTemplate, topology_template, prop.value) + else: + _properties[name] = json.dumps(prop.value) + elif isinstance(prop, dict): + _properties[name] = self.buildProperties_ex(nodeTemplate, topology_template, prop) + elif isinstance(prop, list): + _properties[name] = self.buildProperties_ex(nodeTemplate, topology_template, prop) + elif name in function_mappings: + raw_func = {} + func_args = [] + func_args.append(prop) + raw_func[name] = func_args + if name == 'CONCAT': + value_str = '' + for arg in prop: + if isinstance(arg, str): + value_str += arg + elif isinstance(arg, dict): + raw_func = {} + for k, v in arg.items(): + func_args = [] + func_args.append(v) + raw_func[k] = func_args + value_str += str( + get_function(topology_template, nodeTemplate, raw_func).result()) + value = value_str + else: + return get_function(topology_template, nodeTemplate, raw_func).result() + else: + _properties[name] = prop + elif isinstance(properties, list): + value = [] + for para in properties: + if isinstance(para, dict) or isinstance(para, list): + value.append(self.buildProperties_ex(nodeTemplate, topology_template, para)) + else: + value.append(para) + return value + return _properties + def verify_properties(self, props, inputs, parsed_params): ret_props = {} if (props and len(props) > 0): @@ -237,7 +303,7 @@ class BaseInfoModel(object): def isNodeTypeX(self, node, nodeTypes, x): node_type = node['nodeType'] - while node_type.upper().find(x) == -1: + while node_type != x: node_type_derived = node_type node_type = nodeTypes[node_type]['derived_from'] if node_type == "tosca.nodes.Root" or node_type == node_type_derived: diff --git a/catalog/pub/utils/toscaparser/nsdmodel.py b/catalog/pub/utils/toscaparser/nsdmodel.py index b09ec0a6..032fae3c 100644 --- a/catalog/pub/utils/toscaparser/nsdmodel.py +++ b/catalog/pub/utils/toscaparser/nsdmodel.py @@ -28,7 +28,7 @@ class EtsiNsdInfoModel(BaseInfoModel): if hasattr(tosca, 'topology_template') and hasattr(tosca.topology_template, 'inputs'): self.inputs = self.buildInputs(tosca.topology_template.inputs) - nodeTemplates = map(functools.partial(self.buildNode, inputs=tosca.inputs, parsed_params=tosca.parsed_params), + nodeTemplates = map(functools.partial(self.buildNode, tosca=tosca), tosca.nodetemplates) node_types = tosca.topology_template.custom_defs self.vnfs = self._get_all_vnf(nodeTemplates) @@ -55,7 +55,9 @@ class EtsiNsdInfoModel(BaseInfoModel): ret[tmpinput.name] = tmp return ret - def buildNode(self, nodeTemplate, inputs, parsed_params): + def buildNode(self, nodeTemplate, tosca): + inputs = tosca.inputs + parsed_params = tosca.parsed_params ret = {} ret['name'] = nodeTemplate.name ret['nodeType'] = nodeTemplate.type @@ -67,7 +69,7 @@ class EtsiNsdInfoModel(BaseInfoModel): ret['metadata'] = nodeTemplate.entity_tpl['metadata'] else: ret['metadata'] = '' - props = self.buildProperties(nodeTemplate, parsed_params) + props = self.buildProperties_ex(nodeTemplate, tosca.topology_template) ret['properties'] = self.verify_properties(props, inputs, parsed_params) ret['requirements'] = self.build_requirements(nodeTemplate) self.buildCapabilities(nodeTemplate, inputs, ret) diff --git a/catalog/pub/utils/toscaparser/vnfdmodel.py b/catalog/pub/utils/toscaparser/vnfdmodel.py index fbed8b98..385ca3af 100644 --- a/catalog/pub/utils/toscaparser/vnfdmodel.py +++ b/catalog/pub/utils/toscaparser/vnfdmodel.py @@ -27,7 +27,7 @@ class EtsiVnfdInfoModel(EtsiNsdInfoModel): if hasattr(tosca, 'topology_template') and hasattr(tosca.topology_template, 'inputs'): self.inputs = self.buildInputs(tosca.topology_template.inputs) - nodeTemplates = map(functools.partial(self.buildNode, inputs=tosca.inputs, parsed_params=tosca.parsed_params), + nodeTemplates = map(functools.partial(self.buildNode, tosca=tosca), tosca.nodetemplates) node_types = tosca.topology_template.custom_defs self.services = self._get_all_services(nodeTemplates) |