You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@knox.apache.org by am...@apache.org on 2022/04/26 17:21:18 UTC

[knox] branch master updated: KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 316340129 KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)
316340129 is described below

commit 3163401292d0640a6ade44d77cbefce1db8d9f10
Author: Attila Magyar <m....@gmail.com>
AuthorDate: Tue Apr 26 19:21:13 2022 +0200

    KNOX-2738 On Fresh install JDBCTokenStateService initiation failed (#567)
---
 gateway-server/pom.xml                             |  6 ++
 .../org/apache/knox/gateway/util/JDBCUtils.java    | 13 ++++
 .../resources/createKnoxTokenDatabaseTable.sql     |  2 +-
 .../createKnoxTokenMetadataDatabaseTable.sql       |  2 +-
 .../token/impl/JDBCTokenStateServiceTest.java      | 70 ++++++----------------
 pom.xml                                            |  6 ++
 6 files changed, 46 insertions(+), 53 deletions(-)

diff --git a/gateway-server/pom.xml b/gateway-server/pom.xml
index 89da9d32b..bf6fa837c 100644
--- a/gateway-server/pom.xml
+++ b/gateway-server/pom.xml
@@ -448,6 +448,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.hsqldb</groupId>
+            <artifactId>hsqldb</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.velocity</groupId>
             <artifactId>velocity</artifactId>
diff --git a/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java b/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
index a44823fec..d01fc2032 100644
--- a/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
+++ b/gateway-server/src/main/java/org/apache/knox/gateway/util/JDBCUtils.java
@@ -23,6 +23,7 @@ import org.apache.derby.jdbc.ClientDataSource;
 import org.apache.knox.gateway.config.GatewayConfig;
 import org.apache.knox.gateway.services.security.AliasService;
 import org.apache.knox.gateway.services.security.AliasServiceException;
+import org.hsqldb.jdbc.JDBCDataSource;
 import org.postgresql.ds.PGSimpleDataSource;
 import org.postgresql.jdbc.SslMode;
 import org.postgresql.ssl.NonValidatingFactory;
@@ -34,6 +35,7 @@ public class JDBCUtils {
   public static final String POSTGRESQL_DB_TYPE = "postgresql";
   public static final String MYSQL_DB_TYPE = "mysql";
   public static final String DERBY_DB_TYPE = "derbydb";
+  public static final String HSQL = "hsql";
   public static final String DATABASE_USER_ALIAS_NAME = "gateway_database_user";
   public static final String DATABASE_PASSWORD_ALIAS_NAME = "gateway_database_password";
   public static final String DATABASE_TRUSTSTORE_PASSWORD_ALIAS_NAME = "gateway_database_ssl_truststore_password";
@@ -43,6 +45,8 @@ public class JDBCUtils {
       return createPostgresDataSource(gatewayConfig, aliasService);
     } else if (DERBY_DB_TYPE.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
       return createDerbyDatasource(gatewayConfig, aliasService);
+    } else if (HSQL.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
+      return createHsqlDatasource(gatewayConfig, aliasService);
     } else if (MYSQL_DB_TYPE.equalsIgnoreCase(gatewayConfig.getDatabaseType())) {
       return createMySqlDataSource(gatewayConfig, aliasService);
     }
@@ -87,6 +91,15 @@ public class JDBCUtils {
     return derbyDatasource;
   }
 
+
+  private static DataSource createHsqlDatasource(GatewayConfig gatewayConfig, AliasService aliasService) throws AliasServiceException {
+    JDBCDataSource hsqlDatasource = new JDBCDataSource();
+    hsqlDatasource.setUrl(gatewayConfig.getDatabaseConnectionUrl());
+    hsqlDatasource.setUser(getDatabaseUser(aliasService));
+    hsqlDatasource.setPassword(getDatabasePassword(aliasService));
+    return hsqlDatasource;
+  }
+
   private static DataSource createMySqlDataSource(GatewayConfig gatewayConfig, AliasService aliasService) throws AliasServiceException, SQLException {
     MysqlDataSource dataSource = new MysqlDataSource();
     if (gatewayConfig.getDatabaseConnectionUrl() != null) {
diff --git a/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql b/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
index 598ed7ef1..ff0aba7e6 100644
--- a/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
+++ b/gateway-server/src/main/resources/createKnoxTokenDatabaseTable.sql
@@ -13,7 +13,7 @@
 --  License for the specific language governing permissions and limitations under
 --  the License.
 
-CREATE TABLE KNOX_TOKENS (
+CREATE TABLE IF NOT EXISTS KNOX_TOKENS ( -- IF NOT EXISTS syntax is not supported by Derby
    token_id varchar(128) NOT NULL,
    issue_time bigint NOT NULL,
    expiration bigint NOT NULL,
diff --git a/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql b/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
index 9a1138072..5c69dc8cb 100644
--- a/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
+++ b/gateway-server/src/main/resources/createKnoxTokenMetadataDatabaseTable.sql
@@ -13,7 +13,7 @@
 --  License for the specific language governing permissions and limitations under
 --  the License.
 
-CREATE TABLE KNOX_TOKEN_METADATA (
+CREATE TABLE IF NOT EXISTS KNOX_TOKEN_METADATA ( -- IF NOT EXISTS syntax is not supported by Derby
    token_id varchar(128) NOT NULL,
    md_name varchar(32) NOT NULL,
    md_value varchar(256) NOT NULL,
diff --git a/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java b/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
index ba4372833..d3f33df79 100644
--- a/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
+++ b/gateway-server/src/test/java/org/apache/knox/gateway/services/token/impl/JDBCTokenStateServiceTest.java
@@ -18,13 +18,13 @@
 package org.apache.knox.gateway.services.token.impl;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.knox.gateway.util.JDBCUtils.HSQL;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.sql.Connection;
+import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -36,23 +36,18 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.codec.digest.HmacAlgorithms;
 import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.derby.drda.NetworkServerControl;
 import org.apache.knox.gateway.config.GatewayConfig;
 import org.apache.knox.gateway.services.security.AliasService;
 import org.apache.knox.gateway.services.security.token.KnoxToken;
 import org.apache.knox.gateway.services.security.token.TokenMetadata;
 import org.apache.knox.gateway.services.security.token.UnknownTokenException;
 import org.apache.knox.gateway.services.security.token.impl.TokenMAC;
-import org.apache.knox.gateway.shell.jdbc.Database;
-import org.apache.knox.gateway.shell.jdbc.derby.DerbyDatabase;
 import org.apache.knox.gateway.util.JDBCUtils;
 import org.easymock.EasyMock;
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
@@ -60,67 +55,36 @@ import org.junit.rules.TemporaryFolder;
 
 public class JDBCTokenStateServiceTest {
 
+  public static final String USERNAME = "SA";
+  public static final String PASSWORD = "";
   private static final String GET_TOKENS_COUNT_SQL = "SELECT count(*) FROM " + TokenStateDatabase.TOKENS_TABLE_NAME;
   private static final String TRUNCATE_KNOX_TOKENS_SQL = "DELETE FROM " + TokenStateDatabase.TOKENS_TABLE_NAME;
   private static final String TRUNCATE_KNOX_TOKEN_METADATA_SQL = "DELETE FROM " + TokenStateDatabase.TOKEN_METADATA_TABLE_NAME;
 
   @ClassRule
   public static final TemporaryFolder testFolder = new TemporaryFolder();
-
-  private static final String SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE = "derby.stream.error.file";
-  private static final String SAMPLE_DERBY_DATABASE_NAME = "sampleDerbyDatabase";
-  private static NetworkServerControl derbyNetworkServerControl;
-  private static Database derbyDatabase;
+  public static final String CONNECTION_URL = "jdbc:hsqldb:mem:knox;ifexists=false";
+  public static final String DB_NAME = "knox";
   private static JDBCTokenStateService jdbcTokenStateService;
   private static TokenMAC tokenMAC;
 
   @SuppressWarnings("PMD.JUnit4TestShouldUseBeforeAnnotation")
   @BeforeClass
   public static void setUp() throws Exception {
-    final String username = "app";
-    final String password = "P4ssW0rd!";
-    System.setProperty(SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE, "/dev/null");
-    derbyNetworkServerControl = new NetworkServerControl(username, password);
-    derbyNetworkServerControl.start(null);
-    TimeUnit.SECONDS.sleep(1); // give a bit of time for the server to start
-    final Path derbyDatabaseFolder = Paths.get(testFolder.newFolder().toPath().toString(), SAMPLE_DERBY_DATABASE_NAME);
     final GatewayConfig gatewayConfig = EasyMock.createNiceMock(GatewayConfig.class);
-    EasyMock.expect(gatewayConfig.getDatabaseType()).andReturn(JDBCUtils.DERBY_DB_TYPE).anyTimes();
-    EasyMock.expect(gatewayConfig.getDatabaseHost()).andReturn("localhost").anyTimes();
-    EasyMock.expect(gatewayConfig.getDatabasePort()).andReturn(NetworkServerControl.DEFAULT_PORTNUMBER).anyTimes();
-    EasyMock.expect(gatewayConfig.getDatabaseName()).andReturn(derbyDatabaseFolder.toString()).anyTimes();
+    EasyMock.expect(gatewayConfig.getDatabaseType()).andReturn(HSQL).anyTimes();
+    EasyMock.expect(gatewayConfig.getDatabaseConnectionUrl()).andReturn(CONNECTION_URL).anyTimes();
+    EasyMock.expect(gatewayConfig.getDatabaseName()).andReturn(DB_NAME).anyTimes();
     final AliasService aliasService = EasyMock.createNiceMock(AliasService.class);
-    EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_USER_ALIAS_NAME)).andReturn(username.toCharArray()).anyTimes();
-    EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_PASSWORD_ALIAS_NAME)).andReturn(password.toCharArray()).anyTimes();
+    EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_USER_ALIAS_NAME)).andReturn(USERNAME.toCharArray()).anyTimes();
+    EasyMock.expect(aliasService.getPasswordFromAliasForGateway(JDBCUtils.DATABASE_PASSWORD_ALIAS_NAME)).andReturn(PASSWORD.toCharArray()).anyTimes();
     EasyMock.replay(gatewayConfig, aliasService);
-
-    derbyDatabase = prepareDerbyDatabase(derbyDatabaseFolder);
-
     jdbcTokenStateService = new JDBCTokenStateService();
     jdbcTokenStateService.setAliasService(aliasService);
     jdbcTokenStateService.init(gatewayConfig, null);
-
-    assertTrue(derbyDatabase.hasTable(TokenStateDatabase.TOKENS_TABLE_NAME));
-
     tokenMAC = new TokenMAC(HmacAlgorithms.HMAC_SHA_256.getName(), "sPj8FCgQhCEi6G18kBfpswxYSki33plbelGLs0hMSbk".toCharArray());
   }
 
-  private static Database prepareDerbyDatabase(Path derbyDatabaseFolder) throws SQLException {
-    final Database derbyDatabase = new DerbyDatabase(derbyDatabaseFolder.toString(), true);
-    derbyDatabase.create();
-    return derbyDatabase;
-  }
-
-  @SuppressWarnings("PMD.JUnit4TestShouldUseAfterAnnotation")
-  @AfterClass
-  public static void tearDown() throws Exception {
-    if (derbyDatabase != null) {
-      derbyDatabase.shutdown();
-    }
-    derbyNetworkServerControl.shutdown();
-    System.clearProperty(SYSTEM_PROPERTY_DERBY_STREAM_ERROR_FILE);
-  }
-
   @Test
   public void testAddToken() throws Exception {
     final String tokenId = UUID.randomUUID().toString();
@@ -266,7 +230,7 @@ public class JDBCTokenStateServiceTest {
   }
 
   private long getLongTokenAttributeFromDatabase(String tokenId, String sql) throws SQLException {
-    try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
+    try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
       if (tokenId != null) {
         stmt.setString(1, tokenId);
       }
@@ -277,7 +241,7 @@ public class JDBCTokenStateServiceTest {
   }
 
   private String getStringTokenAttributeFromDatabase(String tokenId, String sql) throws SQLException {
-    try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
+    try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(sql)) {
       stmt.setString(1, tokenId);
       try (ResultSet rs = stmt.executeQuery()) {
         return rs.next() ? rs.getString(1) : null;
@@ -286,15 +250,19 @@ public class JDBCTokenStateServiceTest {
   }
 
   private void truncateDatabase() throws SQLException {
-    try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKEN_METADATA_SQL)) {
+    try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKEN_METADATA_SQL)) {
       stmt.executeUpdate();
     }
 
-    try (Connection conn = derbyDatabase.getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKENS_SQL)) {
+    try (Connection conn = getConnection(); PreparedStatement stmt = conn.prepareStatement(TRUNCATE_KNOX_TOKENS_SQL)) {
       stmt.executeUpdate();
     }
   }
 
+  private Connection getConnection() throws SQLException {
+    return DriverManager.getConnection(CONNECTION_URL, USERNAME, PASSWORD);
+  }
+
   private String getSelectMetadataSql(String metadataName) {
     return "SELECT md_value FROM " + TokenStateDatabase.TOKEN_METADATA_TABLE_NAME + " WHERE token_id = ? AND md_name = '" + metadataName + "'";
   }
diff --git a/pom.xml b/pom.xml
index 624d97cd0..412ca751f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -188,6 +188,7 @@
         <curator.version>4.3.0</curator.version>
         <dependency-check-maven.version>6.0.3</dependency-check-maven.version>
         <derby.db.version>10.14.2.0</derby.db.version> <!-- 10.15.1.3 requires Java 9 -->
+        <hsql.db.version>2.4.0</hsql.db.version>
         <dockerfile-maven-plugin.version>1.4.13</dockerfile-maven-plugin.version>
         <dom4j.version>2.1.3</dom4j.version>
         <easymock.version>4.2</easymock.version>
@@ -2482,6 +2483,11 @@
                 <version>${testcontainers.version}</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>org.hsqldb</groupId>
+                <artifactId>hsqldb</artifactId>
+                <version>${hsql.db.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>