Add code to delete ns by force 21/14021/2
authorfengyuanxing <feng.yuanxing@zte.com.cn>
Thu, 21 Sep 2017 02:34:37 +0000 (10:34 +0800)
committerfengyuanxing <feng.yuanxing@zte.com.cn>
Thu, 21 Sep 2017 02:37:43 +0000 (10:37 +0800)
Change-Id: Iae931b6001a347c35abc368ab3a2b94ed414ae89
Issue-Id: VFC-373
Signed-off-by: fengyuanxing <feng.yuanxing@zte.com.cn>
catalog/packages/nf_package.py
catalog/packages/ns_package.py
catalog/packages/tests.py
catalog/pub/msapi/nslcm.py

index a89c826..ec8bdcd 100644 (file)
@@ -184,7 +184,7 @@ class NfPkgDeleteThread(threading.Thread):
             if NfInstModel.objects.filter(package_id=self.csar_id):
                 raise CatalogException("NfInst by csar(%s) exists, cannot delete." % self.csar_id)
         '''
-        nslcm.delete_nf_inst_mock()
+        nslcm.delete_nf_inst(self.csar_id)
         JobUtil.add_job_status(self.job_id, 50, "Delete CSAR(%s) from Database." % self.csar_id)
 
         if not VnfPackageModel.objects.filter(vnfPackageId=self.csar_id):
index a814130..5bd9808 100644 (file)
@@ -52,13 +52,15 @@ def ns_on_distribute(csar_id):
 
 def ns_delete_csar(csar_id, force_delete):
     ret = None
+    nsinstances = []
     try:
         if force_delete: 
-            ret = NsPackage().delete_csar(csar_id)
+            ret = NsPackage().delete_csar(csar_id,True)
             return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
-        if nslcm.get_nsInstances(csar_id):
-            return fmt_ns_pkg_rsp(STATUS_FAILED, 
-                "NS instances using CSAR(%s) already exists!" % csar_id)
+        nsinstances = nslcm.get_nsInstances(csar_id)
+        if nsinstances:
+            if len(nsinstances) > 0:
+                return fmt_ns_pkg_rsp(STATUS_FAILED, "NS instances using the CSAR exists!",status.HTTP_412_PRECONDITION_FAILED)
         ret = NsPackage().delete_csar(csar_id)
         return fmt_ns_pkg_rsp(STATUS_SUCCESS, ret[1], "")
     except CatalogException as e:
@@ -154,14 +156,14 @@ class NsPackage(object):
 
         return nsd, local_file_name, nsd_json
 
-    def delete_csar(self, csar_id):
-        '''
+    def delete_csar(self, csar_id,force_delete = False):
         if force_delete:
-            NSInstModel.objects.filter(nspackage_id=csar_id).delete()
+            nslcm.delete_all_nsinst(csar_id)
         else:
-            if NSInstModel.objects.filter(nspackage_id=csar_id):
+            nsinstances = nslcm.get_nsInstances(csar_id)
+            if nsinstances and len(nsinstances) > 0:
                 raise CatalogException("CSAR(%s) is in using, cannot be deleted." % csar_id)
-        '''
+
         NSPackageModel.objects.filter(nsPackageId=csar_id).delete()
         return [0, "Delete CSAR(%s) successfully." % csar_id]
 
index dd3d059..b895f11 100644 (file)
@@ -120,7 +120,8 @@ class PackageTest(unittest.TestCase):
     @mock.patch.object(NfDistributeThread, 'get_vnfd')
     @mock.patch.object(NsPackage,'get_nsd')
     @mock.patch.object(nslcm, 'get_nsInstances')
-    def test_ns_package_delete(self, mock_get_nsInstances,mock_get_nsd,mock_get_vnfd):
+    @mock.patch.object(nslcm, 'delete_all_nsinst')
+    def test_ns_package_delete(self, mock_delete_all_nsinst,mock_get_nsInstances,mock_get_nsd,mock_get_vnfd):
 
         # First distribute a VNF
         local_file_name = "/url/local/filename"
@@ -141,6 +142,7 @@ class PackageTest(unittest.TestCase):
 
         # Finally delete ns package
         mock_get_nsInstances.return_value = []
+        mock_delete_all_nsinst.return_values = [0, "success"]
         response = self.client.delete("/api/catalog/v1/nspackages/" + str(self.ns_csarId))
         self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code, response.content)
         self.assertEqual("Delete CSAR(123) successfully.", response.data["statusDescription"], response.content)
@@ -149,7 +151,8 @@ class PackageTest(unittest.TestCase):
     @mock.patch.object(NfDistributeThread, 'get_vnfd')
     @mock.patch.object(NsPackage,'get_nsd')
     @mock.patch.object(nslcm, 'get_nsInstances')
-    def test_ns_package_delete_force(self, mock_get_nsInstances,mock_get_nsd,mock_get_vnfd):
+    @mock.patch.object(nslcm, 'delete_all_nsinst')
+    def test_ns_package_delete_force(self, mock_delete_all_nsinst, mock_get_nsInstances,mock_get_nsd,mock_get_vnfd):
 
         # First distribute a VNF
         local_file_name = "/url/local/filename"
@@ -170,6 +173,7 @@ class PackageTest(unittest.TestCase):
 
         # Finally delete ns package
         mock_get_nsInstances.return_value = [{"csarid":"1"},{"csarid":"2"}]
+        mock_delete_all_nsinst.return_values = [0, "success"]
         response = self.client.delete("/api/catalog/v1/nspackages/%sforce"% str(self.ns_csarId))
         self.assertEqual(status.HTTP_202_ACCEPTED, response.status_code, response.content)
         self.assertEqual("Delete CSAR(123) successfully.", response.data["statusDescription"], response.content)
index 33e169c..27054b0 100644 (file)
@@ -50,6 +50,22 @@ def get_vnfInstances(csarid):
         raise CatalogException("Failed to query VNF Instances(%s) from NSLCM." % csarid)
     return json.JSONDecoder().decode(ret[1])
 
+def delete_all_nsinst(csarid):
+    nsinstances = get_nsInstances(csarid)
+    for ns in nsinstances:
+        nsInstanceId = ns["nsInstanceId"]
+        ret=req_by_msb("/nslcm/v1/ns/%s" % nsInstanceId,"delete")
+        if ret[0] != 0:
+            logger.error("Status code is %s, detail is %s.", ret[2], ret[1])
+            raise CatalogException("Failed to delete NS Instances(%s) from NSLCM." % nsInstanceId)
+
+    return [0,'success']
+
+def delete_nf_inst(csar_id):
+    #vnf_instance = get_vnfInstances(csar_id)
+    # REST API from nslcm to delete nf instance is not implemented
+    # ret=req_by_msb("/nslcm/v1/nf/%s" % csar_id,"delete")
+    return [0,'success']
 
 # def delete_ns(asset_type):
 #     resource = "/nfvolcm/v1/ns/"