0e82d3e7264f4885877c99efa4ea01d26df07a6b
[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 import json
15 import mock
16 from rest_framework import status
17 from django.test import TestCase
18 from django.test import Client
19
20 from catalog.pub.utils import restcall, toscaparser
21 from catalog.pub.utils import fileutil
22 from catalog.pub.database.models import VnfPackageModel
23 from catalog.pub.database.models import JobStatusModel, JobModel
24 from catalog.packages.nf_package import NfDistributeThread, NfPkgDeleteThread
25 from catalog.packages import nf_package
26 from catalog.pub.msapi import sdc
27
28 class TestNfPackage(TestCase):
29     def setUp(self):
30         self.client = Client()
31         VnfPackageModel.objects.filter().delete()
32         JobModel.objects.filter().delete()
33         JobStatusModel.objects.filter().delete()
34         self.vnfd_data = {
35             "volume_storages": [
36                 {
37                     "properties": {
38                         "size_of_storage": {
39                             "factor": 10,
40                             "value": 10000000000,
41                             "unit": "GB",
42                             "unit_size": 1000000000
43                         },
44                         "type_of_storage": "volume",
45                         "rdma_enabled": False,
46                         "size": "10 GB"
47                     },
48                     "volume_storage_id": "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7",
49                     "description": ""
50                 }
51             ],
52             "inputs": {},
53             "vdus": [
54                 {
55                     "volume_storages": [
56                         "vNAT_Storage_6wdgwzedlb6sq18uzrr41sof7"
57                     ],
58                     "description": "",
59                     "dependencies": [],
60                     "vls": [],
61                     "properties": {
62                         "name": "vNat",
63                         "configurable_properties": {
64                             "test": {
65                                 "additional_vnfc_configurable_properties": {
66                                     "aaa": "1",
67                                     "bbb": "2",
68                                     "ccc": "3"
69                                 }
70                             }
71                         },
72                         "description": "the virtual machine of vNat",
73                         "nfvi_constraints": [
74                             "test"
75                         ],
76                         "boot_order": [
77                             "vNAT_Storage"
78                         ]
79                     },
80                     "vdu_id": "vdu_vNat",
81                     "artifacts": [
82                         {
83                             "artifact_name": "vNatVNFImage",
84                             "type": "tosca.artifacts.nfv.SwImage",
85                             "properties": {
86                                 "operating_system": "linux",
87                                 "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
88                                 "name": "vNatVNFImage",
89                                 "container_format": "bare",
90                                 "min_ram": "1 GB",
91                                 "disk_format": "qcow2",
92                                 "supported_virtualisation_environments": [
93                                     "test_0"
94                                 ],
95                                 "version": "1.0",
96                                 "checksum": "5000",
97                                 "min_disk": "10 GB",
98                                 "size": "10 GB"
99                             },
100                             "file": "/swimages/vRouterVNF_ControlPlane.qcow2"
101                         }
102                     ],
103                     "nfv_compute": {
104                         "flavor_extra_specs": {
105                             "hw:cpu_sockets": "2",
106                             "sw:ovs_dpdk": "true",
107                             "hw:cpu_threads": "2",
108                             "hw:numa_mem.1": "3072",
109                             "hw:numa_mem.0": "1024",
110                             "hw:numa_nodes": "2",
111                             "hw:numa_cpus.0": "0,1",
112                             "hw:numa_cpus.1": "2,3,4,5",
113                             "hw:cpu_cores": "2",
114                             "hw:cpu_threads_policy": "isolate"
115                         },
116                         "cpu_frequency": "2.4 GHz",
117                         "num_cpus": 2,
118                         "mem_size": "10 GB"
119                     },
120                     "local_storages": [],
121                     "image_file": "vNatVNFImage",
122                     "cps": []
123                 }
124             ],
125             "image_files": [
126                 {
127                     "properties": {
128                         "operating_system": "linux",
129                         "sw_image": "/swimages/vRouterVNF_ControlPlane.qcow2",
130                         "name": "vNatVNFImage",
131                         "container_format": "bare",
132                         "min_ram": "1 GB",
133                         "disk_format": "qcow2",
134                         "supported_virtualisation_environments": [
135                             "test_0"
136                         ],
137                         "version": "1.0",
138                         "checksum": "5000",
139                         "min_disk": "10 GB",
140                         "size": "10 GB"
141                     },
142                     "image_file_id": "vNatVNFImage",
143                     "description": ""
144                 }
145             ],
146             "routers": [],
147             "local_storages": [],
148             "vnf_exposed": {
149                 "external_cps": [
150                     {
151                         "key_name": "sriov_plane",
152                         "cp_id": "SRIOV_Port"
153                     }
154                 ],
155                 "forward_cps": []
156             },
157             "vls": [
158                 {
159                     "route_id": "",
160                     "vl_id": "sriov_link",
161                     "route_external": False,
162                     "description": "",
163                     "properties": {
164                         "vl_flavours": {
165                             "vl_id": "aaaa"
166                         },
167                         "connectivity_type": {
168                             "layer_protocol": "ipv4",
169                             "flow_pattern": "flat"
170                         },
171                         "description": "sriov_link",
172                         "test_access": [
173                             "test"
174                         ]
175                     }
176                 }
177             ],
178             "cps": [
179                 {
180                     "vl_id": "sriov_link",
181                     "vdu_id": "vdu_vNat",
182                     "description": "",
183                     "cp_id": "SRIOV_Port",
184                     "properties": {
185                         "address_data": [
186                             {
187                                 "address_type": "ip_address",
188                                 "l3_address_data": {
189                                     "ip_address_type": "ipv4",
190                                     "floating_ip_activated": False,
191                                     "number_of_ip_address": 1,
192                                     "ip_address_assignment": True
193                                 }
194                             }
195                         ],
196                         "description": "sriov port",
197                         "layer_protocol": "ipv4",
198                         "virtual_network_interface_requirements": [
199                             {
200                                 "requirement": {
201                                     "SRIOV": "true"
202                                 },
203                                 "support_mandatory": False,
204                                 "name": "sriov",
205                                 "description": "sriov"
206                             },
207                             {
208                                 "requirement": {
209                                     "SRIOV": "False"
210                                 },
211                                 "support_mandatory": False,
212                                 "name": "normal",
213                                 "description": "normal"
214                             }
215                         ],
216                         "role": "root",
217                         "bitrate_requirement": 10
218                     }
219                 }
220             ],
221             "metadata": {
222                 "vnfSoftwareVersion": "1.0.0",
223                 "vnfProductName": "zte",
224                 "localizationLanguage": [
225                     "english",
226                     "chinese"
227                 ],
228                 "vnfProvider": "zte",
229                 "vnfmInfo": "zte",
230                 "defaultLocalizationLanguage": "english",
231                 "vnfdId": "zte-hss-1.0",
232                 "id": "zte-hss-1.0",
233                 "vnfProductInfoDescription": "hss",
234                 "vnfdVersion": "1.0.0",
235                 "vnfProductInfoName": "hss"
236             }
237         }
238
239     def tearDown(self):
240         pass
241
242     def assert_job_result(self, job_id, job_progress, job_detail):
243         jobs = JobStatusModel.objects.filter(
244             jobid=job_id,
245             progress=job_progress,
246             descp=job_detail)
247         self.assertEqual(1, len(jobs))
248
249     @mock.patch.object(NfDistributeThread, 'run')
250     def test_nf_pkg_distribute_normal(self, mock_run):
251         resp = self.client.post("/api/catalog/v1/vnfpackages", {
252             "csarId": "1",
253             "vimIds": ["1"]
254             }, format='json')
255         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
256     
257     def test_nf_pkg_distribute_when_csar_already_exist(self):
258         VnfPackageModel(vnfPackageId="1", vnfdId="vcpe_vfw_zte_1_0").save()
259         NfDistributeThread(csar_id="1",
260                            vim_ids=["1"],
261                            lab_vim_id="",
262                            job_id="2").run()
263         self.assert_job_result("2", 255, "NF CSAR(1) already exists.")
264
265     @mock.patch.object(restcall, 'call_req')
266     @mock.patch.object(sdc, 'download_artifacts')
267     @mock.patch.object(toscaparser, 'parse_vnfd')
268     def test_nf_pkg_distribute_when_vnfd_already_exist(self,
269         mock_parse_vnfd, mock_download_artifacts, mock_call_req):
270         mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
271         mock_download_artifacts.return_value = "/home/hss.csar"
272         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
273             "uuid": "1",
274             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
275             }]), '200']
276         VnfPackageModel(vnfPackageId="2", vnfdId="zte-hss-1.0").save()
277         NfDistributeThread(csar_id="1",
278                            vim_ids=["1"],
279                            lab_vim_id="",
280                            job_id="2").run()
281         self.assert_job_result("2", 255, "NFD(zte-hss-1.0) already exists.")
282     
283     @mock.patch.object(restcall, 'call_req')
284     @mock.patch.object(sdc, 'download_artifacts')
285     @mock.patch.object(toscaparser, 'parse_vnfd')
286     def test_nf_pkg_distribute_successfully(self,
287         mock_parse_vnfd, mock_download_artifacts, mock_call_req):
288         mock_parse_vnfd.return_value = json.JSONEncoder().encode(self.vnfd_data)
289         mock_download_artifacts.return_value = "/home/hss.csar"
290         mock_call_req.return_value = [0, json.JSONEncoder().encode([{
291             "uuid": "1",
292             "toscaModelURL": "https://127.0.0.1:1234/sdc/v1/hss.csar"
293             }]), '200']
294         NfDistributeThread(csar_id="1",
295                            vim_ids=["1"],
296                            lab_vim_id="",
297                            job_id="4").run()
298         self.assert_job_result("4", 100, "CSAR(1) distribute successfully.")
299
300     ###############################################################################################################
301
302     @mock.patch.object(NfPkgDeleteThread, 'run')
303     def test_nf_pkg_delete_normal(self, mock_run):
304         resp = self.client.delete("/api/catalog/v1/vnfpackages/1")
305         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
306     
307     def test_nf_pkg_normal_delete(self):
308         VnfPackageModel(vnfPackageId="2", vnfdId="vcpe_vfw_zte_1_0").save()
309         NfPkgDeleteThread(csar_id="2", job_id="2").run()
310         self.assert_job_result("2", 100, "Delete CSAR(2) successfully.")
311
312     def test_nf_pkg_get_all(self):
313         VnfPackageModel(vnfPackageId="3", vnfdId="4").save()
314
315         resp = self.client.get("/api/catalog/v1/vnfpackages")
316         self.assertEqual(resp.status_code, status.HTTP_200_OK)
317         self.assertEqual({"csars": [{"csarId":"3", "vnfdId": "4"}]}, resp.data)
318
319     def test_nf_pkg_get_one(self):
320         VnfPackageModel(vnfPackageId="4", vnfdId="5", vnfVendor="6", 
321             vnfdVersion="7", vnfSoftwareVersion="8", vnfPackageUri="4.csar").save()
322
323         resp = self.client.get("/api/catalog/v1/vnfpackages/4")
324         self.assertEqual(resp.status_code, status.HTTP_200_OK)
325         self.assertEqual({"csarId": "4", 
326             "packageInfo": {
327                 "vnfdId": "5",
328                 "vnfdProvider": "6",
329                 "vnfdVersion": "7",
330                 "vnfVersion": "8",
331                 "csarName": "4.csar",
332                 "downloadUrl": "http://127.0.0.1:8806/static/catalog/4/4.csar"
333             }, 
334             "imageInfo": []}, resp.data)
335
336     ###############################################################################################################
337
338     @mock.patch.object(toscaparser, 'parse_vnfd')
339     def test_vnfd_parse_normal(self, mock_parse_vnfd):
340         VnfPackageModel(vnfPackageId="8", vnfdId="10").save()
341         mock_parse_vnfd.return_value = json.JSONEncoder().encode({"c": "d"})
342         resp = self.client.post("/api/catalog/v1/parservnfd", 
343             {"csarId": "8", "inputs": []}, format='json')
344         self.assertEqual(resp.status_code, status.HTTP_202_ACCEPTED)
345         self.assertEqual({"model": '{"c": "d"}'}, resp.data)
346
347     def test_vnfd_parse_when_csar_not_exist(self):
348         resp = self.client.post("/api/catalog/v1/parservnfd", 
349             {"csarId": "1", "inputs": []}, format='json')
350         self.assertEqual(resp.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
351         self.assertEqual(resp.data, {"error": "VNF CSAR(1) does not exist."})