From 5f43f873d21ee49a3f1a8c2ae7d6252604ad9119 Mon Sep 17 00:00:00 2001 From: hongyuzhao Date: Mon, 19 Aug 2019 16:13:07 +0800 Subject: [PATCH] Add vnfd validity check Change-Id: I46d607df7e0a61a81e91765396e4df88867e71fa Issue-ID: VFC-1490 Signed-off-by: hongyuzhao --- lcm/lcm/pub/verifyvnfd/__init__.py | 13 ++ lcm/lcm/pub/verifyvnfd/const.py | 328 ++++++++++++++++++++++++++++ lcm/lcm/pub/verifyvnfd/tests.py | 29 +++ lcm/lcm/pub/verifyvnfd/verifyvnfd.py | 35 +++ lcm/lcm/pub/verifyvnfd/vnf_vnfd_schema.json | 123 +++++++++++ 5 files changed, 528 insertions(+) create mode 100644 lcm/lcm/pub/verifyvnfd/__init__.py create mode 100644 lcm/lcm/pub/verifyvnfd/const.py create mode 100644 lcm/lcm/pub/verifyvnfd/tests.py create mode 100644 lcm/lcm/pub/verifyvnfd/verifyvnfd.py create mode 100644 lcm/lcm/pub/verifyvnfd/vnf_vnfd_schema.json diff --git a/lcm/lcm/pub/verifyvnfd/__init__.py b/lcm/lcm/pub/verifyvnfd/__init__.py new file mode 100644 index 00000000..c7b6818e --- /dev/null +++ b/lcm/lcm/pub/verifyvnfd/__init__.py @@ -0,0 +1,13 @@ +# Copyright 2017 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. diff --git a/lcm/lcm/pub/verifyvnfd/const.py b/lcm/lcm/pub/verifyvnfd/const.py new file mode 100644 index 00000000..c590ec94 --- /dev/null +++ b/lcm/lcm/pub/verifyvnfd/const.py @@ -0,0 +1,328 @@ +# Copyright (C) 2019 ZTE. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +vnfd_model1 = { + 'metadata': { + 'vendor': 'zte', + 'is_shared': False, + 'description': '', + 'domain_type': 'CN', + 'version': 'v4.14.10', + 'vmnumber_overquota_alarm': False, + 'cross_dc': False, + 'vnf_type': 'SSS', + 'vnfd_version': 'V00000001', + 'id': 'sss-vnf-template', + 'name': 'sss-vnf-template' + }, + 'vdus': [ + { + "vdu_id": "vdu1Id", + "description": "vdu description", + "properties": { + "name": "vduinstname", + "vdu_type": "OMP", + "key_vdu": True, + "support_scaling": True, + "location_info": { + "vimid": "vimid", + "tenant": "tenantname", + "availability_zone": "zone1", + "host": "host1" + }, + "local_affinity_antiaffinity_rule": [ + { + "affinity_antiaffinity": "anti-affinity", + "scope": "node" + }, + { + "affinity_antiaffinity": "affinity", + "scope": "zone" + } + ], + "inject_data_list": [ + { + "file_name": "abc.xml", + "file_data": "xxxssss" + } + ], + "storage_policy": "HIGH", + "template_id": "26", + "manual_scale_select_vim": False, + "watchdog": { + "enabledelay": 600000, + "action": "reset" + }, + "is_predefined": False, + "allow_scale_updown": False, + "inject_network_address": True, + "inner_hugepage_num": 100, + "inner_hugepage_size": "2048", + "action": "add" + }, + "image_file": 'sss', + "local_storages": [ + "local_storage_id1", + "local_storage_id2" + ], + "virtual_storages": [ + { + "virtual_storage_id": "volume_storage1", + "location": "/usr/data", + "device": "/dev/hda1" + } + ], + "dependencies": [ + "vdu1Id", + "vduNId" + ], + "nfv_compute": { + "num_cpus": 4, + "mem_size": "1 GB", + "cpu_frequency": "1GHz", + "flavor_extra_specs": { + "hw: cpu_policy": "shared", + "hw: cpu_max_threads": 50, + "hw: cpu_sockets": 10, + "hw: cpu_max_sockets": 20, + "hw: cpu_max_cores": 8, + "hw: cpu_threads": 30, + "hw: numa_mem.0": 12288, + "hw: hugepage_num": 100, + "hw: high_performance": "dvs_high", + "hw: numa_nodes": 1, + "hw: numa_cpus.0": "2,4,8", + "hw: numa_pci": True, + "hw: cpu_cores": 4, + "pci_passthrough: alias": "ColetoCreek: 1", + "hw: mem_page_size": "large", + "hw: mem_paging_mechanism": "EPT" + } + }, + "vls": [ + "vlId1", + ], + "cps": [ + "cpId1", + ], + "scalable": { + "min_instances": 1, + "max_instances": 2, + "default_instances": 1 + }, + "interfaces": { + "Standard": { + "create": { + "implementation": "", + "inputs": { + "param1Name": "value1", + "paramNName": "valueN" + } + }, + "configure": { + "implementation": "", + "inputs": { + "param1Name": "value1", + "paramNName": "valueN" + } + }, + "start": { + "implementation": "", + "inputs": { + "param1Name": "value1", + "paramNName": "valueN" + } + }, + "stop": { + "implementation": "", + "inputs": { + "param1Name": "value1", + "paramNName": "valueN" + } + }, + "delete": { + "implementation": "", + "inputs": { + "param1Name": "value1", + "paramNName": "valueN" + } + } + } + }, + "artifacts": [ + ] + } + ], + 'volume_storages': [ + { + "volume_storage_id": "volume_storage1", + "description": "", + "properties": { + "size": "\"100 GB\"", + "volume_id": "", + "volume_name": "volumeStorage1", + "custom_volume_type": "type1", + "disk_type": "data", + "delete_on_termination_vm": True, + "location_info": { + "vimid": "vimid_1", + "tenant": "tenantname_1", + "availability_zone": "zone1" + }, + "is_predefined": False, + "is_shared": False + }, + "image_file": [ + "volume_image" + ] + } + ], + 'policies': { + 'scaling': { + 'targets': { + + }, + 'policy_id': 'policy_scale_sss-vnf-template', + 'properties': { + 'policy_file': '*-vnfd.zip/*-vnf-policy.xml' + }, + 'description': '' + } + }, + 'image_files': [ + { + 'description': '', + 'properties': { + 'name': 'opencos_sss_omm_img_release_20150723-1-disk1.vmdk', + 'checksum': '', + 'disk_format': 'VMDK', + 'file_url': './zte-cn-sss-main-image/OMM/opencos_sss_omm_img_release_20150723-1-disk1.vmdk', + 'container_type': 'vm', + 'version': '', + 'hypervisor_type': 'kvm' + }, + 'image_file_id': 'opencos_sss_omm_img_release_20150723-1-disk1' + }, + { + 'description': '', + 'properties': { + 'name': 'sss.vmdk', + 'checksum': '', + 'disk_format': 'VMDK', + 'file_url': './zte-cn-sss-main-image/NE/sss.vmdk', + 'container_type': 'vm', + 'version': '', + 'hypervisor_type': 'kvm' + }, + 'image_file_id': 'sss' + } + ], + 'vls': [ + { + "vl_id": "vldId1", + "description": "", + "properties": { + "name": "umac_241_control", + "network_name": "umac_control", + "is_predefined": False, + "vendor": "zte", + "netmask": "255.255.255.0", + "mtu": 1500, + "network_type": "vlan", + "physical_network": "phynet01", + "segmentation_id": "30", + "vlan_transparent": False, + "vds_name": "vds1", + "cidr": "192.168.199.0/24", + "ip_version": 4, + "gateway_ip": "192.168.199.1", + "dhcp_enabled": False, + "dns_nameservers": [ + "192.168.0.4", + "192.168.0.10" + ], + "start_ip": "192.168.199.2", + "end_ip": "192.168.199.254", + "host_routes": [ + { + "destination": "10.43.26.0/24", + "nexthop": "10.41.23.1" + } + ], + "location_info": { + "vimid": "vimid_1", + "tenant": "tenantname_1" + }, + "cloud_type": "IaaS", + "vl_profile": {"networkName": "test"}, + "connectivity_type": {} + }, + "route_id": "router01", + "route_external": False + } + ], + 'cps': [ + { + "cp_id": "cpId1", + "description": "", + "properties": { + "name": "", + "mac_address": "00:d9:00:82:11:e1", + "ip_address:": "192.168.1.21", + "ip_range_start": "192.168.1.20", + "ip_range_end": "192.168.1.29", + "floating_ip_address": { + "external_network": "extnet01", + "ip_address": "10.43.53.23" + }, + "service_ip_address": "192.168.1.23", + "order": 1, + "bandwidth": 1000, + "vnic_type": "normal", + "allowed_address_pairs": [ + { + "ip": "192.168.1.13", + "mac": "00:f3:43:20:a2:a3" + } + ], + "bond": "none", + "bond_index": 1, + "macbond": "00:d9:00:82:11:d1", + "sfc_encapsulation": "", + "direction": "", + "gateway_ip": "192.168.199.1", + "netmask": "255.255.255.0", + "interface_name": "fe-01-02", + "is_virtual": False, + "function": "control", + "protocol_data": [ + { + "address_data": { + "l3_address_data": { + "fixed_ip_address": "test" + }, + }, + }, + ] + + }, + "vl_id": "vldId1", + "vdu_id": "vdu1Id" + } + ], + 'local_storages': [ + + ], +} diff --git a/lcm/lcm/pub/verifyvnfd/tests.py b/lcm/lcm/pub/verifyvnfd/tests.py new file mode 100644 index 00000000..3f71ae7f --- /dev/null +++ b/lcm/lcm/pub/verifyvnfd/tests.py @@ -0,0 +1,29 @@ +# Copyright 2018 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from . import verifyvnfd +from . import const + + +class VerifyVnfdTest(unittest.TestCase): + def setUp(self): + pass + + def tearDown(self): + pass + + def test_vnfd_verfify_success1(self): + ret = verifyvnfd.verify(const.vnfd_model1) + self.assertEqual(ret, []) diff --git a/lcm/lcm/pub/verifyvnfd/verifyvnfd.py b/lcm/lcm/pub/verifyvnfd/verifyvnfd.py new file mode 100644 index 00000000..b4ed0408 --- /dev/null +++ b/lcm/lcm/pub/verifyvnfd/verifyvnfd.py @@ -0,0 +1,35 @@ +# Copyright 2016 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json +import os +import logging +import jsonschema +from lcm.pub.exceptions import NFLCMException + +logger = logging.getLogger(__name__) + + +def verify(new_vnfd): + errors_found = [] + vnfd_schema_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vnf_vnfd_schema.json") + with open(vnfd_schema_path, "r") as fvnfd_schema: + vnfd_schema = json.load(fvnfd_schema) + vnfd_validator = jsonschema.validators.Draft4Validator(schema=vnfd_schema) + for error in vnfd_validator.iter_errors(new_vnfd): + logger.error("vnfd verify fail:%s" % error) + errors_found.append(error) + if len(errors_found) > 0: + raise NFLCMException(errors_found) + return errors_found diff --git a/lcm/lcm/pub/verifyvnfd/vnf_vnfd_schema.json b/lcm/lcm/pub/verifyvnfd/vnf_vnfd_schema.json new file mode 100644 index 00000000..784781c0 --- /dev/null +++ b/lcm/lcm/pub/verifyvnfd/vnf_vnfd_schema.json @@ -0,0 +1,123 @@ +{ + "description":"This type represents a vnfd.", + "type":"object", + "required":[ + + ], + "properties":{ + "vdus":{ + "type":"array", + "items":{ + "type":"object", + "required":[ + "vdu_id", + "cps" + ], + "properties":{ + "vdu_id":{ + "type":"string" + }, + "cps":{ + "type":"array" + } + } + } + }, + "volume_storages":{ + "type":"array", + "items":{ + "type":"object", + "required":[ + "volume_storage_id" + ], + "properties":{ + "volume_storage_id":{ + "type":"string" + } + } + } + }, + "vls":{ + "type":"array", + "items":{ + "type":"object", + "required":[ + "vl_id", + "properties" + ], + "properties":{ + "vl_id":{ + "type":"string" + }, + "properties":{ + "type":"object", + "required":[ + "vl_profile", + "connectivity_type" + ], + "properties":{ + "vl_profile":{ + "type":"object", + "required":[ + "networkName" + ], + "properties":{ + "networkName":{ + "type":"string" + } + } + }, + "connectivity_type":{ + "type":"object" + } + } + } + } + } + }, + "cps":{ + "type":"array", + "items":{ + "type":"object", + "required":[ + "cp_id" + ], + "properties":{ + "cp_id":{ + "type":"string" + }, + "properties":{ + "type":"object", + "required":[ + "protocol_data" + ], + "properties":{ + "protocol_data":{ + "type":"array", + "items":{ + "type":"object", + "required":[ + "address_data" + ], + "properties":{ + "address_data":{ + "type":"object", + "required":[ + "l3_address_data" + ], + "properties":{ + "l3_address_data":{ + "type":"object" + } + } + } + } + } + } + } + } + } + } + } + } +} \ No newline at end of file -- 2.16.6