Merge "Resolve healing VNF problem"
[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 = {'vnfInstanceName': 'VFW_f88c0cb7-512a-44c4-bd09-891663f19367',
116                     'vnfPackageId': 'd852e1be-0aac-48f1-b1a4-cd825f6cdf9a',
117                     'vnfDescriptorId': 'vcpe_vfw_zte_1_0',
118                     'additionalParam': {'sdncontroller': 'e4d637f1-a4ec-4c59-8b20-4e8ab34daba9',
119                                         'NatIpRange': '192.167.0.10-192.168.0.20',
120                                         'm6000_mng_ip': '192.168.11.11',
121                                         'externalPluginManageNetworkName': 'plugin_net_2014',
122                                         'location': '516cee95-e8ca-4d26-9268-38e343c2e31e',
123                                         'externalManageNetworkName': 'mng_net_2017',
124                                         'sfc_data_network': 'sfc_data_net_2016',
125                                         'externalDataNetworkName': 'Flow_out_net',
126                                         'inputs':{}}}
127
128         response = self.client.post("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs",
129                                     data=json.dumps(req_data), content_type="application/json")
130         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
131         expect_resp_data = {"jobid": "NF-CREATE-8-b384535c-9f45-11e6-8749-fa163e91c2f9", "vnfInstanceId": "8"}
132         self.assertEqual(expect_resp_data, response.data)
133
134     # @mock.patch.object(restcall, 'call_req_aai')
135     @mock.patch.object(restcall, 'call_req')
136     def test_terminate_vnf__002(self, mock_call_req):
137         """
138         Terminate_VNF
139         """
140         r1 = [0, json.JSONEncoder().encode({
141             "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
142             "name": "g_vnfm",
143             "type": "vnfm",
144             "vimId": "",
145             "vendor": "ZTE",
146             "version": "v1.0",
147             "description": "vnfm",
148             "certificateUrl": "",
149             "url": "http://10.74.44.11",
150             "userName": "admin",
151             "password": "admin",
152             "createTime": "2016-07-06 15:33:18"}), "200"]
153
154         r2 = [0, json.JSONEncoder().encode({"vnfInstanceId": "1", "JobId": "1"}), "200"]
155         # mock_call_req_aai.side_effect = [r1]
156         mock_call_req.side_effect = [r1, r2]
157
158         response = self.client.post("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id/terminate")
159
160         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
161         expect_resp_data = {"jobid": "1", "vnfInstanceId": "1"}
162         self.assertEqual(expect_resp_data, response.data)
163
164     # @mock.patch.object(restcall, 'call_req_aai')
165     @mock.patch.object(restcall, 'call_req')
166     def test_query_vnf_003(self, mock_call_req):
167         """
168         Query_VNF
169         """
170         r1 = [0, json.JSONEncoder().encode({
171             "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
172             "name": "g_vnfm",
173             "type": "vnfm",
174             "vimId": "",
175             "vendor": "ZTE",
176             "version": "v1.0",
177             "description": "vnfm",
178             "certificateUrl": "",
179             "url": "http://10.74.44.11",
180             "userName": "admin",
181             "password": "admin",
182             "createTime": "2016-07-06 15:33:18"}), "200"]
183
184         r2 = [0, json.JSONEncoder().encode({"vnfinstancestatus": "1"}), "200"]
185         # mock_call_req_aai.side_effect = [r1]
186         mock_call_req.side_effect = [r1, r2]
187
188         response = self.client.get("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id")
189
190         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
191
192         expect_resp_data = {"vnfInfo": {"vnfStatus": "1"}}
193         self.assertEqual(expect_resp_data, response.data)
194
195     # @mock.patch.object(restcall, 'call_req_aai')
196     @mock.patch.object(restcall, 'call_req')
197     def test_operation_status_004(self, mock_call_req):
198         """
199         Operation_status
200         """
201         vnfm_info = {u'userName': u'admin',
202                      u'vendor': u'ZTE',
203                      u'name': u'ZTE_VNFM_237_62',
204                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
205                      u'url': u'http://192.168.237.165:2324',
206                      u'certificateUrl': u'',
207                      u'version': u'V1.0',
208                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
209                      u'password': u'admin',
210                      u'type': u'ztevmanagerdriver',
211                      u'createTime': u'2016-10-31 11:08:39',
212                      u'description': u''}
213         resp_body = {"responsedescriptor":
214                          {"status": "processing", "responsehistorylist": [
215                              {"status": "error",
216                               "progress": 255,
217                               "errorcode": "",
218                               "responseid": 20,
219                               "statusdescription": "'JsonParser' object has no attribute 'parser_info'"}],
220                           "responseid": 21,
221                           "errorcode": "",
222                           "progress": 40,
223                           "statusdescription": "Create nf apply resource failed"},
224                      "jobid": "NF-CREATE-11-ec6c2f2a-9f48-11e6-9405-fa163e91c2f9"}
225         r1 = [0, json.JSONEncoder().encode(vnfm_info), '200']
226         r2 = [0, json.JSONEncoder().encode(resp_body), '200']
227         # mock_call_req_aai.side_effect = [r1]
228         mock_call_req.side_effect = [r1, r2]
229         response = self.client.get("/api/ztevmanagerdriver/v1/{vnfmid}/jobs/{jobid}?responseId={responseId}".
230             format(
231             vnfmid=vnfm_info["vnfmId"],
232             jobid=resp_body["jobid"],
233             responseId=resp_body["responsedescriptor"]["responseid"]))
234
235         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
236
237         expect_resp_data = resp_body
238         self.assertDictEqual(expect_resp_data, response.data)
239
240     @mock.patch.object(restcall, 'call_req')
241     def test_grantvnf_005(self, mock_call_req):
242         """
243         Grant_VNF
244         """
245         ret = [0,
246                '{"vim":{"accessinfo":{"tenant":"admin"},"vimid":"516cee95-e8ca-4d26-9268-38e343c2e31e"}}',
247                '201']
248
249         req_data = {
250             "vnfmid": "13232222",
251             "nfvoid": "03212234",
252             "vimid": "12345678",
253             "exvimidlist ":
254                 ["exvimid"],
255             "tenant": " tenant1",
256             "vnfistanceid": "1234",
257             "operationright": "0",
258             "vmlist": [
259                 {
260                     "vmflavor": "SMP",
261                     "vmnumber": "3"},
262                 {
263                     "vmflavor": "CMP",
264                     "vmnumber": "3"}
265             ]}
266
267         mock_call_req.return_value = ret
268         response = self.client.put("/api/ztevmanagerdriver/v1/resource/grant",
269                                    data=json.dumps(req_data), content_type='application/json')
270
271         self.assertEqual(str(status.HTTP_201_CREATED), response.status_code)
272
273         expect_resp_data = {
274             "vimid": "516cee95-e8ca-4d26-9268-38e343c2e31e",
275             "tenant": "admin"}
276         self.assertDictEqual(expect_resp_data, response.data)
277
278     @mock.patch.object(restcall, 'call_req')
279     def test_notify_006(self, mock_call_req):
280         """
281         Notification
282         """
283         r1 = [0, json.JSONEncoder().encode(
284             {"vim":
285                 {
286                     "vimInfoId": "111111",
287                     "vimId": "12345678",
288                     "interfaceInfo": {
289                         "vimType": "vnf",
290                         "apiVersion": "v1",
291                         "protocolType": "None"},
292                     "accessInfo": {
293                         "tenant": "tenant1",
294                         "username": "admin",
295                         "password": "password"},
296                     "interfaceEndpoint": "http://127.0.0.1/api/v1"},
297                 "zone": "",
298                 "addResource": {
299                     "resourceDefinitionId": "xxxxx",
300                     "vimId": "12345678",
301                     "zoneId": "000"},
302                 "removeResource": "",
303                 "vimAssets": {
304                     "computeResourceFlavour": {
305                         "vimId": "12345678",
306                         "vduId": "sdfasdf",
307                         "vimFlavourId": "12"},
308                     "softwareImage": {
309                         "vimId": "12345678",
310                         "imageName": "AAA",
311                         "vimImageId": ""}},
312                 "additionalParam": ""
313              }), "200"]
314
315         req_data = {
316             "nfvoid": "1",
317             "vnfmid": "876543211",
318             "vimid": "6543211",
319             "timestamp": "1234567890",
320             "vnfinstanceid": "1",
321             "eventtype": "0",
322             "vmlist":
323                 [
324                     {
325                         "vmflavor": "SMP",
326                         "vmnumber": "3",
327                         "vmidlist ": ["vmuuid"]},
328                     {
329                         "vmflavor": "CMP",
330                         "vmnumber": "3",
331                         "vmidlist ": ["vmuuid"]}]}
332         mock_call_req.side_effect = [r1]
333         response = self.client.post("/api/ztevmanagerdriver/v1/vnfs/lifecyclechangesnotification",
334                                     data=json.dumps(req_data), content_type='application/json')
335
336         self.assertEqual(str(status.HTTP_200_OK), response.status_code)
337
338         expect_resp_data = None
339         self.assertEqual(expect_resp_data, response.data)
340
341     # @mock.patch.object(restcall, 'call_req_aai')
342     @mock.patch.object(restcall, 'call_req')
343     def test_scale(self, mock_call_req):
344         job_info = {"jobid":"801","nfInstanceId":"101"}
345         vnfm_info = {u'userName': u'admin',
346                      u'vendor': u'ZTE',
347                      u'name': u'ZTE_VNFM_237_62',
348                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
349                      u'url': u'http://192.168.237.165:2324',
350                      u'certificateUrl': u'',
351                      u'version': u'V1.0',
352                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
353                      u'password': u'admin',
354                      u'type': u'ztevmanagerdriver',
355                      u'createTime': u'2016-10-31 11:08:39',
356                      u'description': u''}
357
358         ret = [0, json.JSONEncoder().encode(job_info), "202"]
359         ret_vnfm = [0,json.JSONEncoder().encode(vnfm_info), "200"]
360         # mock_call_req_aai.side_effect = [ret_vnfm]
361         mock_call_req.side_effect = [ret_vnfm, ret]
362
363         vnfd_info = {
364             "vnf_flavours":[
365                 {
366                     "flavour_id":"flavour1",
367                     "description":"",
368                     "vdu_profiles":[
369                         {
370                             "vdu_id":"vdu1Id",
371                             "instances_minimum_number": 1,
372                             "instances_maximum_number": 4,
373                             "local_affinity_antiaffinity_rule":[
374                                 {
375                                     "affinity_antiaffinity":"affinity",
376                                     "scope":"node",
377                                 }
378                             ]
379                         }
380                     ],
381                     "scaling_aspects":[
382                         {
383                             "id": "demo_aspect",
384                             "name": "demo_aspect",
385                             "description": "demo_aspect",
386                             "associated_group": "elementGroup1",
387                             "max_scale_level": 5
388                         }
389                     ]
390                 }
391             ],
392             "element_groups": [
393                   {
394                       "group_id": "elementGroup1",
395                       "description": "",
396                       "properties":{
397                           "name": "elementGroup1",
398                       },
399                       "members": ["gsu_vm","pfu_vm"],
400                   }
401             ]
402         }
403
404         scale_vnf_data = {
405             "type":"SCALE_OUT",
406             "aspectId":"demo_aspect",
407             "numberOfSteps":"3",
408             "additionalParam":{
409                 "vnfdModel":vnfd_info
410             }
411         }
412
413
414         response = self.client.post("/api/ztevmanagerdriver/v1/100/vnfs/101/scale",
415                                    data=json.dumps(scale_vnf_data), content_type='application/json')
416         self.assertEqual(str(status.HTTP_202_ACCEPTED), response.status_code)
417         self.assertDictEqual(job_info, response.data)
418
419     # @mock.patch.object(restcall, 'call_req_aai')
420     @mock.patch.object(restcall, 'call_req')
421     def test_heal(self, mock_call_req):
422         job_info = {"jobid": "12234455", "nfInstanceId": "10144445666"}
423         vnfm_info = {u'userName': u'admin',
424                      u'vendor': u'ZTE',
425                      u'name': u'ZTE_VNFM_237_62',
426                      u'vimId': u'516cee95-e8ca-4d26-9268-38e343c2e31e',
427                      u'url': u'http://192.168.237.165:2324',
428                      u'certificateUrl': u'',
429                      u'version': u'V1.0',
430                      u'vnfmId': u'b0797c9b-3da9-459c-b25c-3813e9d8fd70',
431                      u'password': u'admin',
432                      u'type': u'ztevmanagerdriver',
433                      u'createTime': u'2016-10-31 11:08:39',
434                      u'description': u''}
435
436         ret = [0, json.JSONEncoder().encode(job_info), "202"]
437         ret_vnfm = [0, json.JSONEncoder().encode(vnfm_info), "200"]
438         # mock_call_req_aai.side_effect = [ret_vnfm]
439         mock_call_req.side_effect = [ret_vnfm, ret]
440
441         heal_vnf_data = {
442             'action': 'vmReset',
443             'affectedvm': [{
444                 'flavour': {
445
446                 },
447                 'extention': '',
448                 'vmid': '804cca71-9ae9-4511-8e30-d1387718caff',
449                 'changtype': 'changed',
450                 'vduid': 'vdu_100',
451                 'vmname': 'ZTE_SSS_111_PP_2_L'
452             }],
453             'lifecycleoperation': 'operate',
454             'isgrace': 'force'
455         }
456
457         response = self.client.post("/api/ztevmanagerdriver/v1/200/vnfs/201/heal",
458                                     data=json.dumps(heal_vnf_data), content_type='application/json')
459
460         self.assertEqual(str(status.HTTP_202_ACCEPTED), response.status_code)
461         self.assertDictEqual(job_info, response.data)