This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git

commit 1a33cba0a75525454d8d92d0b590d1aebf54b246
Author: Subhrat Chaudhary <such...@yahoo.com>
AuthorDate: Mon Oct 2 12:10:48 2023 -0700

    RANGER-4435: support cascade delete of datashare
    
    Signed-off-by: Madhan Neethiraj <mad...@apache.org>
---
 .../ranger/plugin/store/AbstractGdsStore.java      |  2 +-
 .../org/apache/ranger/plugin/store/GdsStore.java   |  2 +-
 .../java/org/apache/ranger/biz/GdsDBStore.java     | 44 ++++++++++++++++++++--
 .../org/apache/ranger/common/MessageEnums.java     |  1 +
 .../main/java/org/apache/ranger/rest/GdsREST.java  |  8 +++-
 5 files changed, 50 insertions(+), 7 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
index 0c9114aee..91f598bd4 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java
@@ -105,7 +105,7 @@ public abstract class AbstractGdsStore implements GdsStore {
     public RangerDataShare updateDataShare(RangerDataShare dataShare) throws 
Exception { return null; }
 
     @Override
-    public void deleteDataShare(Long dataShareId) throws Exception { }
+    public void deleteDataShare(Long dataShareId, boolean forceDelete) throws 
Exception { }
 
     @Override
     public RangerDataShare getDataShare(Long dataShareId) throws Exception { 
return null; }
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java 
b/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
index 53fe55336..8c56ec1ff 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java
@@ -73,7 +73,7 @@ public interface GdsStore {
 
     RangerDataShare updateDataShare(RangerDataShare dataShare) throws 
Exception;
 
-    void deleteDataShare(Long dataShareId) throws Exception;
+    void deleteDataShare(Long dataShareId, boolean forceDelete) throws 
Exception;
 
     RangerDataShare getDataShare(Long dataShareId) throws Exception;
 
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java 
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
index ce4769569..05705cd92 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -21,7 +21,10 @@ package org.apache.ranger.biz;
 
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
 import org.apache.ranger.common.GUIDUtil;
+import org.apache.ranger.common.MessageEnums;
+import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.db.XXGdsDataShareInDatasetDao;
@@ -119,6 +122,8 @@ public class GdsDBStore extends AbstractGdsStore {
     @Autowired
     RangerBizUtil bizUtil;
 
+    @Autowired
+    RESTErrorUtil restErrorUtil;
 
     @PostConstruct
     public void initStore() {
@@ -488,8 +493,8 @@ public class GdsDBStore extends AbstractGdsStore {
     }
 
     @Override
-    public void deleteDataShare(Long dataShareId) throws Exception {
-        LOG.debug("==> deleteDataShare({})", dataShareId);
+    public void deleteDataShare(Long dataShareId, boolean forceDelete) throws 
Exception {
+        LOG.debug("==> deleteDataShare(dataShareId: {}, forceDelete: {})", 
dataShareId, forceDelete);
 
         RangerDataShare existing = null;
 
@@ -501,13 +506,18 @@ public class GdsDBStore extends AbstractGdsStore {
 
         validator.validateDelete(dataShareId, existing);
 
+        if(forceDelete) {
+            removeDshInDsForDataShare(dataShareId);
+            removeSharedResourcesForDataShare(dataShareId);
+        }
+
         dataShareService.delete(existing);
 
         dataShareService.createObjectHistory(null, existing, 
RangerServiceService.OPERATION_DELETE_CONTEXT);
 
         updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATA_SHARE);
 
-        LOG.debug("<== deleteDataShare({})", dataShareId);
+        LOG.debug("<== deleteDataShare(dataShareId: {}, forceDelete: {})", 
dataShareId, forceDelete);
     }
 
     @Override
@@ -1011,4 +1021,32 @@ public class GdsDBStore extends AbstractGdsStore {
         dataset.setOptions(null);
         dataset.setAdditionalInfo(null);
     }
+
+    private void removeDshInDsForDataShare(Long dataShareId) {
+        SearchFilter filter = new SearchFilter();
+        filter.setParam(SearchFilter.DATA_SHARE_ID, dataShareId.toString());
+        final RangerDataShareInDatasetList dshInDsList = 
dataShareInDatasetService.searchDataShareInDatasets(filter);
+
+        for(RangerDataShareInDataset dshInDs : dshInDsList.getList()) {
+            final boolean dshInDsDeleted = 
dataShareInDatasetService.delete(dshInDs);
+
+            if(!dshInDsDeleted) {
+                throw restErrorUtil.createRESTException("DataShareInDataset 
could not be deleted", MessageEnums.ERROR_DELETE_OBJECT, dshInDs.getId(), 
"DataSHareInDatasetId", null, 500);
+            }
+        }
+    }
+
+    private void removeSharedResourcesForDataShare(Long dataShareId) {
+        SearchFilter filter  = new SearchFilter();
+        filter.setParam(SearchFilter.DATA_SHARE_ID, dataShareId.toString());
+        final RangerSharedResourceList sharedResources = 
sharedResourceService.searchSharedResources(filter);
+
+        for(RangerSharedResource sharedResource : sharedResources.getList()) {
+            final boolean sharedResourceDeleted = 
sharedResourceService.delete(sharedResource);
+
+            if(!sharedResourceDeleted) {
+                throw restErrorUtil.createRESTException("SharedResource could 
not be deleted", MessageEnums.ERROR_DELETE_OBJECT, sharedResource.getId(), 
"SharedResourceId", null, HttpStatus.SC_INTERNAL_SERVER_ERROR);
+            }
+        }
+    }
 }
diff --git 
a/security-admin/src/main/java/org/apache/ranger/common/MessageEnums.java 
b/security-admin/src/main/java/org/apache/ranger/common/MessageEnums.java
index 7be604261..0ad1ee382 100644
--- a/security-admin/src/main/java/org/apache/ranger/common/MessageEnums.java
+++ b/security-admin/src/main/java/org/apache/ranger/common/MessageEnums.java
@@ -34,6 +34,7 @@ public enum MessageEnums {
     DATA_NOT_UPDATABLE( "xa.error.data_not_updatable", "Data not updatable"),
     ERROR_CREATING_OBJECT("xa.error.create_object", "Error creating object"),
     ERROR_DUPLICATE_OBJECT("xa.error.duplicate_object", "Error creating 
duplicate object"),
+    ERROR_DELETE_OBJECT("xa.error.delete_object", "Error deleting object"),
     ERROR_SYSTEM("xa.error.system", "System Error. Please try later."),
     OPER_NO_EXPORT("xa.error.oper_no_export", "repository is disabled"),
 
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java 
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index 56b908625..f827c754d 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -19,6 +19,7 @@
 
 package org.apache.ranger.rest;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.ranger.biz.GdsDBStore;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.RangerSearchUtil;
@@ -558,7 +559,7 @@ public class GdsREST {
     @DELETE
     @Path("/datashare/{id}")
     @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + 
RangerAPIList.DELETE_DATA_SHARE + "\")")
-    public void deleteDataShare(@PathParam("id") Long dataShareId) {
+    public void deleteDataShare(@PathParam("id") Long dataShareId, @Context 
HttpServletRequest request) {
         LOG.debug("==> GdsREST.deleteDataShare({})", dataShareId);
 
         RangerPerfTracer perf = null;
@@ -568,7 +569,10 @@ public class GdsREST {
                 perf = RangerPerfTracer.getPerfTracer(PERF_LOG, 
"GdsREST.deleteDataShare(" + dataShareId + ")");
             }
 
-            gdsStore.deleteDataShare(dataShareId);
+            String forceDeleteStr = request.getParameter("forceDelete");
+            boolean forceDelete = !StringUtils.isEmpty(forceDeleteStr) && 
"true".equalsIgnoreCase(forceDeleteStr);
+
+            gdsStore.deleteDataShare(dataShareId, forceDelete);
         } catch(WebApplicationException excp) {
             throw excp;
         } catch(Throwable excp) {

Reply via email to