From 34ddb2efb55f4caf76a78dfbc43c08a4328e2b07 Mon Sep 17 00:00:00 2001 From: Haibin Huang Date: Thu, 9 May 2019 10:28:34 +0800 Subject: [PATCH] Support derived node type for substitution mapping Change-Id: I4ea9aaeea429a0036c02df707e34282b57f99713 Issue-ID: VFC-1241 Signed-off-by: Haibin Huang --- catalog/pub/utils/toscaparser/basemodel.py | 23 ++++-- .../toscaparser/testdata/vnf/vcpesriov/vgw.csar | Bin 24011 -> 23182 bytes .../utils/toscaparser/vnfdparser/vnfd_sol_251.py | 78 ++++++++++++++------- 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/catalog/pub/utils/toscaparser/basemodel.py b/catalog/pub/utils/toscaparser/basemodel.py index 0930d60c..d92a4560 100644 --- a/catalog/pub/utils/toscaparser/basemodel.py +++ b/catalog/pub/utils/toscaparser/basemodel.py @@ -515,10 +515,23 @@ class BaseInfoModel(object): metadata = None substitution_mappings = tosca.tpl['topology_template'].get('substitution_mappings', None) if substitution_mappings: - node['type'] = substitution_mappings['node_type'] - node['properties'] = substitution_mappings.get('properties', {}) - node['requirements'] = substitution_mappings.get('requirements', {}) - node['capabilities'] = substitution_mappings.get('capabilities', {}) - metadata = substitution_mappings.get('metadata', {}) + nodeType = substitution_mappings['node_type'] + logger.debug("nodeType %s", nodeType) + if "node_types" in tosca.tpl: + node_types = tosca.tpl['node_types'].get(nodeType, None) + derivedFrom = node_types.get('derived_from', "") + node['type'] = derivedFrom + node['properties'] = node_types.get('properties', {}) + node['requirements'] = node_types.get('requirements', {}) + node['capabilities'] = node_types.get('capabilities', {}) + metadata = node_types.get('metadata', {}) + + if "type" not in node or node['type'] == "": + node['type'] = nodeType + node['properties'] = substitution_mappings.get('properties', {}) + node['requirements'] = substitution_mappings.get('requirements', {}) + node['capabilities'] = substitution_mappings.get('capabilities', {}) + metadata = substitution_mappings.get('metadata', {}) + node['metadata'] = metadata if metadata and metadata != {} else self.buildMetadata(tosca) return node diff --git a/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar b/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar index 433e5724bc7d08a1f17c69ff2929758d2f6117e8..79e0d2012d09784fef48c89ae3ef6e0240d0f08c 100644 GIT binary patch literal 23182 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 W6)W&0VFm_1AbbKmS9nSYhz9@^r6-sG literal 24011 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 diff --git a/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py b/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py index 1785f349..98e0940a 100644 --- a/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py +++ b/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py @@ -31,31 +31,52 @@ class VnfdSOL251(): vnf = self.model.get_substitution_mappings(tosca) properties = vnf.get("properties", {}) metadata = vnf.get("metadata", {}) - if properties.get("descriptor_id", "") == "": - descriptor_id = metadata.get("descriptor_id", "") - if descriptor_id == "": - descriptor_id = metadata.get("id", "") - if descriptor_id == "": - descriptor_id = metadata.get("UUID", "") - properties["descriptor_id"] = descriptor_id - - if properties.get("descriptor_version", "") == "": - version = metadata.get("template_version", "") - if version == "": - version = metadata.get("version", "") - properties["descriptor_version"] = version - - if properties.get("provider", "") == "": - provider = metadata.get("template_author", "") - if provider == "": - provider = metadata.get("provider", "") - properties["provider"] = provider - - if properties.get("template_name", "") == "": - template_name = metadata.get("template_name", "") - if template_name == "": - template_name = metadata.get("template_name", "") - properties["template_name"] = template_name + + for key, value in properties.items(): + if isinstance(value, dict): + if value["type"] == "string": + properties[key] = value.get("default", "") + elif value["type"] == "list": + properties[key] = value.get("default", {}) + else: + properties[key] = value.get("default", "") + ptype = "descriptor_id" + meta_types = ["descriptor_id", "id", "UUID"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "descriptor_version" + meta_types = ["template_version", "version"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "provider" + meta_types = ["template_author", "provider"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "template_name" + meta_types = ["template_name"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "software_version" + meta_types = ["software_version"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "product_name" + meta_types = ["product_name"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "flavour_description" + meta_types = ["flavour_description"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "vnfm_info" + meta_types = ["vnfm_info"] + self._get_property(properties, metadata, ptype, meta_types) + + ptype = "flavour_id" + meta_types = ["flavour_id"] + self._get_property(properties, metadata, ptype, meta_types) + + logger.debug("vnf:%s", vnf) return vnf @@ -184,6 +205,13 @@ class VnfdSOL251(): return {"external_cps": external_cps, "forward_cps": forward_cps} return {} + def _get_property(self, properties, metadata, ptype, meta_types): + if ptype not in properties or properties[ptype] == "": + for mtype in meta_types: + data = metadata.get(mtype, "") + if data != "": + properties[ptype] = data + def _trans_virtual_storage(self, virtual_storage): if isinstance(virtual_storage, str): return {"virtual_storage_id": virtual_storage} -- 2.16.6