1 # Copyright 2017 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
19 from rest_framework.test import APIClient
20 from django.test import TestCase
21 from rest_framework import status
23 from catalog.packages.biz.nf_package import NfDistributeThread, NfPkgDeleteThread
24 from catalog.pub.database.models import JobStatusModel, JobModel
25 from catalog.pub.database.models import VnfPackageModel
26 from catalog.pub.msapi import sdc
27 from catalog.pub.utils import restcall, toscaparser
28 from catalog.pub.config.config import CATALOG_ROOT_PATH
29 from catalog.packages.biz.nf_package import VnfpkgUploadThread
40 class TestNfPackage(TestCase):
42 self.client = APIClient()
43 VnfPackageModel.objects.filter().delete()
44 JobModel.objects.filter().delete()
45 JobStatusModel.objects.filter().delete()
54 "unit_size": 1000000000
56 "type_of_storage": "volume",
57 "rdma_enabled": False,
60 "volume_storage_id": "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7",
68 "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7"
75 "configurable_properties": {
77 "additional_vnfc_configurable_properties": {
84 "description": "the virtual machine of vNat",
95 "artifact_name": "vNatVNFImage",
96 "type": "tosca.artifacts.nfv.SwImage",
98 "operating_system": "linux",
99 "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
100 "name": "vNatVNFImage",
101 "container_format": "bare",
103 "disk_format": "qcow2",
104 "supported_virtualisation_environments": [
112 "file": "/swimages/vRouterVNF_ControlPlane.qcow2"
116 "flavor_extra_specs": {
117 "hw:cpu_sockets": "2",
118 "sw:ovs_dpdk": "true",
119 "hw:cpu_threads": "2",
120 "hw:numa_mem.1": "3072",
121 "hw:numa_mem.0": "1024",
122 "hw:numa_nodes": "2",
123 "hw:numa_cpus.0": "0,1",
124 "hw:numa_cpus.1": "2,3,4,5",
126 "hw:cpu_threads_policy": "isolate"
128 "cpu_frequency": "2.4 GHz",
132 "local_storages": [],
133 "image_file": "vNatVNFImage",
140 "operating_system": "linux",
141 "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
142 "name": "vNatVNFImage",
143 "container_format": "bare",
145 "disk_format": "qcow2",
146 "supported_virtualisation_environments": [
154 "image_file_id": "vNatVNFImage",
159 "local_storages": [],
163 "key_name": "sriov_plane",
164 "cp_id": "SRIOV_Port"
172 "vl_id": "sriov_link",
173 "route_external": False,
179 "connectivity_type": {
180 "layer_protocol": "ipv4",
181 "flow_pattern": "flat"
183 "description": "sriov_link",
192 "vl_id": "sriov_link",
193 "vdu_id": "vdu_vNat",
195 "cp_id": "SRIOV_Port",
199 "address_type": "ip_address",
201 "ip_address_type": "ipv4",
202 "floating_ip_activated": False,
203 "number_of_ip_address": 1,
204 "ip_address_assignment": True
208 "description": "sriov port",
209 "layer_protocol": "ipv4",
210 "virtual_network_interface_requirements": [
215 "support_mandatory": False,
217 "description": "sriov"
223 "support_mandatory": False,
225 "description": "normal"
229 "bitrate_requirement": 10
234 "vnfSoftwareVersion": "1.0.0",
235 "vnfProductName": "zte",
236 "localizationLanguage": [
240 "vnfProvider": "zte",
242 "defaultLocalizationLanguage": "english",
243 "vnfdId": "zte-hss-1.0",
245 "vnfProductInfoDescription": "hss",
246 "vnfdVersion": "1.0.0",
247 "vnfProductInfoName": "hss"
254 def assert_job_result(self, job_id, job_progress, job_detail):
255 jobs = JobStatusModel.objects.filter(
257 progress=job_progress,
259 self.assertEqual(1, len(jobs))
261 @mock.patch.object(NfDistributeThread, 'run')
262 def test_nf_pkg_distribute_normal(self, mock_run):
263 resp = self.client.post("/api/catalog/v1/vnfpackages", {
267 self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
269 def test_nf_pkg_distribute_when_csar_already_exist(self):
270 VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
271 NfDistributeThread(csar_id="1",
275 self.assert_job_result("2", 255, "NF CSAR(1) already exists.")
277 @mock.patch.object(restcall, 'call_req')
278 @mock.patch.object(sdc, 'download_artifacts')
279 @mock.patch.object(toscaparser, 'parse_vnfd')
280 def test_nf_pkg_distribute_when_vnfd_already_exist(self,
281 mock_parse_vnfd, mock_download_artifacts, mock_call_req):
282 mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
283 mock_download_artifacts.return_value = "/home/hss.csar"
284 mock_call_req.return_value = [0, json.JSONEncoder().encode([{
286 "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
288 VnfPackageModel(vnfPackageId="2", vnfdId="zte-hss-1.0").save()
289 NfDistributeThread(csar_id="1",
293 self.assert_job_result("2", 255, "NFD(zte-hss-1.0) already exists.")
295 @mock.patch.object(restcall, 'call_req')
296 @mock.patch.object(sdc, 'download_artifacts')
297 @mock.patch.object(toscaparser, 'parse_vnfd')
298 def test_nf_pkg_distribute_successfully(self,
299 mock_parse_vnfd, mock_download_artifacts, mock_call_req):
300 mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
301 mock_download_artifacts.return_value = "/home/hss.csar"
302 mock_call_req.return_value = [0, json.JSONEncoder().encode([{
304 "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
306 NfDistributeThread(csar_id="1",
310 self.assert_job_result("4", 100, "CSAR(1) distribute successfully.")
312 ###############################################################################################################
314 @mock.patch.object(NfPkgDeleteThread, 'run')
315 def test_nf_pkg_delete_normal(self, mock_run):
316 resp = self.client.delete("/api/catalog/v1/vnfpackages/1")
317 self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
319 def test_nf_pkg_normal_delete(self):
320 VnfPackageModel(vnfPackageId="2", vnfdId="vcpe_vfw_zte_1_0").save()
321 NfPkgDeleteThread(csar_id="2", job_id="2").run()
322 self.assert_job_result("2", 100, "Delete CSAR(2) successfully.")
324 def test_nf_pkg_get_all(self):
325 VnfPackageModel(vnfPackageId="3", vnfdId="3", vnfVendor='3', vnfdVersion='3',
326 vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
327 VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
328 vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
329 resp = self.client.get("/api/catalog/v1/vnfpackages")
330 self.assertEqual(resp.status_code, status.HTTP_200_OK)
340 "downloadUrl": "http://127.0.0.1:8806/static/catalog/3/",
354 "downloadUrl": "http://127.0.0.1:8806/static/catalog/4/",
361 self.assertEqual(expect_data, resp.data)
363 def test_nf_pkg_get_one(self):
364 VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
365 vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
367 resp = self.client.get("/api/catalog/v1/vnfpackages/4")
368 self.assertEqual(resp.status_code, status.HTTP_200_OK)
377 "downloadUrl": "http://127.0.0.1:8806/static/catalog/4/",
383 self.assertEqual(expect_data, resp.data)
385 def test_nf_pkg_get_one_failed(self):
386 VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
387 vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
389 resp = self.client.get("/api/catalog/v1/vnfpackages/2")
390 self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
391 self.assertEqual({'error': 'Vnf package[2] not Found.'}, resp.data)
393 ###############################################################################################################
395 @mock.patch.object(toscaparser, 'parse_vnfd')
396 def test_vnfd_parse_normal(self, mock_parse_vnfd):
397 VnfPackageModel(vnfPackageId="8", vnfdId="10").save()
398 mock_parse_vnfd.return_value = json.JSONEncoder().encode({"c": "d"})
399 req_data = {"csarId": "8", "inputs": []}
400 resp = self.client.post("/api/catalog/v1/parservnfd", req_data, format='json')
401 self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
402 self.assertEqual({"model": '{"c": "d"}'}, resp.data)
404 def test_vnfd_parse_when_csar_not_exist(self):
405 req_data = {"csarId": "1", "inputs": []}
406 resp = self.client.post("/api/catalog/v1/parservnfd", req_data, format='json')
407 self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
408 self.assertEqual(resp.data, {"error": "VNF CSAR(1) does not exist."})
410 def test_upload_vnfPkg(self):
411 data = {'file': open(os.path.join(CATALOG_ROOT_PATH, "empty.txt"), "rb")}
412 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
413 self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
415 @mock.patch.object(urllib2, 'urlopen')
416 def test_upload_nf_pkg(self, mock_urlopen):
417 req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"}
418 mock_urlopen.return_value = MockReq()
420 VnfpkgUploadThread(req_data, vnfPkgId).run()