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

pradeep 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 4624da1  RANGER: 2555 Enhancements in Ranger plugins to support Ranger 
HA without load-balancer
4624da1 is described below

commit 4624da1f47242715865a5197ecd1f0d5adb62617
Author: mateenmansoori <[email protected]>
AuthorDate: Tue Sep 24 10:42:08 2019 +0530

    RANGER: 2555 Enhancements in Ranger plugins to support Ranger HA without 
load-balancer
    
    Signed-off-by: Pradeep <[email protected]>
---
 .../ranger/admin/client/RangerAdminRESTClient.java | 246 +++++++++++++--------
 .../ranger/plugin/util/RangerRESTClient.java       | 194 +++++++++++++++-
 .../admin/client/RangerAdminJersey2RESTClient.java | 152 ++++++++-----
 .../tagsync/sink/tagadmin/TagAdminRESTSink.java    |  84 +++----
 4 files changed, 463 insertions(+), 213 deletions(-)

diff --git 
a/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
 
b/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
index 62d5776..01ee945 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/admin/client/RangerAdminRESTClient.java
@@ -22,7 +22,6 @@
 
 import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.GenericType;
-import com.sun.jersey.api.client.WebResource;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -40,7 +39,9 @@ import java.io.UnsupportedEncodingException;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.security.PrivilegedAction;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class RangerAdminRESTClient extends AbstractRangerAdminClient {
        private static final Log LOG = 
LogFactory.getLog(RangerAdminRESTClient.class);
@@ -119,19 +120,27 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                final boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
                final ClientResponse response;
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion));
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis));
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
+               queryParams.put(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, 
clusterName);
+               
queryParams.put(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
supportsPolicyDeltas);
+
                if (isSecureMode) {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service policy if updated 
as user : " + user);
                        }
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_POLICY_GET_FOR_SECURE_SERVICE_IF_UPDATED
 + serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, clusterName)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
supportsPolicyDeltas);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                                       ClientResponse clientRes = null;
+                                       String relativeURL = 
RangerRESTUtils.REST_URL_POLICY_GET_FOR_SECURE_SERVICE_IF_UPDATED + 
serviceNameUrlParam;
+                                       try {
+                                               clientRes =  
restClient.get(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                                       return clientRes;
                                }
                        };
                        response = user.doAs(action);
@@ -139,13 +148,8 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service policy if updated 
with old api call");
                        }
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_POLICY_GET_FOR_SERVICE_IF_UPDATED + 
serviceNameUrlParam)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, clusterName)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
supportsPolicyDeltas);
-                       response = 
webResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                       String relativeURL = 
RangerRESTUtils.REST_URL_POLICY_GET_FOR_SERVICE_IF_UPDATED + 
serviceNameUrlParam;
+                       response = restClient.get(relativeURL, queryParams);
                }
 
                if (response == null || response.getStatus() == 
HttpServletResponse.SC_NOT_MODIFIED) {
@@ -195,13 +199,21 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_CREATE_ROLE;
+
+               Map <String, String> queryParams = new HashMap<String, String> 
();
+               queryParams.put(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam);
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_CREATE_ROLE)
-                                                       
.queryParam(RangerRESTUtils.SERVICE_NAME_PARAM, serviceNameUrlParam);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                                       ClientResponse clientRes = null;
+                                       try {
+                                               clientRes = 
restClient.post(relativeURL, queryParams, request);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                                       return clientRes;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -209,8 +221,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_CREATE_ROLE);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                       response = restClient.post(relativeURL, queryParams, 
request);
                }
 
                if(response != null && response.getStatus() != 
HttpServletResponse.SC_OK) {
@@ -244,13 +255,22 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam);
+               queryParams.put(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
+
+               String relativeURL = RangerRESTUtils.REST_URL_SERVICE_DROP_ROLE 
+ roleName;
+
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_DROP_ROLE + roleName)
-                                                       
.queryParam(RangerRESTUtils.SERVICE_NAME_PARAM, serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).delete(ClientResponse.class);
+                                       ClientResponse clientRes = null;
+                                       try {
+                                               clientRes = 
restClient.delete(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                                       return clientRes;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -258,9 +278,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_DROP_ROLE + roleName)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).delete(ClientResponse.class);
+                       response = restClient.delete(relativeURL, queryParams);
                }
                if(response == null) {
                        throw new Exception("unknown error during deleteRole. 
roleName="  + roleName);
@@ -291,12 +309,18 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GET_USER_ROLES + execUser;
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_USER_ROLES + execUser);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                                       ClientResponse clientRes = null;
+                                       try {
+                                               clientRes = 
restClient.get(relativeURL, null);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                                       return clientRes;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -304,8 +328,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_USER_ROLES + execUser);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                       response = restClient.get(relativeURL, null);
                }
                if(response != null) {
                        if (response.getStatus() != HttpServletResponse.SC_OK) {
@@ -341,14 +364,22 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GET_ALL_ROLES;
+
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam);
+               queryParams.put(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_ALL_ROLES)
-                                                       
.queryParam(RangerRESTUtils.SERVICE_NAME_PARAM, serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                                       ClientResponse clientRes = null;
+                                       try {
+                                               clientRes = 
restClient.get(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientRes;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -356,9 +387,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_ALL_ROLES)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                       response = restClient.get(relativeURL, queryParams);
                }
                if(response != null) {
                        if (response.getStatus() != HttpServletResponse.SC_OK) {
@@ -393,14 +422,22 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GET_ROLE_INFO + roleName;
+
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam);
+               queryParams.put(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_ROLE_INFO + roleName)
-                                                       
.queryParam(RangerRESTUtils.SERVICE_NAME_PARAM, serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.get(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -408,9 +445,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GET_ROLE_INFO + roleName)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_EXEC_USER, execUser);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).get(ClientResponse.class);
+                       response = restClient.get(relativeURL, queryParams);
                }
                if(response != null) {
                        if (response.getStatus() != HttpServletResponse.SC_OK) {
@@ -445,13 +480,18 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GRANT_ROLE + serviceNameUrlParam;
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GRANT_ROLE + 
serviceNameUrlParam);
-                                                       
//.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).put(ClientResponse.class,
 restClient.toJson(request));
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.put(relativeURL, null, request);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -459,9 +499,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GRANT_ROLE + 
serviceNameUrlParam);
-                                       
//.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).put(ClientResponse.class,
 restClient.toJson(request));
+                       response = restClient.put(relativeURL, null, request);
                }
                if(response != null && response.getStatus() != 
HttpServletResponse.SC_OK) {
                        RESTResponse resp = 
RESTResponse.fromClientResponse(response);
@@ -490,13 +528,18 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                ClientResponse response = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_REVOKE_ROLE + serviceNameUrlParam;
 
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_REVOKE_ROLE + 
serviceNameUrlParam);
-                                                       
//.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).put(ClientResponse.class,
 restClient.toJson(request));
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.put(relativeURL, null, request);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -504,9 +547,7 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_REVOKE_ROLE + 
serviceNameUrlParam);
-                                       
//.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).put(ClientResponse.class,
 restClient.toJson(request));
+                       response = restClient.put(relativeURL, null, request);
                }
                if(response != null && response.getStatus() != 
HttpServletResponse.SC_OK) {
                        RESTResponse resp = 
RESTResponse.fromClientResponse(response);
@@ -536,12 +577,20 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
+
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SECURE_SERVICE_GRANT_ACCESS + 
serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                                       String relativeURL = 
RangerRESTUtils.REST_URL_SECURE_SERVICE_GRANT_ACCESS + serviceNameUrlParam;
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.post(relativeURL, queryParams, request);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -549,9 +598,8 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_GRANT_ACCESS + 
serviceNameUrlParam)
-                                                                               
 .queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                       String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GRANT_ACCESS + serviceNameUrlParam;
+                       response = restClient.post(relativeURL, queryParams, 
request);
                }
                if(response != null && response.getStatus() != 
HttpServletResponse.SC_OK) {
                        RESTResponse resp = 
RESTResponse.fromClientResponse(response);
@@ -581,12 +629,20 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
+
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_SECURE_SERVICE_REVOKE_ACCESS + 
serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                                       String relativeURL = 
RangerRESTUtils.REST_URL_SECURE_SERVICE_REVOKE_ACCESS + serviceNameUrlParam;
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.post(relativeURL, queryParams, request);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -594,9 +650,8 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_SERVICE_REVOKE_ACCESS + 
serviceNameUrlParam)
-                                                                               
 .queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                       response = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).post(ClientResponse.class,
 restClient.toJson(request));
+                       String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_REVOKE_ACCESS + serviceNameUrlParam;
+                       response = restClient.post(relativeURL, queryParams, 
request);
                }
 
                if(response != null && response.getStatus() != 
HttpServletResponse.SC_OK) {
@@ -631,12 +686,6 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                }
        }
 
-       private WebResource createWebResource(String url) {
-               WebResource ret = restClient.getResource(url);
-               
-               return ret;
-       }
-
        @Override
        public ServiceTags getServiceTagsIfUpdated(final long lastKnownVersion, 
final long lastActivationTimeInMillis) throws Exception {
                if(LOG.isDebugEnabled()) {
@@ -645,18 +694,25 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
 
                ServiceTags ret = null;
                ClientResponse response = null;
-               WebResource webResource = null;
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.LAST_KNOWN_TAG_VERSION_PARAM, 
Long.toString(lastKnownVersion));
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis));
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
+
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       WebResource secureWebResource = 
createWebResource(RangerRESTUtils.REST_URL_GET_SECURE_SERVICE_TAGS_IF_UPDATED + 
serviceNameUrlParam)
-                                                       
.queryParam(RangerRESTUtils.LAST_KNOWN_TAG_VERSION_PARAM, 
Long.toString(lastKnownVersion))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                                       return 
secureWebResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                                       String relativeURL = 
RangerRESTUtils.REST_URL_GET_SECURE_SERVICE_TAGS_IF_UPDATED + 
serviceNameUrlParam;
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.get(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -664,11 +720,8 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       webResource = 
createWebResource(RangerRESTUtils.REST_URL_GET_SERVICE_TAGS_IF_UPDATED + 
serviceNameUrlParam)
-                                       
.queryParam(RangerRESTUtils.LAST_KNOWN_TAG_VERSION_PARAM, 
Long.toString(lastKnownVersion))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, pluginId);
-                       response = 
webResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                       String relativeURL = 
RangerRESTUtils.REST_URL_GET_SERVICE_TAGS_IF_UPDATED + serviceNameUrlParam;
+                       response = restClient.get(relativeURL, queryParams);
                }
 
                if (response == null || response.getStatus() == 
HttpServletResponse.SC_NOT_MODIFIED) {
@@ -720,15 +773,22 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
-               final WebResource webResource = 
createWebResource(RangerRESTUtils.REST_URL_LOOKUP_TAG_NAMES)
-                               .queryParam(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam)
-                               .queryParam(RangerRESTUtils.PATTERN_PARAM, 
pattern);
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.SERVICE_NAME_PARAM, 
serviceNameUrlParam);
+               queryParams.put(RangerRESTUtils.PATTERN_PARAM, pattern);
+               String relativeURL = RangerRESTUtils.REST_URL_LOOKUP_TAG_NAMES;
 
                ClientResponse response = null;
                if (isSecureMode) {
                        PrivilegedAction<ClientResponse> action = new 
PrivilegedAction<ClientResponse>() {
                                public ClientResponse run() {
-                                       return 
webResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                                       ClientResponse clientResp = null;
+                                       try {
+                                               clientResp = 
restClient.get(relativeURL, queryParams);
+                                       } catch (Exception e) {
+                                               LOG.error("Failed to get 
response, Error is : "+e.getMessage());
+                                       }
+                               return clientResp;
                                }
                        };
                        if (LOG.isDebugEnabled()) {
@@ -736,16 +796,14 @@ public class RangerAdminRESTClient extends 
AbstractRangerAdminClient {
                        }
                        response = user.doAs(action);
                } else {
-                       response = 
webResource.accept(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+                       response = restClient.get(relativeURL, queryParams);
                }
 
                if(response != null && response.getStatus() == 
HttpServletResponse.SC_OK) {
                        ret = response.getEntity(getGenericType(emptyString));
                } else {
                        RESTResponse resp = 
RESTResponse.fromClientResponse(response);
-                       LOG.error("Error getting tags. request=" + webResource
-                                       + ", response=" + resp + ", 
serviceName=" + serviceName
-                                       + ", " + "pattern=" + pattern);
+                       LOG.error("Error getting tags. response=" + resp + ", 
serviceName=" + serviceName + ", " + "pattern=" + pattern);
                        throw new Exception(resp.getMessage());
                }
 
diff --git 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerRESTClient.java
 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerRESTClient.java
index ef9e5ae..ef5f1d5 100644
--- 
a/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerRESTClient.java
+++ 
b/agents-common/src/main/java/org/apache/ranger/plugin/util/RangerRESTClient.java
@@ -31,6 +31,11 @@ import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.security.UnrecoverableKeyException;
 import java.security.cert.CertificateException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.KeyManager;
@@ -39,6 +44,7 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.TrustManagerFactory;
+import javax.ws.rs.core.Cookie;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
@@ -46,12 +52,13 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.ranger.authorization.hadoop.config.RangerConfiguration;
 import org.apache.ranger.authorization.hadoop.utils.RangerCredentialProvider;
-import org.apache.ranger.authorization.utils.StringUtil;
 import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientHandlerException;
+import com.sun.jersey.api.client.ClientResponse;
 import com.sun.jersey.api.client.WebResource;
 import com.sun.jersey.api.client.config.ClientConfig;
 import com.sun.jersey.api.client.config.DefaultClientConfig;
@@ -102,6 +109,9 @@ public class RangerRESTClient {
        private int  mRestClientConnTimeOutMs;
        private int  mRestClientReadTimeOutMs;
 
+       private int  lastKnownActiveUrlIndex;
+       private final List<String> configuredURLs;
+
        public RangerRESTClient() {
                
this(RangerConfiguration.getInstance().get(RANGER_PROP_POLICYMGR_URL),
                         
RangerConfiguration.getInstance().get(RANGER_PROP_POLICYMGR_SSLCONFIG_FILENAME));
@@ -110,7 +120,8 @@ public class RangerRESTClient {
        public RangerRESTClient(String url, String sslConfigFileName) {
                mUrl               = url;
                mSslConfigFileName = sslConfigFileName;
-
+               this.configuredURLs = getURLs(mUrl);
+               this.lastKnownActiveUrlIndex   = (new 
Random()).nextInt(configuredURLs.size());
                init();
        }
 
@@ -210,7 +221,7 @@ public class RangerRESTClient {
                        client = Client.create(config);
                }
 
-               if(!StringUtils.isEmpty(mUsername) && 
!StringUtils.isEmpty(mPassword)) {
+               if(StringUtils.isNotEmpty(mUsername) && 
StringUtils.isNotEmpty(mPassword)) {
                        client.addFilter(new HTTPBasicAuthFilter(mUsername, 
mPassword));
                }
 
@@ -232,7 +243,7 @@ public class RangerRESTClient {
                        LOG.fatal("RangerRESTClient.init(): failed to create 
GsonBuilder object", excp);
                }
 
-               mIsSSL = StringUtil.containsIgnoreCase(mUrl, "https");
+               mIsSSL = StringUtils.containsIgnoreCase(mUrl, "https");
 
                if (mIsSSL) {
 
@@ -270,7 +281,7 @@ public class RangerRESTClient {
 
                String keyStoreFilepwd = getCredential(mKeyStoreURL, 
mKeyStoreAlias);
 
-               if (!StringUtil.isEmpty(mKeyStoreFile) && 
!StringUtil.isEmpty(keyStoreFilepwd)) {
+               if (StringUtils.isNotEmpty(mKeyStoreFile) && 
StringUtils.isNotEmpty(keyStoreFilepwd)) {
                        InputStream in =  null;
 
                        try {
@@ -321,7 +332,7 @@ public class RangerRESTClient {
 
                String trustStoreFilepwd = getCredential(mTrustStoreURL, 
mTrustStoreAlias);
 
-               if (!StringUtil.isEmpty(mTrustStoreFile) && 
!StringUtil.isEmpty(trustStoreFilepwd)) {
+               if (StringUtils.isNotEmpty(mTrustStoreFile) && 
StringUtils.isNotEmpty(trustStoreFilepwd)) {
                        InputStream in =  null;
 
                        try {
@@ -388,7 +399,7 @@ public class RangerRESTClient {
        private InputStream getFileInputStream(String fileName)  throws 
IOException {
                InputStream in = null;
 
-               if(! StringUtil.isEmpty(fileName)) {
+               if(StringUtils.isNotEmpty(fileName)) {
                        File f = new File(fileName);
 
                        if (f.exists()) {
@@ -411,4 +422,173 @@ public class RangerRESTClient {
                        }
                }
        }
+
+       public ClientResponse get(String relativeUrl, Map<String, String> 
params) throws Exception {
+               ClientResponse finalResponse = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+               int currentIndex = 0;
+
+               for (int index = 0; index < configuredURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configuredURLs.size();
+
+                               WebResource webResource = 
getClient().resource(configuredURLs.get(currentIndex) + relativeUrl);
+                               webResource = setQueryParams(webResource, 
params);
+
+                               finalResponse = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_MIME_TYPE_JSON).get(ClientResponse.class);
+
+                               if (finalResponse != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ClientHandlerException ex) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configuredURLs.get(currentIndex));
+                               processException(index, ex);
+                       }
+               }
+               return finalResponse;
+       }
+
+       public ClientResponse post(String relativeUrl, Map<String, String> 
params, Object obj) throws Exception {
+               ClientResponse finalResponse = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+               int currentIndex = 0;
+
+               for (int index = 0; index < configuredURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configuredURLs.size();
+
+                               WebResource webResource = 
getClient().resource(configuredURLs.get(currentIndex) + relativeUrl);
+                               webResource = setQueryParams(webResource, 
params);
+                               finalResponse = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_MIME_TYPE_JSON).post(ClientResponse.class,
 toJson(obj));
+                               if (finalResponse != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ClientHandlerException ex) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configuredURLs.get(currentIndex));
+                               processException(index, ex);
+                       }
+               }
+               return finalResponse;
+       }
+
+       public ClientResponse delete(String relativeUrl, Map<String, String> 
params) throws Exception {
+               ClientResponse finalResponse = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+               int currentIndex = 0;
+
+               for (int index = 0; index < configuredURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configuredURLs.size();
+
+                               WebResource webResource = 
getClient().resource(configuredURLs.get(currentIndex) + relativeUrl);
+                               webResource = setQueryParams(webResource, 
params);
+
+                               finalResponse = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_MIME_TYPE_JSON).delete(ClientResponse.class);
+                               if (finalResponse != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ClientHandlerException ex) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configuredURLs.get(currentIndex));
+                               processException(index, ex);
+                       }
+               }
+               return finalResponse;
+       }
+
+       public ClientResponse put(String relativeUrl, Map<String, String> 
params, Object obj) throws Exception {
+               ClientResponse finalResponse = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+               int currentIndex = 0;
+               for (int index = 0; index < configuredURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configuredURLs.size();
+
+                               WebResource webResource = 
getClient().resource(configuredURLs.get(currentIndex) + relativeUrl);
+                               webResource = setQueryParams(webResource, 
params);
+                               finalResponse = 
webResource.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_MIME_TYPE_JSON).put(ClientResponse.class,
 toJson(obj));
+                               if (finalResponse != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ClientHandlerException ex) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configuredURLs.get(currentIndex));
+                               processException(index, ex);
+                       }
+               }
+               return finalResponse;
+       }
+
+       public ClientResponse put(String relativeURL, Object request, Cookie 
sessionId) throws Exception {
+               ClientResponse response = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+               int currentIndex = 0;
+
+               for (int index = 0; index < configuredURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configuredURLs.size();
+
+                               WebResource webResource = 
createWebResourceForCookieAuth(currentIndex, relativeURL);
+                               WebResource.Builder br = 
webResource.getRequestBuilder().cookie(sessionId);
+                               response = 
br.accept(RangerRESTUtils.REST_EXPECTED_MIME_TYPE).type(RangerRESTUtils.REST_MIME_TYPE_JSON)
+                                               .put(ClientResponse.class, 
toJson(request));
+                               if (response != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ClientHandlerException e) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configuredURLs.get(currentIndex));
+                               processException(index, e);
+                       }
+               }
+               return response;
+       }
+
+
+       public static List<String> getURLs(String configURLs) {
+               List<String> configuredURLs = new ArrayList<>();
+               if(configURLs!=null) {
+                       String[] urls = configURLs.split(",");
+                       for (String strUrl : urls) {
+                               if 
(StringUtils.isNotEmpty(StringUtils.trimToEmpty(strUrl))) {
+                                       if (strUrl.endsWith("/")) {
+                                               strUrl = strUrl.substring(0, 
strUrl.length() - 1);
+                                       }
+                                       configuredURLs.add(strUrl);
+                               }
+                       }
+               }
+               return configuredURLs;
+       }
+
+       private static WebResource setQueryParams(WebResource webResource, 
Map<String, String> params) {
+               WebResource ret = webResource;
+               if (webResource != null && params != null) {
+                       Set<Map.Entry<String, String>> entrySet= 
params.entrySet();
+                       for (Map.Entry<String, String> entry : entrySet) {
+                               ret = ret.queryParam(entry.getKey(), 
entry.getValue());
+                       }
+               }
+               return ret;
+       }
+
+       private void setLastKnownActiveUrlIndex(int lastKnownActiveUrlIndex) {
+               this.lastKnownActiveUrlIndex = lastKnownActiveUrlIndex;
+       }
+
+       private WebResource createWebResourceForCookieAuth(int currentIndex, 
String relativeURL) {
+               Client cookieClient = getClient();
+               cookieClient.removeAllFilters();
+               WebResource ret = 
cookieClient.resource(configuredURLs.get(currentIndex) + relativeURL);
+               return ret;
+       }
+
+       private void processException(int index, ClientHandlerException e) 
throws Exception {
+               if (index == configuredURLs.size() - 1) {
+                       LOG.error("Failed to communicate with all Ranger 
Admin's URL's : [ " + configuredURLs + " ]");
+                       throw e;
+               }
+       }
 }
diff --git 
a/knox-agent/src/main/java/org/apache/ranger/admin/client/RangerAdminJersey2RESTClient.java
 
b/knox-agent/src/main/java/org/apache/ranger/admin/client/RangerAdminJersey2RESTClient.java
index f57012e..db16d73 100644
--- 
a/knox-agent/src/main/java/org/apache/ranger/admin/client/RangerAdminJersey2RESTClient.java
+++ 
b/knox-agent/src/main/java/org/apache/ranger/admin/client/RangerAdminJersey2RESTClient.java
@@ -22,13 +22,19 @@ package org.apache.ranger.admin.client;
 import java.lang.reflect.Type;
 import java.security.PrivilegedAction;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
 
 import javax.net.ssl.HostnameVerifier;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
+import javax.ws.rs.ProcessingException;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
+import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
@@ -49,6 +55,7 @@ import com.google.gson.JsonDeserializationContext;
 import com.google.gson.JsonDeserializer;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParseException;
+import com.sun.jersey.api.client.ClientHandlerException;
 
 public class RangerAdminJersey2RESTClient extends AbstractRangerAdminClient {
 
@@ -68,6 +75,8 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
        String _pluginId = null;
        int        _restClientConnTimeOutMs;
        int        _restClientReadTimeOutMs;
+       private int lastKnownActiveUrlIndex;
+       private List<String> configURLs;
 
        @Override
        public void init(String serviceName, String appId, String 
configPropertyPrefix) {
@@ -90,14 +99,11 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        _supportsPolicyDeltas = "false";
                }
 
-               if (!StringUtils.isEmpty(tmpUrl)) {
-                       _baseUrl = tmpUrl.trim();
-                       if (_baseUrl.endsWith("/")) {
-                       _baseUrl = _baseUrl.substring(0, _baseUrl.length() - 1);
-                   }
-                }
+               configURLs = RangerRESTClient.getURLs(tmpUrl);
+               this.lastKnownActiveUrlIndex = new 
Random().nextInt(configURLs.size());
+               _baseUrl = configURLs.get(this.lastKnownActiveUrlIndex);
                _isSSL = _utils.isSsl(_baseUrl);
-               LOG.info("Init params: " + String.format("Base URL[%s], SSL 
Congig filename[%s], ServiceName=[%s], SupportsPolicyDeltas=[%s]", _baseUrl, 
_sslConfigFileName, _serviceName, _supportsPolicyDeltas));
+               LOG.info("Init params: " + String.format("Base URL[%s], SSL 
Config filename[%s], ServiceName=[%s], SupportsPolicyDeltas=[%s], 
ConfigURLs=[%s]", _baseUrl, _sslConfigFileName, _serviceName, 
_supportsPolicyDeltas, configURLs));
                
                _client = getClient();
                _client.property(ClientProperties.CONNECT_TIMEOUT, 
_restClientConnTimeOutMs);
@@ -117,26 +123,26 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
-               String url = null;
+               String relativeURL = null;
                ServicePolicies servicePolicies = null;
                Response response = null;
 
+               Map<String, String> queryParams = new HashMap<String, String>();
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion));
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis));
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, 
_pluginId);
+               queryParams.put(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, 
_clusterName);
+               
queryParams.put(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
_supportsPolicyDeltas);
+
                if (isSecureMode) {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service policy if updated 
as user : " + user);
                        }
-                       url = _utils.getSecureUrlForPolicyUpdate(_baseUrl, 
_serviceName);
-                       final String secureUrl = url;
+                       relativeURL = 
RangerRESTUtils.REST_URL_POLICY_GET_FOR_SECURE_SERVICE_IF_UPDATED + 
_serviceName;
+                       final String secureRelativeUrl = relativeURL;
                        PrivilegedAction<Response> action = new 
PrivilegedAction<Response>() {
                                public Response run() {
-                                       return _client.target(secureUrl)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, _clusterName)
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
_supportsPolicyDeltas)
-                                                       
.request(MediaType.APPLICATION_JSON_TYPE)
-                                                       .get();
+                                       return get(queryParams, 
secureRelativeUrl);
                                }
                        };
                        response = user.doAs(action);
@@ -144,15 +150,8 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service policy if updated 
with old api call");
                        }
-                       url = _utils.getUrlForPolicyUpdate(_baseUrl, 
_serviceName);
-                       response = _client.target(url)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_CLUSTER_NAME, _clusterName)
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
_supportsPolicyDeltas)
-                                       
.request(MediaType.APPLICATION_JSON_TYPE)
-                                       .get();
+                       relativeURL = 
RangerRESTUtils.REST_URL_POLICY_GET_FOR_SERVICE_IF_UPDATED + _serviceName;
+                       response = get(queryParams, relativeURL);
                }
 
                int httpResponseCode = response == null ? -1 : 
response.getStatus();
@@ -191,7 +190,7 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        }
                        default:
                                body = response.readEntity(String.class);
-                               LOG.warn(String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, url));
+                               LOG.warn(String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, relativeURL));
                                break;
                }
 
@@ -208,11 +207,12 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        LOG.debug("==> RangerAdminRESTClient.grantAccess(" + 
request + ")");
                }
 
-               String url = _utils.getUrlForGrantAccess(_baseUrl, 
_serviceName);
-               Response response = _client.target(url)
-                               
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                               .request(MediaType.APPLICATION_JSON_TYPE)
-                               .get();
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, 
_pluginId);
+
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_GRANT_ACCESS + _serviceName;
+               Response response = get(queryParams, relativeURL);
+
                int httpResponseCode = response == null ? -1 : 
response.getStatus();
                
                switch(httpResponseCode) {
@@ -226,7 +226,7 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        throw new AccessControlException();
                default:
                        String body = response.readEntity(String.class);
-                       String message = String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, url);
+                       String message = String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, relativeURL);
                        LOG.warn(message);
                        throw new Exception("HTTP status: " + httpResponseCode);
                }
@@ -243,11 +243,12 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        LOG.debug("==> RangerAdminRESTClient.grantAccess(" + 
request + ")");
                }
 
-               String url = _utils.getUrlForRevokeAccess(_baseUrl, 
_serviceName);
-               Response response = _client.target(url)
-                               
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                               .request(MediaType.APPLICATION_JSON_TYPE)
-                               .get();
+               Map<String, String> queryParams = new HashMap<String, String>();
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, 
_pluginId);
+
+               String relativeURL = 
RangerRESTUtils.REST_URL_SERVICE_REVOKE_ACCESS + _serviceName;
+               Response response = get(queryParams, relativeURL);
+
                int httpResponseCode = response == null ? -1 : 
response.getStatus();
                
                switch(httpResponseCode) {
@@ -261,7 +262,7 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        throw new AccessControlException();
                default:
                        String body = response.readEntity(String.class);
-                       String message = String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, url);
+                       String message = String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, relativeURL);
                        LOG.warn(message);
                        throw new Exception("HTTP status: " + httpResponseCode);
                }
@@ -280,23 +281,24 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                UserGroupInformation user = MiscUtil.getUGILoginUser();
                boolean isSecureMode = user != null && 
UserGroupInformation.isSecurityEnabled();
 
-               String url = null;
+               Map<String, String> queryParams = new HashMap<String, String>();
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_KNOWN_POLICY_VERSION, 
Long.toString(lastKnownVersion));
+               
queryParams.put(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis));
+               queryParams.put(RangerRESTUtils.REST_PARAM_PLUGIN_ID, 
_pluginId);
+               
queryParams.put(RangerRESTUtils.REST_PARAM_SUPPORTS_POLICY_DELTAS, 
_supportsPolicyDeltas);
+
+               String relativeURL = null;
                ServiceTags serviceTags = null;
                Response response = null;
                if (isSecureMode) {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service tags if updated as 
user : " + user);
                        }
-                       url = _utils.getSecureUrlForTagUpdate(_baseUrl, 
_serviceName);
-                       final String secureUrl = url;
+                       relativeURL = 
RangerRESTUtils.REST_URL_GET_SECURE_SERVICE_TAGS_IF_UPDATED + _serviceName;
+                       final String secureRelativeURLUrl = relativeURL;
                        PrivilegedAction<Response> action = new 
PrivilegedAction<Response>() {
                                public Response run() {
-                                       return _client.target(secureUrl)
-                                                       
.queryParam(RangerRESTUtils.LAST_KNOWN_TAG_VERSION_PARAM, 
Long.toString(lastKnownVersion))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                                                       
.request(MediaType.APPLICATION_JSON_TYPE)
-                                                       .get();
+                                       return get(queryParams, 
secureRelativeURLUrl);
                                }
                        };
                        response = user.doAs(action);
@@ -304,13 +306,8 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                        if (LOG.isDebugEnabled()) {
                                LOG.debug("Checking Service tags if updated 
with old api call");
                        }
-                       url = _utils.getUrlForTagUpdate(_baseUrl, _serviceName);
-                       response = _client.target(url)
-                                       
.queryParam(RangerRESTUtils.LAST_KNOWN_TAG_VERSION_PARAM, 
Long.toString(lastKnownVersion))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_LAST_ACTIVATION_TIME, 
Long.toString(lastActivationTimeInMillis))
-                                       
.queryParam(RangerRESTUtils.REST_PARAM_PLUGIN_ID, _pluginId)
-                                       
.request(MediaType.APPLICATION_JSON_TYPE)
-                                       .get();
+                       relativeURL = 
RangerRESTUtils.REST_URL_GET_SERVICE_TAGS_IF_UPDATED + _serviceName;
+                       response = get(queryParams, relativeURL);
                }
 
                int httpResponseCode = response == null ? -1 : 
response.getStatus();
@@ -348,7 +345,7 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                                break;
                        default:
                                body = response.readEntity(String.class);
-                               LOG.warn(String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, url));
+                               LOG.warn(String.format("Unexpected: Received 
status[%d] with body[%s] form url[%s]", httpResponseCode, body, relativeURL));
                                break;
                }
 
@@ -422,4 +419,45 @@ public class RangerAdminJersey2RESTClient extends 
AbstractRangerAdminClient {
                
                return _client;
        }
+
+       private Response get(Map<String, String> queyParams, String 
relativeURL) {
+               Response response = null;
+               int startIndex = this.lastKnownActiveUrlIndex;
+        int currentIndex = 0;
+
+               for (int index = 0; index < configURLs.size(); index++) {
+                       try {
+                               currentIndex = (startIndex + index) % 
configURLs.size();
+
+                               WebTarget target = 
_client.target(configURLs.get(currentIndex) + relativeURL);
+                               response = setQueryParams(target, 
queyParams).request(MediaType.APPLICATION_JSON_TYPE).get();
+                               if (response != null) {
+                                       
setLastKnownActiveUrlIndex(currentIndex);
+                                       break;
+                               }
+                       } catch (ProcessingException e) {
+                               LOG.warn("Failed to communicate with Ranger 
Admin, URL : " + configURLs.get(currentIndex));
+                               if (index == configURLs.size() - 1) {
+                                       throw new ClientHandlerException(
+                                                       "Failed to communicate 
with all Ranger Admin's URL's : [ " + configURLs + " ]");
+                               }
+                       }
+               }
+               return response;
+       }
+
+       private static WebTarget setQueryParams(WebTarget target, Map<String, 
String> params) {
+               WebTarget ret = target;
+               if (target != null && params != null) {
+                       Set<Map.Entry<String, String>> entrySet = 
params.entrySet();
+                       for (Map.Entry<String, String> entry : entrySet) {
+                               ret = ret.queryParam(entry.getKey(), 
entry.getValue());
+                       }
+               }
+               return ret;
+       }
+
+       private void setLastKnownActiveUrlIndex(int lastKnownActiveUrlIndex) {
+               this.lastKnownActiveUrlIndex = lastKnownActiveUrlIndex;
+       }
 }
diff --git 
a/tagsync/src/main/java/org/apache/ranger/tagsync/sink/tagadmin/TagAdminRESTSink.java
 
b/tagsync/src/main/java/org/apache/ranger/tagsync/sink/tagadmin/TagAdminRESTSink.java
index 331f783..062c5e3 100644
--- 
a/tagsync/src/main/java/org/apache/ranger/tagsync/sink/tagadmin/TagAdminRESTSink.java
+++ 
b/tagsync/src/main/java/org/apache/ranger/tagsync/sink/tagadmin/TagAdminRESTSink.java
@@ -19,34 +19,30 @@
 
 package org.apache.ranger.tagsync.sink.tagadmin;
 
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
+import java.io.IOException;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.Cookie;
+import javax.ws.rs.core.NewCookie;
 
-import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.security.UserGroupInformation;
 import org.apache.ranger.admin.client.datatype.RESTResponse;
-import org.apache.ranger.tagsync.model.TagSink;
-import com.sun.jersey.api.client.Client;
-import javax.ws.rs.core.Cookie;
-import javax.ws.rs.core.NewCookie;
-import java.util.ArrayList;
-import java.util.List;
 import org.apache.ranger.plugin.util.RangerRESTClient;
-import org.apache.ranger.plugin.util.SearchFilter;
 import org.apache.ranger.plugin.util.ServiceTags;
+import org.apache.ranger.tagsync.model.TagSink;
 import org.apache.ranger.tagsync.process.TagSyncConfig;
-import javax.servlet.http.HttpServletResponse;
 
-import java.io.IOException;
-import java.security.PrivilegedAction;
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
+import com.sun.jersey.api.client.ClientResponse;
 
 public class TagAdminRESTSink implements TagSink, Runnable {
        private static final Log LOG = 
LogFactory.getLog(TagAdminRESTSink.class);
@@ -54,8 +50,6 @@ public class TagAdminRESTSink implements TagSink, Runnable {
        private static final String REST_PREFIX = "/service";
        private static final String MODULE_PREFIX = "/tags";
 
-       private static final String REST_MIME_TYPE_JSON = "application/json";
-
        private static final String REST_URL_IMPORT_SERVICETAGS_RESOURCE = 
REST_PREFIX + MODULE_PREFIX + "/importservicetags/";
 
        private long rangerAdminConnectionCheckInterval;
@@ -193,8 +187,7 @@ public class TagAdminRESTSink implements TagSink, Runnable {
                if (isRangerCookieEnabled) {
                        response = uploadServiceTagsUsingCookie(serviceTags);
                } else {
-                       WebResource webResource = 
createWebResource(REST_URL_IMPORT_SERVICETAGS_RESOURCE);
-                       response = 
webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class,
 tagRESTClient.toJson(serviceTags));
+                       response = 
tagRESTClient.put(REST_URL_IMPORT_SERVICETAGS_RESOURCE, null, serviceTags);
                }
 
                if(response == null || response.getStatus() != 
HttpServletResponse.SC_NO_CONTENT) {
@@ -268,9 +261,13 @@ public class TagAdminRESTSink implements TagSink, Runnable 
{
        private synchronized ClientResponse uploadTagsWithCred(ServiceTags 
serviceTags) {
                        if (sessionId == null) {
                                tagRESTClient.resetClient();
-                               WebResource webResource = 
createWebResource(REST_URL_IMPORT_SERVICETAGS_RESOURCE);
-                               ClientResponse response = 
webResource.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class,
-                                               
tagRESTClient.toJson(serviceTags));
+
+                               ClientResponse response = null;
+                               try {
+                                       response = 
tagRESTClient.put(REST_URL_IMPORT_SERVICETAGS_RESOURCE, null, serviceTags);
+                               } catch (Exception e) {
+                                       LOG.error("Failed to get response, 
Error is : "+e.getMessage());
+                               }
                                if (response != null) {
                                        if 
(!(response.toString().contains(REST_URL_IMPORT_SERVICETAGS_RESOURCE))) {
                                                
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
@@ -306,10 +303,13 @@ public class TagAdminRESTSink implements TagSink, 
Runnable {
                if (LOG.isDebugEnabled()) {
                        LOG.debug("==> uploadTagsWithCookie");
                }
-               WebResource webResource = 
createWebResourceForCookieAuth(REST_URL_IMPORT_SERVICETAGS_RESOURCE);
-               WebResource.Builder br = 
webResource.getRequestBuilder().cookie(sessionId);
-               ClientResponse response = 
br.accept(REST_MIME_TYPE_JSON).type(REST_MIME_TYPE_JSON).put(ClientResponse.class,
-                               tagRESTClient.toJson(serviceTags));
+
+               ClientResponse response = null;
+               try {
+                       response = 
tagRESTClient.put(REST_URL_IMPORT_SERVICETAGS_RESOURCE, serviceTags, sessionId);
+               } catch (Exception e) {
+                       LOG.error("Failed to get response, Error is : 
"+e.getMessage());
+               }
                if (response != null) {
                        if 
(!(response.toString().contains(REST_URL_IMPORT_SERVICETAGS_RESOURCE))) {
                                
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
@@ -331,32 +331,6 @@ public class TagAdminRESTSink implements TagSink, Runnable 
{
                return response;
        }
 
-       private WebResource createWebResource(String url) {
-               return createWebResource(url, null);
-       }
-
-       private WebResource createWebResource(String url, SearchFilter filter) {
-               WebResource ret = tagRESTClient.getResource(url);
-
-               if(filter != null && !MapUtils.isEmpty(filter.getParams())) {
-                       for(Map.Entry<String, String> e : 
filter.getParams().entrySet()) {
-                               String name  = e.getKey();
-                               String value = e.getValue();
-
-                               ret.queryParam(name, value);
-                       }
-               }
-
-               return ret;
-       }
-
-       private WebResource createWebResourceForCookieAuth(String url) {
-               Client cookieClient = tagRESTClient.getClient();
-               cookieClient.removeAllFilters();
-               WebResource ret = cookieClient.resource(tagRESTClient.getUrl() 
+ url);
-               return ret;
-       }
-
        @Override
        public boolean start() {
 

Reply via email to