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) {