From 85a2c699512811122940d6896a0f40f3749527c8 Mon Sep 17 00:00:00 2001 From: maopengzhang Date: Wed, 27 Mar 2019 14:02:35 +0800 Subject: [PATCH] add NS heal test usecase add NS heal test usecase Change-Id: I8a011d6b1acdc0df7473acd35507b4a4edfd4a26 Issue-ID: VFC-1215 Signed-off-by: maopengzhang --- lcm/ns/biz/ns_terminate.py | 1 + lcm/ns/tests/test_sol_ns_heal_api.py | 173 +++++++++++++++++++++ ...stantiate.py => test_sol_ns_instantiate_api.py} | 18 ++- ...s_terminate.py => test_sol_ns_terminate_api.py} | 15 +- 4 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 lcm/ns/tests/test_sol_ns_heal_api.py rename lcm/ns/tests/{test_sol_ns_instantiate.py => test_sol_ns_instantiate_api.py} (91%) rename lcm/ns/tests/{test_sol_ns_terminate.py => test_sol_ns_terminate_api.py} (74%) diff --git a/lcm/ns/biz/ns_terminate.py b/lcm/ns/biz/ns_terminate.py index 4bc9d430..701e65c6 100644 --- a/lcm/ns/biz/ns_terminate.py +++ b/lcm/ns/biz/ns_terminate.py @@ -45,6 +45,7 @@ class TerminateNsService(threading.Thread): try: if not NSInstModel.objects.filter(id=self.ns_inst_id): JobUtil.add_job_status(self.job_id, 100, "Need not terminate.", '') + NsLcmOpOcc.update(self.occ_id, "COMPLETED") return JobUtil.add_job_status(self.job_id, 10, "Starting terminate...", '') diff --git a/lcm/ns/tests/test_sol_ns_heal_api.py b/lcm/ns/tests/test_sol_ns_heal_api.py new file mode 100644 index 00000000..8ff4ced5 --- /dev/null +++ b/lcm/ns/tests/test_sol_ns_heal_api.py @@ -0,0 +1,173 @@ +# Copyright 2019 ZTE Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import json + +import mock +from django.test import Client +from django.test import TestCase +from rest_framework import status + +from lcm.ns.biz.ns_heal import NSHealService +from lcm.pub.database.models import NSInstModel, NfInstModel +from lcm.pub.exceptions import NSLCMException +from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE + + +class TestHealNsApi(TestCase): + def setUp(self): + self.url = "/api/nslcm/v1/ns_instances/%s/heal" + self.ns_inst_id = '1' + self.nf_inst_id = '1' + self.nf_uuid = '1-1-1' + + self.job_id = JobUtil.create_job("NS", JOB_TYPE.HEAL_VNF, self.ns_inst_id) + + self.client = Client() + + model = json.dumps({ + "metadata": { + "vnfdId": "1", + "vnfdName": "PGW001", + "vnfProvider": "zte", + "vnfdVersion": "V00001", + "vnfVersion": "V5.10.20", + "productType": "CN", + "vnfType": "PGW", + "description": "PGW VNFD description", + "isShared": True, + "vnfExtendType": "driver" + } + }) + NSInstModel.objects.filter().delete() + NfInstModel.objects.filter().delete() + NSInstModel(id=self.ns_inst_id, name="ns_name", status='null').save() + NfInstModel.objects.create(nfinstid=self.nf_inst_id, + nf_name='name_1', + vnf_id='1', + vnfm_inst_id='1', + ns_inst_id=self.ns_inst_id, + max_cpu='14', + max_ram='12296', + max_hd='101', + max_shd="20", + max_net=10, + status='null', + mnfinstid=self.nf_uuid, + package_id='pkg1', + vnfd_model=model) + + def tearDown(self): + pass + + @mock.patch.object(NSHealService, 'run') + def test_heal_vnf_url(self, mock_run): + + data = { + "healVnfData": [{ + "vnfInstanceId": self.nf_inst_id, + "cause": "vm is down", + "additionalParams": { + "action": "restartvm", + "actionvminfo": { + "vmid": "33", + "vduid": "", + "vmname": "xgw-smp11" + } + } + }] + } + + response = self.client.post(self.url % self.ns_inst_id, data=data) + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code, response.data) + self.assertIsNotNone(response.data) + self.assertIsNotNone(response['Location']) + + # add healNsData + + @mock.patch.object(NSHealService, 'run') + def test_heal_ns_url(self, mock_run): + + data = { + "healNsData": { + "vnfInstanceId": self.nf_inst_id, + "cause": "", + "additionalParams": { + "action": "vmreset", + "actionvminfo": { + "vmid": "33", + "vduid": "", + "vmname": "xgw-smp11" + } + } + } + } + + response = self.client.post(self.url % self.ns_inst_id, data=data) + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code, response.data) + self.assertIsNotNone(response['Location']) + + @mock.patch.object(NSHealService, "start") + def test_heal_vnf_non_existing_ns(self, mock_start): + mock_start.side_effect = NSLCMException("NS Not Found") + + ns_inst_id = "2" + + data = { + "healVnfData": [{ + "vnfInstanceId": self.nf_inst_id, + "cause": "vm is down", + "additionalParams": { + "action": "restartvm", + "actionvminfo": { + "vmid": "33", + "vmname": "xgw-smp11" + } + } + }] + } + + response = self.client.post(self.url % ns_inst_id, data=data) + self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) + + # add healNsData + @mock.patch.object(NSHealService, "start") + def test_heal_ns_heal_non_existing_ns(self, mock_start): + mock_start.side_effect = NSLCMException("NS Not Found") + + ns_inst_id = "2" + + data = { + "healNsData": { + "vnfInstanceId": self.nf_inst_id, + "cause": "", + "additionalParams": { + "action": "vmreset", + "actionvminfo": { + "vmid": "33", + "vduid": "", + "vmname": "xgw-smp11" + } + } + } + } + + response = self.client.post(self.url % ns_inst_id, data=data) + self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) + + @mock.patch.object(NSHealService, "start") + def test_heal_vnf_empty_post(self, mock_start): + mock_start.side_effect = NSLCMException("healVnfData parameter does not exist or value is incorrect.") + response = self.client.post(self.url % self.ns_inst_id, data={}) + self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR) diff --git a/lcm/ns/tests/test_sol_ns_instantiate.py b/lcm/ns/tests/test_sol_ns_instantiate_api.py similarity index 91% rename from lcm/ns/tests/test_sol_ns_instantiate.py rename to lcm/ns/tests/test_sol_ns_instantiate_api.py index 791bb1dd..37e9eda6 100644 --- a/lcm/ns/tests/test_sol_ns_instantiate.py +++ b/lcm/ns/tests/test_sol_ns_instantiate_api.py @@ -224,7 +224,7 @@ nsd = json.dumps({ vnfminfo = {"vnfmId": "1"} -class TestInstantiateNs(TestCase): +class TestInstantiateNsApi(TestCase): def setUp(self): self.client = APIClient() @@ -305,8 +305,9 @@ class TestInstantiateNs(TestCase): [0, self.vnfms, '200'], [0, self.vnfm, '200'] ] - resp = self.client.post(self.url % '2', data=self.req_data, format='json') - self.assertEqual(status.HTTP_202_ACCEPTED, resp.status_code) + response = self.client.post(self.url % '2', data=self.req_data, format='json') + self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code) + self.assertIsNotNone(response['Location']) @mock.patch.object(InstantNSService, 'do_biz') def test_ns_instantiate_normal(self, mock_do_biz): @@ -354,3 +355,14 @@ class TestInstantiateNs(TestCase): } response = self.client.post(self.url % '1', data=data, format='json') self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + self.assertIsNotNone(response['Location']) + + def test_method_not_allowed(self): + response = self.client.put(self.url % '1', data=self.req_data, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.patch(self.url % '1', data=self.req_data, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.delete(self.url % '1', data=self.req_data, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.get(self.url % '1', data=self.req_data, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) diff --git a/lcm/ns/tests/test_sol_ns_terminate.py b/lcm/ns/tests/test_sol_ns_terminate_api.py similarity index 74% rename from lcm/ns/tests/test_sol_ns_terminate.py rename to lcm/ns/tests/test_sol_ns_terminate_api.py index 7d6c52bb..0027312a 100644 --- a/lcm/ns/tests/test_sol_ns_terminate.py +++ b/lcm/ns/tests/test_sol_ns_terminate_api.py @@ -21,7 +21,7 @@ from lcm.ns.biz.ns_terminate import TerminateNsService from lcm.pub.database.models import NfInstModel, NSInstModel -class TestTerminateNsViews(TestCase): +class TestTerminateNsApi(TestCase): def setUp(self): self.client = Client() self.url = "/api/nslcm/v1/ns_instances/%s/terminate" @@ -56,8 +56,19 @@ class TestTerminateNsViews(TestCase): NfInstModel.objects.all().delete() @mock.patch.object(TerminateNsService, 'run') - def test_terminate_vnf_url(self, mock_run): + def test_terminate_vnf(self, mock_run): mock_run.re.return_value = "1" req_data = {} response = self.client.post(self.url % self.ns_inst_id, data=req_data) self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code) + self.assertIsNotNone(response['Location']) + + def test_method_not_allowed(self): + response = self.client.put(self.url % '1', data={}, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.patch(self.url % '1', data={}, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.delete(self.url % '1', data={}, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) + response = self.client.get(self.url % '1', data={}, format='json') + self.failUnlessEqual(status.HTTP_405_METHOD_NOT_ALLOWED, response.status_code) -- 2.16.6