You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2016/02/22 17:20:01 UTC

jclouds-labs git commit: [JCLOUDS-1084] Docker live tests fixed and made more robust

Repository: jclouds-labs
Updated Branches:
  refs/heads/master 93aff9219 -> 8e142cd20


[JCLOUDS-1084] Docker live tests fixed and made more robust


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/8e142cd2
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/8e142cd2
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/8e142cd2

Branch: refs/heads/master
Commit: 8e142cd204eacfe066f2c76ea9a68fe091ff6f4c
Parents: 93aff92
Author: Josef Cacek <jc...@redhat.com>
Authored: Fri Feb 19 12:33:24 2016 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Feb 22 17:16:40 2016 +0100

----------------------------------------------------------------------
 docker/pom.xml                                  |  3 +-
 .../docker/compute/BaseDockerApiLiveTest.java   | 14 +++-
 .../DockerComputeServiceAdapterLiveTest.java    | 27 +++----
 .../docker/compute/SshToCustomPortLiveTest.java | 47 ++++--------
 .../docker/features/ContainerApiLiveTest.java   |  3 -
 .../docker/features/MiscApiLiveTest.java        | 20 +++--
 .../docker/internal/DockerTestUtils.java        | 78 ++++++++++++++++++++
 docker/src/test/resources/Dockerfile            | 16 +---
 8 files changed, 133 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/pom.xml
----------------------------------------------------------------------
diff --git a/docker/pom.xml b/docker/pom.xml
index 39009fa..8bbb98c 100644
--- a/docker/pom.xml
+++ b/docker/pom.xml
@@ -38,6 +38,7 @@
     <test.docker.identity>${env.DOCKER_CERT_PATH}/cert.pem</test.docker.identity>
     <test.docker.credential>${env.DOCKER_CERT_PATH}/key.pem</test.docker.credential>
     <test.docker.cacert.path>${env.DOCKER_CERT_PATH}/ca.pem</test.docker.cacert.path>
+    <test.docker.endpoint>${env.DOCKER_HOST}</test.docker.endpoint>
     <test.jclouds.trust-all-certs>false</test.jclouds.trust-all-certs>
     <jclouds.osgi.export>org.jclouds.docker*;version="${project.version}"</jclouds.osgi.export>
     <jclouds.osgi.import>
@@ -151,7 +152,7 @@
                 </goals>
                 <configuration>
                   <name>test.docker.endpoint</name>
-                  <value>${env.DOCKER_HOST}</value>
+                  <value>${test.docker.endpoint}</value>
                   <regex>tcp</regex>
                   <replacement>https</replacement>
                   <failIfNoMatch>false</failIfNoMatch>

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
index eab76ba..81324ef 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java
@@ -33,6 +33,7 @@ import org.jclouds.Constants;
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.compute.config.ComputeServiceProperties;
 import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.internal.DockerTestUtils;
 import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
 import org.jclouds.sshj.config.SshjSshClientModule;
@@ -46,7 +47,7 @@ import com.google.inject.Module;
 public class BaseDockerApiLiveTest extends BaseApiLiveTest<DockerApi> {
 
    protected static final String DEFAULT_IMAGE = "alpine";
-   protected static final String DEFAULT_TAG = "3.2";
+   protected static final String DEFAULT_TAG = "3.3";
    protected static final String ALPINE_IMAGE_TAG = String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG);
 
 
@@ -54,6 +55,17 @@ public class BaseDockerApiLiveTest extends BaseApiLiveTest<DockerApi> {
       provider = "docker";
    }
 
+   /**
+    * Removes Docker image if it's present on the Docker host.
+    *
+    * @param imageName
+    *           image to be deleted (must be not-<code>null</code>)
+    * @see DockerTestUtils#removeImageIfExists(DockerApi, String)
+    */
+   protected void removeImageIfExists(String imageName) {
+      DockerTestUtils.removeImageIfExists(api, imageName);
+   }
+
    @Override
    protected Iterable<Module> setupModules() {
       return ImmutableSet.<Module>of(getLoggingModule(), new SshjSshClientModule());

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
index faad0ac..0221776 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java
@@ -19,6 +19,7 @@ package org.jclouds.docker.compute;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
+
 import java.util.Properties;
 import java.util.Random;
 
@@ -32,9 +33,8 @@ import org.jclouds.docker.compute.strategy.DockerComputeServiceAdapter;
 import org.jclouds.docker.domain.Container;
 import org.jclouds.docker.domain.Image;
 import org.jclouds.docker.options.CreateImageOptions;
-import org.jclouds.docker.options.DeleteImageOptions;
 import org.jclouds.sshj.config.SshjSshClientModule;
-import org.testng.annotations.AfterGroups;
+import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -48,7 +48,7 @@ import com.google.inject.Module;
 public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
 
    private static final String SSHABLE_IMAGE = "kwart/alpine-ext";
-   private static final String SSHABLE_IMAGE_TAG = "3.2-ssh";
+   private static final String SSHABLE_IMAGE_TAG = "3.3-ssh";
    private Image defaultImage;
 
    private DockerComputeServiceAdapter adapter;
@@ -68,6 +68,14 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
       assertNotNull(defaultImage);
    }
 
+   @AfterClass(alwaysRun = true)
+   protected void tearDown() {
+      if (guest != null) {
+         adapter.destroyNode(guest.getNode().id() + "");
+      }
+      super.tearDown();
+   }
+
    @Override
    protected DockerApi create(Properties props, Iterable<Module> modules) {
       Injector injector = newBuilder().modules(modules).overrides(props).buildInjector();
@@ -83,7 +91,7 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
       Template template = templateBuilder.imageId(defaultImage.id()).build();
 
       DockerTemplateOptions options = template.getOptions().as(DockerTemplateOptions.class);
-      options.env(ImmutableList.of("ROOT_PASS=password"));
+      options.env(ImmutableList.of("ROOT_PASSWORD=password"));
       guest = adapter.createNodeWithGroupEncodedIntoName(group, name, template);
       assertEquals(guest.getNodeId(), guest.getNode().id());
    }
@@ -97,17 +105,6 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest {
       }
    }
 
-   @AfterGroups(groups = "live")
-   protected void tearDown() {
-      if (guest != null) {
-         adapter.destroyNode(guest.getNode().id() + "");
-      }
-      if (defaultImage != null) {
-         api.getImageApi().deleteImage(defaultImage.id(), DeleteImageOptions.Builder.force(true));
-      }
-      super.tearDown();
-   }
-
    @Override
    protected Iterable<Module> setupModules() {
       return ImmutableSet.<Module>of(getLoggingModule(), new SshjSshClientModule());

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
index 62e1e5e..cb35173 100644
--- a/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java
@@ -17,15 +17,15 @@
 package org.jclouds.docker.compute;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot;
+import static org.jclouds.compute.options.RunScriptOptions.Builder.wrapInInitScript;
+import static org.jclouds.docker.internal.DockerTestUtils.consumeStreamSilently;
+import static org.jclouds.docker.internal.DockerTestUtils.removeImageIfExists;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.util.List;
-import java.util.logging.Level;
 
 import org.jclouds.compute.RunNodesException;
 import org.jclouds.compute.domain.ExecResponse;
@@ -104,8 +104,9 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
    @Test(dependsOnMethods = "testImageCreated")
    public void testCustomPortSsh() throws RunNodesException {
       final DockerTemplateOptions options = DockerTemplateOptions.Builder
-            .commands("/usr/sbin/dropbear", "-E", "-F", "-p", String.valueOf(SSH_PORT)).overrideLoginUser("root")
-            .overrideLoginPassword("screencast").blockOnPort(SSH_PORT, 30).networkMode("host");
+            .env("SSH_PORT=" + SSH_PORT, "ROOT_PASSWORD=screencast")
+            .overrideLoginUser("root").overrideLoginPassword("screencast")
+            .blockOnPort(SSH_PORT, 30).networkMode("host");
 
       final Template template = view.getComputeService().templateBuilder().imageId(image.id()).options(options).build();
 
@@ -115,8 +116,7 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
                .getOnlyElement(view.getComputeService().createNodesInGroup("ssh-test", 1, template));
 
          nodeId = node.getId();
-         ExecResponse response = view.getComputeService().runScriptOnNode(nodeId, "echo hello",
-               runAsRoot(false).wrapInInitScript(false));
+         ExecResponse response = view.getComputeService().runScriptOnNode(nodeId, "sh -c 'echo hello && sleep 0.2'", wrapInInitScript(false));
          assertThat(response.getOutput().trim()).endsWith("hello");
       } finally {
          if (nodeId != null)
@@ -133,8 +133,11 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
    @BeforeClass(groups = { "integration", "live" })
    public void setupContext() {
       super.setupContext();
-
       final String tag = toTag(IMAGE_REPOSITORY, IMAGE_TAG_1);
+
+      removeImageIfExists(api(), tag);
+      removeImageIfExists(api(), toTag(IMAGE_REPOSITORY, IMAGE_TAG_2));
+
       BuildOptions options = BuildOptions.Builder.tag(tag).verbose(false).nocache(false);
       InputStream buildImageStream;
       try {
@@ -154,8 +157,8 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
     */
    @AfterClass(alwaysRun = true)
    protected void tearDown() {
-      consumeStreamSilently(api().getImageApi().deleteImage(toTag(IMAGE_REPOSITORY, IMAGE_TAG_1)));
-      consumeStreamSilently(api().getImageApi().deleteImage(toTag(IMAGE_REPOSITORY, IMAGE_TAG_2)));
+      removeImageIfExists(api(), toTag(IMAGE_REPOSITORY, IMAGE_TAG_1));
+      removeImageIfExists(api(), toTag(IMAGE_REPOSITORY, IMAGE_TAG_2));
    }
 
    /**
@@ -189,29 +192,6 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
    }
 
    /**
-    * Read all data from given InputStream and throw away all the bits.
-    * 
-    * @param is
-    */
-   private static void consumeStreamSilently(InputStream is) {
-      char[] tmpBuff = new char[8 * 1024];
-      // throw everything away
-      InputStreamReader isr = new InputStreamReader(is);
-
-      try {
-         try {
-            while (isr.read(tmpBuff) > -1) {
-               // empty
-            }
-         } finally {
-            isr.close();
-         }
-      } catch (IOException e) {
-         java.util.logging.Logger.getAnonymousLogger().log(Level.WARNING, "Error ocured during reading InputStream.", e);
-      }
-   }
-
-   /**
     * Concatenate repository and tag name (if provided) in Docker format.
     * 
     * @param repo
@@ -221,4 +201,5 @@ public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest {
    private static String toTag(String repo, String tag) {
       return repo + (tag != null ? ":" + tag : "");
    }
+
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
index 295eb5b..1b23b07 100644
--- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java
@@ -67,9 +67,6 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest {
             api.getContainerApi().removeContainer(container.id(), RemoveContainerOptions.Builder.force(true));
          }
       }
-      if (image != null) {
-         api.getImageApi().deleteImage(ALPINE_IMAGE_TAG);
-      }
    }
 
    public void testCreateContainer() throws IOException, InterruptedException {

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java b/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
index 95b749b..c9c69dc 100644
--- a/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
+++ b/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java
@@ -51,6 +51,8 @@ import com.google.common.collect.Iterables;
 @Test(groups = "live", testName = "MiscApiLiveTest", singleThreaded = true)
 public class MiscApiLiveTest extends BaseDockerApiLiveTest {
 
+   private static final String IMAGE_TEST_TAG = "jclouds-test-test-build-image";
+
    private static String imageId;
 
    private Container container = null;
@@ -105,14 +107,19 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest {
 
    @Test
    public void testBuildImageFromDockerfile() throws IOException, InterruptedException, URISyntaxException {
-      BuildOptions options = BuildOptions.Builder.tag("jclouds-test-test-build-image").verbose(false).nocache(false);
+      removeImageIfExists(IMAGE_TEST_TAG);
+      BuildOptions options = BuildOptions.Builder.tag(IMAGE_TEST_TAG).verbose(false).nocache(true);
       InputStream buildImageStream = api().build(tarredDockerfile(), options);
       String buildStream = consumeStream(buildImageStream);
-      Iterable<String> splitted = Splitter.on("\n").split(buildStream.replace("\r", "").trim());
-      String lastStreamedLine = Iterables.getLast(splitted).trim();
-      String rawImageId = Iterables.getLast(Splitter.on("Successfully built ").split(lastStreamedLine));
-      imageId = rawImageId.substring(0, 11);
-      assertNotNull(imageId);
+      try {
+         Iterable<String> splitted = Splitter.on("\n").split(buildStream.replace("\r", "").trim());
+         String lastStreamedLine = Iterables.getLast(splitted).trim();
+         String rawImageId = Iterables.getLast(Splitter.on("Successfully built ").split(lastStreamedLine));
+         imageId = rawImageId.substring(0, 11);
+         assertNotNull(imageId);
+      } finally {
+         removeImageIfExists(IMAGE_TEST_TAG);
+      }
    }
 
    @Test
@@ -168,7 +175,6 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest {
       assertEquals(execInspect.exitCode(), 2);
    }
 
-   
    private MiscApi api() {
       return api.getMiscApi();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/java/org/jclouds/docker/internal/DockerTestUtils.java
----------------------------------------------------------------------
diff --git a/docker/src/test/java/org/jclouds/docker/internal/DockerTestUtils.java b/docker/src/test/java/org/jclouds/docker/internal/DockerTestUtils.java
new file mode 100644
index 0000000..102684a
--- /dev/null
+++ b/docker/src/test/java/org/jclouds/docker/internal/DockerTestUtils.java
@@ -0,0 +1,78 @@
+/*
+ * 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.jclouds.docker.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.logging.Level;
+
+import org.jclouds.docker.DockerApi;
+import org.jclouds.docker.features.ImageApi;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Utility methods shared by Docker tests.
+ */
+public class DockerTestUtils {
+
+   /**
+    * Read all data from given {@link InputStream} and throw away all the bits.
+    * If an {@link IOException} occurs, it's not propagated to user. The given InputStream is closed after the read.
+    * 
+    * @param is InputStream instance (may be null)
+    */
+   public static void consumeStreamSilently(InputStream is) {
+      if (is == null) {
+         return;
+      }
+      char[] tmpBuff = new char[8 * 1024];
+      // throw everything away
+      InputStreamReader isr = new InputStreamReader(is);
+      try {
+         try {
+            while (isr.read(tmpBuff) > -1) {
+               // empty
+            }
+         } finally {
+            isr.close();
+         }
+      } catch (IOException e) {
+         java.util.logging.Logger.getAnonymousLogger().log(Level.WARNING, "Error ocured during reading InputStream.", e);
+      }
+   }
+
+   /**
+    * Removes Docker image if it's present on the Docker host. Docker Image API
+    * is used to inspect and remove image (({@link ImageApi#deleteImage(String)}
+    * method).
+    *
+    * @param dockerApi
+    *           DockerApi instance (must be not-<code>null</code>)
+    * @param imageName
+    *           image to be deleted (must be not-<code>null</code>)
+    */
+   public static void removeImageIfExists(DockerApi dockerApi, String imageName) {
+      Preconditions.checkNotNull(dockerApi, "DockerApi instance has to be provided");
+      Preconditions.checkNotNull(imageName, "Docker image name has to be provided");
+      final ImageApi imageApi = dockerApi.getImageApi();
+      if (null != imageApi.inspectImage(imageName)) {
+         consumeStreamSilently(imageApi.deleteImage(imageName));
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/8e142cd2/docker/src/test/resources/Dockerfile
----------------------------------------------------------------------
diff --git a/docker/src/test/resources/Dockerfile b/docker/src/test/resources/Dockerfile
index f375d33..0cedc5e 100644
--- a/docker/src/test/resources/Dockerfile
+++ b/docker/src/test/resources/Dockerfile
@@ -16,19 +16,5 @@
 #
 
 
-FROM alpine:3.2
+FROM kwart/alpine-ext:3.3-ssh
 MAINTAINER JClouds Dev <de...@jclouds.apache.org>
-
-ENV DROPBEAR_CONF=/etc/dropbear
-
-RUN apk add --update dropbear \
-    && mkdir -p ${DROPBEAR_CONF} \
-    && dropbearkey -t dss -f ${DROPBEAR_CONF}/dropbear_dss_host_key \
-    && dropbearkey -t rsa -f ${DROPBEAR_CONF}/dropbear_rsa_host_key -s 2048 \
-    && dropbearkey -t ecdsa -f ${DROPBEAR_CONF}/dropbear_ecdsa_host_key
-
-RUN echo 'root:screencast' | chpasswd
-
-EXPOSE 22
-
-CMD ["/usr/sbin/dropbear", "-E", "-F"]