You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hawq.apache.org by hu...@apache.org on 2017/05/26 23:45:10 UTC
incubator-hawq git commit: HAWQ-1443. Implement Ranger lookup for
HAWQ with Kerberos enabled.
Repository: incubator-hawq
Updated Branches:
refs/heads/master 3a9978906 -> 9775424ba
HAWQ-1443. Implement Ranger lookup for HAWQ with Kerberos enabled.
Signed-off-by: xiang sheng <st...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/incubator-hawq/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-hawq/commit/9775424b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-hawq/tree/9775424b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-hawq/diff/9775424b
Branch: refs/heads/master
Commit: 9775424ba11546248ac90133330ed6f1cc331545
Parents: 3a99789
Author: Hubert Zhang <hu...@apache.org>
Authored: Fri May 26 20:17:53 2017 +0800
Committer: xiang sheng <st...@gmail.com>
Committed: Fri May 26 20:17:53 2017 +0800
----------------------------------------------------------------------
.../apache/hawq/ranger/service/HawqClient.java | 152 ++++++++++++++-----
.../hawq/ranger/service/HawqResourceMgr.java | 145 +++++++++++++-----
.../hawq/ranger/service/RangerServiceHawq.java | 20 ++-
.../hawq/ranger/service/HawqClientTest.java | 26 +---
.../ranger/service/RangerServiceHawqTest.java | 24 ++-
ranger-plugin/conf/ranger-servicedef-hawq.json | 47 +++++-
6 files changed, 308 insertions(+), 106 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java
----------------------------------------------------------------------
diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java
index d2606be..7e05a82 100644
--- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java
+++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqClient.java
@@ -21,7 +21,9 @@ package org.apache.hawq.ranger.service;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hawq.ranger.model.HawqProtocols;
-
+import org.apache.ranger.plugin.client.BaseClient;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@@ -29,9 +31,9 @@ import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.*;
-import static org.apache.ranger.plugin.client.BaseClient.generateResponseDataMap;
+import javax.security.auth.Subject;
-public class HawqClient {
+public class HawqClient extends BaseClient {
private static final Log LOG = LogFactory.getLog(HawqClient.class);
@@ -63,13 +65,17 @@ public class HawqClient {
public static final String PRONAME = "proname";
public static final String NSPNAME = "nspname";
public static final String WILDCARD = "*";
+ public static final String KERBEROS = "kerberos";
+ public static final String AUTHENTICATION = "authentication";
public static final List<String> INTERNAL_PROTOCOLS = HawqProtocols.getAllProtocols();
private static final String DEFAULT_DATABASE = "postgres";
private static final String JDBC_DRIVER_CLASS = "org.postgresql.Driver";
+ private boolean isKerberosAuth;
+ private Connection con;
private Map<String, String> connectionProperties;
-
+
// we need to load class for the Postgres Driver directly to allow it to register with DriverManager
// since DriverManager's classloader will not be able to find it by itself due to plugin's special classloaders
static {
@@ -81,9 +87,88 @@ public class HawqClient {
}
}
- public HawqClient(Map<String, String> connectionProperties) throws SQLException {
+ public HawqClient(String serviceName, Map<String, String> connectionProperties) throws Exception {
+ super(serviceName,connectionProperties);
this.connectionProperties = connectionProperties;
+ initHawq();
}
+
+ public void initHawq() throws Exception {
+ isKerberosAuth = connectionProperties.get(AUTHENTICATION).equals(KERBEROS);
+ if (isKerberosAuth) {
+ LOG.info("Secured Mode: JDBC Connection done with preAuthenticated Subject");
+
+ // do kinit in hawqclient by principal name and password
+ final String userName = getConfigHolder().getUserName();
+ final String password = getConfigHolder().getPassword();
+
+ String[] kinitcmd ={
+ "/bin/sh",
+ "-c",
+ "echo '"+password+"' | kinit " + userName
+ };
+ java.lang.Runtime rt = java.lang.Runtime.getRuntime();
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("kinit command: "+"echo '"+password+"' | kinit " + userName);
+ }
+ java.lang.Process p = rt.exec(kinitcmd);
+
+ Subject.doAs(getLoginSubject(), new PrivilegedExceptionAction<Void>(){
+ public Void run() throws Exception {
+ final String lookupPricipalName = getConfigHolder().getUserName();
+ final String serverprincipal = connectionProperties.get("principal");
+ initConnectionKerberos(serverprincipal, lookupPricipalName);
+ return null;
+ }});
+ }
+ else {
+ LOG.info("Trying to use UnSecure client with username and password");
+ final String userName = getConfigHolder().getUserName();
+ final String password = getConfigHolder().getPassword();
+ initConnection(userName, password);
+ }
+ }
+
+ private void initConnectionKerberos(String serverPricipal, String userPrincipal) throws SQLException{
+ try {
+ String url = String.format("jdbc:postgresql://%s:%s/%s?kerberosServerName=%s&jaasApplicationName=pgjdbc&user=%s",
+ connectionProperties.get("hostname"),
+ connectionProperties.get("port"), DEFAULT_DATABASE,
+ serverPricipal, userPrincipal
+ );
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("InitConnectionKerberos "+ url);
+ }
+ con = DriverManager.getConnection(url);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ LOG.error("Unable to Connect to Hawq", e);
+ throw e;
+ } catch (SecurityException se) {
+ se.printStackTrace();
+ }
+ }
+
+
+ private void initConnection(String userName, String password) throws SQLException {
+ try {
+ String url = String.format("jdbc:postgresql://%s:%s/%s", connectionProperties.get("hostname"), connectionProperties.get("port"), DEFAULT_DATABASE);
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("InitConnectionKerberos "+ url);
+ }
+ con = DriverManager.getConnection(url, userName, password);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ LOG.error("Unable to Connect to Hawq", e);
+ throw e;
+ } catch (SecurityException se) {
+ se.printStackTrace();
+ }
+ }
+
+ public void setConnection(Connection conn) {
+ con = conn;
+ }
/**
* Uses the connectionProperties and attempts to connect to Hawq.
@@ -97,7 +182,6 @@ public class HawqClient {
boolean isConnected = false;
HashMap<String, Object> result = new HashMap<>();
- Connection conn = null;
String description = CONNECTION_FAILURE_MESSAGE;
@@ -106,8 +190,7 @@ public class HawqClient {
}
try {
- conn = getConnection(connectionProperties);
- if(conn.getCatalog() != null) {
+ if(con.getCatalog() != null) {
isConnected = true;
description = CONNECTION_SUCCESSFUL_MESSAGE;
}
@@ -115,7 +198,6 @@ public class HawqClient {
LOG.error("<== HawqClient.checkConnection Error: Failed to connect" + e);
description = e.getMessage();
} finally {
- closeConnection(conn);
}
String message = isConnected ? CONNECTION_SUCCESSFUL_MESSAGE : CONNECTION_FAILURE_MESSAGE;
@@ -183,7 +265,6 @@ public class HawqClient {
List<String> databases = resources.get("database");
List<String> schemas = resources.get("schema");
- Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
@@ -191,14 +272,16 @@ public class HawqClient {
databases = getDatabaseList(WILDCARD);
}
+ if(con == null) {
+ return new ArrayList<>(uniqueResults);
+ }
for (String db: databases) {
if (LOG.isDebugEnabled()) {
LOG.debug("<== HawqClient.queryHawqPerDbAndSchema: Connecting to db: " + db);
}
try {
- conn = getConnection(connectionProperties, db);
- preparedStatement = handleWildcardPreparedStatement(userInput, query, conn);
+ preparedStatement = handleWildcardPreparedStatement(userInput, query, con);
if (LOG.isDebugEnabled()) {
LOG.debug("<== HawqClient.queryHawqPerDbAndSchema Starting query: " + query);
@@ -221,21 +304,22 @@ public class HawqClient {
} finally {
closeResultSet(resultSet);
closeStatement(preparedStatement);
- closeConnection(conn);
}
}
return new ArrayList<>(uniqueResults);
}
- private List<String> queryHawq(String userInput, String columnName, String query, String database) {
+ private List<String> queryHawq(String userInput, String columnName, String query, String database) throws SQLException{
List<String> result = new ArrayList<>();
- Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
- conn = getConnection(connectionProperties, database);
- preparedStatement = handleWildcardPreparedStatement(userInput, query, conn);
+ if(con == null) {
+ return result;
+ }
+
+ preparedStatement = handleWildcardPreparedStatement(userInput, query, con);
if (LOG.isDebugEnabled()) {
LOG.debug("<== HawqClient.queryHawq Starting query: " + query);
@@ -253,34 +337,15 @@ public class HawqClient {
} catch (SQLException e) {
LOG.error("<== HawqClient.queryHawq Error: Failed to get result from query: " + query + ", Error: " + e);
+ throw e;
} finally {
closeResultSet(resultSet);
closeStatement(preparedStatement);
- closeConnection(conn);
}
return result;
}
- private Connection getConnection(Map<String, String> connectionProperties) throws SQLException {
- return getConnection(connectionProperties, null);
- }
-
- private Connection getConnection(Map<String, String> connectionProperties, String database) throws SQLException {
-
- String db = database != null ? database : DEFAULT_DATABASE;
- String url = String.format("jdbc:postgresql://%s:%s/%s", connectionProperties.get("hostname"), connectionProperties.get("port"), db);
-
- if (LOG.isDebugEnabled()) {
- LOG.debug("<== HawqClient.checkConnection Connecting to: (" + url + ") with user: " + connectionProperties.get("username") );
- }
-
- Properties props = new Properties();
- props.setProperty("user", connectionProperties.get("username"));
- props.setProperty("password", connectionProperties.get("password"));
- return DriverManager.getConnection(url, props);
- }
-
private PreparedStatement handleWildcardPreparedStatement(String userInput, String query, Connection conn) throws SQLException {
PreparedStatement preparedStatement = conn.prepareStatement(query);
preparedStatement.setString(1, userInput.equals(WILDCARD) ? "%" : (userInput + "%"));
@@ -305,10 +370,21 @@ public class HawqClient {
private void closeConnection(Connection conn) {
try {
- if (conn != null) conn.close();
+ if (conn != null) {
+ conn.close();
+ }
} catch (Exception e) {
// ignore
}
}
+
+ public void close() {
+ Subject.doAs(getLoginSubject(), new PrivilegedAction<Void>(){
+ public Void run() {
+ closeConnection(con);
+ return null;
+ }
+ });
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java
----------------------------------------------------------------------
diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java
index 214ebdb..d9f68d7 100644
--- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java
+++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/HawqResourceMgr.java
@@ -19,53 +19,124 @@ package org.apache.hawq.ranger.service;
import org.apache.hawq.ranger.model.HawqResource;
import org.apache.ranger.plugin.service.ResourceLookupContext;
+import org.apache.ranger.plugin.util.TimedEventUtil;
+import org.apache.log4j.Logger;
+
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
import java.util.Collections;
public abstract class HawqResourceMgr {
- public static List<String> getHawqResources(Map<String, String> configs,
- ResourceLookupContext context) throws SQLException {
- String userInput = context.getUserInput();
+ private static final Logger LOG = Logger.getLogger(HawqResourceMgr.class);
+
+ public static List<String> getHawqResources(String serviceName, String serviceType, Map<String, String> configs,
+ ResourceLookupContext context) throws Exception {
+ final String userInput = context.getUserInput();
HawqResource hawqResource = HawqResource.valueOf(context.getResourceName().toUpperCase());
- Map<String, List<String>> resources = context.getResources();
-
- List<String> result;
- HawqClient hawqClient = new HawqClient(configs);
-
- switch (hawqResource) {
- case DATABASE:
- result = hawqClient.getDatabaseList(userInput);
- break;
- case TABLESPACE:
- result = hawqClient.getTablespaceList(userInput);
- break;
- case PROTOCOL:
- result = hawqClient.getProtocolList(userInput);
- break;
- case SCHEMA:
- result = hawqClient.getSchemaList(userInput, resources);
- break;
- case LANGUAGE:
- result = hawqClient.getLanguageList(userInput, resources);
- break;
- case TABLE:
- result = hawqClient.getTableList(userInput, resources);
- break;
- case SEQUENCE:
- result = hawqClient.getSequenceList(userInput, resources);
- break;
- case FUNCTION:
- result = hawqClient.getFunctionList(userInput, resources);
- break;
- default:
- throw new IllegalArgumentException("Resource requested does not exist.");
+ final Map<String, List<String>> resources = context.getResources();
+
+ List<String> result = null;
+ if (serviceName != null && userInput != null) {
+ try {
+
+ if(LOG.isDebugEnabled()) {
+ LOG.debug("==> HawqResourceMgr.getHawqResources() UserInput: "+ userInput + " configs: " + configs);
+ }
+ final HawqClient hawqClient =new HawqClient(serviceName, configs);
+ Callable<List<String>> callableObj = null;
+
+ if(hawqClient != null) {
+ switch (hawqResource) {
+ case DATABASE:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getDatabaseList(userInput);
+ }
+ };
+ break;
+ case TABLESPACE:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getTablespaceList(userInput);
+ }
+ };
+ break;
+ case PROTOCOL:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getProtocolList(userInput);
+ }
+ };
+ break;
+ case SCHEMA:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getSchemaList(userInput, resources);
+ }
+ };
+ break;
+ case LANGUAGE:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getLanguageList(userInput, resources);
+ }
+ };
+ break;
+ case TABLE:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getTableList(userInput, resources);
+ }
+ };
+ break;
+ case SEQUENCE:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException {
+ return hawqClient.getSequenceList(userInput, resources);
+ }
+ };
+ break;
+ case FUNCTION:
+ callableObj = new Callable<List<String>>() {
+ @Override
+ public List<String> call() throws SQLException{
+ return hawqClient.getFunctionList(userInput, resources);
+ }
+ };
+ break;
+ default:
+ throw new IllegalArgumentException("Resource requested does not exist.");
+ }
+ }
+
+ if (callableObj != null) {
+ synchronized (hawqClient) {
+ result = TimedEventUtil.timedTask(callableObj, 5,
+ TimeUnit.SECONDS);
+ }
+ } else {
+ LOG.error("Could not initiate at timedTask");
+ }
+
+
+ Collections.sort(result);
+ } catch (Exception e) {
+ LOG.error("Unable to get hive resources.", e);
+ throw e;
+ }
}
-
- Collections.sort(result);
return result;
}
}
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java
----------------------------------------------------------------------
diff --git a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java
index 0f12191..24a76ca 100644
--- a/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java
+++ b/ranger-plugin/admin-plugin/src/main/java/org/apache/hawq/ranger/service/RangerServiceHawq.java
@@ -19,6 +19,8 @@
package org.apache.hawq.ranger.service;
import org.apache.ranger.plugin.client.HadoopException;
+import org.apache.ranger.plugin.model.RangerService;
+import org.apache.ranger.plugin.model.RangerServiceDef;
import org.apache.ranger.plugin.service.RangerBaseService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -30,6 +32,15 @@ public class RangerServiceHawq extends RangerBaseService {
private static final Log LOG = LogFactory.getLog(RangerServiceHawq.class);
+ public RangerServiceHawq() {
+ super();
+ }
+
+ @Override
+ public void init(RangerServiceDef serviceDef, RangerService service) {
+ super.init(serviceDef, service);
+ }
+
@Override
public HashMap<String, Object> validateConfig() throws Exception {
boolean isDebugEnabled = LOG.isDebugEnabled();
@@ -39,10 +50,10 @@ public class RangerServiceHawq extends RangerBaseService {
}
HashMap<String, Object> result = new HashMap<>();
-
+ String serviceName = getServiceName();
if (configs != null) {
try {
- HawqClient hawqClient = new HawqClient(configs);
+ HawqClient hawqClient = new HawqClient(serviceName, configs);
result = hawqClient.checkConnection(configs);
} catch (HadoopException e) {
LOG.error("<== RangerServiceHawq.validateConfig Error:" + e);
@@ -58,7 +69,10 @@ public class RangerServiceHawq extends RangerBaseService {
@Override
public List<String> lookupResource(ResourceLookupContext context) throws Exception {
- List<String> resources = HawqResourceMgr.getHawqResources(getConfigs(), context);
+ String serviceName = getServiceName();
+ String serviceType = getServiceType();
+
+ List<String> resources = HawqResourceMgr.getHawqResources(serviceName, serviceType, getConfigs(), context);
return resources;
}
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java
----------------------------------------------------------------------
diff --git a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java
index 7d624d8..64bf874 100644
--- a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java
+++ b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/HawqClientTest.java
@@ -27,23 +27,20 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.sql.Connection;
-import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import static org.apache.hawq.ranger.service.HawqClient.*;
import static org.junit.Assert.*;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyMap;
-import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.*;
+import static org.powermock.api.support.membermodification.MemberMatcher.method;
+import static org.powermock.api.support.membermodification.MemberModifier.suppress;
@RunWith(PowerMockRunner.class)
@PrepareForTest(HawqClient.class)
@@ -63,7 +60,7 @@ public class HawqClientTest {
private Map<String, List<String>> resources;
@Before
- public void setUp() throws SQLException {
+ public void setUp() throws Exception {
connectionProperties = new HashMap<>();
connectionProperties.put("hostname", "hostname");
connectionProperties.put("port", "5432");
@@ -71,10 +68,10 @@ public class HawqClientTest {
connectionProperties.put("username", "username");
connectionProperties.put("password", "password");
- mockStatic(DriverManager.class);
suppress(constructor(BaseClient.class, String.class, Map.class));
- hawqClient = new HawqClient(connectionProperties);
-
+ suppress(method(HawqClient.class, "initHawq"));
+ hawqClient = new HawqClient("hawq", connectionProperties);
+ hawqClient.setConnection(conn);
hawqClientSpy = PowerMockito.spy(hawqClient);
resources = new HashMap<>();
@@ -86,7 +83,6 @@ public class HawqClientTest {
@Test
public void testCheckConnection_Failure() throws Exception {
- when(DriverManager.getConnection(anyString(), any(Properties.class))).thenReturn(conn);
when(conn.getCatalog()).thenReturn(null);
Map<String, Object> response = hawqClient.checkConnection(connectionProperties);
assertEquals(CONNECTION_FAILURE_MESSAGE, response.get("message"));
@@ -95,7 +91,6 @@ public class HawqClientTest {
@Test
public void testCheckConnection_Success() throws Exception {
- when(DriverManager.getConnection(anyString(), any(Properties.class))).thenReturn(conn);
when(conn.getCatalog()).thenReturn("catalog");
Map<String, Object> response = hawqClient.checkConnection(connectionProperties);
assertEquals(CONNECTION_SUCCESSFUL_MESSAGE, response.get("message"));
@@ -104,8 +99,8 @@ public class HawqClientTest {
@Test
public void testCheckConnection_ThrowsSQLException_Failure() throws Exception {
- when(DriverManager.getConnection(anyString(), any(Properties.class))).thenThrow(new SQLException("Failed to connect"));
- Map<String, Object> response = hawqClient.checkConnection(connectionProperties);
+ when(conn.getCatalog()).thenThrow(new SQLException("Failed to connect"));
+ Map<String, Object> response = hawqClient.checkConnection(connectionProperties);
assertEquals(CONNECTION_FAILURE_MESSAGE, response.get("message"));
assertEquals("Failed to connect", response.get("description"));
assertFalse((Boolean) response.get("connectivityStatus"));
@@ -117,7 +112,6 @@ public class HawqClientTest {
when(preparedStatement.executeQuery()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
when(resultSet.getString(DATNAME)).thenReturn("db1").thenReturn("db2");
- PowerMockito.doReturn(conn).when(hawqClientSpy, "getConnection", anyMap(), anyString());
assertEquals(Arrays.asList("db1", "db2"), hawqClientSpy.getDatabaseList("d"));
}
@@ -168,7 +162,6 @@ public class HawqClientTest {
@Test
public void testTableList_Success() throws Exception {
- PowerMockito.doReturn(conn).when(hawqClientSpy, "getConnection", anyMap(), anyString());
when(conn.prepareStatement(TABLE_LIST_QUERY)).thenReturn(preparedStatement);
when(preparedStatement.executeQuery()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
@@ -181,7 +174,6 @@ public class HawqClientTest {
@Test
public void testSequenceList_Success() throws Exception {
- PowerMockito.doReturn(conn).when(hawqClientSpy, "getConnection", anyMap(), anyString());
when(conn.prepareStatement(SEQUENCE_LIST_QUERY)).thenReturn(preparedStatement);
when(preparedStatement.executeQuery()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
@@ -194,7 +186,6 @@ public class HawqClientTest {
@Test
public void testSequenceList_SchemaFiltered_Success() throws Exception {
- PowerMockito.doReturn(conn).when(hawqClientSpy, "getConnection", anyMap(), anyString());
when(conn.prepareStatement(SEQUENCE_LIST_QUERY)).thenReturn(preparedStatement);
when(preparedStatement.executeQuery()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
@@ -205,7 +196,6 @@ public class HawqClientTest {
@Test
public void testFunctionList_Success() throws Exception {
- PowerMockito.doReturn(conn).when(hawqClientSpy, "getConnection", anyMap(), anyString());
when(conn.prepareStatement(FUNCTION_LIST_QUERY)).thenReturn(preparedStatement);
when(preparedStatement.executeQuery()).thenReturn(resultSet);
when(resultSet.next()).thenReturn(true).thenReturn(true).thenReturn(false);
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/RangerServiceHawqTest.java
----------------------------------------------------------------------
diff --git a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/RangerServiceHawqTest.java b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/RangerServiceHawqTest.java
index 5264929..7ef3096 100644
--- a/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/RangerServiceHawqTest.java
+++ b/ranger-plugin/admin-plugin/src/test/java/org/apache/hawq/ranger/service/RangerServiceHawqTest.java
@@ -18,6 +18,7 @@
package org.apache.hawq.ranger.service;
import org.apache.ranger.plugin.client.BaseClient;
+import org.apache.hawq.ranger.service.HawqClient;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -25,25 +26,25 @@ import org.mockito.Mock;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
-
+import static org.powermock.api.mockito.PowerMockito.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.HashMap;
import java.util.Map;
-import java.util.Properties;
+import static org.mockito.Matchers.*;
+import static org.powermock.api.support.membermodification.MemberMatcher.method;
import static org.apache.hawq.ranger.service.HawqClient.CONNECTION_SUCCESSFUL_MESSAGE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
import static org.powermock.api.support.membermodification.MemberMatcher.constructor;
import static org.powermock.api.support.membermodification.MemberModifier.suppress;
+
@RunWith(PowerMockRunner.class)
-@PrepareForTest(HawqClient.class)
+@PrepareForTest({HawqClient.class, RangerServiceHawq.class})
public class RangerServiceHawqTest {
private RangerServiceHawq service;
@@ -53,6 +54,8 @@ public class RangerServiceHawqTest {
HawqClient mockHawqClient;
@Mock
Connection conn;
+
+ private Map<String, String> connectionProperties;
@Before
public void setup() {
@@ -73,13 +76,18 @@ public class RangerServiceHawqTest {
@Test
public void testValidateConfigSuccess() throws Exception {
+ suppress(constructor(BaseClient.class, String.class, Map.class));
+ suppress(method(HawqClient.class, "initHawq"));
+
HashMap<String, Object> result = new HashMap<>();
result.put("message", "ConnectionTest Successful");
result.put("description", "ConnectionTest Successful");
result.put("connectivityStatus", true);
-
- suppress(constructor(BaseClient.class, String.class, Map.class));
- PowerMockito.when(DriverManager.getConnection(anyString(), any(Properties.class))).thenReturn(conn);
+
+ mockHawqClient = new HawqClient("hawq", connectionProperties);
+ mockHawqClient.setConnection(conn);
+ PowerMockito.whenNew(HawqClient.class).withArguments(anyObject(),anyObject()).thenReturn(mockHawqClient);
+
when(conn.getCatalog()).thenReturn("catalog");
HashMap<String, Object> response = service.validateConfig();
http://git-wip-us.apache.org/repos/asf/incubator-hawq/blob/9775424b/ranger-plugin/conf/ranger-servicedef-hawq.json
----------------------------------------------------------------------
diff --git a/ranger-plugin/conf/ranger-servicedef-hawq.json b/ranger-plugin/conf/ranger-servicedef-hawq.json
index 38f88ea..172eb3a 100644
--- a/ranger-plugin/conf/ranger-servicedef-hawq.json
+++ b/ranger-plugin/conf/ranger-servicedef-hawq.json
@@ -241,6 +241,29 @@
},
{
"itemId": 3,
+ "name": "authentication",
+ "type": "enum",
+ "subType": "authType",
+ "mandatory": false,
+ "validationRegEx": "",
+ "validationMessage": "",
+ "uiHint": "",
+ "label": "HAWQ Authentication Type",
+ "defaultValue": "simple"
+ },
+ {
+ "itemId": 4,
+ "name": "principal",
+ "type": "string",
+ "mandatory": false,
+ "validationRegEx": "",
+ "validationMessage": "",
+ "uiHint": "",
+ "label": "HAWQ Kerberos Service Name",
+ "defaultValue": ""
+ },
+ {
+ "itemId": 5,
"name": "hostname",
"type": "string",
"mandatory": true,
@@ -250,7 +273,7 @@
"label": "HAWQ Master Hostname"
},
{
- "itemId": 4,
+ "itemId": 6,
"name": "port",
"type": "int",
"mandatory": true,
@@ -261,7 +284,27 @@
"defaultValue": 5432
}
],
- "enums": [],
+ "enums":
+ [
+ {
+ "itemId": 1,
+ "name": "authType",
+ "elements":
+ [
+ {
+ "itemId": 1,
+ "name": "simple",
+ "label": "Simple"
+ },
+ {
+ "itemId": 2,
+ "name": "kerberos",
+ "label": "Kerberos"
+ }
+ ],
+ "defaultIndex": 0
+ }
+ ],
"contextEnrichers": [],
"policyConditions": [],
"dataMaskDef": {},