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:
Maytas Monsereenusorn 2021-08-31 13:26:26 +07:00 committed by GitHub
parent 2405a9f25e
commit 6997fd787d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 1 deletions

View File

@ -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>

View File

@ -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)