3dde266badccaa879528ccf4efd678567bc22a59
[vfc/nfvo/driver/vnfm/svnfm.git] / zte / vmanager / driver / interfaces / tests.py
1 # Copyright 2016-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 mock
17 from django.test import Client
18 from django.test import TestCase
19 from rest_framework import status
20 from driver.pub.utils import restcall
21
22
23 class InterfacesTest(TestCase):
24     def setUp(self):
25         self.client = Client()
26
27     def tearDown(self):
28         pass
29
30     # @mock.patch.object(restcall, 'call_req_aai')
31     @mock.patch.object(restcall, 'call_req')
32     def test_instantiate_vnf_001(self, mock_call_req):
33         """
34         Initate_VNF
35         """
36         vnfm_info = {u'userName': u'admin',
37                      u'vendor': u'ZTE',
38                      u'name': u'ZTE_VNFM_237_62',
39                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
40                      u'url': u'http://192.168.237.165:2324',
41                      u'certificateUrl': u'',
42                      u'version': u'V1.0',
43                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
44                      u'password': u'admin',
45                      u'type': u'ztevmanagerdriver',
46                      u'createTime': u'2016-10-31 11:08:39',
47                      u'description': u''}
48         vnfd_info = {u'vnfInstanceInfo': [{u'vnfInstanceId': u'59b79a9f-9e37-4f6c-acaf-5f41d9cb3f76',
49                                            u'vnfInstanceName': u'VFW_59b79a9f-9e37-4f6c-acaf-5f41d9cb3f76'},
50                                           {u'vnfInstanceId': u'6c5e4bd3-e8a6-42d8-a7a4-53a8ef74c6ac',
51                                            u'vnfInstanceName': u'VFW_6c5e4bd3-e8a6-42d8-a7a4-53a8ef74c6ac'},
52                                           {u'vnfInstanceId': u'930de5c9-8043-41df-ace8-ede2262a3713',
53                                            u'vnfInstanceName': u'VFW_930de5c9-8043-41df-ace8-ede2262a3713'},
54                                           {u'vnfInstanceId': u'c677a305-a7bd-4baf-9eee-c383c588bb3c',
55                                            u'vnfInstanceName': u'VFW_c677a305-a7bd-4baf-9eee-c383c588bb3c'},
56                                           {u'vnfInstanceId': u'e708e5c5-bdf4-436a-b928-826887806d82',
57                                            u'vnfInstanceName': u'VFW_e708e5c5-bdf4-436a-b928-826887806d82'}],
58                      u'csarId': u'd852e1be-0aac-48f1-b1a4-cd825f6cdf9a',
59                      u'imageInfo': [
60                          {u'status': u'Enable', u'index': u'0',
61                           u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
62                           u'fileName': u'VFW_IMAGE_VCPE_ZTE',
63                           u'vimUser': u'admin',
64                           u'imageId': u'd2b73154-0414-466a-a1e6-51b9461b753a',
65                           u'tenant': u'admin'}],
66                      u'packageInfo': {u'usageState': u'NotInUse',
67                                       u'onBoardState': u'onBoarded',
68                                       u'name': u'VFW',
69                                       u'format': u'yaml',
70                                       u'provider': u'ZTE',
71                                       u'vnfdProvider': u'zte',
72                                       u'vnfdId': u'vcpe_vfw_zte_1_0',
73                                       u'deletionPending': False,
74                                       u'version': u'v1.0',
75                                       u'vnfVersion': u'1.0',
76                                       u'vnfdVersion': u'1.0.0',
77                                       u'processState': u'normal',
78                                       u'modifyTime': u'2016-10-31 16:21:32',
79                                       u'downloadUri': u'http://192.168.233.226:80/',
80                                       u'operationalState': u'Disabled',
81                                       u'createTime': u'2016-10-31 16:21:11',
82                                       u'size': u'12.1 MB'}}
83         packageInfo = {u'usageState': u'NotInUse',
84                        u'onBoardState': u'onBoarded',
85                        u'name': u'VFW',
86                        u'format': u'yaml',
87                        u'provider': u'ZTE',
88                        u'vnfdProvider': u'zte',
89                        u'vnfdId': u'vcpe_vfw_zte_1_0',
90                        u'deletionPending': False,
91                        u'version': u'v1.0',
92                        u'vnfVersion': u'1.0',
93                        u'vnfdVersion': u'1.0.0',
94                        u'processState': u'normal',
95                        u'modifyTime': u'2016-10-31 16:21:32',
96                        u'downloadUri': u'http://192.168.233.226:80/files/catalog-http/NFAR/ZTE/VFW/v1.0/VFW.csar',
97                        u'operationalState': u'Disabled',
98                        u'createTime': u'2016-10-31 16:21:11', u'size': u'12.1 MB'}
99
100         inst_response = {
101             u'vnfInstanceId': u'8',
102             u'jobid': u'NF-CREATE-8-b384535c-9f45-11e6-8749-fa163e91c2f9'
103         }
104         ret = [0, json.JSONEncoder().encode(inst_response), '200']
105
106         r1 = [0, json.JSONEncoder().encode(vnfm_info), "200"]
107
108         r2 = [0, json.JSONEncoder().encode(vnfd_info), "200"]
109
110         r3 = [0, json.JSONEncoder().encode(packageInfo), "200"]
111
112         # mock_call_req_aai.side_effect =[r1]
113         mock_call_req.side_effect = [r1, r2, r3, ret]
114
115         req_data = {
116             'vnfInstanceName': 'VFW_f88c0cb7-512a-44c4-bd09-891663f19367',
117             'vnfPackageId': 'd852e1be-0aac-48f1-b1a4-cd825f6cdf9a',
118             'vnfDescriptorId': 'vcpe_vfw_zte_1_0',
119             'additionalParam': {
120                 'sdncontroller': 'e4d637f1-a4ec-4c59-8b20-4e8ab34daba9',
121                 'NatIpRange': '192.167.0.10-192.168.0.20',
122                 'm6000_mng_ip': '192.168.11.11',
123                 'externalPluginManageNetworkName': 'plugin_net_2014',
124                 'location': '516cee95-e8ca-4d26-9268-38e343c2e31e',
125                 'externalManageNetworkName': 'mng_net_2017',
126                 'sfc_data_network': 'sfc_data_net_2016',
127                 'externalDataNetworkName': 'Flow_out_net',
128                 'inputs': {}
129             }
130         }
131
132         response = self.client.post("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs",
133                                     data=json.dumps(req_data), content_type="application/json")
134         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
135         expect_resp_data = {"jobid": "NF-CREATE-8-b384535c-9f45-11e6-8749-fa163e91c2f9", "vnfInstanceId": "8"}
136         self.assertEqual(expect_resp_data, response.data)
137
138     # @mock.patch.object(restcall, 'call_req_aai')
139     @mock.patch.object(restcall, 'call_req')
140     def test_terminate_vnf__002(self, mock_call_req):
141         """
142         Terminate_VNF
143         """
144         r1 = [0, json.JSONEncoder().encode({
145             "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
146             "name": "g_vnfm",
147             "type": "vnfm",
148             "vimId": "",
149             "vendor": "ZTE",
150             "version": "v1.0",
151             "description": "vnfm",
152             "certificateUrl": "",
153             "url": "http://10.74.44.11",
154             "userName": "admin",
155             "password": "admin",
156             "createTime": "2016-07-06 15:33:18"}), "200"]
157
158         r2 = [0, json.JSONEncoder().encode({"vnfInstanceId": "1", "JobId": "1"}), "200"]
159         # mock_call_req_aai.side_effect = [r1]
160         mock_call_req.side_effect = [r1, r2]
161
162         response = self.client.post("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id/terminate")
163
164         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
165         expect_resp_data = {"jobid": "1", "vnfInstanceId": "1"}
166         self.assertEqual(expect_resp_data, response.data)
167
168     # @mock.patch.object(restcall, 'call_req_aai')
169     @mock.patch.object(restcall, 'call_req')
170     def test_query_vnf_003(self, mock_call_req):
171         """
172         Query_VNF
173         """
174         r1 = [0, json.JSONEncoder().encode({
175             "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
176             "name": "g_vnfm",
177             "type": "vnfm",
178             "vimId": "",
179             "vendor": "ZTE",
180             "version": "v1.0",
181             "description": "vnfm",
182             "certificateUrl": "",
183             "url": "http://10.74.44.11",
184             "userName": "admin",
185             "password": "admin",
186             "createTime": "2016-07-06 15:33:18"}), "200"]
187
188         r2 = [0, json.JSONEncoder().encode({"vnfinstancestatus": "1"}), "200"]
189         # mock_call_req_aai.side_effect = [r1]
190         mock_call_req.side_effect = [r1, r2]
191
192         response = self.client.get("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id")
193
194         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
195
196         expect_resp_data = {"vnfInfo": {"vnfStatus": "1"}}
197         self.assertEqual(expect_resp_data, response.data)
198
199     # @mock.patch.object(restcall, 'call_req_aai')
200     @mock.patch.object(restcall, 'call_req')
201     def test_operation_status_004(self, mock_call_req):
202         """
203         Operation_status
204         """
205         vnfm_info = {u'userName': u'admin',
206                      u'vendor': u'ZTE',
207                      u'name': u'ZTE_VNFM_237_62',
208                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
209                      u'url': u'http://192.168.237.165:2324',
210                      u'certificateUrl': u'',
211                      u'version': u'V1.0',
212                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
213                      u'password': u'admin',
214                      u'type': u'ztevmanagerdriver',
215                      u'createTime': u'2016-10-31 11:08:39',
216                      u'description': u''}
217         resp_body = {
218             "responsedescriptor": {
219                 "status": "processing",
220                 "responsehistorylist": [
221                     {
222                         "status": "error",
223                         "progress": 255,
224                         "errorcode": "",
225                         "responseid": 20,
226                         "statusdescription": "'JsonParser' object has no attribute 'parser_info'"
227                     }
228                 ],
229                 "responseid": 21,
230                 "errorcode": "",
231                 "progress": 40,
232                 "statusdescription": "Create nf apply resource failed"
233             },
234             "jobid": "NF-CREATE-11-ec6c2f2a-9f48-11e6-9405-fa163e91c2f9"
235         }
236         r1 = [0, json.JSONEncoder().encode(vnfm_info), '200']
237         r2 = [0, json.JSONEncoder().encode(resp_body), '200']
238         # mock_call_req_aai.side_effect = [r1]
239         mock_call_req.side_effect = [r1, r2]
240         response = self.client.get("/api/ztevmanagerdriver/v1/{vnfmid}/jobs/{jobid}?responseId={responseId}".format(
241             vnfmid=vnfm_info["vnfmId"],
242             jobid=resp_body["jobid"],
243             responseId=resp_body["responsedescriptor"]["responseid"])
244         )
245
246         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
247
248         expect_resp_data = resp_body
249         self.assertDictEqual(expect_resp_data, response.data)
250
251     @mock.patch.object(restcall, 'call_req')
252     def test_grantvnf_005(self, mock_call_req):
253         """
254         Grant_VNF
255         """
256         ret = [0,
257                '{"vim":{"accessinfo":{"tenant":"admin"},"vimid":"516cee95-e8ca-4d26-9268-38e343c2e31e"}}',
258                '201']
259
260         req_data = {
261             "vnfmid": "13232222",
262             "nfvoid": "03212234",
263             "vimid": "12345678",
264             "exvimidlist ": [
265                 "exvimid"
266             ],
267             "tenant": " tenant1",
268             "vnfistanceid": "1234",
269             "operationright": "0",
270             "vmlist": [
271                 {
272                     "vmflavor": "SMP",
273                     "vmnumber": "3"
274                 },
275                 {
276                     "vmflavor": "CMP",
277                     "vmnumber": "3"
278                 }
279             ]
280         }
281
282         mock_call_req.return_value = ret
283         response = self.client.put("/api/ztevmanagerdriver/v1/resource/grant",
284                                    data=json.dumps(req_data), content_type='application/json')
285
286         self.assertEqual(str(status.HTTP_201_CREATED), response.status_code)
287
288         expect_resp_data = {
289             "vimid": "516cee95-e8ca-4d26-9268-38e343c2e31e",
290             "tenant": "admin"}
291         self.assertDictEqual(expect_resp_data, response.data)
292
293     @mock.patch.object(restcall, 'call_req')
294     def test_notify_006(self, mock_call_req):
295         """
296         Notification
297         """
298         r1 = [0, json.JSONEncoder().encode(
299             {"vim":
300                 {
301                     "vimInfoId": "111111",
302                     "vimId": "12345678",
303                     "interfaceInfo": {
304                         "vimType": "vnf",
305                         "apiVersion": "v1",
306                         "protocolType": "None"},
307                     "accessInfo": {
308                         "tenant": "tenant1",
309                         "username": "admin",
310                         "password": "password"},
311                     "interfaceEndpoint": "http://127.0.0.1/api/v1"},
312                 "zone": "",
313                 "addResource": {
314                     "resourceDefinitionId": "xxxxx",
315                     "vimId": "12345678",
316                     "zoneId": "000"},
317                 "removeResource": "",
318                 "vimAssets": {
319                     "computeResourceFlavour": {
320                         "vimId": "12345678",
321                         "vduId": "sdfasdf",
322                         "vimFlavourId": "12"},
323                     "softwareImage": {
324                         "vimId": "12345678",
325                         "imageName": "AAA",
326                         "vimImageId": ""}},
327                 "additionalParam": ""
328              }), "200"]
329
330         req_data = {
331             "nfvoid": "1",
332             "vnfmid": "876543211",
333             "vimid": "6543211",
334             "timestamp": "1234567890",
335             "vnfinstanceid": "1",
336             "eventtype": "0",
337             "vmlist":
338                 [
339                     {
340                         "vmflavor": "SMP",
341                         "vmnumber": "3",
342                         "vmidlist ": ["vmuuid"]},
343                     {
344                         "vmflavor": "CMP",
345                         "vmnumber": "3",
346                         "vmidlist ": ["vmuuid"]}]}
347         mock_call_req.side_effect = [r1]
348         response = self.client.post("/api/ztevmanagerdriver/v1/vnfs/lifecyclechangesnotification",
349                                     data=json.dumps(req_data), content_type='application/json')
350
351         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
352
353         expect_resp_data = None
354         self.assertEqual(expect_resp_data, response.data)
355
356     # @mock.patch.object(restcall, 'call_req_aai')
357     @mock.patch.object(restcall, 'call_req')
358     def test_scale(self, mock_call_req):
359         job_info = {"jobid": "801", "nfInstanceId": "101"}
360         vnfm_info = {u'userName': u'admin',
361                      u'vendor': u'ZTE',
362                      u'name': u'ZTE_VNFM_237_62',
363                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
364                      u'url': u'http://192.168.237.165:2324',
365                      u'certificateUrl': u'',
366                      u'version': u'V1.0',
367                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
368                      u'password': u'admin',
369                      u'type': u'ztevmanagerdriver',
370                      u'createTime': u'2016-10-31 11:08:39',
371                      u'description': u''}
372
373         ret = [0, json.JSONEncoder().encode(job_info), "202"]
374         ret_vnfm = [0, json.JSONEncoder().encode(vnfm_info), "200"]
375         # mock_call_req_aai.side_effect = [ret_vnfm]
376         mock_call_req.side_effect = [ret_vnfm, ret]
377
378         vnfd_info = {
379             "vnf_flavours": [
380                 {
381                     "flavour_id": "flavour1",
382                     "description": "",
383                     "vdu_profiles": [
384                         {
385                             "vdu_id": "vdu1Id",
386                             "instances_minimum_number": 1,
387                             "instances_maximum_number": 4,
388                             "local_affinity_antiaffinity_rule": [
389                                 {
390                                     "affinity_antiaffinity": "affinity",
391                                     "scope": "node",
392
393                                 }
394                             ]
395                         }
396                     ],
397                     "scaling_aspects": [
398                         {
399                             "id": "demo_aspect",
400                             "name": "demo_aspect",
401                             "description": "demo_aspect",
402                             "associated_group": "elementGroup1",
403                             "max_scale_level": 5
404                         }
405                     ]
406                 }
407             ],
408             "element_groups": [
409                 {
410                     "group_id": "elementGroup1",
411                     "description": "",
412                     "properties": {
413                         "name": "elementGroup1"
414                     },
415                     "members": [
416                         "gsu_vm",
417                         "pfu_vm"
418                     ]
419                 }
420             ]
421         }
422
423         scale_vnf_data = {
424             "type": "SCALE_OUT",
425             "aspectId": "demo_aspect",
426             "numberOfSteps": "3",
427             "additionalParam": {
428                 "vnfdModel": vnfd_info
429             }
430         }
431
432         response = self.client.post("/api/ztevmanagerdriver/v1/100/vnfs/101/scale",
433                                     data=json.dumps(scale_vnf_data), content_type='application/json')
434         self.assertEqual(str(status.HTTP_202_ACCEPTED), response.status_code)
435         self.assertDictEqual(job_info, response.data)
436
437     # @mock.patch.object(restcall, 'call_req_aai')
438     @mock.patch.object(restcall, 'call_req')
439     def test_heal(self, mock_call_req):
440         job_info = {"jobid": "12234455", "nfInstanceId": "10144445666"}
441         vnfm_info = {u'userName': u'admin',
442                      u'vendor': u'ZTE',
443                      u'name': u'ZTE_VNFM_237_62',
444                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
445                      u'url': u'http://192.168.237.165:2324',
446                      u'certificateUrl': u'',
447                      u'version': u'V1.0',
448                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
449                      u'password': u'admin',
450                      u'type': u'ztevmanagerdriver',
451                      u'createTime': u'2016-10-31 11:08:39',
452                      u'description': u''}
453
454         ret = [0, json.JSONEncoder().encode(job_info), "202"]
455         ret_vnfm = [0, json.JSONEncoder().encode(vnfm_info), "200"]
456         # mock_call_req_aai.side_effect = [ret_vnfm]
457         mock_call_req.side_effect = [ret_vnfm, ret]
458
459         heal_vnf_data = {
460             'action': 'vmReset',
461             'affectedvm': [{
462                 'flavour': {
463
464                 },
465                 'extention': '',
466                 'vmid': '804cca71-9ae9-4511-8e30-d1387718caff',
467                 'changtype': 'changed',
468                 'vduid': 'vdu_100',
469                 'vmname': 'ZTE_SSS_111_PP_2_L'
470             }],
471             'lifecycleoperation': 'operate',
472             'isgrace': 'force'
473         }
474
475         response = self.client.post("/api/ztevmanagerdriver/v1/200/vnfs/201/heal",
476                                     data=json.dumps(heal_vnf_data), content_type='application/json')
477
478         self.assertEqual(str(status.HTTP_202_ACCEPTED), response.status_code)
479         self.assertDictEqual(job_info, response.data)