Repository: sqoop
Updated Branches:
  refs/heads/sqoop2 0097b465e -> 4a8e27600


SQOOP-2914: Sqoop2: Support using password generators for repository passwords

(Szabolcs Vasas via Abraham Fine)


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/4a8e2760
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/4a8e2760
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/4a8e2760

Branch: refs/heads/sqoop2
Commit: 4a8e276006a6da23aa6065f127d3bdd196db983b
Parents: 0097b46
Author: Abraham Fine <[email protected]>
Authored: Tue May 24 15:00:03 2016 -0700
Committer: Abraham Fine <[email protected]>
Committed: Tue May 24 15:00:03 2016 -0700

----------------------------------------------------------------------
 .../sqoop/repository/JdbcRepositoryContext.java |   6 +-
 .../repository/RepoConfigurationConstants.java  |   8 +
 .../repository/TestJdbcRepositoryContext.java   | 188 +++++++++++++++++++
 3 files changed, 200 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/4a8e2760/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryContext.java 
b/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryContext.java
index 0a8139a..10d7767 100644
--- a/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryContext.java
+++ b/core/src/main/java/org/apache/sqoop/repository/JdbcRepositoryContext.java
@@ -25,6 +25,7 @@ import javax.sql.DataSource;
 import org.apache.log4j.Logger;
 import org.apache.sqoop.common.SqoopException;
 import org.apache.sqoop.common.MapContext;
+import org.apache.sqoop.utils.PasswordUtils;
 
 
 public final class JdbcRepositoryContext {
@@ -63,8 +64,9 @@ public final class JdbcRepositoryContext {
     String jdbcUserName = context.getString(
         RepoConfigurationConstants.SYSCFG_REPO_JDBC_USER);
 
-    String jdbcPassword = context.getString(
-        RepoConfigurationConstants.SYSCFG_REPO_JDBC_PASSWORD);
+    String jdbcPassword = PasswordUtils.readPassword(context,
+        RepoConfigurationConstants.SYSCFG_REPO_JDBC_PASSWORD,
+        RepoConfigurationConstants.SYSCFG_REPO_JDBC_PASSWORD_GENERATOR);
 
     connectionProperties = new Properties();
 

http://git-wip-us.apache.org/repos/asf/sqoop/blob/4a8e2760/core/src/main/java/org/apache/sqoop/repository/RepoConfigurationConstants.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/sqoop/repository/RepoConfigurationConstants.java
 
b/core/src/main/java/org/apache/sqoop/repository/RepoConfigurationConstants.java
index 12cb93e..90f225f 100644
--- 
a/core/src/main/java/org/apache/sqoop/repository/RepoConfigurationConstants.java
+++ 
b/core/src/main/java/org/apache/sqoop/repository/RepoConfigurationConstants.java
@@ -85,6 +85,14 @@ public final class RepoConfigurationConstants {
       + "jdbc.password";
 
   /**
+   * The config specifies a command that prints the password used to build
+   * the JDBC connection:
+   * <tt>org.apache.sqoop.repository.jdbc.password_generator</tt>
+   */
+  public static final String SYSCFG_REPO_JDBC_PASSWORD_GENERATOR = 
PREFIX_REPO_CONFIG
+      + "jdbc.password_generator";
+
+  /**
    * JDBC Transaction Isolation, specified by:
    * <tt>org.apache.sqoop.repository.jdbc.transaction.isolation</tt>. The valid
    * values include: <tt>READ_UNCOMMITTED</tt>, <tt>READ_COMMITTED</tt>,

http://git-wip-us.apache.org/repos/asf/sqoop/blob/4a8e2760/core/src/test/java/org/apache/sqoop/repository/TestJdbcRepositoryContext.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/sqoop/repository/TestJdbcRepositoryContext.java 
b/core/src/test/java/org/apache/sqoop/repository/TestJdbcRepositoryContext.java
new file mode 100644
index 0000000..8fd3fb4
--- /dev/null
+++ 
b/core/src/test/java/org/apache/sqoop/repository/TestJdbcRepositoryContext.java
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.sqoop.repository;
+
+import org.apache.sqoop.common.MapContext;
+import org.apache.sqoop.common.SqoopException;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static 
org.apache.sqoop.repository.JdbcTransactionIsolation.READ_COMMITTED;
+import static org.apache.sqoop.repository.RepoConfigurationConstants.*;
+import static org.testng.Assert.assertEquals;
+
+public class TestJdbcRepositoryContext {
+
+  private JdbcRepositoryContext jdbcRepositoryContext;
+
+  private Map<String, String> propertyMap;
+
+  @BeforeMethod
+  public void setUp() {
+    propertyMap = buildDefaultPropertyMap();
+  }
+
+  @Test
+  public void testValidJdbcHandlerClassName() {
+    final String handlerClass = "handlerClass";
+
+    propertyMap.put(SYSCFG_REPO_JDBC_HANDLER, handlerClass);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(handlerClass, jdbcRepositoryContext.getHandlerClassName());
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testInvalidJdbcHandlerClassName() {
+    propertyMap.put(SYSCFG_REPO_JDBC_HANDLER, null);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  @Test
+  public void testConnectionUrl() {
+    final String url = "jdbcUrl";
+    propertyMap.put(SYSCFG_REPO_JDBC_URL, url);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(url, jdbcRepositoryContext.getConnectionUrl());
+  }
+
+  @Test
+  public void testDriverClass() {
+    final String driverClass = "jdbcDriver";
+    propertyMap.put(SYSCFG_REPO_JDBC_DRIVER, driverClass);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(driverClass, jdbcRepositoryContext.getDriverClass());
+  }
+
+  @Test
+  public void testPasswordGenerator() {
+    final String passwordGenerator = "echo secret";
+    propertyMap.put(SYSCFG_REPO_JDBC_PASSWORD_GENERATOR, passwordGenerator);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals("secret", 
jdbcRepositoryContext.getConnectionProperties().get("password"));
+
+  }
+
+  @Test
+  public void testPasswordString() {
+    final String password = "secret";
+    propertyMap.put(SYSCFG_REPO_JDBC_PASSWORD, password);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(password, 
jdbcRepositoryContext.getConnectionProperties().get("password"));
+
+  }
+
+  @Test
+  public void testNestedPasswordString() {
+    final String nestedPassword = "nestedPassword";
+    propertyMap.put(PREFIX_SYSCFG_REPO_JDBC_PROPERTIES + "password", 
nestedPassword);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(nestedPassword, 
jdbcRepositoryContext.getConnectionProperties().get("password"));
+  }
+
+  @Test
+  public void testExplicitPasswordOverridesNestedPassword() {
+    final String nestedPassword = "nestedPassword";
+    final String password = "secret";
+    propertyMap.put(SYSCFG_REPO_JDBC_PASSWORD, password);
+    propertyMap.put(PREFIX_SYSCFG_REPO_JDBC_PROPERTIES + "password", 
nestedPassword);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(password, 
jdbcRepositoryContext.getConnectionProperties().get("password"));
+  }
+
+  @Test
+  public void testNestedUser() {
+    final String nestedUser = "nestedUser";
+    propertyMap.put(PREFIX_SYSCFG_REPO_JDBC_PROPERTIES + "user", nestedUser);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(nestedUser, 
jdbcRepositoryContext.getConnectionProperties().get("user"));
+  }
+
+  @Test
+  public void testExplicitUserOverridesNestedUser() {
+    final String nestedUser = "nestedUser";
+    final String user = "user";
+    propertyMap.put(SYSCFG_REPO_JDBC_USER, user);
+    propertyMap.put(PREFIX_SYSCFG_REPO_JDBC_PROPERTIES + "user", nestedUser);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(user, 
jdbcRepositoryContext.getConnectionProperties().get("user"));
+  }
+
+  @Test
+  public void testValidMaxConnection() {
+    final String maxConnection = "20";
+
+    propertyMap.put(SYSCFG_REPO_JDBC_MAX_CONN, maxConnection);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+
+    assertEquals(Integer.parseInt(maxConnection), 
jdbcRepositoryContext.getMaximumConnections());
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testWithoutTxIsolation() {
+    propertyMap.put(SYSCFG_REPO_JDBC_TX_ISOLATION, null);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testInvalidTxIsolation() {
+    propertyMap.put(SYSCFG_REPO_JDBC_TX_ISOLATION, "INVALID_ISOLATION");
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testWithoutMaxConnection() {
+    propertyMap.put(SYSCFG_REPO_JDBC_MAX_CONN, null);
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testWithNaNMaxConnection() {
+    propertyMap.put(SYSCFG_REPO_JDBC_MAX_CONN, "INVALID_MAX_CONN");
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  @Test(expectedExceptions = SqoopException.class)
+  public void testNegativeMaxConnection() {
+    propertyMap.put(SYSCFG_REPO_JDBC_MAX_CONN, "-1");
+    jdbcRepositoryContext = new JdbcRepositoryContext(new 
MapContext(propertyMap));
+  }
+
+  private Map<String, String> buildDefaultPropertyMap() {
+    Map<String, String> propertyMap = new HashMap<>();
+    propertyMap.put(SYSCFG_REPO_JDBC_HANDLER, "handler");
+    propertyMap.put(SYSCFG_REPO_JDBC_TX_ISOLATION, READ_COMMITTED.toString());
+    propertyMap.put(SYSCFG_REPO_JDBC_MAX_CONN, "10");
+
+    return propertyMap;
+  }
+
+}
\ No newline at end of file

Reply via email to