1 # Copyright 2018 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.
20 from django.test import TestCase
21 from rest_framework import status
22 from rest_framework.test import APIClient
24 from genericparser.packages.biz.vnf_package import VnfPackage, VnfPkgUploadThread
25 from genericparser.packages.const import PKG_STATUS
26 from genericparser.packages.tests.const import vnfd_data
27 from genericparser.pub.config.config import GENERICPARSER_ROOT_PATH
28 from genericparser.pub.database.models import VnfPackageModel
29 from genericparser.pub.utils import toscaparsers
40 class TestVnfPackage(TestCase):
42 self.client = APIClient()
47 @mock.patch.object(toscaparsers, 'parse_vnfd')
48 def test_upload_vnf_pkg(self, mock_parse_vnfd):
49 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rb")}
50 VnfPackageModel.objects.create(
52 onboardingState="CREATED"
54 mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
55 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
56 vnf_pkg = VnfPackageModel.objects.filter(vnfPackageId="222")
57 self.assertEqual("zte-hss-1.0", vnf_pkg[0].vnfdId)
58 self.assertEqual(PKG_STATUS.ONBOARDED, vnf_pkg[0].onboardingState)
59 self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
61 def test_upload_vnf_pkg_failed(self):
62 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rb")}
63 VnfPackageModel.objects.create(
66 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
67 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
69 @mock.patch.object(toscaparsers, 'parse_vnfd')
70 @mock.patch.object(urllib2, 'urlopen')
71 def test_upload_nf_pkg_from_uri(self, mock_urlopen, mock_parse_vnfd):
72 vnf_pkg = VnfPackageModel.objects.create(
74 onboardingState="CREATED"
76 mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
77 req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"}
78 mock_urlopen.return_value = MockReq()
79 vnf_pkg_id = vnf_pkg.vnfPackageId
80 VnfPkgUploadThread(req_data, vnf_pkg_id).run()
81 vnf_pkg1 = VnfPackageModel.objects.filter(vnfPackageId="222")
82 self.assertEqual("zte-hss-1.0", vnf_pkg1[0].vnfdId)
84 def test_upload_from_uri_failed(self):
85 req_data = {"username": "123"}
86 response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data)
87 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
89 def test_create_vnf_pkg(self):
91 "userDefinedData": {"a": "A"}
93 response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json")
94 resp_data = json.loads(response.content)
96 "id": resp_data.get("id"),
97 "onboardingState": "CREATED",
98 "operationalState": "DISABLED",
99 "usageState": "NOT_IN_USE",
100 "userDefinedData": {"a": "A"},
101 "_links": None # TODO
103 self.assertEqual(expect_resp_data, resp_data)
104 self.assertEqual(response.status_code, status.HTTP_201_CREATED)
106 def test_query_single_vnf(self):
107 VnfPackageModel.objects.create(
109 vnfdId="zte-hss-1.0",
111 vnfdProductName="hss",
112 vnfSoftwareVersion="1.0.0",
114 checksum='{"algorithm":"111", "hash": "11"}',
115 onboardingState="CREATED",
116 operationalState="DISABLED",
117 usageState="NOT_IN_USE",
118 userDefinedData='{"a": "A"}'
120 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222")
123 "vnfdId": "zte-hss-1.0",
124 "vnfProductName": "hss",
125 "vnfSoftwareVersion": "1.0.0",
126 "vnfdVersion": "1.0.0",
127 "checksum": {"algorithm": "111", "hash": "11"},
128 "softwareImages": None,
129 "additionalArtifacts": None,
130 "onboardingState": "CREATED",
131 "operationalState": "DISABLED",
132 "usageState": "NOT_IN_USE",
133 "userDefinedData": {"a": "A"},
136 self.assertEqual(response.data, expect_data)
137 self.assertEqual(response.status_code, status.HTTP_200_OK)
139 def test_query_single_vnf_failed(self):
140 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222")
141 self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
143 def test_query_multiple_vnf(self):
144 VnfPackageModel.objects.create(
146 vnfdId="zte-hss-1.0",
148 vnfdProductName="hss",
149 vnfSoftwareVersion="1.0.0",
151 checksum='{"algorithm":"111", "hash": "11"}',
152 onboardingState="CREATED",
153 operationalState="DISABLED",
154 usageState="NOT_IN_USE",
155 userDefinedData='{"a": "A"}'
157 VnfPackageModel.objects.create(
159 vnfdId="zte-hss-1.0",
161 vnfdProductName="hss",
162 vnfSoftwareVersion="1.0.0",
164 checksum='{"algorithm":"111", "hash": "11"}',
165 onboardingState="CREATED",
166 operationalState="DISABLED",
167 usageState="NOT_IN_USE",
168 userDefinedData='{"a": "A"}'
170 response = self.client.get("/api/vnfpkgm/v1/vnf_packages")
174 "vnfdId": "zte-hss-1.0",
175 "vnfProductName": "hss",
176 "vnfSoftwareVersion": "1.0.0",
177 "vnfdVersion": "1.0.0",
178 "checksum": {"algorithm": "111", "hash": "11"},
179 "softwareImages": None,
180 "additionalArtifacts": None,
181 "onboardingState": "CREATED",
182 "operationalState": "DISABLED",
183 "usageState": "NOT_IN_USE",
184 "userDefinedData": {"a": "A"},
189 "vnfdId": "zte-hss-1.0",
190 "vnfProductName": "hss",
191 "vnfSoftwareVersion": "1.0.0",
192 "vnfdVersion": "1.0.0",
193 "checksum": {"algorithm": "111", "hash": "11"},
194 "softwareImages": None,
195 "additionalArtifacts": None,
196 "onboardingState": "CREATED",
197 "operationalState": "DISABLED",
198 "usageState": "NOT_IN_USE",
199 "userDefinedData": {"a": "A"},
203 self.assertEqual(response.data, expect_data)
204 self.assertEqual(response.status_code, status.HTTP_200_OK)
206 def test_delete_single_vnf_pkg(self):
207 VnfPackageModel.objects.create(
209 vnfdId="zte-hss-1.0",
211 vnfdProductName="hss",
212 vnfSoftwareVersion="1.0.0",
214 checksum='{"algorithm":"111", "hash": "11"}',
215 onboardingState="CREATED",
216 operationalState="DISABLED",
217 usageState="NOT_IN_USE",
218 userDefinedData='{"a": "A"}'
220 response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222")
221 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
222 self.assertEqual(response.data, None)
224 def test_delete_when_vnf_pkg_not_exist(self):
225 response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222")
226 self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
227 self.assertEqual(response.data, None)
229 def test_fetch_vnf_pkg(self):
230 with open("vnfPackage.csar", "wb") as fp:
231 fp.writelines("AAAABBBBCCCCDDDD")
232 VnfPackageModel.objects.create(
234 onboardingState="ONBOARDED",
235 localFilePath="vnfPackage.csar"
237 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
239 for data in response.streaming_content:
240 file_content = file_content + data
241 self.assertEqual(response.status_code, status.HTTP_200_OK)
242 self.assertEqual('AAAABBBBCCCCDDDD', file_content)
243 os.remove("vnfPackage.csar")
245 def test_fetch_partical_vnf_pkg(self):
246 with open("vnfPackage.csar", "wb") as fp:
247 fp.writelines("AAAABBBBCCCCDDDD")
248 VnfPackageModel.objects.create(
250 onboardingState="ONBOARDED",
251 localFilePath="vnfPackage.csar"
253 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content", RANGE="4-7")
254 partial_file_content = ''
255 for data in response.streaming_content:
256 partial_file_content = partial_file_content + data
257 self.assertEqual(response.status_code, status.HTTP_200_OK)
258 self.assertEqual('BBB', partial_file_content)
259 os.remove("vnfPackage.csar")
261 def test_fetch_vnf_pkg_when_pkg_not_exist(self):
262 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
263 self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
265 def test_fetch_vnf_pkg_when_catch_cataloge_exception(self):
266 VnfPackageModel.objects.create(
268 onboardingState="CREATED",
269 localFilePath="vnfPackage.csar"
271 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
272 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
274 @mock.patch.object(VnfPackage, "create_vnf_pkg")
275 def test_create_vnf_pkg_when_catch_exception(self, mock_create_vnf_pkg):
276 mock_create_vnf_pkg.side_effect = TypeError('integer type')
278 "userDefinedData": {"a": "A"}
280 response = self.client.post("/api/vnfpkgm/v1/vnf_packages", data=req_data, format="json")
281 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
283 @mock.patch.object(VnfPackage, "delete_vnf_pkg")
284 def test_delete_single_when_catch_exception(self, mock_delete_vnf_pkg):
285 mock_delete_vnf_pkg.side_effect = TypeError("integer type")
286 response = self.client.delete("/api/vnfpkgm/v1/vnf_packages/222")
287 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
289 @mock.patch.object(VnfPackage, "query_single")
290 def test_query_single_when_catch_exception(self, mock_query_single):
291 mock_query_single.side_effect = TypeError("integer type")
292 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222")
293 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
295 @mock.patch.object(VnfPackage, "query_multiple")
296 def test_query_multiple_when_catch_exception(self, mock_query_muitiple):
297 mock_query_muitiple.side_effect = TypeError("integer type")
298 response = self.client.get("/api/vnfpkgm/v1/vnf_packages")
299 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
301 @mock.patch.object(toscaparsers, 'parse_vnfd')
302 def test_upload_when_catch_exception(self, mock_parse_vnfd):
303 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "empty.txt"), "rb")}
304 VnfPackageModel.objects.create(
306 onboardingState="CREATED"
308 mock_parse_vnfd.side_effect = TypeError("integer type")
309 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
310 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
312 @mock.patch.object(VnfPkgUploadThread, 'start')
313 def test_upload_from_uri_when_catch_exception(self, mock_start):
314 req_data = {"addressInformation": "https://127.0.0.1:1234/sdc/v1/hss.csar"}
315 mock_start.side_effect = TypeError("integer type")
316 response = self.client.post("/api/vnfpkgm/v1/vnf_packages/111/package_content/upload_from_uri", data=req_data)
317 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
319 @mock.patch.object(VnfPackage, 'download')
320 def test_fetch_vnf_pkg_when_catch_exception(self, mock_download):
321 mock_download.side_effect = TypeError("integer type")
322 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/package_content")
323 self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
325 @mock.patch.object(toscaparsers, 'parse_vnfd')
326 def test_fetch_vnf_artifact(self, mock_parse_vnfd):
327 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")}
328 VnfPackageModel.objects.create(
330 onboardingState="CREATED"
332 mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
333 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
334 self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
335 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image")
336 self.assertEqual(response.status_code, status.HTTP_200_OK)
337 self.assertEqual(response.getvalue(), "ubuntu_16.04\n")
339 @mock.patch.object(toscaparsers, 'parse_vnfd')
340 def test_fetch_vnf_artifact_not_exists(self, mock_parse_vnfd):
341 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")}
342 VnfPackageModel.objects.create(
344 onboardingState="CREATED"
346 mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
347 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
348 self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
349 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/1451/artifacts/image")
350 self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)
352 @mock.patch.object(toscaparsers, 'parse_vnfd')
353 def test_fetch_vnf_artifact_vnf_not_exists(self, mock_parse_vnfd):
354 data = {'file': open(os.path.join(GENERICPARSER_ROOT_PATH, "resource_test.csar"), "rb")}
355 VnfPackageModel.objects.create(
357 onboardingState="CREATED"
359 mock_parse_vnfd.return_value = json.JSONEncoder().encode(vnfd_data)
360 response = self.client.put("/api/vnfpkgm/v1/vnf_packages/222/package_content", data=data)
361 self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
362 response = self.client.get("/api/vnfpkgm/v1/vnf_packages/222/artifacts/image1")
363 self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND)