Support derived node type for substitution mapping 88/86988/6
authorHaibin Huang <haibin.huang@intel.com>
Thu, 9 May 2019 02:28:34 +0000 (10:28 +0800)
committerHaibin Huang <haibin.huang@intel.com>
Thu, 9 May 2019 06:46:04 +0000 (14:46 +0800)
Change-Id: I4ea9aaeea429a0036c02df707e34282b57f99713
Issue-ID: VFC-1241
Signed-off-by: Haibin Huang <haibin.huang@intel.com>
catalog/pub/utils/toscaparser/basemodel.py
catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar
catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py

index 0930d60..d92a456 100644 (file)
@@ -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
index 433e572..79e0d20 100644 (file)
Binary files a/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar and b/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar differ
index 1785f34..98e0940 100644 (file)
@@ -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}