mirror of https://github.com/apache/druid.git
Add functionality for integration test to run command inside the Docker container (#11640)
* add run cmd for IT * fix checksyle * fix checksyle
This commit is contained in:
parent
2405a9f25e
commit
6997fd787d
|
@ -315,6 +315,11 @@
|
||||||
<artifactId>docker-java-api</artifactId>
|
<artifactId>docker-java-api</artifactId>
|
||||||
<version>3.2.0</version>
|
<version>3.2.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.docker-java</groupId>
|
||||||
|
<artifactId>docker-java-core</artifactId>
|
||||||
|
<version>3.2.0</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.netty</groupId>
|
<groupId>io.netty</groupId>
|
||||||
<artifactId>netty-transport-native-kqueue</artifactId>
|
<artifactId>netty-transport-native-kqueue</artifactId>
|
||||||
|
|
|
@ -21,11 +21,14 @@ package org.apache.druid.testing.utils;
|
||||||
|
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.github.dockerjava.api.DockerClient;
|
import com.github.dockerjava.api.DockerClient;
|
||||||
|
import com.github.dockerjava.api.command.ExecCreateCmdResponse;
|
||||||
import com.github.dockerjava.api.model.Container;
|
import com.github.dockerjava.api.model.Container;
|
||||||
import com.github.dockerjava.core.DockerClientBuilder;
|
import com.github.dockerjava.core.DockerClientBuilder;
|
||||||
|
import com.github.dockerjava.core.command.ExecStartResultCallback;
|
||||||
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
|
import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import org.apache.druid.java.util.common.ISE;
|
import org.apache.druid.java.util.common.ISE;
|
||||||
|
import org.apache.druid.java.util.common.Pair;
|
||||||
import org.apache.druid.java.util.common.StringUtils;
|
import org.apache.druid.java.util.common.StringUtils;
|
||||||
import org.apache.druid.java.util.common.logger.Logger;
|
import org.apache.druid.java.util.common.logger.Logger;
|
||||||
import org.apache.druid.java.util.http.client.HttpClient;
|
import org.apache.druid.java.util.http.client.HttpClient;
|
||||||
|
@ -39,8 +42,10 @@ import org.jboss.netty.channel.ChannelException;
|
||||||
import org.jboss.netty.handler.codec.http.HttpMethod;
|
import org.jboss.netty.handler.codec.http.HttpMethod;
|
||||||
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
|
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.channels.ClosedChannelException;
|
import java.nio.channels.ClosedChannelException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
@ -154,12 +159,78 @@ public class DruidClusterAdminClient
|
||||||
waitUntilInstanceReady(config.getRouterUrl());
|
waitUntilInstanceReady(config.getRouterUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInCoordinatorContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(COORDINATOR_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInCoordinatorTwoContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(COORDINATOR_TWO_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInHistoricalContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(HISTORICAL_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInOverlordContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(OVERLORD_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInOverlordTwoContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(OVERLORD_TWO_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInBrokerContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(BROKER_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInRouterContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(ROUTER_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair<String, String> runCommandInMiddleManagerContainer(String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
return runCommandInDockerContainer(MIDDLEMANAGER_DOCKER_CONTAINER_NAME, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pair<String, String> runCommandInDockerContainer(String serviceName, String... cmd) throws Exception
|
||||||
|
{
|
||||||
|
DockerClient dockerClient = DockerClientBuilder.getInstance()
|
||||||
|
.withDockerCmdExecFactory((new NettyDockerCmdExecFactory())
|
||||||
|
.withConnectTimeout(10 * 1000))
|
||||||
|
.build();
|
||||||
|
ByteArrayOutputStream stdout = new ByteArrayOutputStream();
|
||||||
|
ByteArrayOutputStream stderr = new ByteArrayOutputStream();
|
||||||
|
ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(findDockerContainer(dockerClient, serviceName))
|
||||||
|
.withAttachStderr(true)
|
||||||
|
.withAttachStdout(true)
|
||||||
|
.withCmd(cmd)
|
||||||
|
.exec();
|
||||||
|
dockerClient.execStartCmd(execCreateCmdResponse.getId())
|
||||||
|
.exec(new ExecStartResultCallback(stdout, stderr))
|
||||||
|
.awaitCompletion();
|
||||||
|
|
||||||
|
return new Pair<>(stdout.toString(StandardCharsets.UTF_8.name()), stderr.toString(StandardCharsets.UTF_8.name()));
|
||||||
|
}
|
||||||
|
|
||||||
private void restartDockerContainer(String serviceName)
|
private void restartDockerContainer(String serviceName)
|
||||||
{
|
{
|
||||||
DockerClient dockerClient = DockerClientBuilder.getInstance()
|
DockerClient dockerClient = DockerClientBuilder.getInstance()
|
||||||
.withDockerCmdExecFactory((new NettyDockerCmdExecFactory())
|
.withDockerCmdExecFactory((new NettyDockerCmdExecFactory())
|
||||||
.withConnectTimeout(10 * 1000))
|
.withConnectTimeout(10 * 1000))
|
||||||
.build();
|
.build();
|
||||||
|
dockerClient.restartContainerCmd(findDockerContainer(dockerClient, serviceName)).exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String findDockerContainer(DockerClient dockerClient, String serviceName)
|
||||||
|
{
|
||||||
|
|
||||||
List<Container> containers = dockerClient.listContainersCmd().exec();
|
List<Container> containers = dockerClient.listContainersCmd().exec();
|
||||||
Optional<String> containerName = containers.stream()
|
Optional<String> containerName = containers.stream()
|
||||||
.filter(container -> Arrays.asList(container.getNames()).contains(serviceName))
|
.filter(container -> Arrays.asList(container.getNames()).contains(serviceName))
|
||||||
|
@ -170,7 +241,7 @@ public class DruidClusterAdminClient
|
||||||
LOG.error("Cannot find docker container for " + serviceName);
|
LOG.error("Cannot find docker container for " + serviceName);
|
||||||
throw new ISE("Cannot find docker container for " + serviceName);
|
throw new ISE("Cannot find docker container for " + serviceName);
|
||||||
}
|
}
|
||||||
dockerClient.restartContainerCmd(containerName.get()).exec();
|
return containerName.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void waitUntilInstanceReady(final String host)
|
private void waitUntilInstanceReady(final String host)
|
||||||
|
|
Loading…
Reference in New Issue