Skip to content

Commit

Permalink
Support governance env for IT (apache#9874)
Browse files Browse the repository at this point in the history
* support governance

* fix checkstyle

* skip 'governance' test case in CI env and build
  • Loading branch information
dmsolr authored Apr 1, 2021
1 parent 4954616 commit 8f941f3
Show file tree
Hide file tree
Showing 14 changed files with 260 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/it.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ jobs:
- name: set environment
run: export MAVEN_OPS=' -Dmaven.javadoc.skip=true -Drat.skip=true -Djacoco.skip=true'
- name: Build Project
run: ./mvnw -B clean install -am -pl shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite -Pit.env.docker
run: ./mvnw -B clean install -am -pl shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite -Pit.env.docker -DskipTests
- name: Run Integration Test
run: ./mvnw -B install -f shardingsphere-test/shardingsphere-integration-test/shardingsphere-integration-test-suite/pom.xml -Dit.adapters=${{ matrix.adapter }} -Dit.databases=MySQL -Dit.scenarios=${{ matrix.scenario }} -Dit.env.type=DOCKER

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@
<artifactId>shardingsphere-jdbc-core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-governance</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,12 @@ public ContainerCompose getOrCreateCompose(final ParameterizedArray parameterize
if (composeMap.containsKey(key)) {
return composeMap.get(key);
}
ContainerCompose result = new ContainerCompose(suiteName, parameterizedArray);
ContainerCompose result;
if ("sharding_governance".equals(parameterizedArray.getScenario())) {
result = new GovernanceContainerCompose(suiteName, parameterizedArray);
} else {
result = new SimpleContainerCompose(suiteName, parameterizedArray);
}
composeMap.put(key, result);
return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.apache.shardingsphere.test.integration.junit.compose;

import lombok.AccessLevel;
import lombok.Getter;
import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
Expand All @@ -32,44 +33,37 @@
import org.testcontainers.containers.Network;
import org.testcontainers.lifecycle.Startable;

import javax.sql.DataSource;
import java.io.Closeable;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/**
* Container compose.
*/
public final class ContainerCompose extends ExternalResource implements Closeable {
@Getter(AccessLevel.PROTECTED)
public abstract class ContainerCompose extends ExternalResource implements Closeable {

private final Network network = Network.newNetwork();

private final String clusterName;

private final ParameterizedArray parameterizedArray;

private final List<ShardingSphereContainer> containers;

@Getter
private final ShardingSphereStorageContainer storageContainer;

@Getter
private final ShardingSphereAdapterContainer adapterContainer;
private final List<ShardingSphereContainer> containers = new ArrayList<>();

private volatile boolean started;

public ContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
this.clusterName = clusterName;
this.parameterizedArray = parameterizedArray;
this.storageContainer = createStorageContainer();
this.adapterContainer = createAdapterContainer();
adapterContainer.dependsOn(storageContainer);
this.containers = Arrays.asList(storageContainer, adapterContainer);
}

private ShardingSphereAdapterContainer createAdapterContainer() {
protected ShardingSphereAdapterContainer createAdapterContainer() {
Supplier<ShardingSphereAdapterContainer> supplier = () -> {
switch (parameterizedArray.getAdapter()) {
case "proxy":
Expand All @@ -81,13 +75,10 @@ private ShardingSphereAdapterContainer createAdapterContainer() {

}
};
ShardingSphereAdapterContainer result = supplier.get();
result.setNetwork(network);
result.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-adapter"));
return result;
return createContainer(supplier, "adapter");
}

private ShardingSphereStorageContainer createStorageContainer() {
protected ShardingSphereStorageContainer createStorageContainer() {
Supplier<ShardingSphereStorageContainer> supplier = () -> {
switch (parameterizedArray.getDatabaseType().getName()) {
case "MySQL":
Expand All @@ -98,10 +89,15 @@ private ShardingSphereStorageContainer createStorageContainer() {
throw new RuntimeException("Unknown storage type " + parameterizedArray.getDatabaseType());
}
};
ShardingSphereStorageContainer result = supplier.get();
return createContainer(supplier, "mysql.db.host");
}

protected final <T extends ShardingSphereContainer> T createContainer(final Supplier<T> supplier, final String hostName) {
T result = supplier.get();
containers.add(result);
result.setNetwork(network);
result.withLogConsumer(ContainerLogs.newConsumer(this.clusterName + "-storage"));
result.setNetworkAliases(Collections.singletonList("mysql.db.host"));
result.setNetworkAliases(Collections.singletonList(hostName));
result.withLogConsumer(ContainerLogs.newConsumer(String.join("-", clusterName, result.getDockerName())));
return result;
}

Expand Down Expand Up @@ -137,6 +133,47 @@ public void waitUntilReady() {
started = true;
}

/**
* Get adapter container.
*
* @return ShardingSphere adapter container
*/
public abstract ShardingSphereAdapterContainer getAdapterContainer();

/**
* Get storage container.
*
* @return ShardingSphere storage container
*/
public abstract ShardingSphereStorageContainer getStorageContainer();

/**
* Get target datasource for writer.
*
* @return datasource
*/
public DataSource getDataSourceForWriter() {
return getAdapterContainer().getDataSource();
}

/**
* Get target datasource for reader.
*
* @return datasource
*/
public DataSource getDataSourceForReader() {
return getAdapterContainer().getDataSource();
}

/**
* Get all target datasources.
*
* @return datasource map
*/
public Map<String, DataSource> getDataSourceMap() {
return Collections.singletonMap(getAdapterContainer().getDockerName(), getAdapterContainer().getDataSource());
}

@Override
protected void before() {
if (!started) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/*
* 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.junit.compose;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
import org.apache.shardingsphere.test.integration.junit.container.adapter.impl.ShardingSphereProxyContainer;
import org.apache.shardingsphere.test.integration.junit.container.governance.ZookeeperContainer;
import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;

import javax.sql.DataSource;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public final class GovernanceContainerCompose extends ContainerCompose {

@Getter
private final ShardingSphereStorageContainer storageContainer;

@Getter
private final ShardingSphereAdapterContainer adapterContainer;

private final ShardingSphereAdapterContainer adapterContainerForReader;

public GovernanceContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
super(clusterName, parameterizedArray);
this.storageContainer = createStorageContainer();
this.adapterContainer = createAdapterContainer();
this.storageContainer.setNetworkAliases(Collections.singletonList("mysql.sharding-governance.host"));
ZookeeperContainer zookeeperContainer = createZookeeperContainer();
if ("proxy".equals(parameterizedArray.getAdapter())) {
adapterContainerForReader = createContainer(() -> new ShardingSphereProxyContainer("ShardingSphere-Proxy-1", parameterizedArray), "ShardingSphere-Proxy-1");
adapterContainerForReader.dependsOn(storageContainer, zookeeperContainer);
} else {
adapterContainerForReader = this.adapterContainer;
}
adapterContainer.dependsOn(storageContainer, zookeeperContainer);
}

private ZookeeperContainer createZookeeperContainer() {
return createContainer(() -> new ZookeeperContainer(getParameterizedArray()), "zk");
}

@Override
public DataSource getDataSourceForReader() {
return adapterContainerForReader.getDataSource();
}

@Override
public Map<String, DataSource> getDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2);
result.put(adapterContainer.getDockerName(), adapterContainer.getDataSource());
result.put(adapterContainerForReader.getDockerName(), adapterContainerForReader.getDataSource());
return result;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* 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.junit.compose;

import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
import org.apache.shardingsphere.test.integration.junit.container.storage.ShardingSphereStorageContainer;
import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;

/**
* Container compose.
*/
@Slf4j
public final class SimpleContainerCompose extends ContainerCompose {

@Getter
private final ShardingSphereStorageContainer storageContainer;

@Getter
private final ShardingSphereAdapterContainer adapterContainer;

public SimpleContainerCompose(final String clusterName, final ParameterizedArray parameterizedArray) {
super(clusterName, parameterizedArray);
this.storageContainer = createStorageContainer();
this.adapterContainer = createAdapterContainer();
adapterContainer.dependsOn(storageContainer);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ private void startDependencies() {
// CHECKSTYLE:OFF
} catch (final Exception ex) {
// CHECKSTYLE:ON
log.warn("Failed to check container {} healthy.", c.getDockerName(), ex);
log.info("Failed to check container {} healthy.", c.getDockerName(), ex);
return false;
}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,5 @@ public ShardingSphereAdapterContainer(final String dockerName, final String dock
* @return DataSource
*/
public abstract DataSource getDataSource();

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
package org.apache.shardingsphere.test.integration.junit.container.adapter.impl;

import org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory;
import org.apache.shardingsphere.driver.governance.api.yaml.YamlGovernanceShardingSphereDataSourceFactory;
import org.apache.shardingsphere.test.integration.env.EnvironmentPath;
import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
import org.apache.shardingsphere.test.integration.junit.container.adapter.ShardingSphereAdapterContainer;
Expand Down Expand Up @@ -51,7 +52,6 @@ public ShardingSphereJDBCContainer(final ParameterizedArray parameterizedArray)
@Override
public void start() {
super.start();
// do not start because it is a fake container.
List<Startable> startables = getDependencies().stream()
.filter(e -> e instanceof ShardingSphereStorageContainer)
.collect(Collectors.toList());
Expand All @@ -66,6 +66,9 @@ public void start() {
*/
public DataSource getDataSource() {
try {
if ("sharding_governance".equals(getParameterizedArray().getScenario())) {
return YamlGovernanceShardingSphereDataSourceFactory.createDataSource(new File(EnvironmentPath.getRulesConfigurationFile(getParameterizedArray().getScenario())));
}
return YamlShardingSphereDataSourceFactory.createDataSource(dataSourceMap, new File(EnvironmentPath.getRulesConfigurationFile(getParameterizedArray().getScenario())));
} catch (SQLException | IOException ex) {
throw new RuntimeException(ex);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,11 @@ public final class ShardingSphereProxyContainer extends ShardingSphereAdapterCon
private final AtomicReference<DataSource> dataSourceProvider = new AtomicReference<>();

public ShardingSphereProxyContainer(final ParameterizedArray parameterizedArray) {
super("shardingsphere-proxy", "apache/shardingsphere-proxy-test", parameterizedArray);
this(null, parameterizedArray);
}

public ShardingSphereProxyContainer(final String dockerName, final ParameterizedArray parameterizedArray) {
super(Objects.isNull(dockerName) ? "ShardingSphere-Proxy" : dockerName, "apache/shardingsphere-proxy-test", parameterizedArray);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* 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.junit.container.governance;

import org.apache.shardingsphere.test.integration.junit.container.ShardingSphereContainer;
import org.apache.shardingsphere.test.integration.junit.param.model.ParameterizedArray;
import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;

public class ZookeeperContainer extends ShardingSphereContainer {

public ZookeeperContainer(final ParameterizedArray parameterizedArray) {
super("zookeeper", "zookeeper:3.6.2", false, parameterizedArray);
setWaitStrategy(new LogMessageWaitStrategy().withRegEx(".*PrepRequestProcessor \\(sid:[0-9]+\\) started.*"));
}

}
Loading

0 comments on commit 8f941f3

Please sign in to comment.