Merge "Add additional unit tests and asserts for NS Heal."
authorFu Jinhua <fu.jinhua@zte.com.cn>
Sat, 26 Aug 2017 02:22:25 +0000 (02:22 +0000)
committerGerrit Code Review <gerrit@onap.org>
Sat, 26 Aug 2017 02:22:25 +0000 (02:22 +0000)
lcm/ns/ns_heal.py
lcm/ns/tests/test_ns_heal.py
lcm/ns/tests/vnfs/tests.py
lcm/ns/vnfs/heal_vnfs.py

index 6973e46..a9cbc32 100644 (file)
@@ -19,7 +19,7 @@ import datetime
 import time
 
 from lcm.ns.const import NS_INST_STATUS
-from lcm.pub.database.models import JobModel, NSInstModel
+from lcm.pub.database.models import JobModel, NSInstModel, NfInstModel
 from lcm.ns.vnfs.heal_vnfs import NFHealService
 from lcm.pub.exceptions import NSLCMException
 from lcm.pub.utils.jobutil import JobUtil, JOB_MODEL_STATUS
@@ -49,13 +49,17 @@ class NSHealService(threading.Thread):
 
     def do_biz(self):
         self.update_job(1, desc='ns heal start')
-        self.update_ns_status(NS_INST_STATUS.HEALING)
         self.get_and_check_params()
+        self.update_ns_status(NS_INST_STATUS.HEALING)
         self.do_vnfs_heal()
         self.update_ns_status(NS_INST_STATUS.ACTIVE)
         self.update_job(100, desc='ns heal success')
 
     def get_and_check_params(self):
+        ns_info = NSInstModel.objects.filter(id=self.ns_instance_id)
+        if not ns_info:
+            logger.error('NS [id=%s] does not exist' % self.ns_instance_id)
+            raise NSLCMException('NS [id=%s] does not exist' % self.ns_instance_id)
         self.heal_vnf_data = ignore_case_get(self.request_data, 'healVnfData')
         if not self.heal_vnf_data:
             logger.error('healVnfData parameter does not exist or value is incorrect.')
index 87cd174..0d77dbc 100644 (file)
 # limitations under the License.
 
 import mock
-import uuid
+
 from rest_framework import status
 from django.test import TestCase
 from django.test import Client
-from lcm.pub.database.models import NSDModel, NSInstModel
+from lcm.pub.database.models import NSInstModel, NfInstModel
 from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE
 from lcm.ns.const import NS_INST_STATUS
 from lcm.pub.utils import restcall
+from lcm.pub.exceptions import NSLCMException
 from lcm.ns.ns_heal import NSHealService
 
 
 class TestHealNsViews(TestCase):
     def setUp(self):
-        self.nsd_id = str(uuid.uuid4())
-        self.ns_package_id = str(uuid.uuid4())
-        self.ns_inst_id = str(uuid.uuid4())
+
+        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)
-        NSDModel(id=self.ns_package_id, nsd_id=self.nsd_id, name='name').save()
 
         self.client = Client()
-        self.context = '{"vnfs": ["a", "b"], "sfcs": ["c"], "vls": ["d", "e", "f"]}'
-        NSInstModel(id=self.ns_inst_id, name="abc", nspackage_id="7", nsd_id="111").save()
+
+        model = '{"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(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):
         NSInstModel.objects.filter().delete()
+        NfInstModel.objects.filter().delete()
 
     @mock.patch.object(NSHealService, 'run')
-    def test_ns_heal(self, mock_run):
+    def test_heal_vnf_url(self, mock_run):
         data = {
-            'nsdid': self.nsd_id,
-            'nsname': 'ns',
-            'description': 'description'}
-        response = self.client.post("/api/nslcm/v1/ns/%s/heal" % self.nsd_id, data=data)
-        self.failUnlessEqual(status.HTTP_202_ACCEPTED, response.status_code)
+            "healVnfData": {
+                "vnfInstanceId": self.nf_inst_id,
+                "cause": "vm is down",
+                "additionalParams": {
+                    "action": "restartvm",
+                    "actionvminfo": {
+                        "vmid": "33",
+                        "vmname": "xgw-smp11"
+                    }
+                }
+            }
+        }
+
+        response = self.client.post("/api/nslcm/v1/ns/%s/heal" % self.ns_inst_id, data=data)
+        self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code)
+        self.assertIsNotNone(response.data)
+        self.assertIn("jobId", response.data)
+        self.assertNotIn("error", response.data)
 
-    @mock.patch.object(restcall, 'call_req')
-    def test_ns_heal_thread(self, mock_call):
+        response = self.client.delete("/api/nslcm/v1/ns/%s" % self.ns_inst_id)
+        self.assertEqual(status.HTTP_204_NO_CONTENT, response.status_code)
+
+    @mock.patch.object(NSHealService, 'start')
+    @mock.patch.object(NSHealService, 'wait_job_finish')
+    @mock.patch.object(NSHealService, 'update_job')
+    def test_ns_manual_scale_thread(self, mock_start, mock_wait, mock_update):
 
         data = {
-            'nsdid': self.nsd_id,
-            'nsname': 'ns',
-            'description': 'description'
+            "healVnfData": {
+                "vnfInstanceId": self.nf_inst_id,
+                "cause": "vm is down",
+                "additionalParams": {
+                    "action": "restartvm",
+                    "actionvminfo": {
+                        "vmid": "33",
+                        "vmname": "xgw-smp11"
+                    }
+                }
+            }
         }
 
         NSHealService(self.ns_inst_id, data, self.job_id).run()
@@ -63,3 +100,39 @@ class TestHealNsViews(TestCase):
     def test_swagger_ok(self):
         resp = self.client.get("/api/nslcm/v1/swagger.json", format='json')
         self.assertEqual(resp.status_code, status.HTTP_200_OK)
+
+    @mock.patch.object(NSHealService, "start")
+    def test_ns_heal_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("/api/nslcm/v1/ns/%s/heal" % ns_inst_id, data=data)
+        self.assertEqual(response.data["error"], "NS Not Found")
+        self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
+        self.assertIn("error", response.data)
+
+    @mock.patch.object(NSHealService, "start")
+    def test_ns_heal_empty_post(self, mock_start):
+        mock_start.side_effect = NSLCMException("healVnfData parameter does not exist or value is incorrect.")
+
+        data = {}
+
+        response = self.client.post("/api/nslcm/v1/ns/%s/heal" % self.ns_inst_id, data=data)
+        self.assertEqual(response.data["error"], "healVnfData parameter does not exist or value is incorrect.")
+        self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
+        self.assertIn("error", response.data)
index 4b78963..73cecd9 100644 (file)
@@ -30,6 +30,7 @@ from lcm.ns.vnfs.terminate_nfs import TerminateVnfs
 from lcm.ns.vnfs.scale_vnfs import NFManualScaleService
 from lcm.ns.vnfs.heal_vnfs import NFHealService
 from lcm.pub.utils.jobutil import JobUtil, JOB_TYPE
+from lcm.pub.exceptions import NSLCMException
 
 
 class TestGetVnfViews(TestCase):
@@ -308,6 +309,8 @@ class TestHealVnfViews(TestCase):
         self.nf_inst_id = str(uuid.uuid4())
         self.nf_uuid = '111'
 
+        self.job_id = JobUtil.create_job("VNF", JOB_TYPE.HEAL_VNF, self.nf_inst_id)
+
         NSInstModel(id=self.ns_inst_id, name="ns_name").save()
         NfInstModel.objects.create(nfinstid=self.nf_inst_id, nf_name='name_1', vnf_id='1',
                                    vnfm_inst_id='1', ns_inst_id='111,2-2-2',
@@ -326,21 +329,63 @@ class TestHealVnfViews(TestCase):
     @mock.patch.object(restcall, "call_req")
     def test_heal_vnf(self, mock_call_req):
 
+
+        mock_vals = {
+            "/api/ztevmanagerdriver/v1/1/vnfs/111/heal":
+                [0, json.JSONEncoder().encode({"jobId": self.job_id}), '200'],
+            "/api/extsys/v1/vnfms/1":
+                [0, json.JSONEncoder().encode({"name": 'vnfm1', "type": 'ztevmanagerdriver'}), '200'],
+            "/api/resmgr/v1/vnf/1":
+                [0, json.JSONEncoder().encode({"jobId": self.job_id}), '200'],
+            "/api/ztevmanagerdriver/v1/1/jobs/" + self.job_id + "?responseId=0":
+                [0, json.JSONEncoder().encode({"jobId": self.job_id,
+                                               "responsedescriptor": {"progress": "100",
+                                                                      "status": JOB_MODEL_STATUS.FINISHED,
+                                                                      "responseid": "3",
+                                                                      "statusdescription": "creating",
+                                                                      "errorcode": "0",
+                                                                      "responsehistorylist": [
+                                                                          {"progress": "0",
+                                                                           "status": JOB_MODEL_STATUS.PROCESSING,
+                                                                           "responseid": "2",
+                                                                           "statusdescription": "creating",
+                                                                           "errorcode": "0"}]}}), '200']}
+
+        def side_effect(*args):
+            return mock_vals[args[4]]
+
+        mock_call_req.side_effect = side_effect
+
         req_data = {
             "action": "vmReset",
             "affectedvm": {
-                "vmid": 1,
-                "vduid": 1,
+                "vmid": "1",
+                "vduid": "1",
                 "vmname": "name",
             }
         }
 
-        NFHealService(self.ns_inst_id, req_data).run()
-        nsIns = NfInstModel.objects.filter(nfinstid=self.nf_inst_id)
-        if nsIns:
-            self.failUnlessEqual(1, 1)
-        else:
-            self.failUnlessEqual(1, 0)
+        NFHealService(self.nf_inst_id, req_data).run()
+
+        self.assertEqual(NfInstModel.objects.get(nfinstid=self.nf_inst_id).status, VNF_STATUS.ACTIVE)
+
+    @mock.patch.object(NFHealService, "run")
+    def test_heal_vnf_non_existing_vnf(self, mock_biz):
+        mock_biz.side_effect = NSLCMException("VNF Not Found")
+
+        nf_inst_id = "1"
+
+        req_data = {
+            "action": "vmReset",
+            "affectedvm": {
+                "vmid": "1",
+                "vduid": "1",
+                "vmname": "name",
+            }
+        }
+
+        self.assertRaises(NSLCMException, NFHealService(nf_inst_id, req_data).run)
+        self.assertEqual(len(NfInstModel.objects.filter(nfinstid=nf_inst_id)), 0)
 
 vnfd_model_dict = {
     'local_storages': [],
index a8a1ed6..d6ad152 100644 (file)
@@ -54,8 +54,8 @@ class NFHealService(threading.Thread):
 
     def do_biz(self):
         self.update_job(1, desc='nf heal start')
-        self.update_nf_status(VNF_STATUS.HEALING)
         self.get_and_check_params()
+        self.update_nf_status(VNF_STATUS.HEALING)
         self.send_nf_healing_request()
         self.update_nf_status(VNF_STATUS.ACTIVE)
         self.update_job(100, desc='nf heal success')