Fix vnf heal logic 16/73316/4
authorfujinhua <fu.jinhua@zte.com.cn>
Thu, 22 Nov 2018 01:20:21 +0000 (09:20 +0800)
committerfujinhua <fu.jinhua@zte.com.cn>
Thu, 22 Nov 2018 02:11:02 +0000 (10:11 +0800)
Change-Id: I05edef058cceef70f250731bde114534eadbfe4d
Issue-ID: VFC-1163
Signed-off-by: fujinhua <fu.jinhua@zte.com.cn>
lcm/lcm/nf/biz/heal_vnf.py
lcm/lcm/nf/tests/test_heal_vnf.py
lcm/lcm/nf/views/heal_vnf_view.py
lcm/lcm/pub/vimapi/adaptor.py

index 4b50342..4d32d50 100644 (file)
@@ -70,7 +70,7 @@ class HealVnf(Thread):
 
     def heal_pre(self):
         if self.action not in (HEAL_ACTION_TYPE.START, HEAL_ACTION_TYPE.RESTART):
-            raise NFLCMException("Action type in Request in invalid. Should be %s or %s" % (HEAL_ACTION_TYPE.START, HEAL_ACTION_TYPE.RESTART))
+            raise NFLCMException("Action should be %s or %s" % (HEAL_ACTION_TYPE.START, HEAL_ACTION_TYPE.RESTART))
 
         self.vm_id = ignore_case_get(self.affectedvm, "vmid")
         self.vdu_id = ignore_case_get(self.affectedvm, "vduid")
@@ -83,21 +83,24 @@ class HealVnf(Thread):
 
     def apply_grant(self):
         if self.action == HEAL_ACTION_TYPE.RESTART:
-            self.vdu = VmInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id, vmname=self.vm_name)
+            self.vdu = VmInstModel.objects.filter(instid=self.nf_inst_id, resourceid=self.vm_id)
             if not self.vdu:
-                raise NFLCMException("VNF Vm does not exist.")
+                raise NFLCMException("VNF Vm(%s) does not exist." % self.vm_id)
             self.vimid = self.vdu[0].vimid
             self.tenant = self.vdu[0].tenant
-        elif self.action == HEAL_ACTION_TYPE.START:
-            vdus = ignore_case_get(self.vnfd_info, "vdus")
-            self.vdu = [elem for elem in vdus if ignore_case_get(elem, "vdu_id") == self.vdu_id]
-            if not self.vdu:
-                raise NFLCMException("VNF Vm does not exist.")
+            logger.debug("Get heal vnf vm(%s,%s) info successfully.", self.vm_id, self.vm_name)
+            JobUtil.add_job_status(self.job_id, 20, 'Nf Healing get vnf vm info finish')
+            return
+
+        vdus = ignore_case_get(self.vnfd_info, "vdus")
+        self.vdu = [elem for elem in vdus if ignore_case_get(elem, "vdu_id") == self.vdu_id]
+        if not self.vdu:
+            raise NFLCMException("VNF Vdu(%s) does not exist." % self.vdu_id)
         apply_result = grant_resource(data=self.data, nf_inst_id=self.nf_inst_id, job_id=self.job_id,
                                       grant_type=self.grant_type, vdus=self.vdu)
-        if self.action == HEAL_ACTION_TYPE.START:
-            self.vimid = ignore_case_get(apply_result, "vimid"),
-            self.tenant = ignore_case_get(apply_result, "tenant")
+
+        self.vimid = ignore_case_get(apply_result, "vimid"),
+        self.tenant = ignore_case_get(apply_result, "tenant")
         logger.info("Grant resource, response: %s" % apply_result)
         JobUtil.add_job_status(self.job_id, 20, 'Nf Healing grant_resource finish')
 
@@ -133,7 +136,7 @@ class HealVnf(Thread):
                 chtype = CHANGE_TYPE.MODIFIED
             vnfcs = VNFCInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id)
             vm_resource = {}
-            vm = VmInstModel.objects.filter(instid=self.nf_inst_id, vmid=self.vm_id)
+            vm = VmInstModel.objects.filter(instid=self.nf_inst_id, resourceid=self.vm_id)
             if vm:
                 vm_resource = {
                     'vimConnectionId': vm[0].vimid,
index 27cce09..08721b7 100644 (file)
@@ -54,13 +54,6 @@ class TestNFInstantiate(TestCase):
         response = self.client.post("/api/vnflcm/v1/vnf_instances/12/heal", data=req_data, format='json')\r
         self.failUnlessEqual(status.HTTP_404_NOT_FOUND, response.status_code)\r
 \r
-    def test_heal_vnf_conflict(self):\r
-        req_data = {}\r
-        NfInstModel(nfinstid='12', nf_name='VNF1', status='NOT_INSTANTIATED').save()\r
-        response = self.client.post("/api/vnflcm/v1/vnf_instances/12/heal", data=req_data, format='json')\r
-        self.failUnlessEqual(status.HTTP_409_CONFLICT, response.status_code)\r
-        NfInstModel(nfinstid='12', nf_name='VNF1', status='NOT_INSTANTIATED').delete()\r
-\r
     @mock.patch.object(HealVnf, 'run')\r
     def test_heal_vnf_success(self, mock_run):\r
         req_data = {}\r
@@ -96,7 +89,7 @@ class TestNFInstantiate(TestCase):
 \r
         VmInstModel.objects.create(vmid="1",\r
                                    vimid="vimid_1",\r
-                                   resourceid="11",\r
+                                   resourceid="1",\r
                                    insttype=0,\r
                                    instid="1111",\r
                                    vmname="vduinstname",\r
index 6b3b313..4c2fad0 100644 (file)
@@ -81,9 +81,6 @@ class HealVnfView(APIView):
         if not vnf_insts.exists():\r
             raise NFLCMExceptionNotFound("VNF nf_inst_id does not exist.")\r
 \r
-        if vnf_insts[0].status != 'INSTANTIATED':\r
-            raise NFLCMExceptionConflict("VNF instantiationState is not INSTANTIATED.")\r
-\r
         NfInstModel.objects.filter(nfinstid=nf_inst_id).update(status=VNF_STATUS.HEALING)\r
         JobUtil.add_job_status(job_id, 15, 'Nf healing pre-check finish')\r
         logger.info("Nf healing pre-check finish")\r
index 3b959c4..bffdcbe 100644 (file)
@@ -88,6 +88,7 @@ def action_vm(action_type, server, vimId, tenantId):
         else:
             param["reboot"]["type"] = "HARD"
     res_id = server["id"]
+    logger.debug("%s,%s,%s,%s", vimId, tenantId, res_id, param)
     api.action_vm(vimId, tenantId, res_id, param)
 
 
@@ -116,15 +117,20 @@ def heal_vim_res(vdus, vnfd_info, do_notify, data, vim_cache, res_cache):
         vimid = data["vimid"]
         tenant = data["tenant"]
         actionType = data["action"]
+        resid = ''
         if actionType == HEAL_ACTION_TYPE.START:
+            resid = vdus[0]["vdu_id"]
             create_vm(vim_cache, res_cache, vnfd_info, vdus[0], do_notify, RES_VM)
         elif actionType == HEAL_ACTION_TYPE.RESTART:
+            resid = vdus[0].resourceid
+            logger.debug("Start restart vm(%s)", resid)
             vm_info = api.get_vm(vimid, tenant, vdus[0].resourceid)
+            logger.debug("vminfo=%s", vm_info)
             action_vm(ACTION_TYPE.REBOOT, vm_info, vimid, tenant)
     except VimException as e:
-        logger.error("Failed to Heal %s(%s)", RES_VM, vdus[0]["vdu_id"])
+        logger.error("Failed to Heal %s(%s)", RES_VM, resid)
         logger.error("%s:%s", e.http_code, e.message)
-        raise NFLCMException("Failed to Heal %s(%s)", RES_VM, vdus[0]["vdu_id"])
+        raise NFLCMException("Failed to Heal %s(%s)" % (RES_VM, resid))
 
 
 def create_vim_res(data, do_notify, vim_cache={}, res_cache={}):