1 # Copyright (C) 2019 ZTE. All Rights Reserved.
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 TestCase
18 from rest_framework import status
19 from rest_framework.test import APIClient
20 from lcm.pub.database.models import NfInstModel, JobStatusModel, StorageInstModel, NetworkInstModel, \
21 SubNetworkInstModel, PortInstModel, FlavourInstModel, VmInstModel, VNFCInstModel
22 from lcm.pub.utils import restcall
23 from lcm.pub.vimapi import api
24 from lcm.pub.utils.jobutil import JobUtil
25 from lcm.nf.biz.scale_vnf import ScaleVnf
28 class TestNfScale(TestCase):
30 self.client = APIClient()
31 NfInstModel(nfinstid='12345',
37 vnfSoftwareVersion="V1",
40 status='NOT_INSTANTIATED').save()
43 "aspectId": "sunshine_aspect"
47 NfInstModel.objects.filter(nfinstid='12345').delete()
49 def assert_job_result(self, job_id, job_progress, job_detail):
50 jobs = JobStatusModel.objects.filter(
52 progress=job_progress,
55 self.assertEqual(1, len(jobs))
57 def test_scale_vnf_not_found(self):
58 url = "/api/vnflcm/v1/vnf_instances/12/scale"
59 response = self.client.post(url,
62 self.assertEqual(status.HTTP_404_NOT_FOUND, response.status_code)
64 def test_scale_vnf_conflict(self):
65 url = "/api/vnflcm/v1/vnf_instances/12345/scale"
66 response = self.client.post(url,
69 self.assertEqual(status.HTTP_409_CONFLICT, response.status_code)
71 def test_scale_vnf_badreq(self):
72 NfInstModel(nfinstid='678',
78 vnfSoftwareVersion="V1",
81 status='INSTANTIATED').save()
82 url = "/api/vnflcm/v1/vnf_instances/678/scale"
83 response = self.client.post(url,
86 NfInstModel.objects.filter(nfinstid='678').delete()
87 self.assertEqual(status.HTTP_400_BAD_REQUEST, response.status_code)
89 @mock.patch.object(restcall, 'call_req')
90 @mock.patch.object(api, 'call')
91 def test_scale_out_vnf_success(self, mock_call, mock_call_req):
92 self.nf_inst_id = '6789'
93 res_cache = {"volume": {}, "flavor": {}, "port": {}}
94 res_cache["volume"]["test"] = "test"
95 # res_cache["flavor"]["vdu1Id"] = "flavor1"
96 # res_cache["port"]["ext_cp"] = "port1"
97 NfInstModel(nfinstid=self.nf_inst_id,
103 vnfSoftwareVersion="V1",
106 status='INSTANTIATED',
107 vnfd_model=json.dumps(const.vnfd_for_scale),
108 vimInfo=json.dumps({}),
109 resInfo=json.dumps(res_cache)).save()
110 StorageInstModel.objects.create(
115 instid=self.nf_inst_id,
118 NetworkInstModel.objects.create(
126 instid=self.nf_inst_id
128 SubNetworkInstModel.objects.create(
137 instid=self.nf_inst_id
139 PortInstModel.objects.create(
149 instid=self.nf_inst_id
151 FlavourInstModel.objects.create(
155 instid=self.nf_inst_id,
157 name="Flavor_sunshine"
159 VmInstModel.objects.create(
164 instid=self.nf_inst_id,
169 r1_apply_grant_result = [
171 json.JSONEncoder().encode(const.instantiate_grant_result),
174 mock_call_req.side_effect = [
175 r1_apply_grant_result,
177 mock_call.side_effect = [
178 const.c1_data_get_tenant_id,
179 const.c6_data_create_port,
180 const.c7_data_create_flavor,
181 const.c8_data_list_image,
182 const.c9_data_create_vm,
183 const.c10_data_get_vm
186 self.job_id = JobUtil.create_job('NF', 'SCALE', self.nf_inst_id)
187 JobUtil.add_job_status(self.job_id, 0, "VNF_SCALE_READY", )
190 {"type": "SCALE_OUT",
191 "aspectId": "sunshine_aspect"},
192 nf_inst_id=self.nf_inst_id,
196 NfInstModel.objects.filter(nfinstid=self.nf_inst_id).delete()
197 # print([{job.progress: job.descp} for job in JobStatusModel.objects.filter( jobid=self.job_id)])
198 self.assert_job_result(
204 @mock.patch.object(restcall, 'call_req')
205 @mock.patch.object(api, 'call')
206 def test_scale_in_vnf_success(self, mock_call, mock_call_req):
207 self.nf_inst_id = '6789'
208 res_cache = {"volume": {}, "flavor": {}, "port": {}}
209 # res_cache["volume"]["volume_storage1"] = "vol1"
210 # res_cache["flavor"]["vdu1Id"] = "flavor1"
211 res_cache["port"]["ext_cp"] = "port1"
212 NfInstModel(nfinstid=self.nf_inst_id,
218 vnfSoftwareVersion="V1",
221 status='INSTANTIATED',
222 vnfd_model=json.dumps(const.vnfd_for_scale),
223 vimInfo=json.dumps({}),
224 resInfo=json.dumps(res_cache)).save()
225 StorageInstModel.objects.create(
230 instid=self.nf_inst_id,
233 NetworkInstModel.objects.create(
241 instid=self.nf_inst_id
243 SubNetworkInstModel.objects.create(
252 instid=self.nf_inst_id
254 PortInstModel.objects.create(
264 instid=self.nf_inst_id
266 FlavourInstModel.objects.create(
270 instid=self.nf_inst_id,
272 name="Flavor_sunshine"
274 VmInstModel.objects.create(
279 instid=self.nf_inst_id,
284 VmInstModel.objects.create(
289 instid=self.nf_inst_id,
294 VNFCInstModel.objects.create(
296 instid=self.nf_inst_id,
299 VNFCInstModel.objects.create(
301 instid=self.nf_inst_id,
304 r1_apply_grant_result = [
306 json.JSONEncoder().encode(const.instantiate_grant_result),
309 mock_call_req.side_effect = [
310 r1_apply_grant_result,
312 mock_call.side_effect = [
313 const.c1_data_get_tenant_id,
314 const.c7_data_create_flavor,
315 const.c8_data_list_image,
316 const.c9_data_create_vm,
317 const.c10_data_get_vm
320 self.job_id = JobUtil.create_job('NF', 'SCALE', self.nf_inst_id)
321 JobUtil.add_job_status(self.job_id, 0, "VNF_SCALE_READY", )
325 "aspectId": "sunshine_aspect"},
326 nf_inst_id=self.nf_inst_id,
330 NfInstModel.objects.filter(nfinstid=self.nf_inst_id).delete()
331 self.assert_job_result(