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 3b2fb766c22faa4f267ffa155870736a0f6081cd Author: prashant <prashantsatam...@gmail.com> AuthorDate: Fri Oct 6 04:15:40 2023 -0700 RANGER-4436: cascade delete for dataset 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 | 41 ++++++++++++++++++++-- .../main/java/org/apache/ranger/rest/GdsREST.java | 6 ++-- 4 files changed, 44 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 7b3677e30..1c08e36ec 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 @@ -36,7 +36,7 @@ public abstract class AbstractGdsStore implements GdsStore { public RangerDataset updateDataset(RangerDataset dataset) throws Exception { return null; } @Override - public void deleteDataset(Long datasetId) throws Exception { } + public void deleteDataset(Long datasetId, boolean forceDelete) throws Exception { } @Override public RangerDataset getDataset(Long datasetId) 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 2dadf2cd4..794c265a3 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 @@ -39,7 +39,7 @@ public interface GdsStore { RangerDataset updateDataset(RangerDataset dataset) throws Exception; - void deleteDataset(Long datasetId) throws Exception; + void deleteDataset(Long datasetId, boolean forceDelete) throws Exception; RangerDataset getDataset(Long datasetId) 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 6a37da62a..eeebb6394 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 @@ -221,8 +221,8 @@ public class GdsDBStore extends AbstractGdsStore { } @Override - public void deleteDataset(Long datasetId) throws Exception { - LOG.debug("==> deleteDataset({})", datasetId); + public void deleteDataset(Long datasetId, boolean forceDelete) throws Exception { + LOG.debug("==> deleteDataset({}, {})", datasetId, forceDelete); RangerDataset existing = null; @@ -235,6 +235,11 @@ public class GdsDBStore extends AbstractGdsStore { validator.validateDelete(datasetId, existing); if (existing != null) { + if (forceDelete) { + removeDSHIDForDataset(datasetId); + removeDIPForDataset(datasetId); + } + deleteDatasetPolicies(existing); datasetService.delete(existing); @@ -243,7 +248,7 @@ public class GdsDBStore extends AbstractGdsStore { updateGlobalVersion(RANGER_GLOBAL_STATE_NAME_DATASET); } - LOG.debug("<== deleteDataset({})", datasetId); + LOG.debug("<== deleteDataset({}, {})", datasetId, forceDelete); } @Override @@ -1438,6 +1443,36 @@ public class GdsDBStore extends AbstractGdsStore { } } + private void removeDIPForDataset(Long datasetId) { + XXGdsDatasetInProjectDao dipDao = daoMgr.getXXGdsDatasetInProject(); + List<XXGdsDatasetInProject> dshidList = dipDao.findByDatasetId(datasetId); + + for (XXGdsDatasetInProject dip : dshidList) { + boolean dipDeleted = dipDao.remove(dip.getId()); + + if (!dipDeleted) { + throw restErrorUtil.createRESTException("DatasetInProject could not be deleted", + MessageEnums.ERROR_DELETE_OBJECT, dip.getId(), "DatasetInProjectId", null, + HttpStatus.SC_INTERNAL_SERVER_ERROR); + } + } + } + + private void removeDSHIDForDataset(Long datasetId) { + XXGdsDataShareInDatasetDao dshidDao = daoMgr.getXXGdsDataShareInDataset(); + List<XXGdsDataShareInDataset> dshidList = dshidDao.findByDatasetId(datasetId); + + for (XXGdsDataShareInDataset dshid : dshidList) { + boolean dshidDeleted = dshidDao.remove(dshid.getId()); + + if (!dshidDeleted) { + throw restErrorUtil.createRESTException("DataShareInDataset could not be deleted", + MessageEnums.ERROR_DELETE_OBJECT, dshid.getId(), "DataShareInDataset", null, + HttpStatus.SC_INTERNAL_SERVER_ERROR); + } + } + } + private void addCreatorAsAclAdmin(RangerGdsObjectACL acl) { String currentUser = bizUtil.getCurrentUserLoginId(); Map<String, GdsPermission> userAcl = acl.getUsers(); 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 7617fb411..cc09506f3 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 @@ -161,7 +161,7 @@ public class GdsREST { @DELETE @Path("/dataset/{id}") @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + RangerAPIList.DELETE_DATASET + "\")") - public void deleteDataset(@PathParam("id") Long datasetId) { + public void deleteDataset(@PathParam("id") Long datasetId, @Context HttpServletRequest request) { LOG.debug("==> deleteDataset({})", datasetId); RangerPerfTracer perf = null; @@ -171,7 +171,9 @@ public class GdsREST { perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "GdsREST.deleteDataset(datasetId=" + datasetId + ")"); } - gdsStore.deleteDataset(datasetId); + boolean forceDelete = Boolean.parseBoolean(request.getParameter("forceDelete")); + + gdsStore.deleteDataset(datasetId, forceDelete); } catch(WebApplicationException excp) { throw excp; } catch(Throwable excp) {