RANGER-4634: on service deletion, delete associated GDS objects as well

Signed-off-by: Madhan Neethiraj <madhan@apache.org>
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 63a6f91..afbce78 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
@@ -131,4 +131,6 @@
     RangerDatasetInProject getDatasetInProject(Long datasetInProjectId) throws Exception;
 
     PList<RangerDatasetInProject> searchDatasetInProjects(SearchFilter filter) throws Exception;
+
+    void deleteAllGdsObjectsForService(Long serviceId) 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 d9c056a..701165f 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
@@ -1190,6 +1190,31 @@
         return ret;
     }
 
+    @Override
+    public void deleteAllGdsObjectsForService(Long serviceId) throws Exception {
+        LOG.debug("==> deleteAllGdsObjectsForService({})", serviceId);
+
+        List<XXGdsDataShare> dataShares = daoMgr.getXXGdsDataShare().findByServiceId(serviceId);
+
+        if (CollectionUtils.isNotEmpty(dataShares)) {
+            LOG.info("Deleting {} dataShares associated with service id={}", dataShares.size(), serviceId);
+
+            dataShares.forEach(dataShare -> {
+                try {
+                    LOG.info("Deleting dataShare id={}, name={}", dataShare.getId(), dataShare.getName());
+
+                    deleteDataShare(dataShare.getId(), true);
+                } catch (Exception excp) {
+                    LOG.error("failed to delete dataShare id={}, name={}", dataShare.getId(), dataShare.getName(), excp);
+
+                    throw excp;
+                }
+            });
+        }
+
+        LOG.debug("<== deleteAllGdsObjectsForService({})", serviceId);
+    }
+
     public ServiceGdsInfo getGdsInfoIfUpdated(String serviceName, Long lastKnownVersion) throws Exception {
         LOG.debug("==> GdsDBStore.getGdsInfoIfUpdated({}, {})", serviceName , lastKnownVersion);
 
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 49386d0..e7e0abb 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -54,6 +54,7 @@
 import org.apache.ranger.authorization.hadoop.config.RangerAdminConfig;
 import org.apache.ranger.authorization.utils.StringUtil;
 import org.apache.ranger.biz.AssetMgr;
+import org.apache.ranger.biz.GdsDBStore;
 import org.apache.ranger.biz.PolicyRefUpdater;
 import org.apache.ranger.biz.RangerPolicyAdmin;
 import org.apache.ranger.biz.RangerBizUtil;
@@ -240,8 +241,11 @@
 	TagDBStore tagStore;
 
 	@Autowired
+	GdsDBStore gdsStore;
+
+	@Autowired
 	RangerTransactionSynchronizationAdapter rangerTransactionSynchronizationAdapter;
-	
+
 	private RangerPolicyEngineOptions delegateAdminOptions;
 	private RangerPolicyEngineOptions policySearchAdminOptions;
 	private RangerPolicyEngineOptions defaultAdminOptions;
@@ -4643,7 +4647,10 @@
 						bizUtil.hasKMSPermissions("Service", xxServiceDef.getImplclassname());
 						bizUtil.blockAuditorRoleUser();
 					}
+
 					tagStore.deleteAllTagObjectsForService(service.getName());
+					gdsStore.deleteAllGdsObjectsForService(id);
+
 					deletedServiceName = service.getName();
 
 					svcStore.deleteService(id);