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.
19 from django.test import TestCase, Client
20 from rest_framework import status
22 from lcm.pub.database.models import VLInstModel, NfInstModel, JobModel, NSInstModel, VmInstModel, \
23 OOFDataModel, VNFCInstModel
24 from lcm.pub.exceptions import NSLCMException
25 from lcm.pub.utils import restcall
26 from lcm.jobs.enum import JOB_MODEL_STATUS, JOB_TYPE, JOB_ACTION, JOB_PROGRESS
27 from lcm.pub.utils.jobutil import JobUtil
28 from lcm.pub.utils.timeutil import now_time
29 from lcm.pub.utils.values import ignore_case_get
30 from lcm.ns_vnfs.biz.grant_vnf import GrantVnf
31 from lcm.ns_vnfs.biz.heal_vnfs import NFHealService
32 from lcm.ns_vnfs.biz.scale_vnfs import NFManualScaleService
33 from lcm.ns_vnfs.biz.subscribe import SubscriptionDeletion
34 from lcm.ns_vnfs.biz.terminate_nfs import TerminateVnfs
35 from lcm.ns_vnfs.enum import VNF_STATUS, LIFE_CYCLE_OPERATION, RESOURCE_CHANGE_TYPE
36 from lcm.ns_vnfs.biz.place_vnfs import PlaceVnfs
37 from lcm.pub.msapi import resmgr
38 from lcm.ns_vnfs.tests.test_data import vnfm_info, vim_info, vnf_place_request
39 from lcm.ns_vnfs.tests.test_data import nf_package_info, nsd_model_dict, subscription_response_data
40 from lcm.ns_vnfs.biz.create_vnfs import CreateVnfs
41 from lcm.ns_vnfs.biz import create_vnfs
42 from lcm.ns_vnfs.biz.grant_vnfs import GrantVnfs
43 from lcm.ns.enum import OWNER_TYPE
46 class TestGetVnfViews(TestCase):
48 self.client = Client()
49 self.nf_inst_id = str(uuid.uuid4())
50 NfInstModel(nfinstid=self.nf_inst_id, nf_name="vnf1", vnfm_inst_id="1", vnf_id="vnf_id1",
51 status=VNF_STATUS.ACTIVE, create_time=now_time(), lastuptime=now_time()).save()
54 NfInstModel.objects.all().delete()
56 def test_get_vnf(self):
57 response = self.client.get("/api/nslcm/v1/ns/vnfs/%s" % self.nf_inst_id)
58 self.assertEqual(status.HTTP_200_OK, response.status_code)
59 context = json.loads(response.content)
60 self.assertEqual(self.nf_inst_id, context["vnfInstId"])
63 class TestTerminateVnfViews(TestCase):
65 self.client = Client()
67 "terminationType": "forceful",
68 "gracefulTerminationTimeout": "600"
70 self.ns_inst_id = str(uuid.uuid4())
72 self.vim_id = str(uuid.uuid4())
73 self.job_id = str(uuid.uuid4())
75 self.vnfd_model = {"metadata": {"vnfdId": "1"}}
76 NSInstModel.objects.all().delete()
77 NfInstModel.objects.all().delete()
78 VmInstModel.objects.all().delete()
79 NSInstModel(id=self.ns_inst_id, name="ns_name").save()
80 NfInstModel.objects.create(nfinstid=self.nf_inst_id,
83 mnfinstid=self.nf_uuid,
84 vnfd_model=self.vnfd_model
86 VmInstModel.objects.create(vmid="1",
87 vimid='{"cloud_owner": "VCPE", "cloud_regionid": "RegionOne"}',
88 instid=self.nf_inst_id
92 NSInstModel.objects.all().delete()
93 NfInstModel.objects.all().delete()
95 @mock.patch.object(TerminateVnfs, "run")
96 def test_terminate_vnf_url(self, mock_run):
98 "terminationType": "forceful",
99 "gracefulTerminationTimeout": "600"}
101 response = self.client.post("/api/nslcm/v1/ns/terminatevnf/%s" % self.nf_inst_id, data=req_data)
102 self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code)
104 @mock.patch.object(time, "sleep")
105 @mock.patch.object(restcall, "call_req")
106 @mock.patch.object(SubscriptionDeletion, "send_subscription_deletion_request")
107 def test_terminate_vnf(self, mock_send_subscription_deletion_request, mock_call_req, mock_sleep):
108 job_id = JobUtil.create_job(JOB_TYPE.VNF, JOB_ACTION.TERMINATE, self.nf_inst_id)
111 "responsedescriptor": {"status": JOB_MODEL_STATUS.FINISHED}
114 "/external-system/esr-vnfm-list/esr-vnfm/1?depth=all":
115 [0, json.JSONEncoder().encode(vnfm_info), "200"],
116 "/api/ztevnfmdriver/v1/1/vnfs/111/terminate":
117 [0, json.JSONEncoder().encode({"jobId": job_id}), "200"],
118 "/api/ztevnfmdriver/v1/1/jobs/" + job_id + "?responseId=0":
119 [0, json.JSONEncoder().encode(job_info), "200"],
120 "/api/resmgr/v1/vnf/1":
121 [0, json.JSONEncoder().encode({"jobId": job_id}), "200"]
124 def side_effect(*args):
125 return mock_vals[args[4]]
126 mock_call_req.side_effect = side_effect
127 TerminateVnfs(self.data, self.nf_inst_id, job_id).run()
128 nfinst = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
130 self.assertEqual(1, 0)
132 self.assertEqual(1, 1)
133 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, 100)
135 def test_terminate_vnf_when_vnf_is_dealing(self):
136 NfInstModel.objects.filter(nfinstid=self.nf_inst_id).update(status=VNF_STATUS.TERMINATING)
137 job_id = JobUtil.create_job(JOB_TYPE.VNF, JOB_ACTION.TERMINATE, self.nf_inst_id)
138 TerminateVnfs(self.data, self.nf_inst_id, job_id).run()
139 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.FAILED)
140 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, 255)
142 @mock.patch.object(time, "sleep")
143 @mock.patch.object(restcall, "call_req")
144 @mock.patch.object(SubscriptionDeletion, "send_subscription_deletion_request")
145 def test_terminate_vnf_when_job_error(self, mock_send_subscription_deletion_request, mock_call_req, mock_sleep):
146 job_id = JobUtil.create_job(JOB_TYPE.VNF, JOB_ACTION.TERMINATE, self.nf_inst_id)
149 "responsedescriptor": {"status": JOB_MODEL_STATUS.ERROR}
152 "/external-system/esr-vnfm-list/esr-vnfm/1?depth=all":
153 [0, json.JSONEncoder().encode(vnfm_info), "200"],
154 "/api/ztevnfmdriver/v1/1/vnfs/111/terminate":
155 [0, json.JSONEncoder().encode({"jobId": job_id}), "200"],
156 "/api/ztevnfmdriver/v1/1/jobs/" + job_id + "?responseId=0":
157 [0, json.JSONEncoder().encode(job_info), "200"]
160 def side_effect(*args):
161 return mock_vals[args[4]]
163 mock_call_req.side_effect = side_effect
164 TerminateVnfs(self.data, self.nf_inst_id, job_id).run()
165 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.FAILED)
166 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, 255)
169 class TestScaleVnfViews(TestCase):
171 self.client = Client()
172 self.nf_inst_id = str(uuid.uuid4())
173 self.url = "/api/nslcm/v1/ns/ns_vnfs/%s/scaling" % self.nf_inst_id
178 "aspectId": "demo_aspect1",
180 "additionalParam": {}
183 NfInstModel.objects.create(nfinstid=self.nf_inst_id, vnfm_inst_id="vnfm_inst_id_001",
184 mnfinstid="m_nf_inst_id_001")
187 NfInstModel.objects.all().delete()
189 # def test_scale_vnf_view(self):
190 # response = self.client.post(self.url, self.data)
191 # self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
193 @mock.patch.object(time, "sleep")
194 @mock.patch.object(restcall, "call_req")
195 def test_scale_vnf_success(self, mock_call_req, mock_sleep):
196 scale_service = NFManualScaleService(self.nf_inst_id, self.data)
198 "jobId": scale_service.job_id,
199 "responsedescriptor": {"status": JOB_MODEL_STATUS.FINISHED}
202 "/external-system/esr-vnfm-list/esr-vnfm/vnfm_inst_id_001?depth=all":
203 [0, json.JSONEncoder().encode(vnfm_info), "200"],
204 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/vnfs/m_nf_inst_id_001/scale":
205 [0, json.JSONEncoder().encode({"jobId": scale_service.job_id}), "200"],
206 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/jobs/" + scale_service.job_id + "?responseId=0":
207 [0, json.JSONEncoder().encode(job_info), "200"]
210 def side_effect(*args):
211 return mock_vals[args[4]]
212 mock_call_req.side_effect = side_effect
214 nsIns = NfInstModel.objects.get(nfinstid=self.nf_inst_id)
215 self.assertEqual(nsIns.status, VNF_STATUS.ACTIVE)
217 jobs = JobModel.objects.get(jobid=scale_service.job_id)
218 self.assertEqual(JOB_PROGRESS.FINISHED, jobs.progress)
220 @mock.patch.object(time, "sleep")
221 @mock.patch.object(restcall, "call_req")
222 def test_scale_vnf_when_job_fail(self, mock_call_req, mock_sleep):
223 scale_service = NFManualScaleService(self.nf_inst_id, self.data)
225 "jobId": scale_service.job_id,
226 "responsedescriptor": {"status": JOB_MODEL_STATUS.ERROR}
229 "/external-system/esr-vnfm-list/esr-vnfm/vnfm_inst_id_001?depth=all":
230 [0, json.JSONEncoder().encode(vnfm_info), "200"],
231 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/vnfs/m_nf_inst_id_001/scale":
232 [0, json.JSONEncoder().encode({"jobId": scale_service.job_id}), "200"],
233 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/jobs/" + scale_service.job_id + "?responseId=0":
234 [0, json.JSONEncoder().encode(job_info), "200"]
237 def side_effect(*args):
238 return mock_vals[args[4]]
240 mock_call_req.side_effect = side_effect
242 nsIns = NfInstModel.objects.get(nfinstid=self.nf_inst_id)
243 self.assertEqual(nsIns.status, VNF_STATUS.ACTIVE)
244 jobs = JobModel.objects.get(jobid=scale_service.job_id)
245 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
247 def test_scale_vnf_when_exception(self):
252 "aspectId": "demo_aspect1",
257 "aspectId": "demo_aspect2",
262 scale_service = NFManualScaleService(self.nf_inst_id, req_data)
264 nsIns = NfInstModel.objects.get(nfinstid=self.nf_inst_id)
265 self.assertEqual(nsIns.status, VNF_STATUS.ACTIVE)
267 jobs = JobModel.objects.get(jobid=scale_service.job_id)
268 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
270 def test_scale_vnf_when_nf_instance_does_not_exist(self):
275 "aspectId": "demo_aspect1",
279 scale_service = NFManualScaleService("nf_instance_does_not_exist", req_data)
282 jobs = JobModel.objects.get(jobid=scale_service.job_id)
283 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
285 def test_scale_vnf_when_scale_vnf_data_does_not_exist(self):
289 scale_service = NFManualScaleService(self.nf_inst_id, req_data)
291 nsIns = NfInstModel.objects.get(nfinstid=self.nf_inst_id)
292 self.assertEqual(nsIns.status, VNF_STATUS.ACTIVE)
294 jobs = JobModel.objects.get(jobid=scale_service.job_id)
295 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
298 class TestHealVnfViews(TestCase):
300 self.client = Client()
301 self.ns_inst_id = str(uuid.uuid4())
302 self.nf_inst_id = str(uuid.uuid4())
311 "additionalParams": {
317 NSInstModel(id=self.ns_inst_id, name="ns_name").save()
318 NfInstModel.objects.create(nfinstid=self.nf_inst_id, status=VNF_STATUS.NULL, vnfm_inst_id="vnfm_inst_id_001",
319 mnfinstid="m_nf_inst_id_001")
320 NfInstModel.objects.create(nfinstid="non_vud_id", status=VNF_STATUS.NULL, vnfm_inst_id="vnfm_inst_id_001",
321 mnfinstid="m_nf_inst_id_001")
322 VNFCInstModel.objects.create(nfinstid=self.nf_inst_id, vmid="vm_id_001", vduid="vdu_id_001")
323 VmInstModel.objects.create(resouceid="vm_id_001", vmname="vm_name_001")
326 NSInstModel.objects.all().delete()
327 NfInstModel.objects.all().delete()
329 @mock.patch.object(time, "sleep")
330 @mock.patch.object(restcall, "call_req")
331 def test_heal_vnf_success(self, mock_call_req, mock_sleep):
332 heal_service = NFHealService(self.nf_inst_id, self.data)
334 "/test/bins/1?timeout=15000":
335 [0, json.JSONEncoder().encode(['{"powering-off": "", "instance_id": "vm_id_001", '
336 '"display_name": ""}']), "200"],
337 "/external-system/esr-vnfm-list/esr-vnfm/vnfm_inst_id_001?depth=all":
338 [0, json.JSONEncoder().encode(vnfm_info), "200"],
339 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/vnfs/m_nf_inst_id_001/heal":
340 [0, json.JSONEncoder().encode({"jobId": heal_service.job_id}), "200"],
341 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/jobs/" + heal_service.job_id + "?responseId=0":
342 [0, json.JSONEncoder().encode({
343 "jobId": heal_service.job_id,
344 "responsedescriptor": {
345 "status": JOB_MODEL_STATUS.FINISHED,
346 "responsehistorylist": [{
348 "status": JOB_MODEL_STATUS.PROCESSING,
350 "statusdescription": "creating",
357 def side_effect(*args):
358 return mock_vals[args[4]]
360 mock_call_req.side_effect = side_effect
362 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.ACTIVE)
363 jobs = JobModel.objects.get(jobid=heal_service.job_id)
364 self.assertEqual(JOB_PROGRESS.FINISHED, jobs.progress)
366 def test_heal_vnf_when_non_existing_vnf(self, ):
367 heal_service = NFHealService("on_existing_vnf", self.data)
369 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.NULL)
370 jobs = JobModel.objects.get(jobid=heal_service.job_id)
371 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
373 def test_heal_vnf_when_additional_params_non_exist(self):
374 data = {"action": "vmReset"}
375 heal_service = NFHealService(self.nf_inst_id, data)
377 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.NULL)
378 jobs = JobModel.objects.get(jobid=heal_service.job_id)
379 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
381 def test_heal_vnf_when_non_vud_id(self, ):
382 heal_service = NFHealService("non_vud_id", self.data)
384 self.assertEqual(NfInstModel.objects.get(nfinstid="non_vud_id").status, VNF_STATUS.NULL)
385 jobs = JobModel.objects.get(jobid=heal_service.job_id)
386 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
388 @mock.patch.object(restcall, "call_req")
389 def test_heal_vnf_when_no_vnfm_job_id(self, mock_call_req):
390 heal_service = NFHealService(self.nf_inst_id, self.data)
392 "/test/bins/1?timeout=15000":
393 [0, json.JSONEncoder().encode(['{"powering-off": "", "instance_id": "vm_id_001", '
394 '"display_name": ""}']), "200"],
395 "/external-system/esr-vnfm-list/esr-vnfm/vnfm_inst_id_001?depth=all":
396 [0, json.JSONEncoder().encode(vnfm_info), "200"],
397 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/vnfs/m_nf_inst_id_001/heal":
398 [0, json.JSONEncoder().encode({}), "200"]
401 def side_effect(*args):
402 return mock_vals[args[4]]
404 mock_call_req.side_effect = side_effect
406 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.ACTIVE)
407 jobs = JobModel.objects.get(jobid=heal_service.job_id)
408 self.assertEqual(JOB_PROGRESS.FINISHED, jobs.progress)
410 @mock.patch.object(time, "sleep")
411 @mock.patch.object(restcall, "call_req")
412 def test_heal_vnf_when_job_bot_finish(self, mock_call_req, mock_sleep):
413 heal_service = NFHealService(self.nf_inst_id, self.data)
415 "/test/bins/1?timeout=15000":
416 [0, json.JSONEncoder().encode(['{"powering-off": "", "instance_id": "vm_id_001", '
417 '"display_name": ""}']), "200"],
418 "/external-system/esr-vnfm-list/esr-vnfm/vnfm_inst_id_001?depth=all":
419 [0, json.JSONEncoder().encode(vnfm_info), "200"],
420 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/vnfs/m_nf_inst_id_001/heal":
421 [0, json.JSONEncoder().encode({"jobId": heal_service.job_id}), "200"],
422 "/api/ztevnfmdriver/v1/vnfm_inst_id_001/jobs/" + heal_service.job_id + "?responseId=0":
423 [0, json.JSONEncoder().encode({
424 "jobId": heal_service.job_id,
425 "responsedescriptor": {
426 "status": JOB_MODEL_STATUS.ERROR,
427 "responsehistorylist": [{
429 "status": JOB_MODEL_STATUS.PROCESSING,
431 "statusdescription": "creating",
438 def side_effect(*args):
439 return mock_vals[args[4]]
441 mock_call_req.side_effect = side_effect
443 self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.HEALING)
444 jobs = JobModel.objects.get(jobid=heal_service.job_id)
445 self.assertEqual(JOB_PROGRESS.ERROR, jobs.progress)
448 class TestGetVnfmInfoViews(TestCase):
450 self.client = Client()
451 self.vnfm_id = str(uuid.uuid4())
456 @mock.patch.object(restcall, "call_req")
457 def test_get_vnfm_info(self, mock_call_req):
459 "vnfm-id": "example-vnfm-id-val-62576",
460 "vim-id": "example-vim-id-val-35114",
461 "certificate-url": "example-certificate-url-val-90242",
462 "esr-system-info-list": {
465 "esr-system-info-id": "example-esr-system-info-id-val-78484",
466 "system-name": "example-system-name-val-23790",
467 "type": "example-type-val-52596",
468 "vendor": "example-vendor-val-47399",
469 "version": "example-version-val-42051",
470 "service-url": "example-service-url-val-10731",
471 "user-name": "example-user-name-val-65946",
472 "password": "example-password-val-22505",
473 "system-type": "example-system-type-val-27221",
474 "protocal": "example-protocal-val-54632",
475 "ssl-cacert": "example-ssl-cacert-val-45965",
476 "ssl-insecure": True,
477 "ip-address": "example-ip-address-val-19212",
478 "port": "example-port-val-57641",
479 "cloud-domain": "example-cloud-domain-val-26296",
480 "default-tenant": "example-default-tenant-val-87724"
485 r1 = [0, json.JSONEncoder().encode(vnfm_info_aai), "200"]
486 mock_call_req.side_effect = [r1]
487 esr_system_info = ignore_case_get(ignore_case_get(vnfm_info_aai, "esr-system-info-list"), "esr-system-info")
489 "vnfmId": vnfm_info_aai["vnfm-id"],
490 "name": vnfm_info_aai["vnfm-id"],
491 "type": ignore_case_get(esr_system_info[0], "type"),
492 "vimId": vnfm_info_aai["vim-id"],
493 "vendor": ignore_case_get(esr_system_info[0], "vendor"),
494 "version": ignore_case_get(esr_system_info[0], "version"),
495 "description": "vnfm",
496 "certificateUrl": vnfm_info_aai["certificate-url"],
497 "url": ignore_case_get(esr_system_info[0], "service-url"),
498 "userName": ignore_case_get(esr_system_info[0], "user-name"),
499 "password": ignore_case_get(esr_system_info[0], "password"),
503 response = self.client.get("/api/nslcm/v1/vnfms/%s" % self.vnfm_id)
504 self.assertEqual(status.HTTP_200_OK, response.status_code, response.content)
505 context = json.loads(response.content)
506 self.assertEqual(expect_data, context)
509 class TestGetVimInfoViews(TestCase):
511 self.client = Client()
512 self.vim_id = {"cloud_owner": "VCPE", "cloud_regionid": "RegionOne"}
517 @mock.patch.object(restcall, "call_req")
518 def test_get_vim_info(self, mock_call_req):
519 r1 = [0, json.JSONEncoder().encode(vim_info), "200"]
520 mock_call_req.side_effect = [r1]
521 esr_system_info = ignore_case_get(ignore_case_get(vim_info, "esr-system-info-list"), "esr-system-info")
523 "vimId": self.vim_id,
525 "url": ignore_case_get(esr_system_info[0], "service-url"),
526 "userName": ignore_case_get(esr_system_info[0], "user-name"),
527 "password": ignore_case_get(esr_system_info[0], "password"),
528 # "tenant": ignore_case_get(tenants[0], "tenant-id"),
529 "tenant": ignore_case_get(esr_system_info[0], "default-tenant"),
530 "vendor": ignore_case_get(esr_system_info[0], "vendor"),
531 "version": ignore_case_get(esr_system_info[0], "version"),
532 "description": "vim",
534 "type": ignore_case_get(esr_system_info[0], "type"),
538 # response = self.client.get("/api/nslcm/v1/vims/%s" % self.vim_id)
539 response = self.client.get("/api/nslcm/v1/vims/%s/%s" % (self.vim_id["cloud_owner"], self.vim_id["cloud_regionid"]))
540 self.assertEqual(status.HTTP_200_OK, response.status_code)
541 context = json.loads(response.content)
542 self.assertEqual(expect_data["url"], context["url"])
545 class TestPlaceVnfViews(TestCase):
547 self.vnf_inst_id = "1234"
549 self.client = Client()
550 OOFDataModel.objects.all().delete()
551 OOFDataModel.objects.create(
553 transaction_id="1234",
554 request_status="init",
555 request_module_name=self.vnf_id,
556 service_resource_id=self.vnf_inst_id,
564 OOFDataModel.objects.all().delete()
566 @mock.patch.object(restcall, "call_req")
567 def test_place_vnf(self, mock_call_req):
570 "flavorName": "HPA.flavor.1",
574 PlaceVnfs(vnf_place_request).extract()
575 db_info = OOFDataModel.objects.filter(request_id=vnf_place_request.get("requestId"), transaction_id=vnf_place_request.get("transactionId"))
576 self.assertEqual(db_info[0].request_status, "completed")
577 self.assertEqual(db_info[0].vim_id, "CloudOwner1_DLLSTX1A")
578 self.assertEqual(db_info[0].cloud_owner, "CloudOwner1")
579 self.assertEqual(db_info[0].cloud_region_id, "DLLSTX1A")
580 self.assertEqual(db_info[0].vdu_info, json.dumps(vdu_info_json))
582 def test_place_vnf_with_invalid_response(self):
585 "transactionId": "1234",
586 "statusMessage": "xx",
587 "requestStatus": "pending",
589 "placementSolutions": [
592 "resourceModuleName": self.vnf_id,
593 "serviceResourceId": self.vnf_inst_id,
595 "identifierType": "serviceInstanceId",
599 "cloudOwner": "CloudOwner1 "
605 "licenseSolutions": [
607 "resourceModuleName": "string",
608 "serviceResourceId": "string",
609 "entitlementPoolUUID": [
612 "licenseKeyGroupUUID": [
615 "entitlementPoolInvariantUUID": [
618 "licenseKeyGroupInvariantUUID": [
625 PlaceVnfs(resp).extract()
626 db_info = OOFDataModel.objects.filter(request_id=resp.get("requestId"), transaction_id=resp.get("transactionId"))
627 self.assertEqual(db_info[0].request_status, "pending")
628 self.assertEqual(db_info[0].vim_id, "none")
629 self.assertEqual(db_info[0].cloud_owner, "none")
630 self.assertEqual(db_info[0].cloud_region_id, "none")
631 self.assertEqual(db_info[0].vdu_info, "none")
633 def test_place_vnf_with_no_assignment_info(self):
636 "transactionId": "1234",
637 "statusMessage": "xx",
638 "requestStatus": "completed",
640 "placementSolutions": [
643 "resourceModuleName": self.vnf_id,
644 "serviceResourceId": self.vnf_inst_id,
646 "identifierType": "serviceInstanceId",
650 "cloudOwner": "CloudOwner1 "
655 "licenseSolutions": [
657 "resourceModuleName": "string",
658 "serviceResourceId": "string",
659 "entitlementPoolUUID": [
662 "licenseKeyGroupUUID": [
665 "entitlementPoolInvariantUUID": [
668 "licenseKeyGroupInvariantUUID": [
675 PlaceVnfs(resp).extract()
676 db_info = OOFDataModel.objects.filter(request_id=resp.get("requestId"), transaction_id=resp.get("transactionId"))
677 self.assertEqual(db_info[0].request_status, "completed")
678 self.assertEqual(db_info[0].vim_id, "none")
679 self.assertEqual(db_info[0].cloud_owner, "none")
680 self.assertEqual(db_info[0].cloud_region_id, "none")
681 self.assertEqual(db_info[0].vdu_info, "none")
683 def test_place_vnf_no_directives(self):
686 "transactionId": "1234",
687 "statusMessage": "xx",
688 "requestStatus": "completed",
690 "placementSolutions": [
693 "resourceModuleName": self.vnf_id,
694 "serviceResourceId": self.vnf_inst_id,
696 "identifierType": "serviceInstanceId",
700 "cloudOwner": "CloudOwner1 "
703 {"key": "locationId",
712 "resourceModuleName": "string",
713 "serviceResourceId": "string",
714 "entitlementPoolUUID": [
717 "licenseKeyGroupUUID": [
720 "entitlementPoolInvariantUUID": [
723 "licenseKeyGroupInvariantUUID": [
730 PlaceVnfs(resp).extract()
731 db_info = OOFDataModel.objects.filter(request_id=resp.get("requestId"), transaction_id=resp.get("transactionId"))
732 self.assertEqual(db_info[0].request_status, "completed")
733 self.assertEqual(db_info[0].vim_id, "none")
734 self.assertEqual(db_info[0].cloud_owner, "none")
735 self.assertEqual(db_info[0].cloud_region_id, "none")
736 self.assertEqual(db_info[0].vdu_info, "none")
738 def test_place_vnf_with_no_solution(self):
741 "transactionId": "1234",
742 "statusMessage": "xx",
743 "requestStatus": "completed",
745 "placementSolutions": [],
746 "licenseSoutions": []
749 PlaceVnfs(resp).extract()
750 db_info = OOFDataModel.objects.filter(request_id=resp.get("requestId"), transaction_id=resp.get("transactionId"))
751 self.assertEqual(db_info[0].request_status, "completed")
752 self.assertEqual(db_info[0].vim_id, "none")
753 self.assertEqual(db_info[0].cloud_owner, "none")
754 self.assertEqual(db_info[0].cloud_region_id, "none")
755 self.assertEqual(db_info[0].vdu_info, "none")
758 class TestGrantVnfsViews(TestCase):
760 self.vnf_inst_id = str(uuid.uuid4())
762 "vnfInstanceId": self.vnf_inst_id,
763 "lifecycleOperation": LIFE_CYCLE_OPERATION.INSTANTIATE,
764 "addResource": [{"type": RESOURCE_CHANGE_TYPE.VDU, "vdu": "vdu_grant_vnf_add_resources"}],
766 "vnfmid": "vnfm_inst_id_001",
767 "vimid": '{"cloud_owner": "VCPE", "cloud_regionid": "RegionOne"}'
770 self.client = Client()
771 self.url = "/api/nslcm/v1/ns/grantvnf"
772 NfInstModel(mnfinstid=self.vnf_inst_id, nfinstid="vnf_inst_id_001", package_id="package_id_001",
773 vnfm_inst_id="vnfm_inst_id_001").save()
776 OOFDataModel.objects.all().delete()
777 NfInstModel.objects.all().delete()
779 # @mock.patch.object(restcall, "call_req")
780 # def test_nf_grant_view(self, mock_call_req):
782 # "/api/catalog/v1/vnfpackages/package_id_001":
783 # [0, json.JSONEncoder().encode(nf_package_info), "200"],
784 # "/api/resmgr/v1/resource/grant":
785 # [1, json.JSONEncoder().encode({}), "200"],
786 # "/cloud-infrastructure/cloud-regions/cloud-region/VCPE/RegionOne?depth=all":
787 # [0, json.JSONEncoder().encode(vim_info), "201"],
790 # def side_effect(*args):
791 # return mock_vals[args[4]]
793 # mock_call_req.side_effect = side_effect
795 # "vnfInstanceId": self.vnf_inst_id,
796 # "lifecycleOperation": LIFE_CYCLE_OPERATION.INSTANTIATE
798 # response = self.client.post(self.url, data=data)
799 # self.assertEqual(response.status_code, status.HTTP_201_CREATED)
801 @mock.patch.object(restcall, "call_req")
802 def test_nf_grant_view_when_add_resource(self, mock_call_req):
804 "/api/catalog/v1/vnfpackages/package_id_001":
805 [0, json.JSONEncoder().encode(nf_package_info), "200"],
806 "/api/resmgr/v1/resource/grant":
807 [1, json.JSONEncoder().encode({}), "200"],
808 "/cloud-infrastructure/cloud-regions/cloud-region/VCPE/RegionOne?depth=all":
809 [0, json.JSONEncoder().encode(vim_info), "201"],
812 def side_effect(*args):
813 return mock_vals[args[4]]
814 mock_call_req.side_effect = side_effect
815 resp = GrantVnfs(json.dumps(self.data), "").send_grant_vnf_to_resMgr()
816 return_success = {"vim": {"accessInfo": {"tenant": "admin"},
817 "vimId": "example-cloud-owner-val-97336_example-cloud-region-id-val-35532"}}
818 self.assertEqual(resp, return_success)
820 @mock.patch.object(restcall, "call_req")
821 def test_nf_grant_view_when_remove_resource(self, mock_call_req):
823 "/api/catalog/v1/vnfpackages/package_id_001":
824 [0, json.JSONEncoder().encode(nf_package_info), "200"],
825 "/api/resmgr/v1/resource/grant":
826 [1, json.JSONEncoder().encode({}), "200"],
827 "/cloud-infrastructure/cloud-regions/cloud-region/VCPE/RegionOne?depth=all":
828 [0, json.JSONEncoder().encode(vim_info), "201"],
831 def side_effect(*args):
832 return mock_vals[args[4]]
834 mock_call_req.side_effect = side_effect
835 self.data.pop("addResource")
836 self.data["removeResource"] = [{"vdu": "vdu_grant_vnf_remove_resources"}]
837 resp = GrantVnfs(json.dumps(self.data), "").send_grant_vnf_to_resMgr()
838 return_success = {"vim": {"accessInfo": {"tenant": "admin"},
839 "vimId": "example-cloud-owner-val-97336_example-cloud-region-id-val-35532"}}
840 self.assertEqual(resp, return_success)
843 class TestGrantVnfViews(TestCase):
845 self.vnf_inst_id = str(uuid.uuid4())
847 "vnfInstanceId": self.vnf_inst_id,
848 "vnfLcmOpOccId": "vnf_lcm_op_occ_id",
849 "addResources": [{"vdu": "vdu_grant_vnf_add_resources"}],
850 "operation": "INSTANTIATE"
852 self.client = Client()
853 vdu_info_dict = [{"vduName": "vg", "flavorName": "flavor_1", "flavorId": "flavor_id_001", "directive": []}]
854 OOFDataModel(request_id="request_id_001", transaction_id="transaction_id_001", request_status="done",
855 request_module_name="vg", service_resource_id=self.vnf_inst_id, vim_id="cloudOwner_casa",
856 cloud_owner="cloudOwner", cloud_region_id="casa", vdu_info=json.dumps(vdu_info_dict)).save()
857 NfInstModel(mnfinstid=self.vnf_inst_id, nfinstid="vnf_inst_id_001", package_id="package_id_001",
858 vnfm_inst_id="vnfm_id_001").save()
861 OOFDataModel.objects.all().delete()
862 NfInstModel.objects.all().delete()
864 @mock.patch.object(resmgr, "grant_vnf")
865 def test_vnf_grant_view(self, mock_grant):
866 resmgr_grant_resp = {
868 "vimId": "cloudOwner_casa",
874 mock_grant.return_value = resmgr_grant_resp
875 self.data.pop("addResources")
876 response = self.client.post("/api/nslcm/v2/grants", data=self.data)
877 self.assertEqual(response.status_code, status.HTTP_201_CREATED)
878 self.assertEqual(response.data["vimAssets"]["computeResourceFlavours"][0]["vimConnectionId"], "cloudOwner_casa")
879 self.assertEqual(response.data["vimAssets"]["computeResourceFlavours"][0]["resourceProviderId"], "vg")
880 self.assertEqual(response.data["vimAssets"]["computeResourceFlavours"][0]["vimFlavourId"], "flavor_id_001")
882 @mock.patch.object(restcall, "call_req")
883 @mock.patch.object(resmgr, "grant_vnf")
884 def test_exec_grant_when_add_resources_success(self, mock_grant, mock_call_req):
886 "/api/catalog/v1/vnfpackages/package_id_001":
887 [0, json.JSONEncoder().encode(nf_package_info), "200"],
890 def side_effect(*args):
891 return mock_vals[args[4]]
893 mock_call_req.side_effect = side_effect
894 resmgr_grant_resp = {
896 "vimId": "cloudOwner_casa",
902 mock_grant.return_value = resmgr_grant_resp
903 resp = GrantVnf(json.dumps(self.data)).exec_grant()
904 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimConnectionId"], "cloudOwner_casa")
905 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["resourceProviderId"], "vg")
906 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimFlavourId"], "flavor_id_001")
908 def test_exec_grant_when_add_resources_but_no_vnfinst(self):
909 self.data["vnfInstanceId"] = "no_vnfinst"
912 resp = GrantVnf(json.dumps(self.data)).exec_grant()
913 except NSLCMException as e:
914 self.assertEqual(type(e), NSLCMException)
916 self.assertEqual(resp, None)
918 @mock.patch.object(time, "sleep")
919 @mock.patch.object(restcall, "call_req")
920 @mock.patch.object(resmgr, "grant_vnf")
921 def test_exec_grant_when_add_resources_but_no_off(self, mock_grant, mock_call_req, mock_sleep):
922 NfInstModel(mnfinstid="add_resources_but_no_off", nfinstid="vnf_inst_id_002",
923 package_id="package_id_002").save()
924 mock_sleep.return_value = None
926 "/api/catalog/v1/vnfpackages/package_id_002":
927 [0, json.JSONEncoder().encode(nf_package_info), "200"],
930 def side_effect(*args):
931 return mock_vals[args[4]]
933 mock_call_req.side_effect = side_effect
934 resmgr_grant_resp = {
936 "vimId": "cloudOwner_casa",
942 mock_grant.return_value = resmgr_grant_resp
943 self.data["vnfInstanceId"] = "add_resources_but_no_off"
944 resp = GrantVnf(json.dumps(self.data)).exec_grant()
945 self.assertEqual(resp["vnfInstanceId"], "add_resources_but_no_off")
946 self.assertEqual(resp["vnfLcmOpOccId"], "vnf_lcm_op_occ_id")
948 "id": "cloudOwner_casa",
949 "vimId": "cloudOwner_casa",
951 "interfaceInfo": None,
952 "accessInfo": {"tenant": "tenantA"},
955 self.assertEqual(resp["vimConnections"], vimConnections)
957 @mock.patch.object(resmgr, "grant_vnf")
958 def test_exec_grant_when_resource_template_in_add_resources(self, mock_grant):
959 resmgr_grant_resp = {
961 "vimId": "cloudOwner_casa",
967 mock_grant.return_value = resmgr_grant_resp
968 self.data["addResources"] = [{"vdu": "vdu_grant_vnf_add_resources"}, "resourceTemplate"]
969 resp = GrantVnf(json.dumps(self.data)).exec_grant()
970 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimConnectionId"], "cloudOwner_casa")
971 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["resourceProviderId"], "vg")
972 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimFlavourId"], "flavor_id_001")
974 @mock.patch.object(restcall, "call_req")
975 @mock.patch.object(resmgr, "grant_vnf")
976 def test_exec_grant_when_remove_resources_success(self, mock_grant, mock_call_req):
978 "/api/catalog/v1/vnfpackages/package_id_001":
979 [0, json.JSONEncoder().encode(nf_package_info), "200"],
982 def side_effect(*args):
983 return mock_vals[args[4]]
985 mock_call_req.side_effect = side_effect
986 resmgr_grant_resp = {
988 "vimId": "cloudOwner_casa",
994 mock_grant.return_value = resmgr_grant_resp
995 self.data.pop("addResources")
996 self.data["removeResources"] = [{"vdu": "vdu_grant_vnf_remove_resources"}]
997 self.data["additionalparams"] = {"vnfmid": "vnfm_id_001"}
998 resp = GrantVnf(json.dumps(self.data)).exec_grant()
999 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimConnectionId"], "cloudOwner_casa")
1000 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["resourceProviderId"], "vg")
1001 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimFlavourId"], "flavor_id_001")
1003 def test_exec_grant_when_remove_resources_no_vnfinst(self):
1004 self.data.pop("addResources")
1005 self.data["removeResources"] = [{"vdu": "vdu_grant_vnf_remove_resources"}]
1006 self.data["additionalparams"] = {"vnfmid": "vnfm_id_002"}
1009 resp = GrantVnf(json.dumps(self.data)).exec_grant()
1010 except NSLCMException as e:
1011 self.assertEqual(type(e), NSLCMException)
1013 self.assertEqual(resp, None)
1015 @mock.patch.object(time, "sleep")
1016 @mock.patch.object(restcall, "call_req")
1017 @mock.patch.object(resmgr, "grant_vnf")
1018 def test_exec_grant_when_remove_resources_but_no_off(self, mock_grant, mock_call_req, mock_sleep):
1019 NfInstModel(mnfinstid="remove_resources_but_no_off", nfinstid="vnf_inst_id_002", package_id="package_id_002",
1020 vnfm_inst_id="vnfm_id_002").save()
1021 mock_sleep.return_value = None
1023 "/api/catalog/v1/vnfpackages/package_id_002":
1024 [0, json.JSONEncoder().encode(nf_package_info), "200"],
1027 def side_effect(*args):
1028 return mock_vals[args[4]]
1030 mock_call_req.side_effect = side_effect
1031 resmgr_grant_resp = {
1033 "vimId": "cloudOwner_casa",
1039 mock_grant.return_value = resmgr_grant_resp
1040 self.data["vnfInstanceId"] = "remove_resources_but_no_off"
1041 self.data.pop("addResources")
1042 self.data["removeResources"] = [{"vdu": "vdu_grant_vnf_remove_resources"}]
1043 self.data["additionalparams"] = {"vnfmid": "vnfm_id_002"}
1044 resp = GrantVnf(json.dumps(self.data)).exec_grant()
1045 self.assertEqual(resp["vnfInstanceId"], "remove_resources_but_no_off")
1046 self.assertEqual(resp["vnfLcmOpOccId"], "vnf_lcm_op_occ_id")
1048 "id": "cloudOwner_casa",
1049 "vimId": "cloudOwner_casa",
1051 "interfaceInfo": None,
1052 "accessInfo": {"tenant": "tenantA"},
1055 self.assertEqual(resp["vimConnections"], vimConnections)
1057 @mock.patch.object(resmgr, "grant_vnf")
1058 def test_exec_grant_when_resource_template_in_remove_resources(self, mock_grant):
1059 resmgr_grant_resp = {
1061 "vimId": "cloudOwner_casa",
1067 mock_grant.return_value = resmgr_grant_resp
1068 self.data.pop("addResources")
1069 self.data["removeResources"] = [{"vdu": "vdu_grant_vnf_remove_resources"}, "resourceTemplate"]
1070 resp = GrantVnf(json.dumps(self.data)).exec_grant()
1071 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimConnectionId"], "cloudOwner_casa")
1072 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["resourceProviderId"], "vg")
1073 self.assertEqual(resp["vimAssets"]["computeResourceFlavours"][0]["vimFlavourId"], "flavor_id_001")
1076 class TestCreateVnfViews(TestCase):
1078 self.ns_inst_id = str(uuid.uuid4())
1079 self.job_id = str(uuid.uuid4())
1082 "nsInstanceId": self.ns_inst_id,
1083 # "additionalParamForNs": {"inputs": json.dumps({})},
1084 "additionalParamForVnf": [
1086 "vnfprofileid": "VBras",
1087 "additionalparam": {
1088 "inputs": json.dumps({
1092 "vnfminstanceid": "1",
1093 # "vimId": "zte_test",
1094 "vimId": '{"cloud_owner": "VCPE", "cloud_regionid": "RegionOne"}'
1099 self.client = Client()
1100 NSInstModel(id=self.ns_inst_id, name="ns", nspackage_id="1", nsd_id="nsd_id", description="description",
1101 status="instantiating", nsd_model=json.dumps(nsd_model_dict), create_time=now_time(),
1102 lastuptime=now_time()).save()
1103 VLInstModel(vldid="ext_mnet_network", ownertype=OWNER_TYPE.NS, ownerid=self.ns_inst_id,
1107 NfInstModel.objects.all().delete()
1108 JobModel.objects.all().delete()
1110 @mock.patch.object(CreateVnfs, "run")
1111 def test_create_vnf_view(self, mock_run):
1112 response = self.client.post("/api/nslcm/v1/ns/vnfs", data=self.data)
1113 self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code)
1114 context = json.loads(response.content)
1115 self.assertTrue(NfInstModel.objects.filter(nfinstid=context["vnfInstId"]).exists())
1117 @mock.patch.object(time, "sleep")
1118 @mock.patch.object(restcall, "call_req")
1119 def test_create_vnf_thread_sucess(self, mock_call_req, mock_sleep):
1120 mock_sleep.return_value = None
1121 nf_inst_id, job_id = create_vnfs.prepare_create_params()
1123 "/api/catalog/v1/vnfpackages/zte_vbras":
1124 [0, json.JSONEncoder().encode(nf_package_info), "200"],
1125 "/external-system/esr-vnfm-list/esr-vnfm/1?depth=all":
1126 [0, json.JSONEncoder().encode(vnfm_info), "200"],
1127 "/api/ztevnfmdriver/v1/1/vnfs":
1128 [0, json.JSONEncoder().encode({"jobId": self.job_id, "vnfInstanceId": 3}), "200"],
1129 "/api/oof/v1/placement":
1130 [0, json.JSONEncoder().encode({}), "202"],
1131 "/api/resmgr/v1/vnf":
1132 [0, json.JSONEncoder().encode({}), "200"],
1133 "/api/ztevnfmdriver/v1/1/jobs/" + self.job_id + "?responseId=0":
1134 [0, json.JSONEncoder().encode({"jobid": self.job_id,
1135 "responsedescriptor": {"progress": "100",
1136 "status": JOB_MODEL_STATUS.FINISHED,
1138 "statusdescription": "creating",
1140 "responsehistorylist": [
1142 "status": JOB_MODEL_STATUS.PROCESSING,
1144 "statusdescription": "creating",
1145 "errorcode": "0"}]}}), "200"],
1146 "api/gvnfmdriver/v1/1/subscriptions":
1147 [0, json.JSONEncoder().encode({}), "200"],
1148 "/api/resmgr/v1/vnfinfo":
1149 [0, json.JSONEncoder().encode(subscription_response_data), "200"],
1151 # "/network/generic-vnfs/generic-vnf/%s" % nf_inst_id:
1152 # [0, json.JSONEncoder().encode({}), "201"],
1153 # "/cloud-infrastructure/cloud-regions/cloud-region/zte/test?depth=all":
1154 # [0, json.JSONEncoder().encode(vim_info), "201"],
1155 # "/cloud-infrastructure/cloud-regions/cloud-region/zte/test/tenants/tenant/admin/vservers/vserver/1":
1156 # [0, json.JSONEncoder().encode({}), "201"],
1160 def side_effect(*args):
1161 return mock_vals[args[4]]
1162 mock_call_req.side_effect = side_effect
1164 "ns_instance_id": ignore_case_get(self.data, "nsInstanceId"),
1165 "additional_param_for_ns": ignore_case_get(self.data, "additionalParamForNs"),
1166 "additional_param_for_vnf": ignore_case_get(self.data, "additionalParamForVnf"),
1167 "vnf_index": ignore_case_get(self.data, "vnfIndex")
1169 CreateVnfs(data, nf_inst_id, job_id).run()
1170 self.assertEqual(NfInstModel.objects.get(nfinstid=nf_inst_id).status, VNF_STATUS.ACTIVE)
1171 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, JOB_PROGRESS.FINISHED)
1173 def test_create_vnf_thread_when_the_name_of_vnf_instance_already_exists(self):
1174 NfInstModel(nf_name="").save()
1175 nf_inst_id, job_id = create_vnfs.prepare_create_params()
1177 "ns_instance_id": ignore_case_get(self.data, "nsInstanceId"),
1178 "additional_param_for_ns": ignore_case_get(self.data, "additionalParamForNs"),
1179 "additional_param_for_vnf": ignore_case_get(self.data, "additionalParamForVnf"),
1180 "vnf_index": ignore_case_get(self.data, "vnfIndex")
1182 CreateVnfs(data, nf_inst_id, job_id).run()
1183 self.assertEqual(NfInstModel.objects.get(nfinstid=nf_inst_id).status, VNF_STATUS.FAILED)
1184 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, JOB_PROGRESS.ERROR)
1186 @mock.patch.object(time, "sleep")
1187 @mock.patch.object(restcall, "call_req")
1188 def test_create_vnf_thread_when_data_has_vnfd_id(self, mock_call_req, mock_sleep):
1189 mock_sleep.return_value = None
1190 nf_inst_id, job_id = create_vnfs.prepare_create_params()
1192 "/api/catalog/v1/vnfpackages/data_has_vnfd_id":
1193 [0, json.JSONEncoder().encode(nf_package_info), "200"],
1194 "/external-system/esr-vnfm-list/esr-vnfm/1?depth=all":
1195 [0, json.JSONEncoder().encode(vnfm_info), "200"],
1196 "/api/ztevnfmdriver/v1/1/vnfs":
1197 [0, json.JSONEncoder().encode({"jobId": self.job_id, "vnfInstanceId": 3}), "200"],
1198 "/api/oof/v1/placement":
1199 [0, json.JSONEncoder().encode({}), "202"],
1200 "/api/resmgr/v1/vnf":
1201 [0, json.JSONEncoder().encode({}), "200"],
1202 "/api/ztevnfmdriver/v1/1/jobs/" + self.job_id + "?responseId=0":
1203 [0, json.JSONEncoder().encode({"jobid": self.job_id,
1204 "responsedescriptor": {"progress": "100",
1205 "status": JOB_MODEL_STATUS.FINISHED,
1207 "statusdescription": "creating",
1209 "responsehistorylist": [
1211 "status": JOB_MODEL_STATUS.PROCESSING,
1213 "statusdescription": "creating",
1214 "errorcode": "0"}]}}), "200"],
1215 "api/gvnfmdriver/v1/1/subscriptions":
1216 [0, json.JSONEncoder().encode({}), "200"],
1217 "/api/resmgr/v1/vnfinfo":
1218 [0, json.JSONEncoder().encode(subscription_response_data), "200"]
1221 def side_effect(*args):
1222 return mock_vals[args[4]]
1224 mock_call_req.side_effect = side_effect
1225 self.data["additionalParamForVnf"][0]["additionalparam"]["vnfdId"] = "data_has_vnfd_id"
1227 "ns_instance_id": ignore_case_get(self.data, "nsInstanceId"),
1228 "additional_param_for_ns": ignore_case_get(self.data, "additionalParamForNs"),
1229 "additional_param_for_vnf": ignore_case_get(self.data, "additionalParamForVnf"),
1230 "vnf_index": ignore_case_get(self.data, "vnfIndex")
1232 CreateVnfs(data, nf_inst_id, job_id).run()
1233 self.assertEqual(NfInstModel.objects.get(nfinstid=nf_inst_id).status, VNF_STATUS.ACTIVE)
1234 self.assertEqual(JobModel.objects.get(jobid=job_id).progress, JOB_PROGRESS.FINISHED)
1236 @mock.patch.object(restcall, "call_req")
1237 @mock.patch.object(CreateVnfs, "build_homing_request")
1238 def test_send_homing_request(self, mock_build_req, mock_call_req):
1239 nf_inst_id, job_id = create_vnfs.prepare_create_params()
1240 OOFDataModel.objects.all().delete()
1242 "requestId": "1234",
1243 "transactionId": "1234",
1244 "requestStatus": "accepted"
1246 mock_build_req.return_value = {
1248 "transactionId": "1234",
1249 "requestId": "1234",
1250 "callbackUrl": "xx",
1252 "requestType": "create",
1254 "optimizers": ["placement"],
1258 "placementDemands": [
1260 "resourceModuleName": "vG",
1261 "serviceResourceId": "1234",
1262 "resourceModelInfo": {
1263 "modelInvariantId": "1234",
1264 "modelVersionId": "1234"
1270 "serviceInstanceId": "1234",
1271 "serviceName": "1234",
1273 "modelInvariantId": "5678",
1274 "modelVersionId": "7890"
1278 mock_call_req.return_value = [0, json.JSONEncoder().encode(resp), "202"]
1280 "ns_instance_id": ignore_case_get(self.data, "nsInstanceId"),
1281 "additional_param_for_ns": ignore_case_get(self.data, "additionalParamForNs"),
1282 "additional_param_for_vnf": ignore_case_get(self.data, "additionalParamForVnf"),
1283 "vnf_index": ignore_case_get(self.data, "vnfIndex")
1285 CreateVnfs(data, nf_inst_id, job_id).send_homing_request_to_OOF()
1286 ret = OOFDataModel.objects.filter(request_id="1234", transaction_id="1234")
1287 self.assertIsNotNone(ret)