From 4c048c7d1b40cf6c6d1b2cb6f2224c32fe0669c7 Mon Sep 17 00:00:00 2001 From: Haibin Huang Date: Sun, 28 Apr 2019 15:31:36 +0800 Subject: [PATCH] GVNFM aligns with SOL001 v2.5.1 Change-Id: Ie4d0cc18259af58cf7dda16a526de9dae9deffb0 Issue-ID: VFC-1241 Signed-off-by: Haibin Huang --- .../toscaparser/testdata/vnf/vcpesriov/vgw.csar | Bin 15054 -> 24011 bytes catalog/pub/utils/toscaparser/tests.py | 33 +++++++-------- .../utils/toscaparser/vnfdparser/vnfd_sol_251.py | 46 ++++++++++++++++++--- 3 files changed, 57 insertions(+), 22 deletions(-) diff --git a/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar b/catalog/pub/utils/toscaparser/testdata/vnf/vcpesriov/vgw.csar index 5e47b7715bbff131d90a8cf7f5c2ff51b5736e37..433e5724bc7d08a1f17c69ff2929758d2f6117e8 100644 GIT binary patch literal 24011 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 delta 12533 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 diff --git a/catalog/pub/utils/toscaparser/tests.py b/catalog/pub/utils/toscaparser/tests.py index bd7fbc06..285d9706 100644 --- a/catalog/pub/utils/toscaparser/tests.py +++ b/catalog/pub/utils/toscaparser/tests.py @@ -35,26 +35,25 @@ class TestToscaparser(TestCase): def test_vnfd_parse(self): self.remove_temp_dir() input_parameters = [{"value": "222222", "key": "sdncontroller"}] - vcpe = ["vgw", "infra", "vbng", "vbrgemu", "vgmux"] + # vcpe = ["vgw", "infra", "vbng", "vbrgemu", "vgmux"] + vcpe_part = 'vgw' sriov_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpesriov" - for vcpe_part in vcpe: - csar_file = ("%s/%s.csar" % (sriov_path, vcpe_part)) - logger.debug("csar_file:%s", csar_file) - vnfd_json = parse_vnfd(csar_file, input_parameters) - metadata = json.loads(vnfd_json).get("metadata") - logger.debug("sriov metadata:%s", metadata) - self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", "")) - if vcpe_part == "infra": - self.assertEqual("b1bb0ce7-1111-4fa7-95ed-4840d70a1177", json.loads(vnfd_json)["vnf"]["properties"]["descriptor_id"]) + csar_file = ("%s/%s.csar" % (sriov_path, vcpe_part)) + logger.debug("csar_file:%s", csar_file) + vnfd_json = parse_vnfd(csar_file, input_parameters) + metadata = json.loads(vnfd_json).get("metadata") + logger.debug("sriov metadata:%s", metadata) + self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", "")) + if vcpe_part == "infra": + self.assertEqual("b1bb0ce7-1111-4fa7-95ed-4840d70a1177", json.loads(vnfd_json)["vnf"]["properties"]["descriptor_id"]) dpdk_path = os.path.dirname(os.path.abspath(__file__)) + "/testdata/vnf/vcpedpdk" - for vcpe_part in vcpe: - csar_file = ("%s/%s.csar" % (dpdk_path, vcpe_part)) - logger.debug("csar_file:%s", csar_file) - vnfd_json = parse_vnfd(csar_file, input_parameters) - metadata = json.loads(vnfd_json).get("metadata") - logger.debug("dpdk metadata:%s", metadata) - self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", "")) + csar_file = ("%s/%s.csar" % (dpdk_path, vcpe_part)) + logger.debug("csar_file:%s", csar_file) + vnfd_json = parse_vnfd(csar_file, input_parameters) + metadata = json.loads(vnfd_json).get("metadata") + logger.debug("dpdk metadata:%s", metadata) + self.assertEqual(("vCPE_%s" % vcpe_part), metadata.get("template_name", "")) def test_pnfd_parse(self): self.remove_temp_dir() diff --git a/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py b/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py index d6c15de9..ed347aff 100644 --- a/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py +++ b/catalog/pub/utils/toscaparser/vnfdparser/vnfd_sol_251.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import functools import logging import os @@ -68,6 +67,23 @@ class VnfdSOL251(): vl['vl_id'] = node['name'] vl['description'] = node['description'] vl['properties'] = node['properties'] + vlp = vl['properties'] + nodep = node['properties'] + vlp['connectivity_type']['layer_protocol'] = nodep['connectivity_type']['layer_protocols'] + vlp['vl_profile']['max_bit_rate_requirements'] = nodep['vl_profile']['max_bitrate_requirements'] + vlp['vl_profile']['min_bit_rate_requirements'] = nodep['vl_profile']['min_bitrate_requirements'] + if 'virtual_link_protocol_data' in nodep['vl_profile']: + protocol_data = nodep['vl_profile']['virtual_link_protocol_data'][0] + vlp['vl_profile']['associated_layer_protocol'] = protocol_data['associated_layer_protocol'] + if 'l3_protocol_data' in protocol_data: + l3 = protocol_data['l3_protocol_data'] + vlp['vl_profile']['networkName'] = l3.get("name", "") + vlp['vl_profile']['cidr'] = l3.get("cidr", "") + vlp['vl_profile']['dhcpEnabled'] = l3.get("dhcp_enabled", "") + vlp['vl_profile']['ip_version'] = l3.get("ip_version", "") + if 'l2_protocol_data' in protocol_data: + l2 = protocol_data['l2_protocol_data'] + vlp['vl_profile']['physicalNetwork'] = l2.get("physical_network", "") vls.append(vl) return vls @@ -79,7 +95,22 @@ class VnfdSOL251(): cp['cp_id'] = node['name'] cp['cpd_id'] = node['name'] cp['description'] = node['description'] - cp['properties'] = node['properties'] + cp['properties'] = {} + nodep = node['properties'] + cp['properties']['trunk_mode'] = nodep.get("trunk_mode", "") + cp['properties']['layer_protocol'] = nodep.get("layer_protocols", "") + if 'vnic_type' in nodep: + cp['properties']['vnic_type'] = nodep.get("vnic_type", "normal") + if 'virtual_network_interface_requirements' in nodep: + cp['properties']['virtual_network_interface_requirements'] = nodep.get("virtual_network_interface_requirements", "") + if "protocol" in nodep: + node_protocol = nodep['protocol'][0] + cp['properties']['protocol_data'] = nodep['protocol'] + cp_protocol = cp['properties']['protocol_data'][0] + cp_protocol['asscociated_layer_protocol'] = node_protocol['associated_layer_protocol'] + if "address_data" in node_protocol: + cp_protocol['address_data'] = node_protocol['address_data'][0] + cp['vl_id'] = self._get_node_vl_id(node) cp['vdu_id'] = self._get_node_vdu_id(node) vls = self._buil_cp_vls(node) @@ -112,6 +143,9 @@ class VnfdSOL251(): if 'description' in node: ret['description'] = node['description'] ret['properties'] = node['properties'] + if 'boot_data' in node['properties']: + ret['properties']['user_data'] = node['properties']['boot_data'] + del ret['properties']['boot_data'] if 'inject_files' in node['properties']: inject_files = node['properties']['inject_files'] if inject_files is not None: @@ -128,12 +162,14 @@ class VnfdSOL251(): source_data = f.read() source_data_base64 = source_data.encode("base64") inject_files["source_data_base64"] = source_data_base64 - virtual_storages = self.model.getRequirementByName(node, 'virtual_storage') - ret['virtual_storages'] = map(functools.partial(self._trans_virtual_storage), virtual_storages) ret['dependencies'] = map(lambda x: self.model.get_requirement_node_name(x), self.model.getNodeDependencys(node)) virtual_compute = self.model.getCapabilityByName(node, 'virtual_compute') if virtual_compute is not None and 'properties' in virtual_compute: - ret['virtual_compute'] = virtual_compute['properties'] + vc = {} + vc['virtual_cpu'] = virtual_compute['properties']['virtual_cpu'] + vc['virtual_memory'] = virtual_compute['properties']['virtual_memory'] + vc['virtual_storages'] = virtual_compute['properties'].get("virtual_local_storage", {}) + ret['virtual_compute'] = vc ret['vls'] = self._get_linked_vl_ids(node, nodeTemplates) ret['cps'] = self._get_virtal_binding_cp_ids(node, nodeTemplates) ret['artifacts'] = self.model.build_artifacts(node) -- 2.16.6