Deal with nfPackage
[vfc/nfvo/catalog.git] / catalog / packages / tests / test_nf.py
1 # Copyright 2017 ZTE Corporation.
2 #
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
6 #
7 #         http://www.apache.org/licenses/LICENSE-2.0
8 #
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.
14
15 import json
16 import os
17 import mock
18 import urllib2
19 from rest_framework.test import APIClient
20 from django.test import TestCase
21 from rest_framework import status
22
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
30
31
32 class MockReq():
33     def read(self):
34         return "1"
35
36     def close(self):
37         pass
38
39
40 class TestNfPackage(TestCase):
41     def setUp(self):
42         self.client = APIClient()
43         VnfPackageModel.objects.filter().delete()
44         JobModel.objects.filter().delete()
45         JobStatusModel.objects.filter().delete()
46         self.vnfd_data = {
47             "volume_storages": [
48                 {
49                     "properties": {
50                         "size_of_storage": {
51                             "factor": 10,
52                             "value": 10000000000,
53                             "unit": "GB",
54                             "unit_size": 1000000000
55                         },
56                         "type_of_storage": "volume",
57                         "rdma_enabled": False,
58                         "size": "10 GB"
59                     },
60                     "volume_storage_id": "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7",
61                     "description": ""
62                 }
63             ],
64             "inputs": {},
65             "vdus": [
66                 {
67                     "volume_storages": [
68                         "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7"
69                     ],
70                     "description": "",
71                     "dependencies": [],
72                     "vls": [],
73                     "properties": {
74                         "name": "vNat",
75                         "configurable_properties": {
76                             "test": {
77                                 "additional_vnfc_configurable_properties": {
78                                     "aaa": "1",
79                                     "bbb": "2",
80                                     "ccc": "3"
81                                 }
82                             }
83                         },
84                         "description": "the virtual machine of vNat",
85                         "nfvi_constraints": [
86                             "test"
87                         ],
88                         "boot_order": [
89                             "vNAT_Storage"
90                         ]
91                     },
92                     "vdu_id": "vdu_vNat",
93                     "artifacts": [
94                         {
95                             "artifact_name": "vNatVNFImage",
96                             "type": "tosca.artifacts.nfv.SwImage",
97                             "properties": {
98                                 "operating_system": "linux",
99                                 "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
100                                 "name": "vNatVNFImage",
101                                 "container_format": "bare",
102                                 "min_ram": "1 GB",
103                                 "disk_format": "qcow2",
104                                 "supported_virtualisation_environments": [
105                                     "test_0"
106                                 ],
107                                 "version": "1.0",
108                                 "checksum": "5000",
109                                 "min_disk": "10 GB",
110                                 "size": "10 GB"
111                             },
112                             "file": "/swimages/vRouterVNF_ControlPlane.qcow2"
113                         }
114                     ],
115                     "nfv_compute": {
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",
125                             "hw:cpu_cores": "2",
126                             "hw:cpu_threads_policy": "isolate"
127                         },
128                         "cpu_frequency": "2.4 GHz",
129                         "num_cpus": 2,
130                         "mem_size": "10 GB"
131                     },
132                     "local_storages": [],
133                     "image_file": "vNatVNFImage",
134                     "cps": []
135                 }
136             ],
137             "image_files": [
138                 {
139                     "properties": {
140                         "operating_system": "linux",
141                         "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
142                         "name": "vNatVNFImage",
143                         "container_format": "bare",
144                         "min_ram": "1 GB",
145                         "disk_format": "qcow2",
146                         "supported_virtualisation_environments": [
147                             "test_0"
148                         ],
149                         "version": "1.0",
150                         "checksum": "5000",
151                         "min_disk": "10 GB",
152                         "size": "10 GB"
153                     },
154                     "image_file_id": "vNatVNFImage",
155                     "description": ""
156                 }
157             ],
158             "routers": [],
159             "local_storages": [],
160             "vnf_exposed": {
161                 "external_cps": [
162                     {
163                         "key_name": "sriov_plane",
164                         "cp_id": "SRIOV_Port"
165                     }
166                 ],
167                 "forward_cps": []
168             },
169             "vls": [
170                 {
171                     "route_id": "",
172                     "vl_id": "sriov_link",
173                     "route_external": False,
174                     "description": "",
175                     "properties": {
176                         "vl_flavours": {
177                             "vl_id": "aaaa"
178                         },
179                         "connectivity_type": {
180                             "layer_protocol": "ipv4",
181                             "flow_pattern": "flat"
182                         },
183                         "description": "sriov_link",
184                         "test_access": [
185                             "test"
186                         ]
187                     }
188                 }
189             ],
190             "cps": [
191                 {
192                     "vl_id": "sriov_link",
193                     "vdu_id": "vdu_vNat",
194                     "description": "",
195                     "cp_id": "SRIOV_Port",
196                     "properties": {
197                         "address_data": [
198                             {
199                                 "address_type": "ip_address",
200                                 "l3_address_data": {
201                                     "ip_address_type": "ipv4",
202                                     "floating_ip_activated": False,
203                                     "number_of_ip_address": 1,
204                                     "ip_address_assignment": True
205                                 }
206                             }
207                         ],
208                         "description": "sriov port",
209                         "layer_protocol": "ipv4",
210                         "virtual_network_interface_requirements": [
211                             {
212                                 "requirement": {
213                                     "SRIOV": "true"
214                                 },
215                                 "support_mandatory": False,
216                                 "name": "sriov",
217                                 "description": "sriov"
218                             },
219                             {
220                                 "requirement": {
221                                     "SRIOV": "False"
222                                 },
223                                 "support_mandatory": False,
224                                 "name": "normal",
225                                 "description": "normal"
226                             }
227                         ],
228                         "role": "root",
229                         "bitrate_requirement": 10
230                     }
231                 }
232             ],
233             "metadata": {
234                 "vnfSoftwareVersion": "1.0.0",
235                 "vnfProductName": "zte",
236                 "localizationLanguage": [
237                     "english",
238                     "chinese"
239                 ],
240                 "vnfProvider": "zte",
241                 "vnfmInfo": "zte",
242                 "defaultLocalizationLanguage": "english",
243                 "vnfdId": "zte-hss-1.0",
244                 "id": "zte-hss-1.0",
245                 "vnfProductInfoDescription": "hss",
246                 "vnfdVersion": "1.0.0",
247                 "vnfProductInfoName": "hss"
248             }
249         }
250
251     def tearDown(self):
252         pass
253
254     def assert_job_result(self, job_id, job_progress, job_detail):
255         jobs = JobStatusModel.objects.filter(
256             jobid=job_id,
257             progress=job_progress,
258             descp=job_detail)
259         self.assertEqual(1, len(jobs))
260
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", {
264             "csarId": "1",
265             "vimIds": ["1"]
266         }, format='json')
267         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
268
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",
272                            vim_ids=["1"],
273                            lab_vim_id="",
274                            job_id="2").run()
275         self.assert_job_result("2", 255, "NF CSAR(1) already exists.")
276
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([{
285             "uuid": "1",
286             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
287         }]), '200']
288         VnfPackageModel(vnfPackageId="2", vnfdId="zte-hss-1.0").save()
289         NfDistributeThread(csar_id="1",
290                            vim_ids=["1"],
291                            lab_vim_id="",
292                            job_id="2").run()
293         self.assert_job_result("2", 255, "NFD(zte-hss-1.0) already exists.")
294
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([{
303             "uuid": "1",
304             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
305         }]), '200']
306         NfDistributeThread(csar_id="1",
307                            vim_ids=["1"],
308                            lab_vim_id="",
309                            job_id="4").run()
310         self.assert_job_result("4", 100, "CSAR(1) distribute successfully.")
311
312     ###############################################################################################################
313
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)
318
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.")
323
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)
331         expect_data = [
332             {
333                 "imageInfo": [],
334                 "csarId": "3",
335                 "packageInfo": {
336                     "csarName": "",
337                     "vnfdModel": "",
338                     "vnfdProvider": "3",
339                     "vnfdId": "3",
340                     "downloadUrl": "http://127.0.0.1:8806/static/catalog/3/",
341                     "vnfVersion": "",
342                     "vnfdVersion": "3",
343                     "vnfPackageId": "3"
344                 }
345             },
346             {
347                 "imageInfo": [],
348                 "csarId": "4",
349                 "packageInfo": {
350                     "csarName": "",
351                     "vnfdModel": "",
352                     "vnfdProvider": "4",
353                     "vnfdId": "4",
354                     "downloadUrl": "http://127.0.0.1:8806/static/catalog/4/",
355                     "vnfVersion": "",
356                     "vnfdVersion": "4",
357                     "vnfPackageId": "4"
358                 }
359             }
360         ]
361         self.assertEqual(expect_data, resp.data)
362
363     def test_nf_pkg_get_one(self):
364         VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
365                         vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
366
367         resp = self.client.get("/api/catalog/v1/vnfpackages/4")
368         self.assertEqual(resp.status_code, status.HTTP_200_OK)
369         expect_data = {
370             "imageInfo": [],
371             "csarId": "4",
372             "packageInfo": {
373                 "csarName": "",
374                 "vnfdModel": "",
375                 "vnfdProvider": "4",
376                 "vnfdId": "4",
377                 "downloadUrl": "http://127.0.0.1:8806/static/catalog/4/",
378                 "vnfVersion": "",
379                 "vnfdVersion": "4",
380                 "vnfPackageId": "4"
381             }
382         }
383         self.assertEqual(expect_data, resp.data)
384
385     def test_nf_pkg_get_one_failed(self):
386         VnfPackageModel(vnfPackageId="4", vnfdId="4", vnfVendor='4', vnfdVersion='4',
387                         vnfSoftwareVersion='', vnfPackageUri='', vnfdModel='').save()
388
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)
392
393     ###############################################################################################################
394
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)
403
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."})
409
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)
414
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()
419         vnfPkgId = "222"
420         VnfpkgUploadThread(req_data, vnfPkgId).run()