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

zhonghongsheng 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 7f2b189c853 Adjust the structure of pipeline IT to support starting 
multiple storage containers (#23611)
7f2b189c853 is described below

commit 7f2b189c8535c275183dd899f6aa67ef7da219d6
Author: Xinze Guo <[email protected]>
AuthorDate: Tue Jan 17 17:24:45 2023 +0800

    Adjust the structure of pipeline IT to support starting multiple storage 
containers (#23611)
    
    * Adjust the structure of pipeline IT to support starting multiple storage 
containers
    
    * Use default container environment
---
 .../pipeline/cases/base/PipelineBaseE2EIT.java     | 16 ++++++----
 .../createtable/CreateTableSQLGeneratorIT.java     | 12 ++++++--
 .../container/compose/DockerContainerComposer.java | 36 ++++++++++++++++------
 .../framework/param/PipelineTestParameter.java     |  9 ++++++
 .../framework/watcher/PipelineWatcher.java         | 13 +++++---
 .../test/resources/env/mysql/{ => mysql5}/my.cnf   |  0
 6 files changed, 63 insertions(+), 23 deletions(-)

diff --git 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/base/PipelineBaseE2EIT.java
 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/base/PipelineBaseE2EIT.java
index 1bceb9b61f4..232f3c9d033 100644
--- 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/base/PipelineBaseE2EIT.java
+++ 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/base/PipelineBaseE2EIT.java
@@ -111,11 +111,11 @@ public abstract class PipelineBaseE2EIT {
     public PipelineBaseE2EIT(final PipelineTestParameter testParam) {
         databaseType = testParam.getDatabaseType();
         containerComposer = ENV.getItEnvType() == PipelineEnvTypeEnum.DOCKER
-                ? new DockerContainerComposer(testParam.getDatabaseType(), 
testParam.getStorageContainerImage())
+                ? new DockerContainerComposer(testParam.getDatabaseType(), 
testParam.getStorageContainerImage(), testParam.getStorageContainerCount())
                 : new NativeContainerComposer(testParam.getDatabaseType());
         containerComposer.start();
         if (ENV.getItEnvType() == PipelineEnvTypeEnum.DOCKER) {
-            DockerStorageContainer storageContainer = 
((DockerContainerComposer) containerComposer).getStorageContainer();
+            DockerStorageContainer storageContainer = 
((DockerContainerComposer) containerComposer).getStorageContainers().get(0);
             username = storageContainer.getUsername();
             password = storageContainer.getPassword();
         } else {
@@ -168,16 +168,20 @@ public abstract class PipelineBaseE2EIT {
                 : jdbcUrl;
     }
     
-    protected String getActualJdbcUrlTemplate(final String databaseName, final 
boolean isInContainer) {
+    protected String getActualJdbcUrlTemplate(final String databaseName, final 
boolean isInContainer, final int storageContainerIndex) {
         if (PipelineEnvTypeEnum.DOCKER == ENV.getItEnvType()) {
-            DockerStorageContainer storageContainer = 
((DockerContainerComposer) containerComposer).getStorageContainer();
+            DockerStorageContainer storageContainer = 
((DockerContainerComposer) 
containerComposer).getStorageContainers().get(storageContainerIndex);
             return isInContainer
-                    ? DataSourceEnvironment.getURL(getDatabaseType(), 
getDatabaseType().getType().toLowerCase() + ".host", 
storageContainer.getExposedPort(), databaseName)
-                    : DataSourceEnvironment.getURL(getDatabaseType(), 
storageContainer.getHost(), storageContainer.getFirstMappedPort(), 
databaseName);
+                    ? DataSourceEnvironment.getURL(getDatabaseType(), 
storageContainer.getNetworkAliases().get(0), storageContainer.getExposedPort(), 
databaseName)
+                    : storageContainer.getJdbcUrl(databaseName);
         }
         return DataSourceEnvironment.getURL(getDatabaseType(), "127.0.0.1", 
ENV.getActualDataSourceDefaultPort(databaseType), databaseName);
     }
     
+    protected String getActualJdbcUrlTemplate(final String databaseName, final 
boolean isInContainer) {
+        return getActualJdbcUrlTemplate(databaseName, isInContainer, 0);
+    }
+    
     protected abstract String getSourceTableOrderName();
     
     protected String getTargetTableOrderName() {
diff --git 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/createtable/CreateTableSQLGeneratorIT.java
 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/createtable/CreateTableSQLGeneratorIT.java
index 1cdb5a0e2b2..521e924e116 100644
--- 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/createtable/CreateTableSQLGeneratorIT.java
+++ 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/cases/createtable/CreateTableSQLGeneratorIT.java
@@ -53,6 +53,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.Map;
 import java.util.Objects;
 import java.util.regex.Pattern;
 
@@ -90,9 +91,14 @@ public final class CreateTableSQLGeneratorIT {
         rootEntity = JAXB.unmarshal(
                 
Objects.requireNonNull(CreateTableSQLGeneratorIT.class.getClassLoader().getResource(testParam.getScenario())),
 CreateTableSQLGeneratorAssertionsRootEntity.class);
         DatabaseType databaseType = testParam.getDatabaseType();
-        StorageContainerConfiguration storageContainerConfig = 
DatabaseTypeUtil.isMySQL(databaseType) && new 
DockerImageVersion(testParam.getStorageContainerImage()).getMajorVersion() > 5
-                ? MySQLContainerConfigurationFactory.newInstance(null, null, 
Collections.singletonMap("/env/mysql/mysql8/my.cnf", 
StorageContainerConstants.MYSQL_CONF_IN_CONTAINER))
-                : 
StorageContainerConfigurationFactory.newInstance(databaseType);
+        StorageContainerConfiguration storageContainerConfig;
+        if (DatabaseTypeUtil.isMySQL(databaseType)) {
+            int majorVersion = new 
DockerImageVersion(testParam.getStorageContainerImage()).getMajorVersion();
+            Map<String, String> mountedResources = 
Collections.singletonMap(String.format("/env/mysql/mysql%s/my.cnf", 
majorVersion), StorageContainerConstants.MYSQL_CONF_IN_CONTAINER);
+            storageContainerConfig = 
MySQLContainerConfigurationFactory.newInstance(null, null, mountedResources);
+        } else {
+            storageContainerConfig = 
StorageContainerConfigurationFactory.newInstance(databaseType);
+        }
         storageContainer = (DockerStorageContainer) 
StorageContainerFactory.newInstance(databaseType, 
testParam.getStorageContainerImage(), "",
                 storageContainerConfig);
         storageContainer.start();
diff --git 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/container/compose/DockerContainerComposer.java
 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/container/compose/DockerContainerComposer.java
index fbf2750186c..a70bb92389e 100644
--- 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/container/compose/DockerContainerComposer.java
+++ 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/container/compose/DockerContainerComposer.java
@@ -37,7 +37,11 @@ import 
org.apache.shardingsphere.test.e2e.env.container.atomic.storage.config.im
 import 
org.apache.shardingsphere.test.e2e.env.container.atomic.util.DatabaseTypeUtil;
 import org.apache.shardingsphere.test.e2e.env.runtime.DataSourceEnvironment;
 
+import java.security.InvalidParameterException;
 import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 /**
  * Composed container, include governance container and database container.
@@ -49,23 +53,37 @@ public final class DockerContainerComposer extends 
BaseContainerComposer {
     private final ShardingSphereProxyClusterContainer proxyContainer;
     
     @Getter
-    private final DockerStorageContainer storageContainer;
+    private final List<DockerStorageContainer> storageContainers = new 
LinkedList<>();
     
     @Getter
     private final GovernanceContainer governanceContainer;
     
-    public DockerContainerComposer(final DatabaseType databaseType, final 
String storageContainerImage) {
+    public DockerContainerComposer(final DatabaseType databaseType, final 
String storageContainerImage, final int storageContainerCount) {
         this.databaseType = databaseType;
         governanceContainer = getContainers().registerContainer(new 
ZookeeperContainer());
-        StorageContainerConfiguration storageContainerConfig = 
DatabaseTypeUtil.isMySQL(databaseType) && new 
DockerImageVersion(storageContainerImage).getMajorVersion() > 5
-                ? MySQLContainerConfigurationFactory.newInstance(null, null, 
Collections.singletonMap("/env/mysql/mysql8/my.cnf", 
StorageContainerConstants.MYSQL_CONF_IN_CONTAINER))
-                : 
StorageContainerConfigurationFactory.newInstance(databaseType);
-        storageContainer = 
getContainers().registerContainer((DockerStorageContainer) 
StorageContainerFactory.newInstance(databaseType, storageContainerImage,
-                "", storageContainerConfig));
+        if (storageContainerCount < 1) {
+            throw new InvalidParameterException("storageContainerCount must >= 
1");
+        }
+        for (int i = 0; i < storageContainerCount; i++) {
+            StorageContainerConfiguration storageContainerConfig;
+            if (DatabaseTypeUtil.isMySQL(databaseType)) {
+                int majorVersion = new 
DockerImageVersion(storageContainerImage).getMajorVersion();
+                Map<String, String> mountedResources = 
Collections.singletonMap(String.format("/env/mysql/mysql%s/my.cnf", 
majorVersion), StorageContainerConstants.MYSQL_CONF_IN_CONTAINER);
+                storageContainerConfig = 
MySQLContainerConfigurationFactory.newInstance(null, null, mountedResources);
+            } else {
+                storageContainerConfig = 
StorageContainerConfigurationFactory.newInstance(databaseType);
+            }
+            DockerStorageContainer storageContainer = 
getContainers().registerContainer((DockerStorageContainer) 
StorageContainerFactory.newInstance(databaseType, storageContainerImage, null,
+                    storageContainerConfig));
+            
storageContainer.setNetworkAliases(Collections.singletonList(String.join(".", 
databaseType.getType().toLowerCase() + "_" + i, "host")));
+            storageContainers.add(storageContainer);
+        }
         AdaptorContainerConfiguration containerConfig = 
PipelineProxyClusterContainerConfigurationFactory.newInstance(databaseType, 
storageContainerImage);
         ShardingSphereProxyClusterContainer proxyClusterContainer = 
(ShardingSphereProxyClusterContainer) 
AdapterContainerFactory.newInstance(EnvironmentConstants.CLUSTER_MODE,
-                AdapterContainerConstants.PROXY, databaseType, 
storageContainer, "", containerConfig);
-        proxyClusterContainer.dependsOn(governanceContainer, storageContainer);
+                AdapterContainerConstants.PROXY, databaseType, null, "", 
containerConfig);
+        for (DockerStorageContainer each : storageContainers) {
+            proxyClusterContainer.dependsOn(governanceContainer, each);
+        }
         proxyContainer = 
getContainers().registerContainer(proxyClusterContainer);
     }
     
diff --git 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/param/PipelineTestParameter.java
 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/param/PipelineTestParameter.java
index 9e20e497f54..e6ec743e71f 100644
--- 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/param/PipelineTestParameter.java
+++ 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/param/PipelineTestParameter.java
@@ -32,4 +32,13 @@ public final class PipelineTestParameter {
     private final String storageContainerImage;
     
     private final String scenario;
+    
+    private final int storageContainerCount;
+    
+    public PipelineTestParameter(final DatabaseType databaseType, final String 
storageContainerImage, final String scenario) {
+        this.databaseType = databaseType;
+        this.storageContainerImage = storageContainerImage;
+        this.scenario = scenario;
+        storageContainerCount = 1;
+    }
 }
diff --git 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/watcher/PipelineWatcher.java
 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/watcher/PipelineWatcher.java
index 01d64c5892f..fa765e17ccb 100644
--- 
a/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/watcher/PipelineWatcher.java
+++ 
b/test/e2e/pipeline/src/test/java/org/apache/shardingsphere/test/e2e/data/pipeline/framework/watcher/PipelineWatcher.java
@@ -20,12 +20,12 @@ package 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.watcher;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
-import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.BaseContainerComposer;
-import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.DockerContainerComposer;
-import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.NativeContainerComposer;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 import 
org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepositoryConfiguration;
 import 
org.apache.shardingsphere.mode.repository.cluster.zookeeper.ZookeeperRepository;
+import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.BaseContainerComposer;
+import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.DockerContainerComposer;
+import 
org.apache.shardingsphere.test.e2e.data.pipeline.framework.container.compose.NativeContainerComposer;
 import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;
 
@@ -47,10 +47,13 @@ public class PipelineWatcher extends TestWatcher {
         }
     }
     
-    // TODO now the meta data mistake is not reproduce, but keep this method, 
it may be used again later
+    // TODO now the meta data mistake is not reproduce, but keep this method, 
it may be used again
     private void outputZookeeperData() {
+        if (!(containerComposer instanceof DockerContainerComposer)) {
+            return;
+        }
         DockerContainerComposer dockerContainerComposer = 
(DockerContainerComposer) containerComposer;
-        DatabaseType databaseType = 
dockerContainerComposer.getStorageContainer().getDatabaseType();
+        DatabaseType databaseType = 
dockerContainerComposer.getStorageContainers().get(0).getDatabaseType();
         String namespace = "it_db_" + databaseType.getType().toLowerCase();
         ClusterPersistRepositoryConfiguration config = new 
ClusterPersistRepositoryConfiguration("ZooKeeper", namespace,
                 
dockerContainerComposer.getGovernanceContainer().getServerLists(), new 
Properties());
diff --git a/test/e2e/pipeline/src/test/resources/env/mysql/my.cnf 
b/test/e2e/pipeline/src/test/resources/env/mysql/mysql5/my.cnf
similarity index 100%
rename from test/e2e/pipeline/src/test/resources/env/mysql/my.cnf
rename to test/e2e/pipeline/src/test/resources/env/mysql/mysql5/my.cnf

Reply via email to