You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/09/05 10:32:37 UTC

[shardingsphere] branch master updated: Refactor : add mapped and exposed Datasource for HA testing. (#20800)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new a0f784f2b10 Refactor : add mapped and exposed Datasource for HA testing.  (#20800)
a0f784f2b10 is described below

commit a0f784f2b10006a62e9d6000cf1d5676e813038f
Author: 孙念君 Nianjun Sun <su...@sphere-ex.com>
AuthorDate: Mon Sep 5 18:32:29 2022 +0800

    Refactor : add mapped and exposed Datasource for HA testing.  (#20800)
    
    * Refactor : add mapped and exposed Datasource for HA testing.
    
    * Refactor : update some java docs
    
    * Refactor : update some java docs
---
 .../atomic/storage/DockerStorageContainer.java     |  2 +-
 .../atomic/util/StorageContainerUtil.java          | 54 ++++++++++++++++++++++
 .../test/integration/ha/cases/base/BaseITCase.java | 37 ++++-----------
 .../ha/cases/mysql/MySQLHAGeneralIT.java           |  6 ++-
 .../container/compose/BaseContainerComposer.java   | 25 ++++++++--
 .../container/compose/DockerContainerComposer.java | 37 ++++++++-------
 6 files changed, 110 insertions(+), 51 deletions(-)

diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/storage/DockerStorageContainer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/storage/DockerStorageContainer.java
index a2e1348d7a4..cfd7d5b2f76 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/storage/DockerStorageContainer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/storage/DockerStorageContainer.java
@@ -167,7 +167,7 @@ public abstract class DockerStorageContainer extends DockerITContainer implement
      * 
      * @return mapped database container port
      */
-    protected abstract int getMappedPort();
+    public abstract int getMappedPort();
     
     @Override
     public final String getAbbreviation() {
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/util/StorageContainerUtil.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/util/StorageContainerUtil.java
new file mode 100644
index 00000000000..ce79def9573
--- /dev/null
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-env/src/test/java/org/apache/shardingsphere/test/integration/env/container/atomic/util/StorageContainerUtil.java
@@ -0,0 +1,54 @@
+/*
+ * 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.shardingsphere.test.integration.env.container.atomic.util;
+
+import com.zaxxer.hikari.HikariDataSource;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
+import org.apache.shardingsphere.test.integration.env.runtime.DataSourceEnvironment;
+
+import javax.sql.DataSource;
+
+/**
+ * Storage container util.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class StorageContainerUtil {
+    
+    /**
+     * Generate datasource. 
+     * 
+     * @param jdbcUrl JDBC URL for generating datasource
+     * @param username username
+     * @param password password
+     * @return data source
+     */
+    public static DataSource generateDataSource(final String jdbcUrl, final String username, final String password) {
+        DatabaseType databaseType = DatabaseTypeEngine.getDatabaseType(jdbcUrl);
+        HikariDataSource result = new HikariDataSource();
+        result.setDriverClassName(DataSourceEnvironment.getDriverClassName(databaseType));
+        result.setJdbcUrl(jdbcUrl);
+        result.setUsername(username);
+        result.setPassword(password);
+        result.setMaximumPoolSize(2);
+        result.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
+        return result;
+    }
+}
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/base/BaseITCase.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/base/BaseITCase.java
index 1d3e85abd7d..19fd9df018a 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/base/BaseITCase.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/base/BaseITCase.java
@@ -17,18 +17,12 @@
 
 package org.apache.shardingsphere.test.integration.ha.cases.base;
 
-import com.zaxxer.hikari.HikariDataSource;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.database.metadata.url.JdbcUrlAppender;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import org.apache.shardingsphere.test.integration.env.container.atomic.adapter.impl.ShardingSphereProxyClusterContainer;
-import org.apache.shardingsphere.test.integration.env.container.atomic.constants.ProxyContainerConstants;
-import org.apache.shardingsphere.test.integration.env.container.atomic.constants.StorageContainerConstants;
-import org.apache.shardingsphere.test.integration.env.container.atomic.storage.DockerStorageContainer;
 import org.apache.shardingsphere.test.integration.env.container.atomic.util.DatabaseTypeUtil;
-import org.apache.shardingsphere.test.integration.env.runtime.DataSourceEnvironment;
 import org.apache.shardingsphere.test.integration.ha.env.IntegrationTestEnvironment;
 import org.apache.shardingsphere.test.integration.ha.framework.container.compose.BaseContainerComposer;
 import org.apache.shardingsphere.test.integration.ha.framework.container.compose.DockerContainerComposer;
@@ -36,7 +30,6 @@ import org.apache.shardingsphere.test.integration.ha.framework.parameter.HAParam
 
 import javax.sql.DataSource;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Base integration test.
@@ -49,13 +42,15 @@ public abstract class BaseITCase {
     
     protected static final JdbcUrlAppender JDBC_URL_APPENDER = new JdbcUrlAppender();
     
-    protected static final String DEFAULT_SCHEMA = "ha_test";
+    private final String databaseName;
     
     private final BaseContainerComposer containerComposer;
     
     private final DatabaseType databaseType;
     
-    private List<DataSource> storageDataSources;
+    private List<DataSource> exposedDataSources;
+    
+    private List<DataSource> mappedDataSources;
     
     private DataSource proxyDataSource;
     
@@ -63,33 +58,17 @@ public abstract class BaseITCase {
         databaseType = haParameterized.getDatabaseType();
         containerComposer = new DockerContainerComposer(haParameterized.getScenario(), haParameterized.getDatabaseType(), haParameterized.getDockerImageName());
         containerComposer.start();
+        databaseName = (DatabaseTypeUtil.isPostgreSQL(databaseType) || DatabaseTypeUtil.isOpenGauss(databaseType)) ? "postgres" : "";
         initStorageDataSources();
         initProxyDataSource();
     }
     
     private void initProxyDataSource() {
-        String databaseName = (DatabaseTypeUtil.isPostgreSQL(databaseType) || DatabaseTypeUtil.isOpenGauss(databaseType)) ? "postgres" : "";
-        ShardingSphereProxyClusterContainer proxyContainer = ((DockerContainerComposer) containerComposer).getProxyContainer();
-        this.proxyDataSource = getDataSource(DataSourceEnvironment.getURL(databaseType, proxyContainer.getHost(), proxyContainer.getFirstMappedPort(),
-                containerComposer.getProxyJdbcUrl(databaseName)), ProxyContainerConstants.USERNAME, ProxyContainerConstants.PASSWORD);
+        proxyDataSource = containerComposer.getProxyDatasource(databaseName);
     }
     
     private void initStorageDataSources() {
-        List<DockerStorageContainer> storageContainers = ((DockerContainerComposer) containerComposer).getStorageContainers();
-        this.storageDataSources = storageContainers.stream()
-                .map(storageContainer -> DataSourceEnvironment.getURL(getDatabaseType(), storageContainer.getNetworkAliases().get(0), storageContainer.getExposedPort(), DEFAULT_SCHEMA))
-                .map(jdbcUrl -> getDataSource(jdbcUrl, StorageContainerConstants.USERNAME, StorageContainerConstants.PASSWORD))
-                .collect(Collectors.toList());
-    }
-    
-    private DataSource getDataSource(final String jdbcUrl, final String username, final String password) {
-        HikariDataSource result = new HikariDataSource();
-        result.setDriverClassName(DataSourceEnvironment.getDriverClassName(getDatabaseType()));
-        result.setJdbcUrl(jdbcUrl);
-        result.setUsername(username);
-        result.setPassword(password);
-        result.setMaximumPoolSize(2);
-        result.setTransactionIsolation("TRANSACTION_READ_COMMITTED");
-        return result;
+        exposedDataSources = containerComposer.getExposedDatasource(databaseName);
+        mappedDataSources = containerComposer.getMappedDatasource(databaseName);
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/mysql/MySQLHAGeneralIT.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/mysql/MySQLHAGeneralIT.java
index b65a23c0ee0..1438f3780b5 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/mysql/MySQLHAGeneralIT.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/cases/mysql/MySQLHAGeneralIT.java
@@ -57,8 +57,10 @@ public final class MySQLHAGeneralIT extends BaseITCase {
     
     @Test
     public void assertProxyJdbcConnection() {
-        List<DataSource> dataSourceList = getStorageDataSources();
+        List<DataSource> mappedDataSources = getMappedDataSources();
+        List<DataSource> exposedDataSources = getExposedDataSources();
         // TODO add the MySQL HA logic here.
-        dataSourceList.forEach(each -> log.info(each.toString()));
+        mappedDataSources.forEach(each -> log.info(each.toString()));
+        exposedDataSources.forEach(each -> log.info(each.toString()));
     }
 }
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/BaseContainerComposer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/BaseContainerComposer.java
index 417fb38f509..a6d0cb6228c 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/BaseContainerComposer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/BaseContainerComposer.java
@@ -21,6 +21,9 @@ import lombok.Getter;
 import org.apache.shardingsphere.test.integration.env.container.atomic.ITContainers;
 import org.testcontainers.lifecycle.Startable;
 
+import javax.sql.DataSource;
+import java.util.List;
+
 /**
  * Abstract composed container.
  */
@@ -37,12 +40,28 @@ public abstract class BaseContainerComposer implements Startable {
     }
     
     /**
-     * Get proxy JDBC URL.
+     * Get proxy data source.
+     *
+     * @param databaseName database name
+     * @return proxy data source
+     */
+    public abstract DataSource getProxyDatasource(String databaseName);
+    
+    /**
+     * Get Datasource with storage container exposed port and network alias.
+     * 
+     * @param databaseName database name
+     * @return list of datasource
+     */
+    public abstract List<DataSource> getExposedDatasource(String databaseName);
+    
+    /**
+     * Get Datasource with storage container mapped port and host.
      *
      * @param databaseName database name
-     * @return proxy JDBC URL
+     * @return list of datasource
      */
-    public abstract String getProxyJdbcUrl(String databaseName);
+    public abstract List<DataSource> getMappedDatasource(String databaseName);
     
     @Override
     public void start() {
diff --git a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/DockerContainerComposer.java b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/DockerContainerComposer.java
index 4993c83d15c..8683bbe1f32 100644
--- a/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/DockerContainerComposer.java
+++ b/shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-ha/src/test/java/org/apache/shardingsphere/test/integration/ha/framework/container/compose/DockerContainerComposer.java
@@ -23,16 +23,19 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.test.integration.env.container.atomic.adapter.AdapterContainerFactory;
 import org.apache.shardingsphere.test.integration.env.container.atomic.adapter.config.AdaptorContainerConfiguration;
 import org.apache.shardingsphere.test.integration.env.container.atomic.adapter.impl.ShardingSphereProxyClusterContainer;
+import org.apache.shardingsphere.test.integration.env.container.atomic.constants.StorageContainerConstants;
 import org.apache.shardingsphere.test.integration.env.container.atomic.governance.GovernanceContainer;
 import org.apache.shardingsphere.test.integration.env.container.atomic.governance.impl.ZookeeperContainer;
 import org.apache.shardingsphere.test.integration.env.container.atomic.storage.DockerStorageContainer;
 import org.apache.shardingsphere.test.integration.env.container.atomic.storage.StorageContainerFactory;
 import org.apache.shardingsphere.test.integration.env.container.atomic.storage.config.StorageContainerConfiguration;
 import org.apache.shardingsphere.test.integration.env.container.atomic.util.ContainerUtil;
+import org.apache.shardingsphere.test.integration.env.container.atomic.util.StorageContainerUtil;
 import org.apache.shardingsphere.test.integration.env.runtime.DataSourceEnvironment;
 import org.apache.shardingsphere.test.integration.ha.framework.container.config.ProxyClusterContainerConfigurationFactory;
 import org.apache.shardingsphere.test.integration.ha.framework.container.config.StorageContainerConfigurationFactory;
 
+import javax.sql.DataSource;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -74,23 +77,25 @@ public final class DockerContainerComposer extends BaseContainerComposer {
         proxyContainer = getContainers().registerContainer(proxyClusterContainer);
     }
     
-    /**
-     * Get proxy JDBC URL.
-     * 
-     * @param databaseName database name
-     * @return proxy JDBC URL
-     */
-    public String getProxyJdbcUrl(final String databaseName) {
-        return DataSourceEnvironment.getURL(databaseType, proxyContainer.getHost(), proxyContainer.getFirstMappedPort(), databaseName);
+    @Override
+    public DataSource getProxyDatasource(final String databaseName) {
+        return StorageContainerUtil.generateDataSource(DataSourceEnvironment.getURL(databaseType, proxyContainer.getHost(), proxyContainer.getFirstMappedPort(), databaseName),
+                StorageContainerConstants.USERNAME, StorageContainerConstants.PASSWORD);
     }
     
-    /**
-     * Get storage containers JDBC URL.
-     * 
-     * @param databaseName database name
-     * @return storage containers JDBC URL
-     */
-    public List<String> getJdbcUrls(final String databaseName) {
-        return storageContainers.stream().map(each -> each.getJdbcUrl(databaseName)).collect(Collectors.toList());
+    @Override
+    public List<DataSource> getExposedDatasource(final String databaseName) {
+        return getStorageContainers().stream()
+                .map(each -> DataSourceEnvironment.getURL(databaseType, each.getNetworkAliases().get(0), each.getExposedPort(), databaseName))
+                .map(each -> StorageContainerUtil.generateDataSource(each, StorageContainerConstants.USERNAME, StorageContainerConstants.PASSWORD))
+                .collect(Collectors.toList());
+    }
+    
+    @Override
+    public List<DataSource> getMappedDatasource(final String databaseName) {
+        return getStorageContainers().stream()
+                .map(each -> DataSourceEnvironment.getURL(databaseType, each.getHost(), each.getMappedPort(), databaseName))
+                .map(each -> StorageContainerUtil.generateDataSource(each, StorageContainerConstants.USERNAME, StorageContainerConstants.PASSWORD))
+                .collect(Collectors.toList());
     }
 }