You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by ma...@apache.org on 2021/08/31 06:26:41 UTC

[druid] branch master updated: Add functionality for integration test to run command inside the Docker container (#11640)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6997fd7  Add functionality for integration test to run command inside the Docker container (#11640)
6997fd7 is described below

commit 6997fd787de50dbb2dd69bfd9994626583d4cdaa
Author: Maytas Monsereenusorn <ma...@apache.org>
AuthorDate: Tue Aug 31 13:26:26 2021 +0700

    Add functionality for integration test to run command inside the Docker container (#11640)
    
    * add run cmd for IT
    
    * fix checksyle
    
    * fix checksyle
---
 integration-tests/pom.xml                          |  5 ++
 .../testing/utils/DruidClusterAdminClient.java     | 73 +++++++++++++++++++++-
 2 files changed, 77 insertions(+), 1 deletion(-)

diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 339e01f..ab9a638 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -316,6 +316,11 @@
             <version>3.2.0</version>
         </dependency>
         <dependency>
+            <groupId>com.github.docker-java</groupId>
+            <artifactId>docker-java-core</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-transport-native-kqueue</artifactId>
             <classifier>osx-x86_64</classifier>
diff --git a/integration-tests/src/main/java/org/apache/druid/testing/utils/DruidClusterAdminClient.java b/integration-tests/src/main/java/org/apache/druid/testing/utils/DruidClusterAdminClient.java
index d867b20..c8908ab 100644
--- a/integration-tests/src/main/java/org/apache/druid/testing/utils/DruidClusterAdminClient.java
+++ b/integration-tests/src/main/java/org/apache/druid/testing/utils/DruidClusterAdminClient.java
@@ -21,11 +21,14 @@ package org.apache.druid.testing.utils;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.ExecCreateCmdResponse;
 import com.github.dockerjava.api.model.Container;
 import com.github.dockerjava.core.DockerClientBuilder;
+import com.github.dockerjava.core.command.ExecStartResultCallback;
 import com.github.dockerjava.netty.NettyDockerCmdExecFactory;
 import com.google.inject.Inject;
 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.logger.Logger;
 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.HttpResponseStatus;
 
+import java.io.ByteArrayOutputStream;
 import java.net.URL;
 import java.nio.channels.ClosedChannelException;
+import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Optional;
@@ -154,12 +159,78 @@ public class DruidClusterAdminClient
     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)
   {
     DockerClient dockerClient = DockerClientBuilder.getInstance()
                                                    .withDockerCmdExecFactory((new NettyDockerCmdExecFactory())
                                                                                  .withConnectTimeout(10 * 1000))
                                                    .build();
+    dockerClient.restartContainerCmd(findDockerContainer(dockerClient, serviceName)).exec();
+  }
+
+  private String findDockerContainer(DockerClient dockerClient, String serviceName)
+  {
+
     List<Container> containers = dockerClient.listContainersCmd().exec();
     Optional<String> containerName = containers.stream()
                                                .filter(container -> Arrays.asList(container.getNames()).contains(serviceName))
@@ -170,7 +241,7 @@ public class DruidClusterAdminClient
       LOG.error("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)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org