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.
18 from django.test import TestCase, Client
19 from rest_framework import status
21 from lcm.ns.vnfs import create_vnfs
22 from lcm.ns.vnfs.const import VNF_STATUS
23 from lcm.ns.vnfs.create_vnfs import CreateVnfs
24 from lcm.pub.database.models import NfInstModel, JobModel, NfPackageModel, NSInstModel
25 from lcm.pub.utils import restcall
26 from lcm.pub.utils.jobutil import JOB_MODEL_STATUS
27 from lcm.pub.utils.timeutil import now_time
28 from lcm.pub.utils.values import ignore_case_get
29 from lcm.ns.vnfs.terminate_nfs import TerminateVnfs
30 from lcm.ns.vnfs.scale_vnfs import NFManualScaleService
31 from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE
34 class TestGetVnfViews(TestCase):
36 self.client = Client()
37 self.nf_inst_id = str(uuid.uuid4())
38 NfInstModel(nfinstid=self.nf_inst_id, nf_name='vnf1', vnfm_inst_id='1', vnf_id='vnf_id1',
39 status=VNF_STATUS.ACTIVE, create_time=now_time(), lastuptime=now_time()).save()
42 NfInstModel.objects.all().delete()
44 def test_get_vnf(self):
45 response = self.client.get("/api/nslcm/v1/ns/vnfs/%s" % self.nf_inst_id)
46 self.failUnlessEqual(status.HTTP_200_OK, response.status_code)
47 context = json.loads(response.content)
48 self.failUnlessEqual(self.nf_inst_id, context['vnfInstId'])
51 class TestCreateVnfViews(TestCase):
53 self.ns_inst_id = str(uuid.uuid4())
54 self.job_id = str(uuid.uuid4())
56 'nsInstanceId': self.ns_inst_id,
57 'additionalParamForNs': {"inputs": json.dumps({})},
58 'additionalParamForVnf': [{
59 'vnfprofileid': 'VBras',
61 'inputs': json.dumps({'vnf_param1': '11', 'vnf_param2': '22'}),
62 'vnfminstanceid': "1"}}],
64 self.client = Client()
65 NfPackageModel(uuid=str(uuid.uuid4()), nfpackageid='package_id1', vnfdid='zte_vbras', vendor='zte',
66 vnfdversion='1.0.0', vnfversion='1.0.0', vnfdmodel=json.dumps(vnfd_model_dict)).save()
67 NSInstModel(id=self.ns_inst_id, name='ns', nspackage_id='1', nsd_id='nsd_id', description='description',
68 status='instantiating', nsd_model=json.dumps(nsd_model_dict), create_time=now_time(),
69 lastuptime=now_time()).save()
72 NfInstModel.objects.all().delete()
73 JobModel.objects.all().delete()
75 @mock.patch.object(CreateVnfs, 'run')
76 def test_create_vnf(self, mock_run):
77 response = self.client.post("/api/nslcm/v1/ns/vnfs", data=self.data)
78 self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code)
79 context = json.loads(response.content)
80 self.assertTrue(NfInstModel.objects.filter(nfinstid=context['vnfInstId']).exists())
82 @mock.patch.object(restcall, 'call_req')
83 def test_create_vnf_thread(self, mock_call_req):
85 "/api/ztevmanagerdriver/v1/1/vnfs":
86 [0, json.JSONEncoder().encode({"jobId": self.job_id, "vnfInstanceId": 3}), '200'],
87 "/api/extsys/v1/vnfms/1":
88 [0, json.JSONEncoder().encode({"name": 'vnfm1'}), '200'],
90 [0, json.JSONEncoder().encode({}), '200'],
91 "/api/resmgr/v1/vnfinfo":
92 [0, json.JSONEncoder().encode({}), '200'],
93 "/api/ztevmanagerdriver/v1/jobs/" + self.job_id + "&responseId=0":
94 [0, json.JSONEncoder().encode({"jobid": self.job_id,
95 "responsedescriptor": {"progress": "100",
96 "status": JOB_MODEL_STATUS.FINISHED,
98 "statusdescription": "creating",
100 "responsehistorylist": [
102 "status": JOB_MODEL_STATUS.PROCESSING,
104 "statusdescription": "creating",
105 "errorcode": "0"}]}}), '200']}
107 def side_effect(*args):
108 return mock_vals[args[4]]
109 mock_call_req.side_effect = side_effect
110 data = {'ns_instance_id': ignore_case_get(self.data, 'nsInstanceId'),
111 'additional_param_for_ns': ignore_case_get(self.data, 'additionalParamForNs'),
112 'additional_param_for_vnf': ignore_case_get(self.data, 'additionalParamForVnf'),
113 'vnf_index': ignore_case_get(self.data, 'vnfIndex')}
114 nf_inst_id, job_id = create_vnfs.prepare_create_params()
115 CreateVnfs(data, nf_inst_id, job_id).run()
116 self.assertTrue(NfInstModel.objects.get(nfinstid=nf_inst_id).status, VNF_STATUS.ACTIVE)
119 class TestTerminateVnfViews(TestCase):
121 self.client = Client()
122 self.ns_inst_id = str(uuid.uuid4())
123 self.nf_inst_id = '1'
124 self.vnffg_id = str(uuid.uuid4())
125 self.vim_id = str(uuid.uuid4())
126 self.job_id = str(uuid.uuid4())
128 self.tenant = "tenantname"
129 NSInstModel.objects.all().delete()
130 NfInstModel.objects.all().delete()
131 NSInstModel(id=self.ns_inst_id, name="ns_name").save()
132 NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
133 vnfm_inst_id='1', ns_inst_id='111,2-2-2',
134 max_cpu='14', max_ram='12296', max_hd='101', max_shd="20", max_net=10,
135 status='active', mnfinstid=self.nf_uuid, package_id='pkg1',
136 vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",'
137 '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",'
138 '"productType": "CN","vnfType": "PGW",'
139 '"description": "PGW VNFD description",'
140 '"isShared":true,"vnfExtendType":"driver"}}')
143 NSInstModel.objects.all().delete()
144 NfInstModel.objects.all().delete()
146 @mock.patch.object(TerminateVnfs, 'run')
147 def test_terminate_vnf_url(self, mock_run):
149 "terminationType": "forceful",
150 "gracefulTerminationTimeout": "600"}
152 response = self.client.post("/api/nslcm/v1/ns/vnfs/%s" % self.nf_inst_id, data=req_data)
153 self.failUnlessEqual(status.HTTP_201_CREATED, response.status_code)
155 @mock.patch.object(restcall, "call_req")
156 def test_terminate_vnf(self, mock_call_req):
157 job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, self.nf_inst_id)
159 nfinst = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
161 self.failUnlessEqual(1, 1)
163 self.failUnlessEqual(1, 0)
166 "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
167 [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
168 "/api/extsys/v1/vnfms/1":
169 [0, json.JSONEncoder().encode({"name": 'vnfm1', "type": 'ztevmanagerdriver'}), '200'],
170 "/api/resmgr/v1/vnf/1":
171 [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
172 "/api/ztevmanagerdriver/v1/1/jobs/" + job_id + "?responseId=0":
173 [0, json.JSONEncoder().encode({"jobId": job_id,
174 "responsedescriptor": {"progress": "100",
175 "status": JOB_MODEL_STATUS.FINISHED,
177 "statusdescription": "creating",
179 "responsehistorylist": [
181 "status": JOB_MODEL_STATUS.PROCESSING,
183 "statusdescription": "creating",
184 "errorcode": "0"}]}}), '200']}
187 "terminationType": "forceful",
188 "gracefulTerminationTimeout": "600"}
190 def side_effect(*args):
191 return mock_vals[args[4]]
192 mock_call_req.side_effect = side_effect
194 TerminateVnfs(req_data, self.nf_inst_id, job_id).run()
195 nfinst = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
197 self.failUnlessEqual(1, 0)
199 self.failUnlessEqual(1, 1)
201 class TestScaleVnfViews(TestCase):
203 self.client = Client()
204 self.ns_inst_id = str(uuid.uuid4())
205 self.nf_inst_id = str(uuid.uuid4())
206 self.vnffg_id = str(uuid.uuid4())
207 self.vim_id = str(uuid.uuid4())
208 self.job_id = str(uuid.uuid4())
210 self.tenant = "tenantname"
211 NSInstModel(id=self.ns_inst_id, name="ns_name").save()
212 NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
213 vnfm_inst_id='1', ns_inst_id='111,2-2-2',
214 max_cpu='14', max_ram='12296', max_hd='101', max_shd="20", max_net=10,
215 status='active', mnfinstid=self.nf_uuid, package_id='pkg1',
216 vnfd_model='{"metadata": {"vnfdId": "1","vnfdName": "PGW001",'
217 '"vnfProvider": "zte","vnfdVersion": "V00001","vnfVersion": "V5.10.20",'
218 '"productType": "CN","vnfType": "PGW",'
219 '"description": "PGW VNFD description",'
220 '"isShared":true,"vnfExtendType":"driver"}}')
223 NSInstModel.objects.all().delete()
224 NfInstModel.objects.all().delete()
226 @mock.patch.object(restcall, "call_req")
227 def test_scale_vnf(self, mock_call_req):
228 job_id = JobUtil.create_job("VNF", JOB_TYPE.TERMINATE_VNF, self.nf_inst_id)
233 "flavour_id":"flavour1",
238 "instances_minimum_number": 1,
239 "instances_maximum_number": 4,
240 "local_affinity_antiaffinity_rule":[
242 "affinity_antiaffinity":"affinity",
251 "name": "demo_aspect",
252 "description": "demo_aspect",
253 "associated_group": "elementGroup1",
261 "group_id": "elementGroup1",
264 "name": "elementGroup1",
266 "members": ["gsu_vm","pfu_vm"],
275 "aspectId":"demo_aspect1",
277 "additionalParam":vnfd_info
281 "aspectId":"demo_aspect2",
283 "additionalParam":vnfd_info
290 "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
291 [0, json.JSONEncoder().encode({"jobId": job_id}), '200'],
292 "/api/ztevmanagerdriver/v1/1/vnfs/111/terminate":
293 [0, json.JSONEncoder().encode({"jobId": job_id}), '200']
295 NFManualScaleService(self.nf_inst_id, req_data).run()
296 nsIns = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
298 self.failUnlessEqual(1, 1)
300 self.failUnlessEqual(1, 0)
303 'local_storages': [],
306 'volumn_storages': [],
310 'local_storages': [],
311 'vdu_id': u'vdu_omm.001',
312 'image_file': u'opencos_sss_omm_img_release_20150723-1-disk1',
318 'support_scaling': False,
321 'storage_policy': '',
324 'availability_zone': '',
329 'inject_data_list': [],
333 'local_affinity_antiaffinity_rule': {},
334 'template_id': u'omm.001',
335 'manual_scale_select_vim': False},
336 'description': u'singleommvm'},
338 'volumn_storages': [],
342 'local_storages': [],
344 'image_file': u'sss',
350 'support_scaling': False,
353 'storage_policy': '',
356 'availability_zone': '',
361 'inject_data_list': [],
365 'local_affinity_antiaffinity_rule': {},
367 'manual_scale_select_vim': False},
368 'description': u'ompvm'},
370 'volumn_storages': [],
374 'local_storages': [],
376 'image_file': u'sss',
382 'support_scaling': False,
385 'storage_policy': '',
388 'availability_zone': '',
393 'inject_data_list': [],
397 'local_affinity_antiaffinity_rule': {},
399 'manual_scale_select_vim': False},
400 'description': u'ompvm'},
402 'volumn_storages': [],
406 'local_storages': [],
408 'image_file': u'sss',
414 'support_scaling': False,
417 'storage_policy': '',
420 'availability_zone': '',
425 'inject_data_list': [],
429 'local_affinity_antiaffinity_rule': {},
431 'manual_scale_select_vim': False},
432 'description': u'ompvm'},
434 'volumn_storages': [],
438 'local_storages': [],
440 'image_file': u'sss',
446 'support_scaling': False,
449 'storage_policy': '',
452 'availability_zone': '',
457 'inject_data_list': [],
461 'local_affinity_antiaffinity_rule': {},
462 'template_id': u'10',
463 'manual_scale_select_vim': False},
464 'description': u'ppvm'},
466 'volumn_storages': [],
470 'local_storages': [],
472 'image_file': u'sss',
478 'support_scaling': False,
481 'storage_policy': '',
484 'availability_zone': '',
489 'inject_data_list': [],
493 'local_affinity_antiaffinity_rule': {},
494 'template_id': u'11',
495 'manual_scale_select_vim': False},
496 'description': u'ppvm'},
498 'volumn_storages': [],
502 'local_storages': [],
504 'image_file': u'sss',
510 'support_scaling': False,
513 'storage_policy': '',
516 'availability_zone': '',
521 'inject_data_list': [],
525 'local_affinity_antiaffinity_rule': {},
526 'template_id': u'12',
527 'manual_scale_select_vim': False},
528 'description': u'ppvm'}],
529 'volumn_storages': [],
533 'policy_id': u'policy_scale_sss-vnf-template',
535 'policy_file': '*-vnfd.zip/*-vnf-policy.xml'},
541 'name': u'opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
543 'disk_format': u'VMDK',
544 'file_url': u'./zte-cn-sss-main-image/OMM/opencos_sss_omm_img_release_20150723-1-disk1.vmdk',
545 'container_type': 'vm',
547 'hypervisor_type': 'kvm'},
548 'image_file_id': u'opencos_sss_omm_img_release_20150723-1-disk1'},
554 'disk_format': u'VMDK',
555 'file_url': u'./zte-cn-sss-main-image/NE/sss.vmdk',
556 'container_type': 'vm',
558 'hypervisor_type': 'kvm'},
559 'image_file_id': u'sss'}],
566 'domain_type': u'CN',
567 'version': u'v4.14.10',
568 'vmnumber_overquota_alarm': False,
571 'vnfd_version': u'V00000001',
572 'id': u'sss-vnf-template',
573 'name': u'sss-vnf-template'}}
578 "externalDataNetworkName": {
590 "plugin_info": "vbrasplugin_1.0",
592 "is_shared": "False",
593 "request_reclassification": "False",
594 "vnfd_version": "1.0.0",
598 "externalDataNetworkName": {
599 "get_input": "externalDataNetworkName"},
610 "vl_id": "ext_mnet_network",
613 "network_type": "vlan",
614 "name": "externalMNetworkName",
615 "dhcp_enabled": False,
622 "end_ip": "190.168.100.100",
623 "gateway_ip": "190.168.100.1",
624 "start_ip": "190.168.100.2",
625 "cidr": "190.168.100.0/24",
627 "network_name": "sub_mnet",
632 "invariant_id": "vbras_ns",
633 "description": "vbras_ns",