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/02/07 22:00:56 UTC

[ranger] branch master updated: RANGER-4012: optmization of getPolicyByName REST API

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

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


The following commit(s) were added to refs/heads/master by this push:
     new b31db07db RANGER-4012: optmization of getPolicyByName REST API
b31db07db is described below

commit b31db07dbde2d7109998689046ebe4b34bfea6c8
Author: Ramachandran Krishnan <ra...@gmail.com>
AuthorDate: Tue Feb 7 23:01:29 2023 +0530

    RANGER-4012: optmization of getPolicyByName REST API
    
    Signed-off-by: Madhan Neethiraj <ma...@apache.org>
---
 .../main/java/org/apache/ranger/RangerClient.java  | 28 +++++++++++
 .../python/apache_ranger/client/ranger_client.py   | 13 ++++++
 .../ranger/examples/sampleclient/SampleClient.java | 26 +++++++----
 .../java/org/apache/ranger/rest/PublicAPIsv2.java  | 20 ++++----
 .../java/org/apache/ranger/rest/ServiceREST.java   | 48 ++++---------------
 .../org/apache/ranger/rest/TestPublicAPIsv2.java   | 28 +++++------
 .../org/apache/ranger/rest/TestServiceREST.java    | 54 ++++++++++++++++++++++
 7 files changed, 142 insertions(+), 75 deletions(-)

diff --git a/intg/src/main/java/org/apache/ranger/RangerClient.java b/intg/src/main/java/org/apache/ranger/RangerClient.java
index e4e3a57ad..ff281112f 100644
--- a/intg/src/main/java/org/apache/ranger/RangerClient.java
+++ b/intg/src/main/java/org/apache/ranger/RangerClient.java
@@ -48,6 +48,8 @@ public class RangerClient {
     private static final String PARAM_EXEC_USER                     = "execUser";
     private static final String PARAM_POLICY_NAME                   = "policyname";
     private static final String PARAM_SERVICE_NAME                  = "serviceName";
+    private static final String PARAM_ZONE_NAME                     = "zoneName";
+
     private static final String PARAM_RELOAD_SERVICE_POLICIES_CACHE = "reloadServicePoliciesCache";
 
     // URIs
@@ -259,6 +261,14 @@ public class RangerClient {
         return callAPI(UPDATE_POLICY_BY_NAME.applyUrlFormat(serviceName, policyName), null, policy, RangerPolicy.class);
     }
 
+    public RangerPolicy updatePolicyByNameAndZone(String serviceName, String policyName, String zoneName, RangerPolicy policy) throws RangerServiceException {
+        Map<String,String> queryParams = new HashMap<>();
+
+        queryParams.put(PARAM_ZONE_NAME, zoneName);
+
+        return callAPI(UPDATE_POLICY_BY_NAME.applyUrlFormat(serviceName, policyName), queryParams, policy, RangerPolicy.class);
+    }
+
     public RangerPolicy applyPolicy(RangerPolicy policy) throws RangerServiceException {
         return callAPI(APPLY_POLICY, null, policy, RangerPolicy.class);
     }
@@ -276,6 +286,17 @@ public class RangerClient {
         callAPI(DELETE_POLICY_BY_NAME, queryParams);
     }
 
+
+    public void deletePolicyByNameAndZone(String serviceName, String policyName, String zoneName) throws RangerServiceException {
+        Map<String,String> queryParams = new HashMap<>();
+
+        queryParams.put(PARAM_POLICY_NAME, policyName);
+        queryParams.put(PARAM_SERVICE_NAME, serviceName);
+        queryParams.put(PARAM_ZONE_NAME, zoneName);
+
+        callAPI(DELETE_POLICY_BY_NAME, queryParams);
+    }
+
     public RangerPolicy getPolicy(long policyId) throws RangerServiceException {
         return callAPI(GET_POLICY_BY_ID.applyUrlFormat(policyId), null, null, RangerPolicy.class);
     }
@@ -284,6 +305,13 @@ public class RangerClient {
         return callAPI(GET_POLICY_BY_NAME.applyUrlFormat(serviceName, policyName), null, null, RangerPolicy.class);
     }
 
+    public RangerPolicy getPolicyByNameAndZone(String serviceName, String policyName, String zoneName) throws RangerServiceException {
+        Map<String,String> queryParams = new HashMap<>();
+
+        queryParams.put(PARAM_ZONE_NAME, zoneName);
+
+        return callAPI(GET_POLICY_BY_NAME.applyUrlFormat(serviceName, policyName), queryParams, null, RangerPolicy.class);
+    }
     public List<RangerPolicy> getPoliciesInService(String serviceName) throws RangerServiceException {
         return callAPI(GET_POLICIES_IN_SERVICE.applyUrlFormat(serviceName), null, null, new GenericType<List<RangerPolicy>>(){});
     }
diff --git a/intg/src/main/python/apache_ranger/client/ranger_client.py b/intg/src/main/python/apache_ranger/client/ranger_client.py
index 16853d4c2..e26528013 100644
--- a/intg/src/main/python/apache_ranger/client/ranger_client.py
+++ b/intg/src/main/python/apache_ranger/client/ranger_client.py
@@ -138,6 +138,11 @@ class RangerClient:
 
         return type_coerce(resp, RangerPolicy)
 
+    def get_policy_by_name_zone(self, serviceName, policyName, zoneName):
+        resp = self.client_http.call_api(RangerClient.GET_POLICY_BY_NAME.format_path({ 'serviceName': serviceName, 'policyName': policyName}), { 'zoneName': zoneName })
+
+        return type_coerce(resp, RangerPolicy)
+
     def get_policies_in_service(self, serviceName, params=None):
         resp = self.client_http.call_api(RangerClient.GET_POLICIES_IN_SERVICE.format_path({ 'serviceName': serviceName }), params)
 
@@ -153,6 +158,11 @@ class RangerClient:
 
         return type_coerce(resp, RangerPolicy)
 
+    def update_policy_by_name_zone(self, serviceName, policyName, zoneName, policy):
+        resp = self.client_http.call_api(RangerClient.UPDATE_POLICY_BY_NAME.format_path({ 'serviceName': serviceName, 'policyName': policyName}), { 'zoneName': zoneName },  request_data=policy)
+
+        return type_coerce(resp, RangerPolicy)
+
     def apply_policy(self, policy, params=None):
         resp = self.client_http.call_api(RangerClient.APPLY_POLICY, params, policy)
 
@@ -164,6 +174,9 @@ class RangerClient:
     def delete_policy(self, serviceName, policyName):
         self.client_http.call_api(RangerClient.DELETE_POLICY_BY_NAME, { 'servicename': serviceName, 'policyname': policyName })
 
+    def delete_policy_by_name_zone(self, serviceName, policyName, zoneName):
+        self.client_http.call_api(RangerClient.DELETE_POLICY_BY_NAME, { 'servicename': serviceName, 'policyname': policyName, 'zoneName': zoneName })
+
     def find_policies(self, filter=None):
         resp = self.client_http.call_api(RangerClient.FIND_POLICIES, filter)
 
diff --git a/ranger-examples/sample-client/src/main/java/org/apache/ranger/examples/sampleclient/SampleClient.java b/ranger-examples/sample-client/src/main/java/org/apache/ranger/examples/sampleclient/SampleClient.java
index d0202e47e..dd87b81b7 100644
--- a/ranger-examples/sample-client/src/main/java/org/apache/ranger/examples/sampleclient/SampleClient.java
+++ b/ranger-examples/sample-client/src/main/java/org/apache/ranger/examples/sampleclient/SampleClient.java
@@ -79,6 +79,7 @@ public class SampleClient {
         String serviceDefName     = "sampleServiceDef";
         String serviceName        = "sampleService";
         String policyName         = "samplePolicy";
+        String zoneName           = null;
         String roleName           = "sampleRole";
         Map<String,String> filter = Collections.emptyMap();
 
@@ -145,24 +146,31 @@ public class SampleClient {
                 "root", new RangerPolicy.RangerPolicyResource(Collections.singletonList("/path/to/sample/resource"),false,false));
         RangerPolicy policy = new RangerPolicy();
         policy.setService(serviceName);
+        policy.setZoneName(zoneName);
         policy.setName(policyName);
         policy.setResources(resource);
 
         RangerPolicy createdPolicy = rangerClient.createPolicy(policy);
-        LOG.info("New Policy created successfully {}", gsonBuilder.toJson(createdPolicy));
+        LOG.info("Created policy {} in zone {}: {}", policyName, zoneName, gsonBuilder.toJson(createdPolicy));
 
         /*
-        Get a policy by name
-         */
-        RangerPolicy fetchedPolicy = rangerClient.getPolicy(serviceName, policyName);
-        LOG.info("Policy: {} fetched {}", policyName, gsonBuilder.toJson(fetchedPolicy));
+        Get a policy by name and Zone
+        */
+        RangerPolicy fetchedPolicy = rangerClient.getPolicyByNameAndZone(serviceName, policyName, zoneName);
+        LOG.info("Fetched policy {} in zone {}: {}", policyName, zoneName ,gsonBuilder.toJson(fetchedPolicy));
 
+        /*
+        Update a policy by name and Zone
+        */
+        RangerPolicy updatedPolicy = rangerClient.updatePolicyByNameAndZone(serviceName, policyName, zoneName, fetchedPolicy);
+        LOG.info("Updated policy {} in zone {}: {}", policyName, zoneName ,gsonBuilder.toJson(updatedPolicy));
 
         /*
-        Delete a policy
-         */
-        rangerClient.deletePolicy(serviceName, policyName);
-        LOG.info("Policy {} successfully deleted", policyName);
+        Delete a policy by name and zone
+        */
+        rangerClient.deletePolicyByNameAndZone(serviceName, policyName, zoneName);
+        LOG.info("Deleted policy {} in zone {}", policyName, zoneName);
+
 
         /* import tags */
         RangerTagDef tagDefTest1 = new RangerTagDef("test1");
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
index d98910bee..4ad6058cc 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/PublicAPIsv2.java
@@ -34,7 +34,6 @@ import org.apache.ranger.plugin.model.RangerServiceDef;
 import org.apache.ranger.plugin.model.RangerServiceHeaderInfo;
 import org.apache.ranger.plugin.model.RangerServiceTags;
 import org.apache.ranger.plugin.util.GrantRevokeRoleRequest;
-import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServiceTags;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -463,23 +462,20 @@ public class PublicAPIsv2 {
 	@Produces({ "application/json" })
 	public RangerPolicy getPolicyByName(@PathParam("servicename") String serviceName,
 	                                    @PathParam("policyname") String policyName,
+	                                    @QueryParam("zoneName") String zoneName,
 	                                    @Context HttpServletRequest request) {
 		if(logger.isDebugEnabled()) {
-			logger.debug("==> PublicAPIsv2.getPolicyByName(" + serviceName + "," + policyName + ")");
+			logger.debug("==> PublicAPIsv2.getPolicyByName(" + serviceName + "," + policyName + "," + zoneName + ")");
 		}
 
-		SearchFilter filter = new SearchFilter();
-		filter.setParam(SearchFilter.SERVICE_NAME, serviceName);
-		filter.setParam(SearchFilter.POLICY_NAME, policyName);
-		List<RangerPolicy> policies = serviceREST.getPolicies(filter);
+		RangerPolicy policy = serviceREST.getPolicyByName(serviceName, policyName, zoneName);
 
-		if (policies.size() != 1) {
+		if (policy == null) {
 			throw restErrorUtil.createRESTException(HttpServletResponse.SC_NOT_FOUND, "Not found", true);
 		}
-		RangerPolicy policy = policies.get(0);
 
 		if(logger.isDebugEnabled()) {
-			logger.debug("<== PublicAPIsv2.getPolicyByName(" + serviceName + "," + policyName + ")" + policy);
+			logger.debug("<== PublicAPIsv2.getPolicyByName(" + serviceName + "," + policyName + "," + zoneName + ")" + policy);
 		}
 		return policy;
 	}
@@ -555,11 +551,12 @@ public class PublicAPIsv2 {
 	public RangerPolicy updatePolicyByName(RangerPolicy policy,
 	                                               @PathParam("servicename") String serviceName,
 	                                               @PathParam("policyname") String policyName,
+	                                               @QueryParam("zoneName") String zoneName,
 	                                               @Context HttpServletRequest request) {
 		if (policy.getService() == null || !policy.getService().equals(serviceName)) {
 			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST , "service name mismatch", true);
 		}
-		RangerPolicy oldPolicy = getPolicyByName(serviceName, policyName, request);
+		RangerPolicy oldPolicy = getPolicyByName(serviceName, policyName, zoneName, request);
 
 		// ignore policy.id - if specified. Retrieve using the given serviceName+policyName and use id from the retrieved object
 		policy.setId(oldPolicy.getId());
@@ -602,6 +599,7 @@ public class PublicAPIsv2 {
 	@Path("/api/policy")
 	public void deletePolicyByName(@QueryParam("servicename") String serviceName,
 	                               @QueryParam("policyname") String policyName,
+	                               @QueryParam("zoneName") String zoneName,
 	                               @Context HttpServletRequest request) {
 		if(logger.isDebugEnabled()) {
 			logger.debug("==> PublicAPIsv2.deletePolicyByName(" + serviceName + "," + policyName + ")");
@@ -610,7 +608,7 @@ public class PublicAPIsv2 {
 		if (serviceName == null || policyName == null) {
 			throw restErrorUtil.createRESTException(HttpServletResponse.SC_BAD_REQUEST , "Invalid service name or policy name", true);
 		}
-		RangerPolicy policy = getPolicyByName(serviceName, policyName, request);
+		RangerPolicy policy = getPolicyByName(serviceName, policyName, zoneName, request);
 		serviceREST.deletePolicy(policy.getId());
 		if(logger.isDebugEnabled()) {
 			logger.debug("<== PublicAPIsv2.deletePolicyByName(" + serviceName + "," + policyName + ")");
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 e02b0ea42..9e2fb66b4 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
@@ -4365,59 +4365,33 @@ public class ServiceREST {
 	}
 
 	/**
-	 * Returns {@link RangerPolicy} for non-empty serviceName and policyName, null otherwise.
+	 * Returns {@link RangerPolicy} for non-empty serviceName, policyName and zoneName null otherwise.
 	 * @param serviceName
 	 * @param policyName
+	 * @param zoneName
 	 * @return
 	 */
-    private RangerPolicy getPolicyByName(String serviceName, String policyName) {
 
+	public RangerPolicy getPolicyByName(String serviceName, String policyName, String zoneName) {
         if (LOG.isDebugEnabled()) {
-            LOG.debug("==> ServiceREST.getPolicyByName(" + serviceName + "," + policyName + ")");
+            LOG.debug("==> ServiceREST.getPolicyByName(" + serviceName + "," + policyName + "," + zoneName + ")");
         }
 
         RangerPolicy ret = null;
         if (StringUtils.isNotBlank(serviceName) && StringUtils.isNotBlank(policyName)) {
-            SearchFilter filter = new SearchFilter();
+            XXPolicy dbPolicy = daoManager.getXXPolicy().findPolicy(policyName, serviceName, zoneName);
 
-            filter.setParam(SearchFilter.SERVICE_NAME, serviceName);
-            filter.setParam(SearchFilter.POLICY_NAME, policyName);
-
-            List<RangerPolicy> policies = getPolicies(filter);
-
-            if (CollectionUtils.isNotEmpty(policies)) {
-                ret = policies.get(0);
+            if (dbPolicy != null) {
+                ret = policyService.getPopulatedViewObject(dbPolicy);
             }
         }
 
         if (LOG.isDebugEnabled()) {
-            LOG.debug("<== ServiceREST.getPolicyByName(" + serviceName + "," + policyName + ") " + (ret != null ? ret : "ret is null"));
+            LOG.debug("<== ServiceREST.getPolicyByName(" + serviceName + "," + policyName  + "," + zoneName + ") " + (ret != null ? ret : "ret is null"));
         }
         return ret;
     }
 
-	private RangerPolicy getPolicyByNameAndZone(String serviceName, String policyName, String zoneName) {
-		RangerPolicy ret = null;
-		if(LOG.isDebugEnabled()) {
-			LOG.debug("==> ServiceREST.getPolicyByNameAndZone(" + serviceName + "," + policyName + "," + zoneName + ")");
-		}
-
-		SearchFilter filter = new SearchFilter();
-		filter.setParam(SearchFilter.SERVICE_NAME, serviceName);
-		filter.setParam(SearchFilter.POLICY_NAME, policyName);
-		filter.setParam(SearchFilter.ZONE_NAME, zoneName);
-		List<RangerPolicy> policies = getPolicies(filter);
-
-		if (CollectionUtils.isNotEmpty(policies) && policies.size()==1) {
-			ret = policies.get(0);
-		}
-
-		if(LOG.isDebugEnabled()) {
-			LOG.debug("<== ServiceREST.getPolicyByNameAndZone(" + serviceName + "," + policyName + "," + zoneName + ")");
-		}
-		return ret;
-	}
-
 	private RangerPolicy createPolicyUnconditionally(RangerPolicy policy) throws Exception {
 		if(LOG.isDebugEnabled()) {
 			LOG.debug("==> ServiceREST.createPolicyUnconditionally( "+ policy +")");
@@ -4479,11 +4453,7 @@ public class ServiceREST {
 			if (StringUtils.isNotBlank(zoneName)) {
 				policy.setZoneName(StringUtils.trim(zoneName));
 			}
-			if (StringUtils.isNotBlank(zoneName)) {
-				existingPolicy = getPolicyByNameAndZone(policy.getService(), policy.getName(), policy.getZoneName());
-			} else {
-				existingPolicy = getPolicyByName(policy.getService(), policy.getName());
-			}
+			existingPolicy = getPolicyByName(policy.getService(), policy.getName(), policy.getZoneName());
 		}
 
 		if(LOG.isDebugEnabled()) {
diff --git a/security-admin/src/test/java/org/apache/ranger/rest/TestPublicAPIsv2.java b/security-admin/src/test/java/org/apache/ranger/rest/TestPublicAPIsv2.java
index 7409883ab..53750a041 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestPublicAPIsv2.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestPublicAPIsv2.java
@@ -46,7 +46,6 @@ import org.apache.ranger.plugin.model.RangerServiceDef.RangerEnumDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerPolicyConditionDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerResourceDef;
 import org.apache.ranger.plugin.model.RangerServiceDef.RangerServiceConfigDef;
-import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.security.context.RangerContextHolder;
 import org.apache.ranger.security.context.RangerSecurityContext;
 import org.apache.ranger.service.RangerPolicyService;
@@ -479,17 +478,16 @@ public class TestPublicAPIsv2 {
 		RangerService rangerService = rangerService();
 		String serviceName = rangerService.getName();
 		String policyName = rangerPolicy.getName();
-		List<RangerPolicy> policies = new ArrayList<RangerPolicy>();
-		policies.add(rangerPolicy);
-		Mockito.when(serviceREST.getPolicies((SearchFilter) Mockito.any())).thenReturn(policies);
-		RangerPolicy dbRangerPolicy = publicAPIsv2.getPolicyByName(serviceName, policyName, request);
+		String zoneName = "zone-1";
+		Mockito.when(serviceREST.getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString())).thenReturn(rangerPolicy);
+		RangerPolicy dbRangerPolicy = publicAPIsv2.getPolicyByName(serviceName, policyName, zoneName, request);
 		Assert.assertNotNull(dbRangerPolicy);
 		Assert.assertEquals(dbRangerPolicy, rangerPolicy);
 		Assert.assertEquals(dbRangerPolicy.getId(),
 				rangerPolicy.getId());
 		Assert.assertEquals(dbRangerPolicy.getName(),
 				rangerPolicy.getName());
-		Mockito.verify(serviceREST).getPolicies((SearchFilter) Mockito.any());
+		Mockito.verify(serviceREST).getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString());
 	}
 	
 	@Test
@@ -559,11 +557,10 @@ public class TestPublicAPIsv2 {
 		String policyName = rangerPolicy.getName();
 		RangerService rangerService = rangerService();
 		String serviceName = rangerService.getName();
-		List<RangerPolicy> policies = new ArrayList<RangerPolicy>();
-		policies.add(rangerPolicy);
-		Mockito.when(serviceREST.getPolicies((SearchFilter) Mockito.any())).thenReturn(policies);
+		String zoneName = "zone-1";
+		Mockito.when(serviceREST.getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString())).thenReturn(rangerPolicy);
 		Mockito.when(serviceREST.updatePolicy(rangerPolicy, rangerPolicy.getId())).thenReturn(rangerPolicy);
-		RangerPolicy dbRangerPolicy = publicAPIsv2.updatePolicyByName(rangerPolicy, serviceName, policyName, request);
+		RangerPolicy dbRangerPolicy = publicAPIsv2.updatePolicyByName(rangerPolicy, serviceName, policyName, zoneName, request);
 		Assert.assertNotNull(dbRangerPolicy);
 		Assert.assertEquals(dbRangerPolicy, rangerPolicy);
 		Assert.assertEquals(dbRangerPolicy.getId(),
@@ -571,7 +568,7 @@ public class TestPublicAPIsv2 {
 		Assert.assertEquals(dbRangerPolicy.getName(),
 				rangerPolicy.getName());
 		Mockito.verify(serviceREST).updatePolicy(rangerPolicy, rangerPolicy.getId());
-		Mockito.verify(serviceREST).getPolicies((SearchFilter) Mockito.any());
+		Mockito.verify(serviceREST).getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString());
 	}
 	
 	@Test
@@ -588,12 +585,11 @@ public class TestPublicAPIsv2 {
 		String policyName = rangerPolicy.getName();
 		RangerService rangerService = rangerService();
 		String serviceName = rangerService.getName();
-		List<RangerPolicy> policies = new ArrayList<RangerPolicy>();
-		policies.add(rangerPolicy);
-		Mockito.when(serviceREST.getPolicies((SearchFilter) Mockito.any())).thenReturn(policies);
+		String zoneName = "zone-1";
+		Mockito.when(serviceREST.getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString())).thenReturn(rangerPolicy);
 		Mockito.doNothing().when(serviceREST).deletePolicy(Id);
-		publicAPIsv2.deletePolicyByName(serviceName, policyName, request);
-		Mockito.verify(serviceREST).getPolicies((SearchFilter) Mockito.any());
+		publicAPIsv2.deletePolicyByName(serviceName, policyName, zoneName, request);
+		Mockito.verify(serviceREST).getPolicyByName(Mockito.anyString(),Mockito.anyString(),Mockito.anyString());
 		Mockito.verify(serviceREST).deletePolicy(Id);
 	}
 
diff --git a/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java b/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
index 5e3b1908d..9d17553a4 100644
--- a/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
+++ b/security-admin/src/test/java/org/apache/ranger/rest/TestServiceREST.java
@@ -55,6 +55,7 @@ import org.apache.ranger.common.StringUtil;
 import org.apache.ranger.common.UserSessionBase;
 import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXPolicyDao;
 import org.apache.ranger.db.XXSecurityZoneDao;
 import org.apache.ranger.db.XXSecurityZoneRefServiceDao;
 import org.apache.ranger.db.XXSecurityZoneRefTagServiceDao;
@@ -447,6 +448,22 @@ public class TestServiceREST {
 		return grantRevokeRequest;
 	}
 
+	private XXPolicy getXXPolicy() {
+		XXPolicy xxPolicy = new XXPolicy();
+		xxPolicy.setId(Id);
+		xxPolicy.setName("HDFS_1-1-20150316062453");
+		xxPolicy.setAddedByUserId(Id);
+		xxPolicy.setDescription("policy");
+		xxPolicy.setGuid("policyguid");
+		xxPolicy.setCreateTime(new Date());
+		xxPolicy.setIsAuditEnabled(true);
+		xxPolicy.setIsEnabled(true);
+		xxPolicy.setService(1L);
+		xxPolicy.setUpdatedByUserId(Id);
+		xxPolicy.setUpdateTime(new Date());
+		return xxPolicy;
+	}
+
 	@Test
 	public void test1createServiceDef() throws Exception {
 		RangerServiceDef rangerServiceDef = rangerServiceDef();
@@ -2675,4 +2692,41 @@ public class TestServiceREST {
 		serviceREST.resetPolicyCache(serviceName);
 		Mockito.verify(restErrorUtil).createRESTException(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean());
 	}
+
+	@Test
+	public void test80GetPolicyByNameAndServiceNameWithZoneName() throws Exception {
+		RangerPolicy rangerPolicy = rangerPolicy();
+		RangerService rangerService = rangerService();
+		XXPolicy xxPolicy = new XXPolicy();
+		String serviceName = rangerService.getName();
+		String policyName = rangerPolicy.getName();
+		String zoneName = "zone-1";
+		XXPolicyDao xXPolicyDao = Mockito.mock(XXPolicyDao.class);
+		Mockito.when(daoManager.getXXPolicy()).thenReturn(xXPolicyDao);
+		Mockito.when(daoManager.getXXPolicy().findPolicy(policyName,serviceName,zoneName)).thenReturn(xxPolicy);
+		Mockito.when(policyService.getPopulatedViewObject(xxPolicy)).thenReturn(rangerPolicy);
+		RangerPolicy dbRangerPolicy = serviceREST.getPolicyByName(serviceName, policyName, zoneName);
+		Assert.assertNotNull(dbRangerPolicy);
+		Assert.assertEquals(dbRangerPolicy, rangerPolicy);
+		Assert.assertEquals(dbRangerPolicy.getId(), rangerPolicy.getId());
+		Assert.assertEquals(dbRangerPolicy.getName(), rangerPolicy.getName());
+	}
+
+	@Test
+	public void test81GetPolicyByNameAndServiceNameWithZoneNameIsNull() throws Exception {
+		RangerPolicy rangerPolicy = rangerPolicy();
+		RangerService rangerService = rangerService();
+		XXPolicy xxPolicy = new XXPolicy();
+		String serviceName = rangerService.getName();
+		String policyName = rangerPolicy.getName();
+		XXPolicyDao xXPolicyDao = Mockito.mock(XXPolicyDao.class);
+		Mockito.when(daoManager.getXXPolicy()).thenReturn(xXPolicyDao);
+		Mockito.when(daoManager.getXXPolicy().findPolicy(policyName,serviceName,null)).thenReturn(xxPolicy);
+		Mockito.when(policyService.getPopulatedViewObject(xxPolicy)).thenReturn(rangerPolicy);
+		RangerPolicy dbRangerPolicy = serviceREST.getPolicyByName(serviceName, policyName, null);
+		Assert.assertNotNull(dbRangerPolicy);
+		Assert.assertEquals(dbRangerPolicy, rangerPolicy);
+		Assert.assertEquals(dbRangerPolicy.getId(), rangerPolicy.getId());
+		Assert.assertEquals(dbRangerPolicy.getName(), rangerPolicy.getName());
+	}
 }