http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/main/java/org/jclouds/docker/suppliers/KeyStoreSupplier.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/suppliers/KeyStoreSupplier.java b/docker/src/main/java/org/jclouds/docker/suppliers/KeyStoreSupplier.java deleted file mode 100644 index e8643cd..0000000 --- a/docker/src/main/java/org/jclouds/docker/suppliers/KeyStoreSupplier.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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.suppliers; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Throwables.propagate; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.KeySpec; -import java.util.Collection; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.crypto.Crypto; -import org.jclouds.crypto.Pems; -import org.jclouds.domain.Credentials; -import org.jclouds.location.Provider; -import org.jclouds.rest.AuthorizationException; - -import com.google.common.base.Charsets; -import com.google.common.base.Supplier; -import com.google.common.io.ByteSource; - -@Singleton -public class KeyStoreSupplier implements Supplier<KeyStore> { - private final Crypto crypto; - private final Supplier<Credentials> creds; - - @Inject - KeyStoreSupplier(Crypto crypto, @Provider Supplier<Credentials> creds) { - this.crypto = crypto; - this.creds = creds; - } - - @Override - public KeyStore get() { - Credentials currentCreds = checkNotNull(creds.get(), "credential supplier returned null"); - String cert = checkNotNull(currentCreds.identity, "credential supplier returned null identity (should be cert)"); - String keyStorePassword = checkNotNull(currentCreds.credential, - "credential supplier returned null credential (should be keyStorePassword)"); - try { - KeyStore keyStore = KeyStore.getInstance("PKCS12"); - - File certFile = new File(checkNotNull(cert)); - if (certFile.isFile()) { // cert is path to pkcs12 file - FileInputStream stream = new FileInputStream(certFile); - try { - keyStore.load(stream, keyStorePassword.toCharArray()); - } finally { - stream.close(); - } - } else { // cert is PEM encoded, containing private key and certs - - // split in private key and certs - int privateKeyBeginIdx = cert.indexOf("-----BEGIN PRIVATE KEY"); - int privateKeyEndIdx = cert.indexOf("-----END PRIVATE KEY"); - if (privateKeyBeginIdx != -1) { - String pemPrivateKey = cert.substring(privateKeyBeginIdx, privateKeyEndIdx + 26); - - StringBuilder pemCerts = new StringBuilder(); - int certsBeginIdx = 0; - - do { - certsBeginIdx = cert.indexOf("-----BEGIN CERTIFICATE", certsBeginIdx); - - if (certsBeginIdx >= 0) { - int certsEndIdx = cert.indexOf("-----END CERTIFICATE", certsBeginIdx) + 26; - pemCerts.append(cert.substring(certsBeginIdx, certsEndIdx)); - certsBeginIdx = certsEndIdx; - } - } while (certsBeginIdx != -1); - - // parse private key - KeySpec keySpec = Pems.privateKeySpec(ByteSource.wrap(pemPrivateKey.getBytes(Charsets.UTF_8))); - PrivateKey privateKey = crypto.rsaKeyFactory().generatePrivate(keySpec); - - // populate keystore with private key and certs - CertificateFactory cf = CertificateFactory.getInstance("X.509"); - @SuppressWarnings("unchecked") - Collection<Certificate> certs = (Collection<Certificate>) cf.generateCertificates(new ByteArrayInputStream( - pemCerts.toString().getBytes(Charsets.UTF_8))); - keyStore.load(null); - keyStore.setKeyEntry("dummy", privateKey, keyStorePassword.toCharArray(), - certs.toArray(new Certificate[0])); - } else { - throw new AuthorizationException(); - } - } - return keyStore; - } catch (NoSuchAlgorithmException e) { - throw propagate(e); - } catch (KeyStoreException e) { - throw propagate(e); - } catch (CertificateException e) { - throw propagate(e); - } catch (FileNotFoundException e) { - throw propagate(e); - } catch (IOException e) { - throw propagate(e); - } catch (InvalidKeySpecException e) { - throw propagate(e); - } - } -}
http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextWithKeysSupplier.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextWithKeysSupplier.java b/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextWithKeysSupplier.java index 59695d3..7aeee18 100644 --- a/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextWithKeysSupplier.java +++ b/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextWithKeysSupplier.java @@ -18,60 +18,146 @@ package org.jclouds.docker.suppliers; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Throwables.propagate; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.net.Socket; import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; +import java.security.KeyPair; import java.security.NoSuchAlgorithmException; +import java.security.Principal; +import java.security.PrivateKey; import java.security.SecureRandom; -import java.security.UnrecoverableKeyException; +import java.security.Security; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; import javax.inject.Inject; import javax.inject.Singleton; -import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.KeyManager; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; +import javax.net.ssl.X509ExtendedKeyManager; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import org.jclouds.domain.Credentials; import org.jclouds.http.HttpUtils; import org.jclouds.http.config.SSLModule.TrustAllCerts; import org.jclouds.location.Provider; +import com.google.common.base.Charsets; import com.google.common.base.Supplier; +import com.google.common.io.Files; @Singleton public class SSLContextWithKeysSupplier implements Supplier<SSLContext> { - private final Supplier<KeyStore> keyStore; private final TrustManager[] trustManager; private final Supplier<Credentials> creds; @Inject - SSLContextWithKeysSupplier(Supplier<KeyStore> keyStore, @Provider Supplier<Credentials> creds, HttpUtils utils, - TrustAllCerts trustAllCerts) { - this.keyStore = keyStore; - this.trustManager = utils.trustAllCerts() ? new TrustManager[] { trustAllCerts } : null; + SSLContextWithKeysSupplier(@Provider Supplier<Credentials> creds, HttpUtils utils, TrustAllCerts trustAllCerts) { + this.trustManager = utils.trustAllCerts() ? new TrustManager[]{trustAllCerts} : null; this.creds = creds; } @Override public SSLContext get() { Credentials currentCreds = checkNotNull(creds.get(), "credential supplier returned null"); - String keyStorePassword = checkNotNull(currentCreds.credential, - "credential supplier returned null credential (should be keyStorePassword)"); - KeyManagerFactory kmf; try { - kmf = KeyManagerFactory.getInstance("SunX509"); - kmf.init(keyStore.get(), keyStorePassword.toCharArray()); - SSLContext sc = SSLContext.getInstance("TLS"); - sc.init(kmf.getKeyManagers(), trustManager, new SecureRandom()); - return sc; + SSLContext sslContext = SSLContext.getInstance("TLS"); + X509Certificate certificate = getCertificate(loadFile(currentCreds.identity)); + PrivateKey privateKey = getKey(loadFile(currentCreds.credential)); + sslContext.init(new KeyManager[]{new InMemoryKeyManager(certificate, privateKey)}, trustManager, new SecureRandom()); + return sslContext; } catch (NoSuchAlgorithmException e) { throw propagate(e); - } catch (UnrecoverableKeyException e) { + } catch (KeyManagementException e) { throw propagate(e); - } catch (KeyStoreException e) { + } catch (CertificateException e) { throw propagate(e); - } catch (KeyManagementException e) { + } catch (IOException e) { throw propagate(e); } } + + private static X509Certificate getCertificate(String certificate) { + try { + return (X509Certificate) CertificateFactory.getInstance("X.509").generateCertificate( + new ByteArrayInputStream(certificate.getBytes(Charsets.UTF_8))); + } catch (CertificateException ex) { + throw new RuntimeException("Invalid certificate", ex); + } + } + + private static PrivateKey getKey(String privateKey) { + + try { + PEMParser pemParser = new PEMParser(new StringReader(privateKey)); + Object object = pemParser.readObject(); + if (Security.getProvider("BC") == null) { + Security.addProvider(new BouncyCastleProvider()); + } + JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC"); + KeyPair keyPair = converter.getKeyPair((PEMKeyPair) object); + return keyPair.getPrivate(); + } catch (IOException ex) { + throw new RuntimeException("Invalid private key", ex); + } + } + + private static String loadFile(final String filePath) throws IOException { + return Files.toString(new File(filePath), Charsets.UTF_8); + } + + private static class InMemoryKeyManager extends X509ExtendedKeyManager { + private static final String DEFAULT_ALIAS = "docker"; + + private final X509Certificate certificate; + + private final PrivateKey privateKey; + + public InMemoryKeyManager(final X509Certificate certificate, final PrivateKey privateKey) + throws IOException, CertificateException { + this.certificate = certificate; + this.privateKey = privateKey; + } + + @Override + public String chooseClientAlias(final String[] keyType, final Principal[] issuers, + final Socket socket) { + return DEFAULT_ALIAS; + } + + @Override + public String chooseServerAlias(final String keyType, final Principal[] issuers, + final Socket socket) { + return DEFAULT_ALIAS; + } + + @Override + public X509Certificate[] getCertificateChain(final String alias) { + return new X509Certificate[]{certificate}; + } + + @Override + public String[] getClientAliases(final String keyType, final Principal[] issuers) { + return new String[]{DEFAULT_ALIAS}; + } + + @Override + public PrivateKey getPrivateKey(final String alias) { + return privateKey; + } + + @Override + public String[] getServerAliases(final String keyType, final Principal[] issuers) { + return new String[]{DEFAULT_ALIAS}; + } + } + } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/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 9aca266..447c9e4 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java @@ -29,7 +29,6 @@ import org.jboss.shrinkwrap.api.GenericArchive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.ClassLoaderAsset; import org.jboss.shrinkwrap.api.exporter.TarExporter; -import org.jclouds.Constants; import org.jclouds.apis.BaseApiLiveTest; import org.jclouds.compute.config.ComputeServiceProperties; import org.jclouds.docker.DockerApi; @@ -57,8 +56,7 @@ public class BaseDockerApiLiveTest extends BaseApiLiveTest<DockerApi> { @Override protected Properties setupProperties() { Properties overrides = super.setupProperties(); - overrides.setProperty(Constants.PROPERTY_MAX_RETRIES, "15"); - overrides.setProperty("jclouds.ssh.retry-auth", "true"); + overrides.setProperty("jclouds.trust-all-certs", "false"); overrides.setProperty(ComputeServiceProperties.IMAGE_LOGIN_USER, "root:password"); return overrides; } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/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 c3da551..9aae9bf 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java @@ -116,10 +116,4 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { return ImmutableSet.<Module>of(getLoggingModule(), new SshjSshClientModule()); } - @Override - protected Properties setupProperties() { - Properties properties = super.setupProperties(); - properties.setProperty("jclouds.ssh.max-retries", "10"); - return properties; - } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java index 94ee205..850863c 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java @@ -34,6 +34,7 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.OperatingSystem; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.functions.GroupNamingConvention; +import org.jclouds.date.internal.SimpleDateFormatDateService; import org.jclouds.docker.domain.Config; import org.jclouds.docker.domain.Container; import org.jclouds.docker.domain.HostConfig; @@ -97,12 +98,13 @@ public class ContainerToNodeMetadataTest { 0, // exitCode "2014-03-24T20:28:37.537659054Z", // startedAt "0001-01-01T00:00:00Z", // finishedAt - false // ghost + false, // paused + false // restarting ); container = Container.builder() .id("6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9") .name("/hopeful_mclean") - .created("2014-03-22T07:16:45.784120972Z") + .created(new SimpleDateFormatDateService().iso8601DateParse("2014-03-22T07:16:45.784120972Z")) .path("/usr/sbin/sshd") .args(Arrays.asList("-D")) .config(containerConfig) http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java index 76d82ee..db02e3d 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java @@ -21,8 +21,11 @@ import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.testng.Assert.assertEquals; +import java.util.Date; + import org.easymock.EasyMock; import org.jclouds.compute.domain.Image; +import org.jclouds.docker.domain.Config; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -41,16 +44,24 @@ public class ImageToImageTest { @BeforeMethod public void setup() { image = org.jclouds.docker.domain.Image.create( - "id", // id - "parent", // parent - "created", // created - null, // container - null, // dockerVersion - "x86_64", // architecture - null, // os - 0l, // size - 0l, // virtualSize - ImmutableList.of("repoTag1:version") // repoTags + "id", // id + "author", + "comment", + Config.builder() + .image("imageId") + .build(), + Config.builder() + .image("imageId") + .build(), + "parent", // parent + new Date(), // created + "containerId", // container + "1.3.1", // dockerVersion + "x86_64", // architecture + "os", // os + 0l, // size + 0l, // virtualSize + ImmutableList.of("repoTag1:version") // repoTags ); function = new ImageToImage(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/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 44edc57..684f5de 100644 --- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java +++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiLiveTest.java @@ -16,8 +16,11 @@ */ package org.jclouds.docker.features; +import static org.assertj.core.api.Assertions.assertThat; +import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import java.io.IOException; @@ -29,8 +32,11 @@ import org.jclouds.docker.domain.Config; import org.jclouds.docker.domain.Container; import org.jclouds.docker.domain.ContainerSummary; import org.jclouds.docker.domain.Image; +import org.jclouds.docker.domain.Resource; +import org.jclouds.docker.options.AttachOptions; import org.jclouds.docker.options.CreateImageOptions; import org.jclouds.docker.options.ListContainerOptions; +import org.jclouds.docker.options.RemoveContainerOptions; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -57,6 +63,11 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest { @AfterClass protected void tearDown() { + if (container != null) { + if (api.getContainerApi().inspectContainer(container.id()) != null) { + api.getContainerApi().removeContainer(container.id(), RemoveContainerOptions.Builder.force(true)); + } + } if (image != null) { api.getImageApi().deleteImage(BUSYBOX_IMAGE_TAG); } @@ -64,7 +75,7 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest { public void testCreateContainer() throws IOException, InterruptedException { Config containerConfig = Config.builder().image(image.id()) - .cmd(ImmutableList.of("/bin/sh", "-c", "while true; do echo hello world; sleep 1; done")) + .cmd(ImmutableList.of("/bin/sh", "-c", "touch hello; while true; do echo hello world; sleep 1; done")) .build(); container = api().createContainer("testCreateContainer", containerConfig); assertNotNull(container); @@ -78,11 +89,54 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest { } @Test(dependsOnMethods = "testStartContainer") + public void testAttachContainer() { + InputStream attachStream = api().attach(container.id(), AttachOptions.Builder.logs(true).stream(false).stdout(true)); + String stream = consumeStream(attachStream); + assertThat(stream.trim()).contains("hello world"); + } + + @Test(dependsOnMethods = "testAttachContainer") + public void testCopyFileFromContainer() { + InputStream tarredStream = api().copy(container.id(), Resource.create("hello")); + assertNotNull(consumeStream(tarredStream)); + } + + @Test(dependsOnMethods = "testCopyFileFromContainer") + public void testPauseContainer() { + api().pause(container.id()); + assertTrue(api().inspectContainer(container.id()).state().paused()); + } + + @Test(dependsOnMethods = "testPauseContainer") + public void testUnpauseContainer() { + api().unpause(container.id()); + assertFalse(api().inspectContainer(container.id()).state().paused()); + } + + @Test(dependsOnMethods = "testUnpauseContainer") public void testStopContainer() { api().stopContainer(container.id()); assertFalse(api().inspectContainer(container.id()).state().running()); } + @Test(dependsOnMethods = "testStopContainer") + public void testRestartContainer() { + api().restart(container.id()); + assertTrue(api().inspectContainer(container.id()).state().running()); + } + + @Test(dependsOnMethods = "testRestartContainer") + public void testWaitContainer() { + api().stopContainer(container.id(), 1); + assertEquals(api().wait(container.id()).statusCode(), -1); + } + + @Test(dependsOnMethods = "testWaitContainer") + public void testRemoveContainer() { + api().removeContainer(container.id()); + assertNull(api().inspectContainer(container.id())); + } + @Test public void testListContainers() { List<ContainerSummary> containerSummaries = api().listContainers(ListContainerOptions.Builder.all(true)); @@ -93,12 +147,6 @@ public class ContainerApiLiveTest extends BaseDockerApiLiveTest { } } - @Test(dependsOnMethods = "testStopContainer", expectedExceptions = NullPointerException.class) - public void testRemoveContainer() { - api().removeContainer(container.id()); - assertFalse(api().inspectContainer(container.id()).state().running()); - } - private ContainerApi api() { return api.getContainerApi(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java index 4bbff66..ab3657b 100644 --- a/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java +++ b/docker/src/test/java/org/jclouds/docker/features/ContainerApiMockTest.java @@ -16,23 +16,22 @@ */ package org.jclouds.docker.features; +import static org.assertj.core.api.Assertions.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; -import java.util.List; import org.jclouds.docker.DockerApi; +import org.jclouds.docker.config.DockerParserModule; import org.jclouds.docker.domain.Config; import org.jclouds.docker.domain.Container; -import org.jclouds.docker.domain.ContainerSummary; +import org.jclouds.docker.domain.Resource; import org.jclouds.docker.internal.BaseDockerMockTest; import org.jclouds.docker.options.ListContainerOptions; -import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.docker.parse.ContainerParseTest; +import org.jclouds.docker.parse.ContainersParseTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMultimap; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; @@ -43,96 +42,56 @@ import com.squareup.okhttp.mockwebserver.MockWebServer; public class ContainerApiMockTest extends BaseDockerMockTest { public void testListContainers() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/containers.json"))); - - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); - + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/containers.json"))); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - List<ContainerSummary> containerSummaries = api.listContainers(); - assertRequestHasCommonFields(server.takeRequest(), "/containers/json"); - assertEquals(containerSummaries.size(), 1); + assertEquals(api.listContainers(), new ContainersParseTest().expected()); + assertSent(server, "GET", "/containers/json"); } finally { - dockerApi.close(); server.shutdown(); } } public void testListNonexistentContainers() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(404)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - List<ContainerSummary> containerSummaries = api.listContainers(); - assertRequestHasCommonFields(server.takeRequest(), "/containers/json"); - assertTrue(containerSummaries.isEmpty()); + assertEquals(api.listContainers(), ImmutableList.of()); + assertSent(server, "GET", "/containers/json"); } finally { - dockerApi.close(); server.shutdown(); } } - @Test(timeOut = 10000l) public void testListAllContainers() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/containers.json"))); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/containers.json"))); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - List<ContainerSummary> containerSummaries = api.listContainers(ListContainerOptions.Builder.all(true)); - assertRequestHasParameters(server.takeRequest(), "/containers/json", ImmutableMultimap.of("all", "true")); - assertEquals(containerSummaries.size(), 1); + assertEquals(api.listContainers(ListContainerOptions.Builder.all(true)), new ContainersParseTest().expected()); + assertSent(server, "GET", "/containers/json?all=true"); } finally { - dockerApi.close(); server.shutdown(); } } public void testGetContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/container.json"))); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/container.json"))); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString(), new DockerParserModule()).getContainerApi(); String containerId = "b03d4cd15b76f8876110615cdeed15eadf77c9beb408d62f1687dcc69192cd6d"; try { - Container container = api.inspectContainer(containerId); - assertRequestHasCommonFields(server.takeRequest(), "/containers/" + containerId + "/json"); - assertNotNull(container); - assertNotNull(container.id(), containerId); - assertNotNull(container.config()); - assertNotNull(container.hostConfig()); - assertTrue(container.name().contains("/weave")); - assertEquals(container.state().running(), true); + assertEquals(api.inspectContainer(containerId), new ContainerParseTest().expected()); + assertSent(server, "GET", "/containers/" + containerId + "/json"); } finally { - dockerApi.close(); - server.shutdown(); - } - } - - public void testGetNonExistingContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); - String containerId = "notExisting"; - try { - Container container = api.inspectContainer(containerId); - assertRequestHasCommonFields(server.takeRequest(), "/containers/" + containerId + "/json"); - } finally { - dockerApi.close(); server.shutdown(); } } public void testCreateContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/container-creation.json"))); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); - Config containerConfig = Config.builder().cmd(ImmutableList.of("date")) + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/container-creation.json"))); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + Config containerConfig = Config.builder() + .cmd(ImmutableList.of("date")) .attachStdin(false) .attachStderr(true) .attachStdout(true) @@ -141,106 +100,135 @@ public class ContainerApiMockTest extends BaseDockerMockTest { .build(); try { Container container = api.createContainer("test", containerConfig); - assertRequestHasCommonFields(server.takeRequest(), "POST", "/containers/create?name=test"); + assertSent(server, "POST", "/containers/create?name=test"); assertNotNull(container); - assertEquals(container.id(), "c6c74153ae4b1d1633d68890a68d89c40aa5e284a1ea016cbc6ef0e634ee37b2"); + assertThat(container.id()).isEqualTo("c6c74153ae4b1d1633d68890a68d89c40aa5e284a1ea016cbc6ef0e634ee37b2"); } finally { - dockerApi.close(); server.shutdown(); } } public void testRemoveContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); String containerId = "6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9"; try { api.removeContainer(containerId); - assertRequestHasCommonFields(server.takeRequest(), "DELETE", "/containers/" + containerId); + assertSent(server, "DELETE", "/containers/" + containerId); + } finally { - dockerApi.close(); server.shutdown(); } } - public void testRemoveNonExistingContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); - String containerId = "nonExisting"; + public void testStartContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - api.removeContainer(containerId); - fail("Remove container must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception + api.startContainer("1"); + assertSent(server, "POST", "/containers/1/start"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testStartContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(200)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + public void testStopContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - api.startContainer("1"); - assertRequestHasCommonFields(server.takeRequest(), "POST", "/containers/1/start"); + api.stopContainer("1"); + assertSent(server, "POST", "/containers/1/stop"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testStartNonExistingContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + + public void testCommitContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(201)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - try { - api.startContainer("1"); - fail("Start container must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception - } + api.commit(); + assertSent(server, "POST", "/commit"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testStopContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(200)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + public void testPauseContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - api.stopContainer("1"); - assertRequestHasCommonFields(server.takeRequest(), "POST", "/containers/1/stop"); + api.pause("1"); + assertSent(server, "POST", "/containers/1/pause"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testStopNonExistingContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ContainerApi api = dockerApi.getContainerApi(); + public void testUnpauseContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); try { - api.stopContainer("1"); - fail("Stop container must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception + api.unpause("1"); + assertSent(server, "POST", "/containers/1/unpause"); + } finally { + server.shutdown(); + } + } + + public void testAttachContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + try { + api.attach("1"); + assertSent(server, "POST", "/containers/1/attach"); + } finally { + server.shutdown(); + } + } + + public void testWaitContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + try { + api.wait("1"); + assertSent(server, "POST", "/containers/1/wait"); + } finally { + server.shutdown(); + } + } + + public void testRestartContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + try { + api.restart("1"); + assertSent(server, "POST", "/containers/1/restart"); + } finally { + server.shutdown(); + } + } + + public void testKillContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + try { + api.kill("1"); + assertSent(server, "POST", "/containers/1/kill"); + } finally { + server.shutdown(); + } + } + + public void testCopyFileFromContainer() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ContainerApi api = api(DockerApi.class, server.getUrl("/").toString()).getContainerApi(); + try { + api.copy("1", Resource.create("test")); + assertSent(server, "POST", "/containers/1/copy"); } finally { - dockerApi.close(); server.shutdown(); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java index 7ad6414..5349c39 100644 --- a/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java +++ b/docker/src/test/java/org/jclouds/docker/features/ImageApiMockTest.java @@ -16,15 +16,16 @@ */ package org.jclouds.docker.features; -import static org.testng.Assert.fail; +import static org.testng.Assert.assertEquals; import org.jclouds.docker.DockerApi; +import org.jclouds.docker.config.DockerParserModule; import org.jclouds.docker.internal.BaseDockerMockTest; import org.jclouds.docker.options.CreateImageOptions; -import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.docker.parse.ImageParseTest; +import org.jclouds.docker.parse.ImagesParseTest; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableMultimap; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; @@ -35,61 +36,47 @@ import com.squareup.okhttp.mockwebserver.MockWebServer; public class ImageApiMockTest extends BaseDockerMockTest { public void testCreateImage() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(200)); - DockerApi dockerApi = api(server.getUrl("/")); - ImageApi api = dockerApi.getImageApi(); + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + ImageApi api = api(DockerApi.class, server.getUrl("/").toString()).getImageApi(); try { api.createImage(CreateImageOptions.Builder.fromImage("base")); - assertRequestHasParameters(server.takeRequest(), "POST", "/images/create", ImmutableMultimap.of("fromImage", "base")); + assertSent(server, "POST", "/images/create?fromImage=base"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testCreateImageFailure() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ImageApi api = dockerApi.getImageApi(); + public void testGetImage() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/image.json"))); + ImageApi api = api(DockerApi.class, server.getUrl("/").toString(), new DockerParserModule()).getImageApi(); try { - api.createImage(CreateImageOptions.Builder.fromImage("base")); - fail("Create image must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception + String imageId = "cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456"; + assertEquals(api.inspectImage(imageId), new ImageParseTest().expected()); + assertSent(server, "GET", "/images/" + imageId + "/json"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testDeleteImage() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(204)); - DockerApi dockerApi = api(server.getUrl("/")); - ImageApi api = dockerApi.getImageApi(); + public void testListImages() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/images.json"))); + ImageApi api = api(DockerApi.class, server.getUrl("/").toString()).getImageApi(); try { - api.deleteImage("1"); - assertRequestHasCommonFields(server.takeRequest(), "DELETE", "/images/1"); + assertEquals(api.listImages(), new ImagesParseTest().expected()); + assertSent(server, "GET", "/images/json"); } finally { - dockerApi.close(); server.shutdown(); } } - public void testDeleteNotExistingImage() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - ImageApi api = dockerApi.getImageApi(); + public void testDeleteImage() throws Exception { + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(204)); + ImageApi api = api(DockerApi.class, server.getUrl("/").toString()).getImageApi(); try { api.deleteImage("1"); - fail("Delete image must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception + assertSent(server, "DELETE", "/images/1"); + } finally { - dockerApi.close(); server.shutdown(); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/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 b14a108..bfe1b40 100644 --- a/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java +++ b/docker/src/test/java/org/jclouds/docker/features/MiscApiLiveTest.java @@ -18,7 +18,6 @@ package org.jclouds.docker.features; import org.jclouds.docker.compute.BaseDockerApiLiveTest; import org.jclouds.docker.options.BuildOptions; -import org.testng.annotations.AfterClass; import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; @@ -34,10 +33,10 @@ import com.google.common.collect.Iterables; public class MiscApiLiveTest extends BaseDockerApiLiveTest { private static final String API_VERSION = "1.15"; - private static final String VERSION = "1.3.0"; - private static final String GIT_COMMIT = "c78088f"; + private static final String VERSION = "1.3.2"; + private static final String GIT_COMMIT = "39fa2fa"; private static final String GO_VERSION = "go1.3.3"; - private static final String KERNEL_VERSION = "3.16.4-tinycore64"; + private static final String KERNEL_VERSION = "3.16.7-tinycore64"; private static final String ARCH = "amd64"; private static final String OS = "linux"; @@ -71,13 +70,6 @@ public class MiscApiLiveTest extends BaseDockerApiLiveTest { assertNotNull(imageId); } - @AfterClass - protected void tearDown() { - if (imageId != null) { - consumeStream(api.getImageApi().deleteImage(imageId)); - } - } - private MiscApi api() { return api.getMiscApi(); } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/features/MiscApiMockTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/features/MiscApiMockTest.java b/docker/src/test/java/org/jclouds/docker/features/MiscApiMockTest.java index e7b1e5b..630d7af 100644 --- a/docker/src/test/java/org/jclouds/docker/features/MiscApiMockTest.java +++ b/docker/src/test/java/org/jclouds/docker/features/MiscApiMockTest.java @@ -19,19 +19,15 @@ package org.jclouds.docker.features; import com.squareup.okhttp.mockwebserver.MockResponse; import com.squareup.okhttp.mockwebserver.MockWebServer; import org.jclouds.docker.DockerApi; -import org.jclouds.docker.domain.Info; -import org.jclouds.docker.domain.Version; import org.jclouds.docker.internal.BaseDockerMockTest; -import org.jclouds.docker.options.BuildOptions; +import org.jclouds.docker.parse.InfoParseTest; +import org.jclouds.docker.parse.VersionParseTest; import org.jclouds.io.Payload; import org.jclouds.io.Payloads; -import org.jclouds.rest.ResourceNotFoundException; import org.testng.annotations.Test; import static org.jclouds.docker.compute.BaseDockerApiLiveTest.tarredDockerfile; import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.fail; import java.io.File; import java.io.FileInputStream; @@ -41,117 +37,50 @@ import java.io.FileInputStream; @Test(groups = "unit", testName = "MiscApiMockTest") public class MiscApiMockTest extends BaseDockerMockTest { - private static final String API_VERSION = "1.15"; - private static final String VERSION = "1.3.0"; - private static final String GIT_COMMIT = "c78088f"; - private static final String GO_VERSION = "go1.3.3"; - private static final String KERNEL_VERSION = "3.16.4-tinycore64"; - private static final String ARCH = "amd64"; - private static final String OS = "linux"; - public void testGetVersion() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/version.json"))); - DockerApi dockerApi = api(server.getUrl("/")); - MiscApi api = dockerApi.getMiscApi(); + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/version.json"))); + MiscApi api = api(DockerApi.class, server.getUrl("/").toString()).getMiscApi(); try { - Version version = api.getVersion(); - assertRequestHasCommonFields(server.takeRequest(), "/version"); - assertNotNull(version); - assertEquals(version.version(), VERSION); - assertEquals(version.gitCommit(), GIT_COMMIT); - assertEquals(version.apiVersion(), API_VERSION); - assertEquals(version.goVersion(), GO_VERSION); - assertEquals(version.kernelVersion(), KERNEL_VERSION); - assertEquals(version.arch(), ARCH); - assertEquals(version.os(), OS); + assertEquals(api.getVersion(), new VersionParseTest().expected()); + assertSent(server, "GET", "/version"); } finally { - dockerApi.close(); server.shutdown(); } } public void testGetInfo() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setBody(payloadFromResource("/info.json"))); - DockerApi dockerApi = api(server.getUrl("/")); - MiscApi api = dockerApi.getMiscApi(); - + MockWebServer server = mockWebServer(new MockResponse().setBody(payloadFromResource("/info.json"))); + MiscApi api = api(DockerApi.class, server.getUrl("/").toString()).getMiscApi(); try { - Info info = api.getInfo(); - assertRequestHasCommonFields(server.takeRequest(), "/info"); - assertNotNull(info); - assertNotNull(info.containers()); - assertNotNull(info.debug()); - assertNotNull(info.driver()); - assertNotNull(info.executionDriver()); - assertNotNull(info.images()); - assertNotNull(info.indexServerAddress()); - assertNotNull(info.initPath()); - assertNotNull(info.iPv4Forwarding()); - assertNotNull(info.kernelVersion()); - assertNotNull(info.memoryLimit()); - assertNotNull(info.nEventsListener()); - assertNotNull(info.nFd()); - assertNotNull(info.nGoroutines()); - assertNotNull(info.swapLimit()); + assertEquals(api.getInfo(), new InfoParseTest().expected()); + assertSent(server, "GET", "/info"); } finally { - dockerApi.close(); server.shutdown(); } } public void testBuildContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(200)); - DockerApi dockerApi = api(server.getUrl("/")); - MiscApi api = dockerApi.getMiscApi(); - File dockerFile = File.createTempFile("docker", "tmp"); + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + MiscApi api = api(DockerApi.class, server.getUrl("/").toString()).getMiscApi(); try { - api.build(tarredDockerfile(), BuildOptions.NONE); - assertRequestHasCommonFields(server.takeRequest(), "POST", "/build"); + api.build(tarredDockerfile()); + assertSent(server, "POST", "/build"); } finally { - dockerFile.delete(); - dockerApi.close(); server.shutdown(); } } public void testBuildContainerUsingPayload() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(200)); - DockerApi dockerApi = api(server.getUrl("/")); - MiscApi api = dockerApi.getMiscApi(); + MockWebServer server = mockWebServer(new MockResponse().setResponseCode(200)); + MiscApi api = api(DockerApi.class, server.getUrl("/").toString()).getMiscApi(); File file = File.createTempFile("docker", "tmp"); FileInputStream data = new FileInputStream(file); Payload payload = Payloads.newInputStreamPayload(data); payload.getContentMetadata().setContentLength(file.length()); - - try { - api.build(payload, BuildOptions.NONE); - assertRequestHasCommonFields(server.takeRequest(), "POST", "/build"); - } finally { - dockerApi.close(); - server.shutdown(); - } - } - - public void testBuildNonexistentContainer() throws Exception { - MockWebServer server = mockWebServer(); - server.enqueue(new MockResponse().setResponseCode(404)); - DockerApi dockerApi = api(server.getUrl("/")); - MiscApi api = dockerApi.getMiscApi(); - File dockerFile = File.createTempFile("docker", "tmp"); try { - try { - api.build(tarredDockerfile(), BuildOptions.NONE); - fail("Build container must fail on 404"); - } catch (ResourceNotFoundException ex) { - // Expected exception - } + api.build(payload); + assertSent(server, "POST", "/build"); } finally { - dockerFile.delete(); - dockerApi.close(); server.shutdown(); } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java index efdc9b5..994519e 100644 --- a/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java +++ b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerMockTest.java @@ -16,27 +16,19 @@ */ package org.jclouds.docker.internal; -import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor; -import static org.jclouds.http.utils.Queries.encodeQueryLine; +import static org.assertj.core.api.Assertions.assertThat; import static org.jclouds.util.Strings2.toStringAndClose; -import static org.testng.Assert.assertEquals; import java.io.IOException; -import java.net.URL; import java.util.Properties; -import java.util.Set; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; -import org.jclouds.ContextBuilder; -import org.jclouds.concurrent.config.ExecutorServiceModule; -import org.jclouds.docker.DockerApi; +import org.jclouds.http.BaseMockWebServerTest; +import org.jclouds.http.okhttp.config.OkHttpCommandExecutorServiceModule; import com.google.common.base.Charsets; import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; import com.google.inject.Module; import com.squareup.okhttp.mockwebserver.MockWebServer; import com.squareup.okhttp.mockwebserver.RecordedRequest; @@ -44,33 +36,18 @@ import com.squareup.okhttp.mockwebserver.RecordedRequest; /** * Base class for all Docker mock tests. */ -public class BaseDockerMockTest { - private final Set<Module> modules = ImmutableSet.<Module> of(new ExecutorServiceModule(sameThreadExecutor(), - sameThreadExecutor())); +public class BaseDockerMockTest extends BaseMockWebServerTest { - protected String provider; + protected static final String API_VERSION = "1.15"; - public BaseDockerMockTest() { - provider = "docker"; + @Override + protected void addOverrideProperties(Properties properties) { + properties.setProperty("jclouds.api-version", API_VERSION); } - public DockerApi api(URL url) { - return ContextBuilder.newBuilder(provider) - .credentials("clientid", "apikey") - .endpoint(url.toString()) - .modules(modules) - .overrides(setupProperties()) - .buildApi(DockerApi.class); - } - - protected Properties setupProperties() { - return new Properties(); - } - - public static MockWebServer mockWebServer() throws IOException { - MockWebServer server = new MockWebServer(); - server.play(); - return server; + @Override + protected Module createConnectionModule() { + return new OkHttpCommandExecutorServiceModule(); } public byte[] payloadFromResource(String resource) { @@ -81,38 +58,12 @@ public class BaseDockerMockTest { } } - protected static void assertRequestHasCommonFields(final RecordedRequest request, final String path) - throws InterruptedException { - assertRequestHasParameters(request, "GET", path, ImmutableMultimap.<String, String> of()); - } - - protected static void assertRequestHasCommonFields(final RecordedRequest request, - final String verb, final String path) - throws InterruptedException { - assertRequestHasParameters(request, verb, path, ImmutableMultimap.<String, String> of()); - } - - protected static void assertRequestHasParameters(final RecordedRequest request, final String path, - Multimap<String, String> parameters) throws InterruptedException { - assertRequestHasParameters(request, "GET", path, parameters); - } - - protected static void assertRequestHasParameters(final RecordedRequest request, String verb, final String path, - Multimap<String, String> parameters) throws InterruptedException { - String queryParameters = ""; - if (!parameters.isEmpty()) { - Multimap<String, String> allparams = ImmutableMultimap.<String, String>builder() - .putAll(parameters) - .build(); - - assertRequestHasAcceptHeader(request); - queryParameters = "?" + encodeQueryLine(allparams); - } - assertEquals(request.getRequestLine(), verb + " " + path + queryParameters + " HTTP/1.1"); - } - - protected static void assertRequestHasAcceptHeader(final RecordedRequest request) throws InterruptedException { - assertEquals(request.getHeader(HttpHeaders.ACCEPT), MediaType.APPLICATION_JSON); + protected RecordedRequest assertSent(MockWebServer server, String method, String path) throws InterruptedException { + RecordedRequest request = server.takeRequest(); + assertThat(request.getMethod()).isEqualTo(method); + assertThat(request.getPath()).isEqualTo("/v" + API_VERSION + path); + assertThat(request.getHeader(HttpHeaders.ACCEPT)).isEqualTo(MediaType.APPLICATION_JSON); + return request; } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/internal/BaseDockerParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/internal/BaseDockerParseTest.java b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerParseTest.java new file mode 100644 index 0000000..5227ff8 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/internal/BaseDockerParseTest.java @@ -0,0 +1,33 @@ +/* + * 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 org.jclouds.docker.config.DockerParserModule; +import org.jclouds.json.BaseItemParserTest; +import org.jclouds.json.config.GsonModule; + +import com.google.inject.Guice; +import com.google.inject.Injector; + +public abstract class BaseDockerParseTest<T> extends BaseItemParserTest<T> { + + @Override + protected Injector injector() { + return Guice.createInjector(new GsonModule(), new DockerParserModule()); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java new file mode 100644 index 0000000..dc5c791 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/ContainerParseTest.java @@ -0,0 +1,95 @@ +/* + * 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.parse; + +import java.util.List; +import java.util.Map; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.docker.domain.Config; +import org.jclouds.docker.domain.Container; +import org.jclouds.docker.domain.HostConfig; +import org.jclouds.docker.domain.NetworkSettings; +import org.jclouds.docker.domain.State; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +@Test(groups = "unit") +public class ContainerParseTest extends BaseDockerParseTest<Container> { + + @Override + public String resource() { + return "/container.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public Container expected() { + return Container.builder() + .id("6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524") + .created(new SimpleDateFormatDateService().iso8601DateParse("2014-10-31T17:00:21.544197943Z")) + .path("/home/weave/weaver") + .name("/weave") + .args(ImmutableList.of("-iface", "ethwe", "-wait", "5", "-name", "7a:63:a2:39:7b:0f")) + .config(Config.builder() + .hostname("6c9932f478bd") + .env(ImmutableList.of("PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin")) + .image("57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587") + .domainname("") + .user("") + .cmd(ImmutableList.of("-name", "7a:63:a2:39:7b:0f")) + .entrypoint(ImmutableList.of("/home/weave/weaver", "-iface", "ethwe", "-wait", "5")) + .image("zettio/weave") + .workingDir("/home/weave") + .exposedPorts(ImmutableMap.of("6783/tcp", ImmutableMap.of(), "6783/udp", ImmutableMap.of())) + .build()) + .state(State.create(3939, true, 0, "2014-10-31T17:00:21.802008706Z", "0001-01-01T00:00:00Z", false, false)) + .image("57e570db16baba1e8c0d6f3c15868ddb400f64ff76ec948e65c3ca3f15fb3587") + .networkSettings(NetworkSettings.builder() + .ipAddress("172.17.0.7") + .ipPrefixLen(16) + .gateway("172.17.42.1") + .bridge("docker0") + .ports(ImmutableMap.<String, List<Map<String, String>>>of( + "6783/tcp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783")), + "6783/udp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", "6783"))) + ) + .build()) + .resolvConfPath("/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/resolv.conf") + .hostConfig(HostConfig.builder() + .containerIDFile("") + .portBindings(ImmutableMap.<String, List<Map<String, String>>>of( + "6783/tcp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "", "HostPort", "6783")), + "6783/udp", ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "", "HostPort", "6783"))) + ) + .privileged(true) + .build()) + .driver("aufs") + .execDriver("native-0.2") + .hostnamePath("/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hostname") + .hostsPath("/var/lib/docker/containers/6c9932f478bd761f32ddb54ed28ab42ab6fac6f2a279f561ea31503ee9d39524/hosts") + .mountLabel("") + .processLabel("") + .build(); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/ContainersParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/ContainersParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ContainersParseTest.java new file mode 100644 index 0000000..bb3bd62 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/ContainersParseTest.java @@ -0,0 +1,53 @@ +/* + * 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.parse; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.docker.domain.ContainerSummary; +import org.jclouds.docker.domain.Port; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; + +@Test(groups = "unit") +public class ContainersParseTest extends BaseDockerParseTest<List<ContainerSummary>> { + + @Override + public String resource() { + return "/containers.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public List<ContainerSummary> expected() { + return ImmutableList.of( + ContainerSummary.create("6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9", + ImmutableList.of("/hopeful_mclean"), + "1395472605", + "jclouds/ubuntu:latest", + "/usr/sbin/sshd -D", + ImmutableList.of(Port.create("0.0.0.0", 22, 49231, "tcp")), + "Up 55 seconds") + ); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/ImageParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/ImageParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ImageParseTest.java new file mode 100644 index 0000000..038be86 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/ImageParseTest.java @@ -0,0 +1,83 @@ +/* + * 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.parse; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.date.internal.SimpleDateFormatDateService; +import org.jclouds.docker.domain.Config; +import org.jclouds.docker.domain.Image; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +import com.beust.jcommander.internal.Maps; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +@Test(groups = "unit") +public class ImageParseTest extends BaseDockerParseTest<Image> { + + @Override + public String resource() { + return "/image.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public Image expected() { + return Image.create("cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456", + "author", + "comment", + Config.builder().cmd(ImmutableList.of("/bin/sh", "-c", "echo hello world")) + .env(ImmutableList.of( + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOME=/root", + "JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64" + ) + ) + .exposedPorts(ImmutableMap.of("8081/tcp", Maps.newHashMap())) + .hostname("f22711318734") + .domainname("") + .user("user") + .image("05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba") + .workingDir("/home/user") + .build(), + Config.builder().cmd(ImmutableList.of("/bin/sh", "-c", "echo hello world")) + .env(ImmutableList.of( + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOME=/root", + "JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64") + ) + .exposedPorts(ImmutableMap.of("8081/tcp", Maps.newHashMap())) + .hostname("f22711318734") + .domainname("") + .user("user") + .image("05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba") + .workingDir("/home/user") + .build(), + "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + new SimpleDateFormatDateService().iso8601DateParse("2014-11-24T11:09:20.310023104Z"), + "0d14967353dbbd2ee78abe209f026f71654da49692fa2b044296ec3c810027b3", + "1.3.1", + "amd64", + "linux", + 0, + 808709069, + null); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java new file mode 100644 index 0000000..d2ef5b6 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/ImagesParseTest.java @@ -0,0 +1,69 @@ +/* + * 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.parse; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.docker.domain.ImageSummary; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; + +@Test(groups = "unit") +public class ImagesParseTest extends BaseDockerParseTest<List<ImageSummary>> { + + @Override + public String resource() { + return "/images.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public List<ImageSummary> expected() { + return ImmutableList.of( + ImageSummary.create("cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456", + 1416827360, + "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + 0, + 808709069, + ImmutableList.of("test:latest")), + ImageSummary.create("e1e548b03259ae30ba12232b6c16ef5205cf71b0363848e78b0394e1ecba4f57", + 1416826851, + "6f36bec79c7f184ceebf7000cfb7244c4bc9b397b6659ac7f420a53d114250d9", + 0, + 5609404, + ImmutableList.of("<none>:<none>")), + ImageSummary.create("8201388d2b288539aab6aabf5d3b15ec269eba95c6baa9d6771f16540abf3a3f", + 1414247273, + "4671e2c549c5b60063e349f520c801dc73b53d2226a5a8e5501845ebe94761ca", + 0, + 755313702, + ImmutableList.of("dockerfile/java:openjdk-7-jdk")), + ImageSummary.create("5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", + 1414108439, + "22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723", + 0, + 199257566, + ImmutableList.of("ubuntu:14.04")) + ); + } + +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/InfoParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/InfoParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/InfoParseTest.java new file mode 100644 index 0000000..5527e28 --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/InfoParseTest.java @@ -0,0 +1,62 @@ +/* + * 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.parse; + +import java.util.List; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.docker.domain.Info; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; + +@Test(groups = "unit") +public class InfoParseTest extends BaseDockerParseTest<Info> { + + @Override + public String resource() { + return "/info.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public Info expected() { + return Info.create(0, + 1, + "aufs", + ImmutableList.<List<String>>of( + ImmutableList.of("Root Dir", "/mnt/sda1/var/lib/docker/aufs"), + ImmutableList.of("Dirs", "15") + ), + "native-0.2", + 1, + 15, + "https://index.docker.io/v1/", + "/usr/local/bin/docker", + "", + "3.16.4-tinycore64", + 1, + 0, + 10, + 11, + "Boot2Docker 1.3.0 (TCL 5.4); master : a083df4 - Thu Oct 16 17:05:03 UTC 2014", + 1); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/java/org/jclouds/docker/parse/VersionParseTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/parse/VersionParseTest.java b/docker/src/test/java/org/jclouds/docker/parse/VersionParseTest.java new file mode 100644 index 0000000..2d9781b --- /dev/null +++ b/docker/src/test/java/org/jclouds/docker/parse/VersionParseTest.java @@ -0,0 +1,46 @@ +/* + * 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.parse; + +import javax.ws.rs.Consumes; +import javax.ws.rs.core.MediaType; + +import org.jclouds.docker.domain.Version; +import org.jclouds.docker.internal.BaseDockerParseTest; +import org.testng.annotations.Test; + +@Test(groups = "unit") +public class VersionParseTest extends BaseDockerParseTest<Version> { + + @Override + public String resource() { + return "/version.json"; + } + + @Override + @Consumes(MediaType.APPLICATION_JSON) + public Version expected() { + return Version.create( + "1.15", + "amd64", + "c78088f", + "go1.3.3", + "3.16.4-tinycore64", + "linux", + "1.3.0"); + } +} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/resources/cert.pem ---------------------------------------------------------------------- diff --git a/docker/src/test/resources/cert.pem b/docker/src/test/resources/cert.pem new file mode 100644 index 0000000..ab2c41a --- /dev/null +++ b/docker/src/test/resources/cert.pem @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIJAL/TuOknjSR5MA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQwHhcNMTQxMjEyMTYwMDEyWhcNMjQxMjA5MTYwMDEyWjBF +MQswCQYDVQQGEwJBVTETMBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50 +ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAuUQcWlhrMXmzLSLiHUADdF98IHKRde7I1eDT91NndOtx4pKfvVc3WPei +REIMksrU8F1r4A086h5++xxDf27LxR4EC9ry0Q6GgJ9Un9RB9clCWRhLw8awHAS7 +HgAEN8YOSCeF3qP+78muxyMkIKQbYn3TqqOzRZcK576hX+a6URNJDhbHHAzq2fxm +rOSRVdPXzKLl48ABfmqJ6+KiXc6e7mQSgmwBLfh51zxmJNNwZ5e+6sfZ8oz4yM4y +Kzek53GRSFj+VFNp5nS/x2072fUak2i6DGut5LibFfh1kqskIm+Iq5WwO15RbojZ +CR6fkktCl5QOtea5p8SETZpwWfaddQIDAQABo4GnMIGkMB0GA1UdDgQWBBQtOc1g +1gxisDQ7VTmRYI1U9WHVMDB1BgNVHSMEbjBsgBQtOc1g1gxisDQ7VTmRYI1U9WHV +MKFJpEcwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgTClNvbWUtU3RhdGUxITAfBgNV +BAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZIIJAL/TuOknjSR5MAwGA1UdEwQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBABxYn5JdJYC8FUITqymJeNZ72/a2GVf8 ++gGlWH+DuiyviEAGMGpv7O4GXfS/6UiUBO7zMe2z15fUvNgd5RQBh4T+l5bA9aS0 +5JhENIpEApiIcEII4ISIk6pTLmAZjWvqq2kStiiFPNvdKFclYqFuKHv847EA8kGz +9u6MuUyFrJipWZ3g8zeYiwLWaAzvimbHomO7HU4pcvYaCSl7O5BQTToKwLfHcx5y +UG6uRf+0auC5QbotiXpYNdXhIbSD/2xXbjxGwYy4yRWHINcbwfK8iVRhR4eSvtBC +WvF3Vp8xLJxp6ujBd+a27AOWEiE1XM8oAoUpEzdIINY1GtUSbXzNboc= +-----END CERTIFICATE----- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/resources/image.json ---------------------------------------------------------------------- diff --git a/docker/src/test/resources/image.json b/docker/src/test/resources/image.json new file mode 100644 index 0000000..8d34de7 --- /dev/null +++ b/docker/src/test/resources/image.json @@ -0,0 +1,83 @@ +{ + "Architecture": "amd64", + "Author": "author", + "Comment": "comment", + "Config": { + "AttachStderr": false, + "AttachStdin": false, + "AttachStdout": false, + "Cmd": [ + "/bin/sh", + "-c", + "echo hello world" + ], + "CpuShares": 0, + "Cpuset": "", + "Domainname": "", + "Entrypoint": null, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOME=/root", + "JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64" + ], + "ExposedPorts": { + "8081/tcp": {} + }, + "Hostname": "f22711318734", + "Image": "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + "Memory": 0, + "MemorySwap": 0, + "NetworkDisabled": false, + "OnBuild": [], + "OpenStdin": false, + "PortSpecs": null, + "StdinOnce": false, + "Tty": false, + "User": "user", + "Volumes": null, + "WorkingDir": "/home/user" + }, + "Container": "0d14967353dbbd2ee78abe209f026f71654da49692fa2b044296ec3c810027b3", + "ContainerConfig": { + "AttachStderr": false, + "AttachStdin": false, + "AttachStdout": false, + "Cmd": [ + "/bin/sh", + "-c", + "echo hello world" + ], + "CpuShares": 0, + "Cpuset": "", + "Domainname": "", + "Entrypoint": null, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "HOME=/root", + "JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64" + ], + "ExposedPorts": { + "8081/tcp": {} + }, + "Hostname": "f22711318734", + "Image": "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + "Memory": 0, + "MemorySwap": 0, + "NetworkDisabled": false, + "OnBuild": [], + "OpenStdin": false, + "PortSpecs": null, + "StdinOnce": false, + "Tty": false, + "User": "user", + "Volumes": null, + "WorkingDir": "/home/user" + }, + "Created": "2014-11-24T11:09:20.310023104Z", + "DockerVersion": "1.3.1", + "Id": "cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456", + "Os": "linux", + "Parent": "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + "Size": 0, + "VirtualSize": 808709069 +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/74cefc97/docker/src/test/resources/images.json ---------------------------------------------------------------------- diff --git a/docker/src/test/resources/images.json b/docker/src/test/resources/images.json new file mode 100644 index 0000000..41d4f12 --- /dev/null +++ b/docker/src/test/resources/images.json @@ -0,0 +1,42 @@ +[ + { + "Created": 1416827360, + "Id": "cbba6639a342646deed70d7ea6162fa2a0acea9300f911f4e014555fe37d3456", + "ParentId": "05794515afd5724df1cdf0e674ae932455fce7dea3c70a94d77119ad1fa954ba", + "RepoTags": [ + "test:latest" + ], + "Size": 0, + "VirtualSize": 808709069 + }, + { + "Created": 1416826851, + "Id": "e1e548b03259ae30ba12232b6c16ef5205cf71b0363848e78b0394e1ecba4f57", + "ParentId": "6f36bec79c7f184ceebf7000cfb7244c4bc9b397b6659ac7f420a53d114250d9", + "RepoTags": [ + "<none>:<none>" + ], + "Size": 0, + "VirtualSize": 5609404 + }, + { + "Created": 1414247273, + "Id": "8201388d2b288539aab6aabf5d3b15ec269eba95c6baa9d6771f16540abf3a3f", + "ParentId": "4671e2c549c5b60063e349f520c801dc73b53d2226a5a8e5501845ebe94761ca", + "RepoTags": [ + "dockerfile/java:openjdk-7-jdk" + ], + "Size": 0, + "VirtualSize": 755313702 + }, + { + "Created": 1414108439, + "Id": "5506de2b643be1e6febbf3b8a240760c6843244c41e12aa2f60ccbb7153d17f5", + "ParentId": "22093c35d77bb609b9257ffb2640845ec05018e3d96cb939f68d0e19127f1723", + "RepoTags": [ + "ubuntu:14.04" + ], + "Size": 0, + "VirtualSize": 199257566 + } +] \ No newline at end of file
