X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=catalog%2Fpackages%2Ftests%2Ftest_vnf_package.py;h=b2675a855e72f57e690554977ca6f6846a5176e8;hb=46bd3041d522ddce28ae3450e98c9c49b44b02cc;hp=b83268a3c1cd93678e240aa0f5b0b382619a0354;hpb=a32c2b20207885d895bd96204cc166fca14db97b;p=modeling%2Fetsicatalog.git diff --git a/catalog/packages/tests/test_vnf_package.py b/catalog/packages/tests/test_vnf_package.py index b83268a..b2675a8 100644 --- a/catalog/packages/tests/test_vnf_package.py +++ b/catalog/packages/tests/test_vnf_package.py @@ -14,10 +14,11 @@ import json import os -import urllib -import mock import shutil +import urllib +import zipfile +import mock from django.test import TestCase from rest_framework import status from rest_framework.test import APIClient @@ -29,6 +30,8 @@ from catalog.pub.config.config import CATALOG_ROOT_PATH from catalog.pub.database.models import VnfPackageModel from catalog.pub.utils import toscaparser +VNF_BASE_URL = "/api/vnfpkgm/v1/vnf_packages" + class MockReq(): def read(self): @@ -55,9 +58,9 @@ class TestVnfPackage(TestCase): onboardingState="CREATED" ) mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put("%s/222/package_content" % VNF_BASE_URL, data=data) vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId="222") - self.assertEqual("zte-hss-1.0", vnf_pkg[0].vnfdId) + self.assertEqual("00342b18-a5c7-11e8-998c-bf1755941f12", vnf_pkg[0].vnfdId) self.assertEqual(PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) @@ -66,7 +69,7 @@ class TestVnfPackage(TestCase): VnfPackageModel.objects.create( vnfPackageId="222", ) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put("%s/222/package_content" % VNF_BASE_URL, data=data) self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(toscaparser, 'parse_vnfd') @@ -82,18 +85,31 @@ class TestVnfPackage(TestCase): vnf_pkg_id = vnf_pkg.vnfPackageId VnfPkgUploadThread(req_data, vnf_pkg_id).run() vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="222") - self.assertEqual("zte-hss-1.0", vnf_pkg1[0].vnfdId) + self.assertEqual("00342b18-a5c7-11e8-998c-bf1755941f12", vnf_pkg1[0].vnfdId) - def test_upload_from_uri_failed(self): + def test_upload_from_uri_bad_req(self): req_data = {"username": "123"} - response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data) - self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) + response = self.client.post("%s/111/package_content/upload_from_uri" % VNF_BASE_URL, data=req_data) + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + @mock.patch.object(urllib.request, 'urlopen') + def test_upload_from_uri_failed(self, mock_urlopen): + vnf_pkg = VnfPackageModel.objects.create( + vnfPackageId="333", + onboardingState="CREATED" + ) + req_data = {"addressInformation": "error"} + mock_urlopen.return_value = Exception('Boom!') + vnf_pkg_id = vnf_pkg.vnfPackageId + VnfPkgUploadThread(req_data, vnf_pkg_id).run() + vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="333") + self.assertEqual("CREATED", vnf_pkg1[0].onboardingState) def test_create_vnf_pkg(self): req_data = { "userDefinedData": {"a": "A"} } - response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json") + response = self.client.post(VNF_BASE_URL, data=req_data, format="json") resp_data = json.loads(response.content) expect_resp_data = { "id": resp_data.get("id"), @@ -120,7 +136,7 @@ class TestVnfPackage(TestCase): usageState="NOT_IN_USE", userDefinedData='{"a": "A"}' ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.get("%s/222" % VNF_BASE_URL) expect_data = { "id": "222", "vnfdId": "zte-hss-1.0", @@ -134,13 +150,18 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": {'self': {'href': '/api/vnfpkgm/v1/vnf_packages/222'}, + 'vnfd': { + 'href': '/api/vnfpkgm/v1/vnf_packages/222/vnfd'}, + 'packageContent': { + 'href': '/api/vnfpkgm/v1/vnf_packages/222/package_content'} + } } self.assertEqual(response.data, expect_data) self.assertEqual(response.status_code, status.HTTP_200_OK) def test_query_single_vnf_failed(self): - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.get(VNF_BASE_URL + "/222") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_query_multiple_vnf(self): @@ -170,7 +191,7 @@ class TestVnfPackage(TestCase): usageState="NOT_IN_USE", userDefinedData='{"a": "A"}' ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages") + response = self.client.get(VNF_BASE_URL) expect_data = [ { "id": "111", @@ -185,7 +206,17 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": { + "self": { + "href": "/api/vnfpkgm/v1/vnf_packages/111" + }, + "vnfd": { + "href": "/api/vnfpkgm/v1/vnf_packages/111/vnfd" + }, + "packageContent": { + "href": "/api/vnfpkgm/v1/vnf_packages/111/package_content" + } + } }, { "id": "222", @@ -200,7 +231,10 @@ class TestVnfPackage(TestCase): "operationalState": "DISABLED", "usageState": "NOT_IN_USE", "userDefinedData": {"a": "A"}, - "_links": None + "_links": {'self': {'href': '/api/vnfpkgm/v1/vnf_packages/222'}, + 'vnfd': {'href': '/api/vnfpkgm/v1/vnf_packages/222/vnfd'}, + 'packageContent': { + 'href': '/api/vnfpkgm/v1/vnf_packages/222/package_content'}} } ] self.assertEqual(response.data, expect_data) @@ -220,12 +254,12 @@ class TestVnfPackage(TestCase): usageState="NOT_IN_USE", userDefinedData='{"a": "A"}' ) - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.delete(VNF_BASE_URL + "/222") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(response.data, None) def test_delete_when_vnf_pkg_not_exist(self): - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.delete(VNF_BASE_URL + "/222") self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) self.assertEqual(response.data, None) @@ -237,7 +271,7 @@ class TestVnfPackage(TestCase): onboardingState="ONBOARDED", localFilePath="vnfPackage.csar" ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") + response = self.client.get(VNF_BASE_URL + "/222/package_content") file_content = '' for data in response.streaming_content: file_content = file_content + data.decode() @@ -253,7 +287,7 @@ class TestVnfPackage(TestCase): onboardingState="ONBOARDED", localFilePath="vnfPackage.csar" ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", HTTP_RANGE="4-7") + response = self.client.get("%s/222/package_content" % VNF_BASE_URL, HTTP_RANGE="4-7") partial_file_content = '' for data in response.streaming_content: partial_file_content = partial_file_content + data.decode() @@ -269,7 +303,7 @@ class TestVnfPackage(TestCase): onboardingState="ONBOARDED", localFilePath="vnfPackage.csar" ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", HTTP_RANGE=" 4-") + response = self.client.get(VNF_BASE_URL + "/222/package_content", HTTP_RANGE=" 4-") partial_file_content = '' for data in response.streaming_content: partial_file_content = partial_file_content + data.decode() @@ -278,7 +312,7 @@ class TestVnfPackage(TestCase): os.remove("vnfPackage.csar") def test_fetch_vnf_pkg_when_pkg_not_exist(self): - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") + response = self.client.get(VNF_BASE_URL + "/222/package_content") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) def test_fetch_vnf_pkg_when_catch_cataloge_exception(self): @@ -287,7 +321,34 @@ class TestVnfPackage(TestCase): onboardingState="CREATED", localFilePath="vnfPackage.csar" ) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") + response = self.client.get(VNF_BASE_URL + "/222/package_content") + self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) + + def test_download_vnfd(self): + VnfPackageModel.objects.create( + vnfPackageId="222", + onboardingState="ONBOARDED", + localFilePath=os.path.join(CATALOG_ROOT_PATH, "resource_test.csar") + ) + response = self.client.get(VNF_BASE_URL + "/222/vnfd") + self.assertEqual(response.status_code, status.HTTP_200_OK) + with open("vnfd.csar", 'wb') as local_file: + for chunk in response.streaming_content: + local_file.write(chunk) + self.assertTrue(zipfile.is_zipfile("vnfd.csar")) + os.remove("vnfd.csar") + + def test_download_vnfd_when_pkg_not_exist(self): + response = self.client.get(VNF_BASE_URL + "/222/vnfd") + self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + def test_download_vnfd_when_catch_cataloge_exception(self): + VnfPackageModel.objects.create( + vnfPackageId="222", + onboardingState="CREATED", + localFilePath="vnfPackage.csar" + ) + response = self.client.get(VNF_BASE_URL + "/222/vnfd") self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPackage, "create_vnf_pkg") @@ -296,25 +357,25 @@ class TestVnfPackage(TestCase): req_data = { "userDefinedData": {"a": "A"} } - response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json") + response = self.client.post(VNF_BASE_URL, data=req_data, format="json") self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPackage, "delete_vnf_pkg") def test_delete_single_when_catch_exception(self, mock_delete_vnf_pkg): mock_delete_vnf_pkg.side_effect = TypeError("integer type") - response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.delete(VNF_BASE_URL + "/222") self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPackage, "query_single") def test_query_single_when_catch_exception(self, mock_query_single): mock_query_single.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222") + response = self.client.get(VNF_BASE_URL + "/222") self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPackage, "query_multiple") def test_query_multiple_when_catch_exception(self, mock_query_muitiple): mock_query_muitiple.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages") + response = self.client.get(VNF_BASE_URL) self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(toscaparser, 'parse_vnfd') @@ -325,20 +386,20 @@ class TestVnfPackage(TestCase): onboardingState="CREATED" ) mock_parse_vnfd.side_effect = TypeError("integer type") - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put(VNF_BASE_URL + "/222/package_content", data=data) self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPkgUploadThread, 'start') def test_upload_from_uri_when_catch_exception(self, mock_start): req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"} mock_start.side_effect = TypeError("integer type") - response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data) + response = self.client.post(VNF_BASE_URL + "/111/package_content/upload_from_uri", data=req_data) self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(VnfPackage, 'download') def test_fetch_vnf_pkg_when_catch_exception(self, mock_download): mock_download.side_effect = TypeError("integer type") - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content") + response = self.client.get(VNF_BASE_URL + "/222/package_content") self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) @mock.patch.object(toscaparser, 'parse_vnfd') @@ -349,9 +410,9 @@ class TestVnfPackage(TestCase): onboardingState="CREATED" ) mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put(VNF_BASE_URL + "/222/package_content", data=data) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image") + response = self.client.get(VNF_BASE_URL + "/222/artifacts/image") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(response.getvalue(), b"ubuntu_16.04\n") @@ -363,9 +424,9 @@ class TestVnfPackage(TestCase): onboardingState="CREATED" ) mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put(VNF_BASE_URL + "/222/package_content", data=data) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/1451/artifacts/image") + response = self.client.get(VNF_BASE_URL + "/1451/artifacts/image") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) @mock.patch.object(toscaparser, 'parse_vnfd') @@ -376,7 +437,53 @@ class TestVnfPackage(TestCase): onboardingState="CREATED" ) mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data) - response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data) + response = self.client.put(VNF_BASE_URL + "/222/package_content", data=data) self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) - response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image1") + response = self.client.get(VNF_BASE_URL + "/222/artifacts/image1") self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) + + def test_upload_vnf_pkg_with_artifacts(self): + data = {'file': open(os.path.join(CATALOG_ROOT_PATH, "vgw.csar"), "rb")} + VnfPackageModel.objects.create( + vnfPackageId="222", + onboardingState="CREATED" + ) + response = self.client.put("%s/222/package_content" % VNF_BASE_URL, data=data) + vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId="222") + self.assertEqual(PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState) + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + response = self.client.get("%s/222" % VNF_BASE_URL) + print(response.data) + self.assertEqual(response.status_code, status.HTTP_200_OK) + expact_response_data = { + "id": "222", + "vnfdId": "b1bb0ce7-2222-4fa7-95ed-4840d70a1177", + "vnfProductName": "vcpe_vgw", + "vnfSoftwareVersion": "1.0", + "vnfdVersion": "1.0", + "softwareImages": None, + "additionalArtifacts": [ + { + "artifactPath": "MainServiceTemplate.yaml", + "checksum": { + "algorithm": "Null", + "hash": "Null" + } + } + ], + "onboardingState": "ONBOARDED", + "operationalState": "ENABLED", + "usageState": "NOT_IN_USE", + "_links": { + "self": { + "href": "/api/vnfpkgm/v1/vnf_packages/222" + }, + "vnfd": { + "href": "/api/vnfpkgm/v1/vnf_packages/222/vnfd" + }, + "packageContent": { + "href": "/api/vnfpkgm/v1/vnf_packages/222/package_content" + } + } + } + self.assertEqual(response.data, expact_response_data)