You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ma...@apache.org on 2023/06/19 07:06:55 UTC

[ranger] branch RANGER-3923 updated: RANGER-4265: updated ServicePolicies to include GDS policies

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


The following commit(s) were added to refs/heads/RANGER-3923 by this push:
     new a3fc43cfe RANGER-4265: updated ServicePolicies to include GDS policies
a3fc43cfe is described below

commit a3fc43cfeabf9be2e1b3d58502ba6e0f45104fb1
Author: Madhan Neethiraj <ma...@apache.org>
AuthorDate: Sun Jun 18 19:54:51 2023 -0700

    RANGER-4265: updated ServicePolicies to include GDS policies
---
 .../apache/ranger/plugin/util/ServicePolicies.java | 193 ++++++++++++++++++
 .../java/org/apache/ranger/biz/ServiceDBStore.java | 218 ++++++++++++++++-----
 2 files changed, 367 insertions(+), 44 deletions(-)

diff --git a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
index e022a1b17..288672a20 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/util/ServicePolicies.java
@@ -63,6 +63,7 @@ public class ServicePolicies implements java.io.Serializable {
 	private RangerServiceDef   serviceDef;
 	private String             auditMode = RangerPolicyEngine.AUDIT_DEFAULT;
 	private TagPolicies        tagPolicies;
+	private GdsPolicies        gdsPolicies;
 	private Map<String, SecurityZoneInfo> securityZones;
 	private List<RangerPolicyDelta> policyDeltas;
 	private Map<String, String> serviceConfig;
@@ -168,6 +169,19 @@ public class ServicePolicies implements java.io.Serializable {
 		this.tagPolicies = tagPolicies;
 	}
 
+	/**
+	 * @return the gdsPolicies
+	 */
+	public ServicePolicies.GdsPolicies getGdsPolicies() {
+		return gdsPolicies;
+	}
+	/**
+	 * @param gdsPolicies the gdsPolicies to set
+	 */
+	public void setGdsPolicies(ServicePolicies.GdsPolicies gdsPolicies) {
+		this.gdsPolicies = gdsPolicies;
+	}
+
 	public Map<String, SecurityZoneInfo> getSecurityZones() { return securityZones; }
 
 	public void setSecurityZones(Map<String, SecurityZoneInfo> securityZones) {
@@ -195,6 +209,10 @@ public class ServicePolicies implements java.io.Serializable {
 			tagPolicies.dedupStrings(strTbl);
 		}
 
+		if (gdsPolicies != null) {
+			gdsPolicies.dedupStrings(strTbl);
+		}
+
 		if (securityZones != null) {
 			for (SecurityZoneInfo securityZoneInfo : securityZones.values()) {
 				securityZoneInfo.dedupStrings(strTbl);
@@ -216,6 +234,7 @@ public class ServicePolicies implements java.io.Serializable {
 			 	+ "policyUpdateTime=" + policyUpdateTime + ", "
 			 	+ "policies=" + policies + ", "
 			 	+ "tagPolicies=" + tagPolicies + ", "
+				+ "gdsPolicies=" + gdsPolicies + ", "
 			 	+ "policyDeltas=" + policyDeltas + ", "
 			 	+ "serviceDef=" + serviceDef + ", "
 			 	+ "auditMode=" + auditMode + ", "
@@ -362,6 +381,142 @@ public class ServicePolicies implements java.io.Serializable {
 		}
 	}
 
+	@JsonAutoDetect(fieldVisibility=Visibility.ANY)
+	@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY)
+	@JsonIgnoreProperties(ignoreUnknown=true)
+	@XmlRootElement
+	@XmlAccessorType(XmlAccessType.FIELD)
+	public static class GdsPolicies implements java.io.Serializable {
+		private static final long serialVersionUID = 1L;
+
+		private String              serviceName;
+		private Long                serviceId;
+		private Long                policyVersion;
+		private Date                policyUpdateTime;
+		private List<RangerPolicy>  policies;
+		private RangerServiceDef    serviceDef;
+		private String              auditMode = RangerPolicyEngine.AUDIT_DEFAULT;
+		private Map<String, String> serviceConfig;
+
+		/**
+		 * @return the serviceName
+		 */
+		public String getServiceName() {
+			return serviceName;
+		}
+		/**
+		 * @param serviceName the serviceName to set
+		 */
+		public void setServiceName(String serviceName) {
+			this.serviceName = serviceName;
+		}
+		/**
+		 * @return the serviceId
+		 */
+		public Long getServiceId() {
+			return serviceId;
+		}
+		/**
+		 * @param serviceId the serviceId to set
+		 */
+		public void setServiceId(Long serviceId) {
+			this.serviceId = serviceId;
+		}
+		/**
+		 * @return the policyVersion
+		 */
+		public Long getPolicyVersion() {
+			return policyVersion;
+		}
+		/**
+		 * @param policyVersion the policyVersion to set
+		 */
+		public void setPolicyVersion(Long policyVersion) {
+			this.policyVersion = policyVersion;
+		}
+		/**
+		 * @return the policyUpdateTime
+		 */
+		public Date getPolicyUpdateTime() {
+			return policyUpdateTime;
+		}
+		/**
+		 * @param policyUpdateTime the policyUpdateTime to set
+		 */
+		public void setPolicyUpdateTime(Date policyUpdateTime) {
+			this.policyUpdateTime = policyUpdateTime;
+		}
+		/**
+		 * @return the policies
+		 */
+		public List<RangerPolicy> getPolicies() {
+			return policies;
+		}
+		/**
+		 * @param policies the policies to set
+		 */
+		public void setPolicies(List<RangerPolicy> policies) {
+			this.policies = policies;
+		}
+		/**
+		 * @return the serviceDef
+		 */
+		public RangerServiceDef getServiceDef() {
+			return serviceDef;
+		}
+		/**
+		 * @param serviceDef the serviceDef to set
+		 */
+		public void setServiceDef(RangerServiceDef serviceDef) {
+			this.serviceDef = serviceDef;
+		}
+
+		public String getAuditMode() {
+			return auditMode;
+		}
+
+		public void setAuditMode(String auditMode) {
+			this.auditMode = auditMode;
+		}
+
+		public Map<String, String> getServiceConfig() {
+			return serviceConfig;
+		}
+
+		public void setServiceConfig(Map<String, String> serviceConfig) {
+			this.serviceConfig = serviceConfig;
+		}
+
+		public void dedupStrings(Map<String, String> strTbl) {
+			serviceName   = StringUtil.dedupString(serviceName, strTbl);
+			auditMode     = StringUtil.dedupString(auditMode, strTbl);
+			serviceConfig = StringUtil.dedupStringsMap(serviceConfig, strTbl);
+
+			if (policies != null) {
+				for (RangerPolicy policy : policies) {
+					policy.dedupStrings(strTbl);
+				}
+			}
+
+			if (serviceDef != null) {
+				serviceDef.dedupStrings(strTbl);
+			}
+		}
+
+		@Override
+		public String toString() {
+			return "serviceName=" + serviceName + ", "
+					+ "serviceId=" + serviceId + ", "
+					+ "policyVersion=" + policyVersion + ", "
+					+ "policyUpdateTime=" + policyUpdateTime + ", "
+					+ "policies=" + policies + ", "
+					+ "serviceDef=" + serviceDef + ", "
+					+ "auditMode=" + auditMode
+					+ "serviceConfig=" + serviceConfig
+					;
+		}
+	}
+
 	@JsonAutoDetect(fieldVisibility = Visibility.ANY)
 	@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
 	@JsonIgnoreProperties(ignoreUnknown = true)
@@ -460,6 +615,10 @@ public class ServicePolicies implements java.io.Serializable {
 			TagPolicies tagPolicies = copyHeader(source.getTagPolicies(), source.getServiceDef().getName());
 			ret.setTagPolicies(tagPolicies);
 		}
+		if (source.getGdsPolicies() != null) {
+			GdsPolicies gdsPolicies = copyHeader(source.getGdsPolicies(), source.getServiceDef().getName());
+			ret.setGdsPolicies(gdsPolicies);
+		}
 
 		return ret;
 	}
@@ -478,11 +637,26 @@ public class ServicePolicies implements java.io.Serializable {
 		return ret;
 	}
 
+	static public GdsPolicies copyHeader(GdsPolicies source, String componentServiceName) {
+		GdsPolicies ret = new GdsPolicies();
+
+		ret.setServiceName(source.getServiceName());
+		ret.setServiceId(source.getServiceId());
+		ret.setPolicyVersion(source.getPolicyVersion());
+		ret.setAuditMode(source.getAuditMode());
+		ret.setServiceDef(ServiceDefUtil.normalizeAccessTypeDefs(source.getServiceDef(), componentServiceName));
+		ret.setPolicyUpdateTime(source.getPolicyUpdateTime());
+		ret.setPolicies(Collections.emptyList());
+
+		return ret;
+	}
+
 	public static ServicePolicies applyDelta(final ServicePolicies servicePolicies, RangerPolicyEngineImpl policyEngine) {
 		ServicePolicies ret = copyHeader(servicePolicies);
 
 		List<RangerPolicy> oldResourcePolicies = policyEngine.getResourcePolicies();
 		List<RangerPolicy> oldTagPolicies      = policyEngine.getTagPolicies();
+		List<RangerPolicy> oldGdsPolicies      = policyEngine.getGdsPolicies();
 
 		List<RangerPolicy> newResourcePolicies = RangerPolicyDeltaUtil.applyDeltas(oldResourcePolicies, servicePolicies.getPolicyDeltas(), servicePolicies.getServiceDef().getName());
 
@@ -505,10 +679,29 @@ public class ServicePolicies implements java.io.Serializable {
 			LOG.debug("New tag policies:[" + Arrays.toString(newTagPolicies.toArray()) + "]");
 		}
 
+		final List<RangerPolicy> newGdsPolicies;
+		if (servicePolicies.getGdsPolicies() != null) {
+			LOG.debug("applyingDeltas for gds policies");
+
+			newGdsPolicies = RangerPolicyDeltaUtil.applyDeltas(oldGdsPolicies, servicePolicies.getPolicyDeltas(), servicePolicies.getGdsPolicies().getServiceDef().getName());
+		} else {
+			LOG.debug("No need to apply deltas for gds policies");
+
+			newGdsPolicies = oldGdsPolicies;
+		}
+
+		if (LOG.isDebugEnabled()) {
+			LOG.debug("New gds policies:[" + Arrays.toString(newGdsPolicies.toArray()) + "]");
+		}
+
 		if (ret.getTagPolicies() != null) {
 			ret.getTagPolicies().setPolicies(newTagPolicies);
 		}
 
+		if (ret.getGdsPolicies() != null) {
+			ret.getGdsPolicies().setPolicies(newGdsPolicies);
+		}
+
 		if (MapUtils.isNotEmpty(servicePolicies.getSecurityZones())) {
 			Map<String, SecurityZoneInfo> newSecurityZones = new HashMap<>();
 
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
index 231472143..bd8149f3d 100644
--- a/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/ServiceDBStore.java
@@ -2454,22 +2454,39 @@ public class ServiceDBStore extends AbstractServiceStore {
 	}
 
 	private List<RangerPolicy> searchRangerTagPoliciesOnBasisOfServiceName(List<RangerPolicy> allExceptTagPolicies) throws Exception {
-		Set<String> rangerServiceNames = new HashSet<String>();
+		List<RangerPolicy> ret          = new ArrayList<>();
+		Set<String>        serviceNames = new HashSet<>();
+		Map<String, Long>  tagServices  = new HashMap<>();
+
 		for(RangerPolicy pol : allExceptTagPolicies) {
-			rangerServiceNames.add(pol.getService());
-		}
-		List<RangerPolicy> retPolicies = new ArrayList<RangerPolicy>();
-		for(String eachRangerService : rangerServiceNames) {
-			List<RangerPolicy> policies = new ArrayList<RangerPolicy>();
-				RangerService rangerServiceObj = getServiceByName(eachRangerService);
-				RangerService rangerTagService = getServiceByName(rangerServiceObj.getTagService());
-				if(rangerTagService != null) {
-					ServicePolicies servicePolicies = RangerServicePoliciesCache.getInstance().getServicePolicies(rangerTagService.getName(),rangerTagService.getId(), -1L, true, this);
-					policies = servicePolicies != null ? servicePolicies.getPolicies() : null;
-					retPolicies.addAll(policies);
+			serviceNames.add(pol.getService());
+		}
+
+		for(String serviceName : serviceNames) {
+			RangerService service = getServiceByName(serviceName);
+
+			if (StringUtils.isNotBlank(service.getTagService())) {
+				RangerService tagService = getServiceByName(service.getTagService());
+
+				if (tagService != null) {
+					tagServices.put(tagService.getName(), tagService.getId());
 				}
 			}
-		return retPolicies;
+		}
+
+		for (Map.Entry<String, Long> entry : tagServices.entrySet()) {
+			String tagServiceName = entry.getKey();
+			Long   tagServiceId   = entry.getValue();
+
+			ServicePolicies    tagServicePolicies = RangerServicePoliciesCache.getInstance().getServicePolicies(tagServiceName, tagServiceId, -1L, true, this);
+			List<RangerPolicy> policies           = tagServicePolicies != null ? tagServicePolicies.getPolicies() : null;
+
+			if (policies != null) {
+				ret.addAll(policies);
+			}
+		}
+
+		return ret;
 	}
 
 	@Override
@@ -2897,37 +2914,30 @@ public class ServiceDBStore extends AbstractServiceStore {
 			if (!serviceDbObj.getIsenabled()) {
 				ret = ServicePolicies.copyHeader(ret);
 				ret.setTagPolicies(null);
+				ret.setGdsPolicies(null);
 			} else {
-				boolean isTagServiceActive = true;
+				String  tagServiceName     = ret.getTagPolicies() != null ? ret.getTagPolicies().getServiceName() : null;
+				String  gdsServiceName     = ret.getGdsPolicies() != null ? ret.getGdsPolicies().getServiceName() : null;
+				boolean isTagServiceActive = isServiceActive(tagServiceName);
+				boolean isGdsServiceActive = isServiceActive(gdsServiceName);
 
-				if (ret.getTagPolicies() != null) {
-					if (LOG.isDebugEnabled()) {
-						LOG.debug("Checking if tag-service:[" + ret.getTagPolicies().getServiceName() + "] is disabled");
+				if (!isTagServiceActive || !isGdsServiceActive) {
+					ServicePolicies copy = ServicePolicies.copyHeader(ret);
+
+					if (!isTagServiceActive) {
+						copy.setTagPolicies(null);
 					}
-					String tagServiceName = ret.getTagPolicies().getServiceName();
 
-					if (StringUtils.isNotEmpty(tagServiceName)) {
-						XXService tagService = daoMgr.getXXService().findByName(tagServiceName);
-						if (tagService == null || !tagService.getIsenabled()) {
-							if (LOG.isDebugEnabled()) {
-								LOG.debug("tag-service:[" + tagServiceName + "] is disabled");
-							}
-							isTagServiceActive = false;
-						}
-					} else {
-						isTagServiceActive = false;
+					if (!isGdsServiceActive) {
+						copy.setGdsPolicies(null);
 					}
-				} else {
-					isTagServiceActive = false;
-				}
 
-				if (!isTagServiceActive) {
-					ServicePolicies copy = ServicePolicies.copyHeader(ret);
-					copy.setTagPolicies(null);
-					List<RangerPolicy> copyPolicies = ret.getPolicies() != null ? new ArrayList<>(ret.getPolicies()) : null;
+					List<RangerPolicy>     copyPolicies      = ret.getPolicies() != null ? new ArrayList<>(ret.getPolicies()) : null;
 					List<RangerPolicyDelta> copyPolicyDeltas = ret.getPolicyDeltas() != null ? new ArrayList<>(ret.getPolicyDeltas()) : null;
+
 					copy.setPolicies(copyPolicies);
 					copy.setPolicyDeltas(copyPolicyDeltas);
+
 					ret = copy;
 				}
 			}
@@ -3025,14 +3035,21 @@ public class ServiceDBStore extends AbstractServiceStore {
 
 		String auditMode = getAuditMode(serviceType, serviceName);
 
-		XXService tagServiceDbObj = null;
-		RangerServiceDef tagServiceDef = null;
+		XXService            tagServiceDbObj = null;
+		RangerServiceDef     tagServiceDef = null;
 		XXServiceVersionInfo tagServiceVersionInfoDbObj= null;
+		XXService            gdsServiceDbObj = null;
+		RangerServiceDef     gdsServiceDef = null;
+		XXServiceVersionInfo gdsServiceVersionInfoDbObj= null;
 
 		if (serviceDbObj.getTagService() != null) {
 			tagServiceDbObj = daoMgr.getXXService().getById(serviceDbObj.getTagService());
 		}
 
+		if (serviceDbObj.getGdsService() != null) {
+			gdsServiceDbObj = daoMgr.getXXService().getById(serviceDbObj.getGdsService());
+		}
+
 		if (tagServiceDbObj != null) {
 			tagServiceDef = getServiceDef(tagServiceDbObj.getType());
 
@@ -3049,8 +3066,24 @@ public class ServiceDBStore extends AbstractServiceStore {
 			}
 		}
 
+		if (gdsServiceDbObj != null) {
+			gdsServiceDef = getServiceDef(gdsServiceDbObj.getType());
+
+			if (gdsServiceDef == null) {
+				throw new Exception("service-def does not exist. id=" + gdsServiceDbObj.getType());
+			}
+
+			ServiceDefUtil.normalizeAccessTypeDefs(gdsServiceDef, serviceType);
+
+			gdsServiceVersionInfoDbObj = daoMgr.getXXServiceVersionInfo().findByServiceId(serviceDbObj.getGdsService());
+
+			if (gdsServiceVersionInfoDbObj == null) {
+				LOG.warn("serviceVersionInfo does not exist. name=" + gdsServiceDbObj.getName());
+			}
+		}
+
 		if (isDeltaEnabled) {
-			ret = getServicePoliciesWithDeltas(serviceDef, serviceDbObj, tagServiceDef, tagServiceDbObj, lastKnownVersion, maxNeededVersion);
+			ret = getServicePoliciesWithDeltas(serviceDef, serviceDbObj, tagServiceDef, tagServiceDbObj, gdsServiceDef, gdsServiceDbObj, lastKnownVersion, maxNeededVersion);
 		}
 
 		if (ret != null) {
@@ -3060,11 +3093,15 @@ public class ServiceDBStore extends AbstractServiceStore {
 				ret.getTagPolicies().setPolicyUpdateTime(tagServiceVersionInfoDbObj == null ? null : tagServiceVersionInfoDbObj.getPolicyUpdateTime());
 				ret.getTagPolicies().setAuditMode(auditMode);
 			}
+			if (ret.getGdsPolicies() != null) {
+				ret.getGdsPolicies().setPolicyUpdateTime(gdsServiceVersionInfoDbObj == null ? null : gdsServiceVersionInfoDbObj.getPolicyUpdateTime());
+				ret.getGdsPolicies().setAuditMode(auditMode);
+			}
 		} else if (!getOnlyDeltas) {
 			ServicePolicies.TagPolicies tagPolicies = null;
+			ServicePolicies.GdsPolicies gdsPolicies = null;
 
 			if (tagServiceDbObj != null) {
-
 				tagPolicies = new ServicePolicies.TagPolicies();
 
 				tagPolicies.setServiceId(tagServiceDbObj.getId());
@@ -3075,6 +3112,19 @@ public class ServiceDBStore extends AbstractServiceStore {
 				tagPolicies.setServiceDef(tagServiceDef);
 				tagPolicies.setAuditMode(auditMode);
 			}
+
+			if (gdsServiceDbObj != null) {
+				gdsPolicies = new ServicePolicies.GdsPolicies();
+
+				gdsPolicies.setServiceId(gdsServiceDbObj.getId());
+				gdsPolicies.setServiceName(gdsServiceDbObj.getName());
+				gdsPolicies.setPolicyVersion(gdsServiceVersionInfoDbObj == null ? null : gdsServiceVersionInfoDbObj.getPolicyVersion());
+				gdsPolicies.setPolicyUpdateTime(gdsServiceVersionInfoDbObj == null ? null : gdsServiceVersionInfoDbObj.getPolicyUpdateTime());
+				gdsPolicies.setPolicies(getServicePoliciesFromDb(gdsServiceDbObj));
+				gdsPolicies.setServiceDef(gdsServiceDef);
+				gdsPolicies.setAuditMode(auditMode);
+			}
+
 			List<RangerPolicy> policies = getServicePoliciesFromDb(serviceDbObj);
 
 			ret = new ServicePolicies();
@@ -3087,6 +3137,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 			ret.setServiceDef(serviceDef);
 			ret.setAuditMode(auditMode);
 			ret.setTagPolicies(tagPolicies);
+			ret.setGdsPolicies(gdsPolicies);
 		}
 
 		if (LOG.isDebugEnabled()) {
@@ -3259,7 +3310,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 
 	}
 
-	ServicePolicies getServicePoliciesWithDeltas(RangerServiceDef serviceDef, XXService service, RangerServiceDef tagServiceDef, XXService tagService, Long lastKnownVersion, Long maxNeededVersion) {
+	ServicePolicies getServicePoliciesWithDeltas(RangerServiceDef serviceDef, XXService service, RangerServiceDef tagServiceDef, XXService tagService, RangerServiceDef gdsServiceDef, XXService gdsService, Long lastKnownVersion, Long maxNeededVersion) {
 		ServicePolicies ret = null;
 
 		// if lastKnownVersion != -1L : try and get deltas. Get delta for serviceName first. Find id of the delta
@@ -3271,9 +3322,11 @@ public class ServiceDBStore extends AbstractServiceStore {
 		if (lastKnownVersion != -1L) {
 
 			List<RangerPolicyDelta> resourcePolicyDeltas;
-			List<RangerPolicyDelta> tagPolicyDeltas = null;
-			Long                    retrievedPolicyVersion = null;
+			List<RangerPolicyDelta> tagPolicyDeltas           = null;
+			List<RangerPolicyDelta> gdsPolicyDeltas           = null;
+			Long                    retrievedPolicyVersion    = null;
 			Long                    retrievedTagPolicyVersion = null;
+			Long                    retrievedGdsPolicyVersion = null;
 
 			String componentServiceType = serviceDef.getName();
 
@@ -3293,7 +3346,6 @@ public class ServiceDBStore extends AbstractServiceStore {
 					Long id = resourcePolicyDeltas.get(0).getId();
 					tagPolicyDeltas = daoMgr.getXXPolicyChangeLog().findGreaterThan(id, maxNeededVersion, tagService.getId());
 
-
 					if (CollectionUtils.isNotEmpty(tagPolicyDeltas)) {
 						String tagServiceType = tagServiceDef.getName();
 
@@ -3307,6 +3359,23 @@ public class ServiceDBStore extends AbstractServiceStore {
 					}
 				}
 
+				if (isValid && gdsService != null) {
+					Long id = resourcePolicyDeltas.get(0).getId();
+					gdsPolicyDeltas = daoMgr.getXXPolicyChangeLog().findGreaterThan(id, maxNeededVersion, gdsService.getId());
+
+					if (CollectionUtils.isNotEmpty(gdsPolicyDeltas)) {
+						String gdsServiceType = gdsServiceDef.getName();
+
+						isValid = RangerPolicyDeltaUtil.isValidDeltas(gdsPolicyDeltas, gdsServiceType);
+
+						if (isValid) {
+							retrievedGdsPolicyVersion = gdsPolicyDeltas.get(gdsPolicyDeltas.size() - 1).getPoliciesVersion();
+						} else {
+							LOG.warn("Gds policy-Deltas :[" + gdsPolicyDeltas + "] for service-version :[" + lastKnownVersion + "] and delta-id :[" + id + "] are not valid");
+						}
+					}
+				}
+
 				if (isValid) {
 					if (CollectionUtils.isNotEmpty(tagPolicyDeltas)) {
 						// To ensure that resource-policy-deltas with service-type of 'tag' are ignored after validation
@@ -3335,6 +3404,16 @@ public class ServiceDBStore extends AbstractServiceStore {
 							tagPolicies.setPolicyVersion(retrievedTagPolicyVersion);
 							ret.setTagPolicies(tagPolicies);
 						}
+
+						if (gdsServiceDef != null && gdsService != null) {
+							ServicePolicies.GdsPolicies gdsPolicies = new ServicePolicies.GdsPolicies();
+							gdsPolicies.setServiceDef(gdsServiceDef);
+							gdsPolicies.setServiceId(gdsService.getId());
+							gdsPolicies.setServiceName(gdsService.getName());
+							gdsPolicies.setPolicies(null);
+							gdsPolicies.setPolicyVersion(retrievedGdsPolicyVersion);
+							ret.setGdsPolicies(gdsPolicies);
+						}
 					} else {
 						LOG.warn("Deltas :[" + resourcePolicyDeltas + "] from version :[" + lastKnownVersion + "] after compressing are null!");
 					}
@@ -6072,6 +6151,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 			ret.setPolicyVersion(servicePolicies.getPolicyVersion());
 			ret.setPolicyUpdateTime(servicePolicies.getPolicyUpdateTime());
 			ret.setTagPolicies(servicePolicies.getTagPolicies());
+			ret.setGdsPolicies(servicePolicies.getGdsPolicies());
 
 			Map<String, ServicePolicies.SecurityZoneInfo> securityZonesInfo = new HashMap<>();
 
@@ -6183,6 +6263,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 		ServicePolicies ret = null;
 		boolean containsDisabledResourcePolicies = false;
 		boolean containsDisabledTagPolicies = false;
+		boolean containsDisabledGdsPolicies = false;
 
 		if (servicePolicies != null) {
 			List<RangerPolicy> policies = null;
@@ -6209,7 +6290,19 @@ public class ServiceDBStore extends AbstractServiceStore {
 				}
 			}
 
-			if (!containsDisabledResourcePolicies && !containsDisabledTagPolicies) {
+			if (servicePolicies.getGdsPolicies() != null) {
+				policies = servicePolicies.getGdsPolicies().getPolicies();
+				if (CollectionUtils.isNotEmpty(policies)) {
+					for (RangerPolicy policy : policies) {
+						if (!policy.getIsEnabled()) {
+							containsDisabledGdsPolicies = true;
+							break;
+						}
+					}
+				}
+			}
+
+			if (!containsDisabledResourcePolicies && !containsDisabledTagPolicies && !containsDisabledGdsPolicies) {
 				ret = servicePolicies;
 			} else {
 				ret = new ServicePolicies();
@@ -6221,6 +6314,7 @@ public class ServiceDBStore extends AbstractServiceStore {
 				ret.setPolicyUpdateTime(servicePolicies.getPolicyUpdateTime());
 				ret.setPolicies(servicePolicies.getPolicies());
 				ret.setTagPolicies(servicePolicies.getTagPolicies());
+				ret.setGdsPolicies(servicePolicies.getGdsPolicies());
 				ret.setSecurityZones(servicePolicies.getSecurityZones());
 
 				if (containsDisabledResourcePolicies) {
@@ -6252,6 +6346,26 @@ public class ServiceDBStore extends AbstractServiceStore {
 
 					ret.setTagPolicies(tagPolicies);
 				}
+
+				if (containsDisabledGdsPolicies) {
+					ServicePolicies.GdsPolicies gdsPolicies = new ServicePolicies.GdsPolicies();
+
+					gdsPolicies.setServiceDef(servicePolicies.getGdsPolicies().getServiceDef());
+					gdsPolicies.setServiceId(servicePolicies.getGdsPolicies().getServiceId());
+					gdsPolicies.setServiceName(servicePolicies.getGdsPolicies().getServiceName());
+					gdsPolicies.setPolicyVersion(servicePolicies.getGdsPolicies().getPolicyVersion());
+					gdsPolicies.setPolicyUpdateTime(servicePolicies.getGdsPolicies().getPolicyUpdateTime());
+
+					List<RangerPolicy> filteredPolicies = new ArrayList<>();
+					for (RangerPolicy policy : servicePolicies.getGdsPolicies().getPolicies()) {
+						if (policy.getIsEnabled()) {
+							filteredPolicies.add(policy);
+						}
+					}
+					gdsPolicies.setPolicies(filteredPolicies);
+
+					ret.setGdsPolicies(gdsPolicies);
+				}
 			}
 		}
 
@@ -6409,4 +6523,20 @@ public class ServiceDBStore extends AbstractServiceStore {
 		}
 		return roleNames;
 	}
+
+	private boolean isServiceActive(String serviceName) {
+		boolean ret = false;
+
+		if (StringUtils.isNotBlank(serviceName)) {
+			XXService service = daoMgr.getXXService().findByName(serviceName);
+
+			ret = (service != null && service.getIsenabled());
+
+			if (LOG.isDebugEnabled()) {
+				LOG.debug("isServiceActive(" + serviceName + "): " + ret);
+			}
+		}
+
+		return ret;
+	}
 }