1 # Copyright 2016-2017 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.
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
23 class InterfacesTest(TestCase):
25 self.client = Client()
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, mock_call_req_aai):
36 vnfm_info = {u'userName': u'admin',
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'',
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',
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',
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',
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',
71 u'vnfdProvider': u'zte',
72 u'vnfdId': u'vcpe_vfw_zte_1_0',
73 u'deletionPending': False,
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',
83 packageInfo = {u'usageState': u'NotInUse',
84 u'onBoardState': u'onBoarded',
88 u'vnfdProvider': u'zte',
89 u'vnfdId': u'vcpe_vfw_zte_1_0',
90 u'deletionPending': False,
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'}
101 u'vnfInstanceId': u'8',
102 u'jobid': u'NF-CREATE-8-b384535c-9f45-11e6-8749-fa163e91c2f9'
104 ret = [0, json.JSONEncoder().encode(inst_response), '200']
106 r1 = [0, json.JSONEncoder().encode(vnfm_info), "200"]
108 r2 = [0, json.JSONEncoder().encode(vnfd_info), "200"]
110 r3 = [0, json.JSONEncoder().encode(packageInfo), "200"]
112 mock_call_req_aai.side_effect =[r1]
113 mock_call_req.side_effect = [r2, r3, ret]
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',
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)
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, mock_call_req_aai):
140 r1 = [0, json.JSONEncoder().encode({
141 "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
147 "description": "vnfm",
148 "certificateUrl": "",
149 "url": "http://10.74.44.11",
152 "createTime": "2016-07-06 15:33:18"}), "200"]
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 = [r2]
158 response = self.client.post("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id/terminate")
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)
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, mock_call_req_aai):
170 r1 = [0, json.JSONEncoder().encode({
171 "vnfmId": "19ecbb3a-3242-4fa3-9926-8dfb7ddc29ee",
177 "description": "vnfm",
178 "certificateUrl": "",
179 "url": "http://10.74.44.11",
182 "createTime": "2016-07-06 15:33:18"}), "200"]
184 r2 = [0, json.JSONEncoder().encode({"vnfinstancestatus": "1"}), "200"]
185 mock_call_req_aai.side_effect = [r1]
186 mock_call_req.side_effect = [r2]
188 response = self.client.get("/api/ztevmanagerdriver/v1/ztevnfmid/vnfs/vbras_innstance_id")
190 self.assertEqual(str(status.HTTP_200_OK), response.status_code)
192 expect_resp_data = {"vnfInfo": {"vnfStatus": "1"}}
193 self.assertEqual(expect_resp_data, response.data)
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, mock_call_req_aai):
201 vnfm_info = {u'userName': u'admin',
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'',
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',
213 resp_body = {"responsedescriptor":
214 {"status": "processing", "responsehistorylist": [
219 "statusdescription": "'JsonParser' object has no attribute 'parser_info'"}],
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 = [r2]
229 response = self.client.get("/api/ztevmanagerdriver/v1/{vnfmid}/jobs/{jobid}?responseId={responseId}".
231 vnfmid=vnfm_info["vnfmId"],
232 jobid=resp_body["jobid"],
233 responseId=resp_body["responsedescriptor"]["responseid"]))
235 self.assertEqual(str(status.HTTP_200_OK), response.status_code)
237 expect_resp_data = resp_body
238 self.assertDictEqual(expect_resp_data, response.data)
240 @mock.patch.object(restcall, 'call_req')
241 def test_grantvnf_005(self, mock_call_req):
246 '{"vim":{"accessinfo":{"tenant":"admin"},"vimid":"516cee95-e8ca-4d26-9268-38e343c2e31e"}}',
250 "vnfmid": "13232222",
251 "nfvoid": "03212234",
255 "tenant": " tenant1",
256 "vnfistanceid": "1234",
257 "operationright": "0",
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')
271 self.assertEqual(str(status.HTTP_201_CREATED), response.status_code)
274 "vimid": "516cee95-e8ca-4d26-9268-38e343c2e31e",
276 self.assertDictEqual(expect_resp_data, response.data)
278 @mock.patch.object(restcall, 'call_req')
279 def test_notify_006(self, mock_call_req):
283 r1 = [0, json.JSONEncoder().encode(
286 "vimInfoId": "111111",
291 "protocolType": "None"},
295 "password": "password"},
296 "interfaceEndpoint": "http://127.0.0.1/api/v1"},
299 "resourceDefinitionId": "xxxxx",
302 "removeResource": "",
304 "computeResourceFlavour": {
307 "vimFlavourId": "12"},
312 "additionalParam": ""
317 "vnfmid": "876543211",
319 "timestamp": "1234567890",
320 "vnfinstanceid": "1",
327 "vmidlist ": ["vmuuid"]},
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')
336 self.assertEqual(str(status.HTTP_200_OK), response.status_code)
338 expect_resp_data = None
339 self.assertEqual(expect_resp_data, response.data)
341 @mock.patch.object(restcall, 'call_req_aai')
342 @mock.patch.object(restcall, 'call_req')
343 def test_scale(self, mock_call_req, mock_call_req_aai):
344 job_info = {"jobid":"801","nfInstanceId":"101"}
345 vnfm_info = {u'userName': u'admin',
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'',
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',
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]
366 "flavour_id":"flavour1",
371 "instances_minimum_number": 1,
372 "instances_maximum_number": 4,
373 "local_affinity_antiaffinity_rule":[
375 "affinity_antiaffinity":"affinity",
384 "name": "demo_aspect",
385 "description": "demo_aspect",
386 "associated_group": "elementGroup1",
394 "group_id": "elementGroup1",
397 "name": "elementGroup1",
399 "members": ["gsu_vm","pfu_vm"],
406 "aspectId":"demo_aspect",
409 "vnfdModel":vnfd_info
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)
419 @mock.patch.object(restcall, 'call_req_aai')
420 @mock.patch.object(restcall, 'call_req')
421 def test_heal(self, mock_call_req, mock_call_req_aai):
422 job_info = {"jobid": "12234455", "nfInstanceId": "10144445666"}
423 vnfm_info = {u'userName': u'admin',
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'',
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',
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]
448 'vmid': '804cca71-9ae9-4511-8e30-d1387718caff',
449 'changtype': 'changed',
451 'vmname': 'ZTE_SSS_111_PP_2_L'
453 'lifecycleoperation': 'operate',
457 response = self.client.post("/api/ztevmanagerdriver/v1/200/vnfs/201/heal",
458 data=json.dumps(heal_vnf_data), content_type='application/json')
460 self.assertEqual(str(status.HTTP_202_ACCEPTED), response.status_code)
461 self.assertDictEqual(job_info, response.data)