c624e05ccd92306620841509d3aa0d2d8a572cc0
[vfc/gvnfm/vnflcm.git] / lcm / lcm / nf / tests / test_instantiate_vnf.py
1 # Copyright 2017 ZTE Corporation.\r
2 #\r
3 # Licensed under the Apache License, Version 2.0 (the "License");\r
4 # you may not use this file except in compliance with the License.\r
5 # You may obtain a copy of the License at\r
6 #\r
7 #         http://www.apache.org/licenses/LICENSE-2.0\r
8 #\r
9 # Unless required by applicable law or agreed to in writing, software\r
10 # distributed under the License is distributed on an "AS IS" BASIS,\r
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 # See the License for the specific language governing permissions and\r
13 # limitations under the License.\r
14 \r
15 import json\r
16 import uuid\r
17 import mock\r
18 \r
19 from django.test import TestCase\r
20 from rest_framework import status\r
21 from rest_framework.test import APIClient\r
22 \r
23 from .const import c1_data_get_tenant_id\r
24 from .const import c4_data_create_network\r
25 from .const import c2_data_create_volume\r
26 from .const import c5_data_create_subnet\r
27 from .const import c3_data_get_volume\r
28 from .const import c6_data_create_port\r
29 from .const import c7_data_create_flavor\r
30 from .const import c8_data_list_image\r
31 from .const import c9_data_create_vm\r
32 from .const import c10_data_get_vm\r
33 from .const import inst_req_data\r
34 from .const import vnfpackage_info\r
35 from .const import instantiate_grant_result\r
36 \r
37 from lcm.pub.database.models import NfInstModel\r
38 from lcm.pub.database.models import JobStatusModel\r
39 from lcm.pub.database.models import SubscriptionModel\r
40 from lcm.pub.utils import restcall\r
41 from lcm.pub.utils.jobutil import JobUtil\r
42 from lcm.pub.utils.timeutil import now_time\r
43 from lcm.pub.utils.notificationsutil import NotificationsUtil\r
44 from lcm.pub.vimapi import api\r
45 from lcm.pub.exceptions import NFLCMException\r
46 \r
47 from lcm.nf.biz.instantiate_vnf import InstantiateVnf\r
48 \r
49 \r
50 class TestNFInstantiate(TestCase):\r
51     def setUp(self):\r
52         self.client = APIClient()\r
53         self.grant_result = instantiate_grant_result\r
54 \r
55     def tearDown(self):\r
56         NfInstModel.objects.all().delete()\r
57 \r
58     def assert_job_result(self, job_id, job_progress, job_detail):\r
59         jobs = JobStatusModel.objects.filter(\r
60             jobid=job_id,\r
61             progress=job_progress,\r
62             descp=job_detail\r
63         )\r
64         self.assertEqual(1, len(jobs))\r
65 \r
66     @mock.patch.object(InstantiateVnf, 'run')\r
67     def test_instantiate_vnf(self, mock_run):\r
68         NfInstModel(\r
69             nfinstid='12',\r
70             nf_name='VNF1',\r
71             status='NOT_INSTANTIATED'\r
72         ).save()\r
73         mock_run.re.return_value = None\r
74         response = self.client.post(\r
75             '/api/vnflcm/v1/vnf_instances/12/instantiate',\r
76             data=inst_req_data,\r
77             format='json'\r
78         )\r
79         self.failUnlessEqual(\r
80             status.HTTP_202_ACCEPTED,\r
81             response.status_code\r
82         )\r
83 \r
84     @mock.patch.object(InstantiateVnf, 'run')\r
85     def test_instantiate_vnf_notfound(self, mock_run):\r
86         mock_run.re.return_value = None\r
87         response = self.client.post(\r
88             '/api/vnflcm/v1/vnf_instances/3421/instantiate',\r
89             data=inst_req_data,\r
90             format='json'\r
91         )\r
92         self.failUnlessEqual(\r
93             status.HTTP_404_NOT_FOUND,\r
94             response.status_code,\r
95             response.content\r
96         )\r
97 \r
98     @mock.patch.object(InstantiateVnf, 'run')\r
99     def test_instantiate_vnf_conflict(self, mock_run):\r
100         NfInstModel(\r
101             nfinstid='1123',\r
102             nf_name='VNF1',\r
103             status='INSTANTIATED'\r
104         ).save()\r
105         mock_run.re.return_value = None\r
106         response = self.client.post(\r
107             '/api/vnflcm/v1/vnf_instances/1123/instantiate',\r
108             data=inst_req_data,\r
109             format='json'\r
110         )\r
111         self.failUnlessEqual(\r
112             status.HTTP_409_CONFLICT,\r
113             response.status_code,\r
114             response.content\r
115         )\r
116 \r
117     def test_instantiate_vnf_when_inst_id_not_exist(self):\r
118         self.nf_inst_id = str(uuid.uuid4())\r
119         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
120         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
121         jobs = JobStatusModel.objects.filter(\r
122             jobid=self.job_id,\r
123             progress=0,\r
124             descp='INST_VNF_READY'\r
125         )\r
126         self.assertEqual(1, len(jobs))\r
127         data = inst_req_data\r
128         InstantiateVnf(\r
129             data,\r
130             nf_inst_id=self.nf_inst_id,\r
131             job_id=self.job_id\r
132         ).run()\r
133         self.assert_job_result(\r
134             self.job_id,\r
135             255,\r
136             'VNF nf_inst_id is not exist.'\r
137         )\r
138 \r
139     def test_instantiate_vnf_when_already_instantiated(self):\r
140         NfInstModel.objects.create(\r
141             nfinstid='1111',\r
142             nf_name='vFW_01',\r
143             package_id='222',\r
144             version='',\r
145             vendor='',\r
146             netype='',\r
147             vnfd_model='',\r
148             status='INSTANTIATED',\r
149             nf_desc='vFW in Nanjing TIC Edge',\r
150             vnfdid='111',\r
151             create_time=now_time()\r
152         )\r
153         self.nf_inst_id = '1111'\r
154         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
155         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
156         jobs = JobStatusModel.objects.filter(\r
157             jobid=self.job_id,\r
158             progress=0,\r
159             descp='INST_VNF_READY'\r
160         )\r
161         self.assertEqual(1, len(jobs))\r
162         data = inst_req_data\r
163         InstantiateVnf(\r
164             data,\r
165             nf_inst_id=self.nf_inst_id,\r
166             job_id=self.job_id\r
167         ).run()\r
168         self.assert_job_result(\r
169             self.job_id,\r
170             255,\r
171             'VNF instantiationState is not NOT_INSTANTIATED.'\r
172         )\r
173 \r
174     @mock.patch.object(restcall, 'call_req')\r
175     def test_instantiate_vnf_when_get_packageinfo_by_csarid_failed(self, mock_call_req):\r
176         NfInstModel.objects.create(\r
177             nfinstid='1111',\r
178             nf_name='vFW_01',\r
179             package_id='222',\r
180             version='',\r
181             vendor='',\r
182             netype='',\r
183             vnfd_model='',\r
184             status='NOT_INSTANTIATED',\r
185             nf_desc='vFW in Nanjing TIC Edge',\r
186             vnfdid='111',\r
187             create_time=now_time()\r
188         )\r
189         r1_get_vnfpackage_by_vnfdid = [\r
190             1,\r
191             json.JSONEncoder().encode(vnfpackage_info),\r
192             '200'\r
193         ]\r
194         mock_call_req.side_effect = [r1_get_vnfpackage_by_vnfdid]\r
195         self.nf_inst_id = '1111'\r
196         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
197         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
198         data = inst_req_data\r
199         InstantiateVnf(\r
200             data,\r
201             nf_inst_id=self.nf_inst_id,\r
202             job_id=self.job_id\r
203         ).run()\r
204         self.assert_job_result(\r
205             self.job_id,\r
206             255,\r
207             'Failed to query vnf CSAR(111) from catalog.'\r
208         )\r
209 \r
210     @mock.patch.object(restcall, 'call_req')\r
211     def test_instantiate_vnf_when_applay_grant_failed(self, mock_call_req):\r
212         NfInstModel.objects.create(\r
213             nfinstid='1111',\r
214             nf_name='vFW_01',\r
215             package_id='222',\r
216             version='',\r
217             vendor='',\r
218             netype='',\r
219             vnfd_model='',\r
220             status='NOT_INSTANTIATED',\r
221             nf_desc='vFW in Nanjing TIC Edge',\r
222             vnfdid='111',\r
223             create_time=now_time()\r
224         )\r
225         r1_get_vnfpackage_by_vnfdid = [\r
226             0,\r
227             json.JSONEncoder().encode(vnfpackage_info),\r
228             '200'\r
229         ]\r
230         r2_apply_grant_result = [\r
231             1,\r
232             json.JSONEncoder().encode(self.grant_result),\r
233             '200'\r
234         ]\r
235         mock_call_req.side_effect = [\r
236             r1_get_vnfpackage_by_vnfdid,\r
237             r2_apply_grant_result\r
238         ]\r
239         self.nf_inst_id = '1111'\r
240         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
241         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
242         data = inst_req_data\r
243         InstantiateVnf(\r
244             data,\r
245             nf_inst_id=self.nf_inst_id,\r
246             job_id=self.job_id\r
247         ).run()\r
248         self.assert_job_result(\r
249             self.job_id,\r
250             255,\r
251             'Nf instancing apply grant exception'\r
252         )\r
253 \r
254     @mock.patch.object(restcall, 'call_req')\r
255     @mock.patch.object(api, 'call')\r
256     def test_instantiate_vnf_when_unexpected_exception(self, mock_call, mock_call_req):\r
257         NfInstModel.objects.create(\r
258             nfinstid='1111',\r
259             nf_name='vFW_01',\r
260             package_id='222',\r
261             version='',\r
262             vendor='',\r
263             netype='',\r
264             vnfd_model='',\r
265             status='NOT_INSTANTIATED',\r
266             nf_desc='vFW in Nanjing TIC Edge',\r
267             vnfdid='111',\r
268             create_time=now_time()\r
269         )\r
270         r1_get_vnfpackage_by_vnfdid = [\r
271             0,\r
272             json.JSONEncoder().encode(vnfpackage_info),\r
273             '200'\r
274         ]\r
275         r2_apply_grant_result = [\r
276             0,\r
277             json.JSONEncoder().encode(self.grant_result),\r
278             '200'\r
279         ]\r
280         mock_call_req.side_effect = [\r
281             r1_get_vnfpackage_by_vnfdid,\r
282             r2_apply_grant_result\r
283         ]\r
284         mock_call.side_effect = [\r
285             c1_data_get_tenant_id,\r
286             c2_data_create_volume,\r
287             c3_data_get_volume\r
288         ]\r
289         self.nf_inst_id = '1111'\r
290         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
291         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
292         data = inst_req_data\r
293         InstantiateVnf(\r
294             data,\r
295             nf_inst_id=self.nf_inst_id,\r
296             job_id=self.job_id\r
297         ).run()\r
298         self.assert_job_result(\r
299             self.job_id,\r
300             255,\r
301             'unexpected exception'\r
302         )\r
303 \r
304     @mock.patch.object(restcall, 'call_req')\r
305     @mock.patch.object(api, 'call')\r
306     @mock.patch.object(NotificationsUtil, 'post_notification')\r
307     def test_instantiate_vnf_success(self, mock_post_notification, mock_call, mock_call_req):\r
308         NfInstModel.objects.create(\r
309             nfinstid='1111',\r
310             nf_name='vFW_01',\r
311             package_id='222',\r
312             version='',\r
313             vendor='',\r
314             netype='',\r
315             vnfd_model='',\r
316             status='NOT_INSTANTIATED',\r
317             nf_desc='vFW in Nanjing TIC Edge',\r
318             vnfdid='111',\r
319             create_time=now_time()\r
320         )\r
321         SubscriptionModel.objects.create(\r
322             subscription_id=str(uuid.uuid4()),\r
323             callback_uri='api/gvnfmdriver/v1/vnfs/lifecyclechangesnotification',\r
324             auth_info=json.JSONEncoder().encode({\r
325                 'authType': ['BASIC'],\r
326                 'paramsBasic': {\r
327                     'userName': 'username',\r
328                     'password': 'password'\r
329                 }\r
330             }),\r
331             notification_types=str([\r
332                 'VnfLcmOperationOccurrenceNotification',\r
333                 'VnfIdentifierCreationNotification',\r
334                 'VnfIdentifierDeletionNotification'\r
335             ]),\r
336             operation_types=str(['INSTANTIATE']),\r
337             operation_states=str(['COMPLETED']),\r
338             vnf_instance_filter=json.JSONEncoder().encode({\r
339                 'vnfdIds': ['111'],\r
340                 'vnfProductsFromProviders': [],\r
341                 'vnfInstanceIds': ['1111'],\r
342                 'vnfInstanceNames': [],\r
343             })\r
344         )\r
345         r1_get_vnfpackage_by_vnfdid = [\r
346             0,\r
347             json.JSONEncoder().encode(vnfpackage_info),\r
348             '200'\r
349         ]\r
350         r2_apply_grant_result = [\r
351             0,\r
352             json.JSONEncoder().encode(self.grant_result),\r
353             '200'\r
354         ]\r
355         r3_all_aai_result = [\r
356             1,\r
357             json.JSONEncoder().encode(''),\r
358             '404'\r
359         ]\r
360         r4_lcm_notify_result = [\r
361             0,\r
362             json.JSONEncoder().encode(''),\r
363             '200'\r
364         ]\r
365         mock_call_req.side_effect = [\r
366             r1_get_vnfpackage_by_vnfdid,\r
367             r2_apply_grant_result,\r
368             r3_all_aai_result,\r
369             r4_lcm_notify_result\r
370         ]\r
371         mock_call.side_effect = [\r
372             c1_data_get_tenant_id,\r
373             c2_data_create_volume,\r
374             c3_data_get_volume,\r
375             c4_data_create_network,\r
376             c5_data_create_subnet,\r
377             c6_data_create_port,\r
378             c7_data_create_flavor,\r
379             c8_data_list_image,\r
380             c9_data_create_vm,\r
381             c10_data_get_vm\r
382         ]\r
383         mock_post_notification.side_effect = None\r
384         self.nf_inst_id = '1111'\r
385         self.job_id = JobUtil.create_job('NF', 'CREATE', self.nf_inst_id)\r
386         JobUtil.add_job_status(self.job_id, 0, 'INST_VNF_READY')\r
387         data = inst_req_data\r
388         InstantiateVnf(\r
389             data,\r
390             nf_inst_id=self.nf_inst_id,\r
391             job_id=self.job_id\r
392         ).run()\r
393 \r
394     @mock.patch.object(JobUtil, 'create_job')\r
395     def test_instantiate_inner_error(self, mock_run):\r
396         NfInstModel(\r
397             nfinstid='144',\r
398             nf_name='VNF1',\r
399             status='NOT_INSTANTIATED'\r
400         ).save()\r
401         mock_run.return_value = NFLCMException('Boom!')\r
402         response = self.client.post(\r
403             '/api/vnflcm/v1/vnf_instances/144/instantiate',\r
404             data=inst_req_data,\r
405             format='json'\r
406         )\r
407         NfInstModel.objects.filter(nfinstid='144').delete()\r
408         self.assertEqual(status.HTTP_500_INTERNAL_SERVER_ERROR, response.status_code)\r
409 \r
410     def test_instantiate_badreq(self):\r
411         NfInstModel(\r
412             nfinstid='144',\r
413             nf_name='VNF1',\r
414             status='NOT_INSTANTIATED'\r
415         ).save()\r
416         response = self.client.post(\r
417             '/api/vnflcm/v1/vnf_instances/144/instantiate',\r
418             data={},\r
419             format='json'\r
420         )\r
421         NfInstModel.objects.filter(nfinstid='144').delete()\r
422         self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)\r