http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextBuilder.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextBuilder.java b/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextBuilder.java deleted file mode 100644 index 2933f78..0000000 --- a/docker/src/main/java/org/jclouds/docker/suppliers/SSLContextBuilder.java +++ /dev/null @@ -1,201 +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 com.google.common.base.Charsets; -import com.google.common.io.Files; - -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.crypto.Pems; -import org.jclouds.util.Closeables2; - -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509ExtendedKeyManager; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.net.Socket; -import java.security.GeneralSecurityException; -import java.security.KeyManagementException; -import java.security.KeyPair; -import java.security.KeyStore; -import java.security.NoSuchAlgorithmException; -import java.security.Principal; -import java.security.PrivateKey; -import java.security.SecureRandom; -import java.security.Security; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509Certificate; - -import static com.google.common.base.Throwables.propagate; - -public class SSLContextBuilder { - - private KeyManager[] keyManagers; - private TrustManager[] trustManagers; - - public static final boolean isClientKeyAndCertificateData(String key, String cert) { - return (key.startsWith(Pems.PRIVATE_PKCS1_MARKER) || key.startsWith(Pems.PRIVATE_PKCS8_MARKER)) && - cert.startsWith(Pems.CERTIFICATE_X509_MARKER); - } - - public SSLContextBuilder() { } - - public SSLContextBuilder clientKeyAndCertificatePaths(String keyPath, String certPath) throws IOException, CertificateException { - X509Certificate certificate = getCertificate(loadFile(certPath)); - PrivateKey privateKey = getKey(loadFile(keyPath)); - keyManager(new InMemoryKeyManager(certificate, privateKey)); - return this; - } - - public SSLContextBuilder clientKeyAndCertificateData(String keyData, String certData) throws CertificateException { - X509Certificate certificate = getCertificate(certData); - PrivateKey privateKey = getKey(keyData); - keyManager(new InMemoryKeyManager(certificate, privateKey)); - return this; - } - - public SSLContextBuilder caCertificatePath(String caCertPath) { - try { - trustManagers = getTrustManagerWithCaCert(loadFile(caCertPath)); - } catch (IOException e) { - throw propagate(e); - } - return this; - } - - public SSLContextBuilder caCertificateData(String caCertPath) { - trustManagers = getTrustManagerWithCaCert(caCertPath); - return this; - } - - public SSLContextBuilder keyManager(KeyManager keyManager) { - keyManagers = new KeyManager[] { keyManager }; - return this; - } - - public SSLContextBuilder trustManager(TrustManager trustManager) { - trustManagers = new TrustManager[] { trustManager }; - return this; - } - - public SSLContext build() throws NoSuchAlgorithmException, KeyManagementException { - SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(keyManagers, trustManagers, new SecureRandom()); - return sslContext; - } - - private TrustManager[] getTrustManagerWithCaCert(String caCertData) { - try { - X509Certificate caCert = getCertificate(caCertData); - KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); - trustStore.load(null, null); - trustStore.setCertificateEntry("ca", caCert); - TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); - tmf.init(trustStore); - return tmf.getTrustManagers(); - } catch (GeneralSecurityException e) { - throw propagate(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) { - PEMParser pemParser = new PEMParser(new StringReader(privateKey)); - try { - 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); - } finally { - Closeables2.closeQuietly(pemParser); - } - } - - 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 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/39cd6698/docker/src/main/java/org/jclouds/docker/util/DockerInputStream.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/util/DockerInputStream.java b/docker/src/main/java/org/jclouds/docker/util/DockerInputStream.java deleted file mode 100644 index dacd7b7..0000000 --- a/docker/src/main/java/org/jclouds/docker/util/DockerInputStream.java +++ /dev/null @@ -1,73 +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.util; - -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * Extension to {@link DataInputStream} which adds method - * {@link #readStdStreamData()} to allow read multiplexed standard streams. - */ -public final class DockerInputStream extends DataInputStream { - - /** - * Ctor from superclass. - * - * @param in - * @see DataInputStream#DataInputStream(InputStream) - */ - public DockerInputStream(InputStream in) { - super(in); - } - - /** - * @return {@link StdStreamData} instance read from the input stream or - * <code>null</code> if we reached end of the stream. - * @throws IOException - */ - public StdStreamData readStdStreamData() throws IOException { - byte[] header = new byte[8]; - // try to read first byte from the message header - just to check if we - // are at the end - // of stream - if (-1 == read(header, 0, 1)) { - return null; - } - // read the rest of the header - readFully(header, 1, 7); - // decode size as an unsigned int - long size = (long) (header[4] & 0xFF) << 24 | (header[5] & 0xFF) << 16 | (header[6] & 0xFF) << 8 - | (header[7] & 0xFF); - - byte[] payload; - // The size from the header is an unsigned int so it can happen the byte - // array has not a sufficient size and we'll have to truncate the frame - payload = new byte[(int) Math.min(Integer.MAX_VALUE, size)]; - readFully(payload); - boolean truncated = false; - if (size > Integer.MAX_VALUE) { - truncated = true; - // skip the rest - readFully(new byte[(int) (size - Integer.MAX_VALUE)]); - } - return new StdStreamData(header[0], payload, truncated); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/main/java/org/jclouds/docker/util/StdStreamData.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/util/StdStreamData.java b/docker/src/main/java/org/jclouds/docker/util/StdStreamData.java deleted file mode 100644 index f8f5f9a..0000000 --- a/docker/src/main/java/org/jclouds/docker/util/StdStreamData.java +++ /dev/null @@ -1,87 +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.util; - -import java.util.Arrays; - -/** - * Representation of single message from docker-raw-stream. It holds stream - * type, data (payload) and flag which says if the payload was truncated. The - * truncation can occur when the frame size is greater than - * {@link Integer#MAX_VALUE}. - */ -public final class StdStreamData { - - private final StdStreamType type; - private final byte[] payload; - private final boolean truncated; - - /** - * Ctor. - * - * @param streamTypeId - * standard stream type (0=stdIn, 1=stdOut, 2=stdErr) - * @param payload - * message data - must not be <code>null</code> - * @param truncated - * @throws ArrayIndexOutOfBoundsException - * if streamTypeId is not an index in {@link StdStreamType} enum. - * @throws NullPointerException - * if provided payload is <code>null</code> - */ - StdStreamData(byte streamTypeId, byte[] payload, boolean truncated) - throws ArrayIndexOutOfBoundsException, NullPointerException { - this.type = StdStreamType.values()[streamTypeId]; - this.payload = Arrays.copyOf(payload, payload.length); - this.truncated = truncated; - } - - /** - * Type of stream. - * - * @return - */ - public StdStreamType getType() { - return type; - } - - /** - * Data from this message. - * - * @return payload. - */ - public byte[] getPayload() { - return payload; - } - - /** - * Flag which says if the payload was truncated (because of size). - * - * @return true if truncated - */ - public boolean isTruncated() { - return truncated; - } - - /** - * Standard streams enum. The order of entries is important! - */ - public static enum StdStreamType { - IN, OUT, ERR; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/DockerApiMetadataTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/DockerApiMetadataTest.java b/docker/src/test/java/org/jclouds/docker/DockerApiMetadataTest.java deleted file mode 100644 index 41d0067..0000000 --- a/docker/src/test/java/org/jclouds/docker/DockerApiMetadataTest.java +++ /dev/null @@ -1,47 +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; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; - -import org.jclouds.apis.ApiMetadata; -import org.jclouds.apis.Apis; -import org.jclouds.compute.internal.BaseComputeServiceApiMetadataTest; -import org.testng.annotations.Test; - -/** - * Unit tests for the {@link DockerApiMetadata} class. - */ -@Test(groups = "unit", testName = "AbiquoApiMetadataTest") -public class DockerApiMetadataTest extends BaseComputeServiceApiMetadataTest { - - public DockerApiMetadataTest() { - super(new DockerApiMetadata()); - } - - public void testDockerApiRegistered() { - ApiMetadata api = Apis.withId("docker"); - - assertNotNull(api); - assertTrue(api instanceof DockerApiMetadata); - assertEquals(api.getId(), "docker"); - } - -} - http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/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 deleted file mode 100644 index 81324ef..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/BaseDockerApiLiveTest.java +++ /dev/null @@ -1,101 +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.compute; - -import static com.google.common.base.Charsets.UTF_8; -import static org.jclouds.util.Closeables2.closeQuietly; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.Properties; - -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; -import org.jclouds.docker.internal.DockerTestUtils; -import org.jclouds.io.Payload; -import org.jclouds.io.Payloads; -import org.jclouds.sshj.config.SshjSshClientModule; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; -import com.google.common.io.CharStreams; -import com.google.inject.Module; - -@Test(groups = "live") -public class BaseDockerApiLiveTest extends BaseApiLiveTest<DockerApi> { - - protected static final String DEFAULT_IMAGE = "alpine"; - protected static final String DEFAULT_TAG = "3.3"; - protected static final String ALPINE_IMAGE_TAG = String.format("%s:%s", DEFAULT_IMAGE, DEFAULT_TAG); - - - public BaseDockerApiLiveTest() { - 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()); - } - - @Override - protected Properties setupProperties() { - Properties overrides = super.setupProperties(); - overrides.setProperty(ComputeServiceProperties.IMAGE_LOGIN_USER, "root:password"); - setIfTestSystemPropertyPresent(overrides, provider + ".cacert.path"); - setIfTestSystemPropertyPresent(overrides, Constants.PROPERTY_TRUST_ALL_CERTS); - return overrides; - } - - protected String consumeStream(InputStream stream) { - try { - return CharStreams.toString(new InputStreamReader(stream, UTF_8)); - } catch (IOException e) { - throw new AssertionError(e); - } finally { - closeQuietly(stream); - } - } - - public static Payload tarredDockerfile() throws IOException { - ByteArrayOutputStream bytes = new ByteArrayOutputStream(); - ShrinkWrap.create(GenericArchive.class, "archive.tar") - .add(new ClassLoaderAsset("Dockerfile"), "Dockerfile") - .as(TarExporter.class).exportTo(bytes); - - return Payloads.newByteArrayPayload(bytes.toByteArray()); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/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 deleted file mode 100644 index 72fc8d5..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java +++ /dev/null @@ -1,178 +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.compute; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertNull; - -import java.util.Properties; -import java.util.Random; - -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.inject.Injector; -import com.google.inject.Module; - -import org.jclouds.compute.ComputeServiceAdapter.NodeAndInitialCredentials; -import org.jclouds.compute.domain.Hardware; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.docker.DockerApi; -import org.jclouds.docker.compute.options.DockerTemplateOptions; -import org.jclouds.docker.compute.strategy.DockerComputeServiceAdapter; -import org.jclouds.docker.domain.Container; -import org.jclouds.docker.domain.Image; -import org.jclouds.docker.domain.Network; -import org.jclouds.docker.features.NetworkApi; -import org.jclouds.sshj.config.SshjSshClientModule; - -@Test(groups = "live", singleThreaded = true, testName = "DockerComputeServiceAdapterLiveTest") -public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { - - private static final String SSHABLE_IMAGE = "kwart/alpine-ext"; - private static final String SSHABLE_IMAGE_TAG = "3.3-ssh"; - private Image defaultImage; - private Network network1; - private Network network2; - - private DockerComputeServiceAdapter adapter; - private TemplateBuilder templateBuilder; - private NodeAndInitialCredentials<Container> guest; - private static final String CHUANWEN_COWSAY = "chuanwen/cowsay"; - - @BeforeClass - protected void init() { - super.initialize(); - String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG; - defaultImage = adapter.getImage(imageName); - network1 = createAndInspectNetwork("network1"); - network2 = createAndInspectNetwork("network2"); - assertNotNull(defaultImage); - } - - @AfterClass(alwaysRun = true) - protected void tearDown() { - if (guest != null) { - adapter.destroyNode(guest.getNode().id() + ""); - } - if (api.getImageApi().inspectImage(CHUANWEN_COWSAY) != null) { - api.getImageApi().deleteImage(CHUANWEN_COWSAY); - } - if (api.getNetworkApi().inspectNetwork("network1") != null) { - api.getNetworkApi().removeNetwork("network1"); - } - if (api.getNetworkApi().inspectNetwork("network2") != null) { - api.getNetworkApi().removeNetwork("network2"); - } - super.tearDown(); - } - - @Override - protected DockerApi create(Properties props, Iterable<Module> modules) { - Injector injector = newBuilder().modules(modules).overrides(props).buildInjector(); - adapter = injector.getInstance(DockerComputeServiceAdapter.class); - templateBuilder = injector.getInstance(TemplateBuilder.class); - return injector.getInstance(DockerApi.class); - } - - public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() { - String name = "container" + new Random().nextInt(); - Template template = templateBuilder.imageId(defaultImage.id()).build(); - DockerTemplateOptions options = template.getOptions().as(DockerTemplateOptions.class); - options.env(ImmutableList.of("ROOT_PASSWORD=password")); - guest = adapter.createNodeWithGroupEncodedIntoName("test", name, template); - assertEquals(guest.getNodeId(), guest.getNode().id()); - } - - public void testListHardwareProfiles() { - Iterable<Hardware> profiles = adapter.listHardwareProfiles(); - assertFalse(Iterables.isEmpty(profiles)); - - for (Hardware profile : profiles) { - assertNotNull(profile); - } - } - - public void testGetImageNotHiddenByCache() { - // Ensure image to be tested is unknown to jclouds and docker and that - // cache is warm - assertNull(findImageFromListImages(CHUANWEN_COWSAY)); - assertNull(api.getImageApi().inspectImage(CHUANWEN_COWSAY)); - - // Get new image - adapter.getImage(CHUANWEN_COWSAY); - - assertNotNull(findImageFromListImages(CHUANWEN_COWSAY), - "New image is not available from listImages presumably due to caching"); - } - - public void testCreateNodeWithMultipleNetworks() { - String name = "container" + new Random().nextInt(); - Template template = templateBuilder.imageId(defaultImage.id()).build(); - DockerTemplateOptions options = template.getOptions().as(DockerTemplateOptions.class); - options.env(ImmutableList.of("ROOT_PASSWORD=password")); - options.networkMode("bridge"); - options.networks(network1.name(), network2.name()); - guest = adapter.createNodeWithGroupEncodedIntoName("test", name, template); - - assertTrue(guest.getNode().networkSettings().networks().containsKey("network1")); - assertTrue(guest.getNode().networkSettings().networks().containsKey("network2")); - assertEquals(guest.getNode().networkSettings().networks().size(), 3); - } - - private Image findImageFromListImages(final String image) { - return Iterables.find(adapter.listImages(), new Predicate<Image>() { - @Override - public boolean apply(Image input) { - for (String tag : input.repoTags()) { - if (tag.equals(CHUANWEN_COWSAY + DockerComputeServiceAdapter.SUFFIX_LATEST_VERSION) - || tag.equals(DockerComputeServiceAdapter.PREFIX_DOCKER_HUB_HOST + CHUANWEN_COWSAY - + DockerComputeServiceAdapter.SUFFIX_LATEST_VERSION)) { - return true; - } - } - return false; - } - }, null); - } - - @Override - protected Iterable<Module> setupModules() { - return ImmutableSet.<Module> of(getLoggingModule(), new SshjSshClientModule()); - } - - /** - * Creates network (driver="bridge") with given name and then inspects it to - * fully populate the returned {@link Network} object. - * - * @param networkName - */ - private Network createAndInspectNetwork(final String networkName) { - final NetworkApi networkApi = api.getNetworkApi(); - Network network = networkApi.createNetwork(Network.builder().name(networkName).driver("bridge").build()); - return networkApi.inspectNetwork(network.id()); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java deleted file mode 100644 index d02e215..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceLiveTest.java +++ /dev/null @@ -1,214 +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.compute; - -import static com.google.common.collect.Iterables.getOnlyElement; -import static java.lang.String.format; -import static java.util.concurrent.TimeUnit.SECONDS; -import static java.util.logging.Logger.getAnonymousLogger; -import static org.jclouds.compute.options.RunScriptOptions.Builder.nameTask; -import static org.jclouds.compute.options.TemplateOptions.Builder.runAsRoot; -import static org.jclouds.util.Predicates2.retry; -import static org.testng.Assert.assertNotNull; - -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.concurrent.TimeUnit; - -import org.jclouds.compute.ComputeService; -import org.jclouds.compute.JettyStatements; -import org.jclouds.compute.RunNodesException; -import org.jclouds.compute.domain.ExecResponse; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; -import org.jclouds.compute.util.OpenSocketFinder; -import org.jclouds.docker.DockerApi; -import org.jclouds.docker.compute.options.DockerTemplateOptions; -import org.jclouds.docker.domain.Container; -import org.jclouds.docker.features.ImageApi; -import org.jclouds.docker.options.CreateImageOptions; -import org.jclouds.docker.options.DeleteImageOptions; -import org.jclouds.domain.LoginCredentials; -import org.jclouds.predicates.SocketOpen; -import org.jclouds.scriptbuilder.domain.Statement; -import org.jclouds.scriptbuilder.domain.Statements; -import org.jclouds.sshj.config.SshjSshClientModule; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeGroups; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.google.common.base.Stopwatch; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.net.HostAndPort; -import com.google.inject.Module; - -/** - * Live tests for the {@link org.jclouds.compute.ComputeService} integration. - */ -@Test(groups = "live", singleThreaded = true, testName = "DockerComputeServiceLiveTest") -public class DockerComputeServiceLiveTest extends BaseComputeServiceContextLiveTest { - - private static final String SSHABLE_IMAGE = "tutum/ubuntu"; - private static final String SSHABLE_IMAGE_TAG = "trusty"; - private Image defaultImage; - protected Template template; - protected Predicate<HostAndPort> socketTester; - protected OpenSocketFinder openSocketFinder; - - protected ComputeService client; - - public DockerComputeServiceLiveTest() { - provider = "docker"; - } - - @Override - protected Module getSshModule() { - return new SshjSshClientModule(); - } - - @BeforeGroups(groups = { "integration", "live" }) - @Override - public void setupContext() { - super.setupContext(); - buildSocketTester(); - } - - @Override - protected void initializeContext() { - super.initializeContext(); - client = view.getComputeService(); - - String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG; - defaultImage = client.getImage(imageName); - assertNotNull(defaultImage); - } - - @AfterClass - @Override - protected void tearDownContext() { - super.tearDownContext(); - if (defaultImage != null) { - imageApi().deleteImage(SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG, DeleteImageOptions.Builder.force(true)); - } - } - - private ImageApi imageApi() { - return client.getContext().unwrapApi(DockerApi.class).getImageApi(); - } - - protected Template buildTemplate(TemplateBuilder templateBuilder) { - - String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG; - org.jclouds.docker.domain.Image image = imageApi().inspectImage(imageName); - if (image == null) { - CreateImageOptions options = CreateImageOptions.Builder.fromImage(SSHABLE_IMAGE).tag(SSHABLE_IMAGE_TAG); - imageApi().createImage(options); - } - image = imageApi().inspectImage(imageName); - defaultImage = client.getImage(image.id()); - - - DockerTemplateOptions options = new DockerTemplateOptions(); - options.env(ImmutableList.of("ROOT_PASS=password")); - options.overrideLoginCredentials(LoginCredentials.builder().identity("root").credential("password").build()); - template = templateBuilder.imageId(defaultImage.getId()).options(options).build(); - return template; - } - - protected void createAndRunAServiceInGroup(String group) throws RunNodesException { - // note that some cloud providers do not support mixed case tag names - ImmutableMap<String, String> userMetadata = ImmutableMap.of("test", group); - ImmutableSet<String> tags = ImmutableSet.of(group); - Stopwatch watch = Stopwatch.createStarted(); - template = buildTemplate(client.templateBuilder()); - template.getOptions().inboundPorts(22, 8080).blockOnPort(22, 300).userMetadata(userMetadata).tags(tags); - NodeMetadata node = getOnlyElement(client.createNodesInGroup(group, 1, template)); - long createSeconds = watch.elapsed(TimeUnit.SECONDS); - final String nodeId = node.getId(); - //checkUserMetadataContains(node, userMetadata); - //checkTagsInNodeEquals(node, tags); - getAnonymousLogger().info( - format("<< available node(%s) os(%s) in %ss", node.getId(), node.getOperatingSystem(), createSeconds)); - watch.reset().start(); - client.runScriptOnNode(nodeId, JettyStatements.install(), nameTask("configure-jetty")); - long configureSeconds = watch.elapsed(TimeUnit.SECONDS); - getAnonymousLogger().info( - format( - "<< configured node(%s) with %s and jetty %s in %ss", - nodeId, - exec(nodeId, "java -fullversion"), - exec(nodeId, JettyStatements.version()), configureSeconds)); - trackProcessOnNode(JettyStatements.start(), "start jetty", node); - client.runScriptOnNode(nodeId, JettyStatements.stop(), runAsRoot(false).wrapInInitScript(false)); - trackProcessOnNode(JettyStatements.start(), "start jetty", node); - } - - protected void trackProcessOnNode(Statement process, String processName, NodeMetadata node) { - ServiceStats stats = new ServiceStats(); - Stopwatch watch = Stopwatch.createStarted(); - ExecResponse exec = client.runScriptOnNode(node.getId(), process, runAsRoot(false).wrapInInitScript(false)); - stats.backgroundProcessMilliseconds = watch.elapsed(TimeUnit.MILLISECONDS); - - Container container = client.getContext().unwrapApi(DockerApi.class).getContainerApi().inspectContainer(node.getId()); - Map<String, List<Map<String, String>>> ports = container.networkSettings().ports(); - int port = Integer.parseInt(getOnlyElement(ports.get("8080/tcp")).get("HostPort")); - - watch.reset().start(); - HostAndPort socket; - try { - socket = openSocketFinder.findOpenSocketOnNode(node, port, 600, TimeUnit.SECONDS); - } catch (NoSuchElementException e) { - throw new NoSuchElementException(format("%s%n%s%s", e.getMessage(), exec.getOutput(), exec.getError())); - } - stats.socketOpenMilliseconds = watch.elapsed(TimeUnit.MILLISECONDS); - getAnonymousLogger().info(format("<< %s on node(%s)[%s] %s", processName, node.getId(), socket, stats)); - } - - static class ServiceStats { - long backgroundProcessMilliseconds; - long socketOpenMilliseconds; - - @Override - public String toString() { - return format("[backgroundProcessMilliseconds=%s, socketOpenMilliseconds=%s]", - backgroundProcessMilliseconds, socketOpenMilliseconds); - } - } - - protected String exec(final String nodeId, String command) { - return exec(nodeId, Statements.exec(command)); - } - - protected String exec(final String nodeId, Statement command) { - return client.runScriptOnNode(nodeId, command, runAsRoot(false).wrapInInitScript(false)).getOutput().trim(); - } - - protected void buildSocketTester() { - SocketOpen socketOpen = view.utils().injector().getInstance(SocketOpen.class); - socketTester = retry(socketOpen, 60, 1, SECONDS); - // wait a maximum of 60 seconds for port 8080 to open. - openSocketFinder = context.utils().injector().getInstance(OpenSocketFinder.class); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/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 deleted file mode 100644 index 2e815a4..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/SshToCustomPortLiveTest.java +++ /dev/null @@ -1,245 +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.compute; - -import static org.assertj.core.api.Assertions.assertThat; -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.util.List; -import java.util.Map; - -import org.jclouds.compute.RunNodesException; -import org.jclouds.compute.domain.ExecResponse; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.internal.BaseComputeServiceContextLiveTest; -import org.jclouds.docker.DockerApi; -import org.jclouds.docker.compute.functions.LoginPortForContainer; -import org.jclouds.docker.compute.options.DockerTemplateOptions; -import org.jclouds.docker.domain.Config; -import org.jclouds.docker.domain.Container; -import org.jclouds.docker.domain.HostConfig; -import org.jclouds.docker.domain.Image; -import org.jclouds.docker.domain.ImageSummary; -import org.jclouds.docker.options.BuildOptions; -import org.jclouds.sshj.config.SshjSshClientModule; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.inject.AbstractModule; -import com.google.inject.Module; - -/** - * This class tests configuring custom SSH port for Docker images. - */ -@Test(groups = "live", testName = "SshToCustomPortLiveTest", singleThreaded = true) -public class SshToCustomPortLiveTest extends BaseComputeServiceContextLiveTest { - - private static final int SSH_PORT = 8822; - private static final int SSH_PORT_BRIDGE = 18822; - private static final String IMAGE_REPOSITORY = "jclouds/testrepo"; - private static final String IMAGE_TAG_1 = "testtag"; - private static final String IMAGE_TAG_2 = "second"; - - private Image image; - - public SshToCustomPortLiveTest() { - provider = "docker"; - } - - /** - * Asserts that the new image exists and tags were created successfully in - * the test preparation phase ({@link #setupContext()} method). - */ - @Test - public void testImageCreated() { - assertNotNull(image); - - final String imageId = image.id(); - assertNotNull(imageId); - - List<ImageSummary> listImages = api().getImageApi().listImages(); - assertNotNull(listImages); - ImageSummary testImage = Iterables.find(listImages, new Predicate<ImageSummary>() { - @Override - public boolean apply(ImageSummary input) { - return imageId.equals(input.id()); - } - }); - - assertEquals(testImage.repoTags().size(), 2, "Unexpected number of tags on the image."); - assertThat(testImage.repoTags()).contains(toTag(IMAGE_REPOSITORY, IMAGE_TAG_1), - toTag(IMAGE_REPOSITORY, IMAGE_TAG_2)); - } - - /** - * Start a node from the newly created image. The dropbear SSH server running - * on custom port ( {@value #SSH_PORT}). The Docker networkMode used is - * "host". Execute a command through the SSH connection and check the result. - * Destroy the node when finished. - * - * @throws RunNodesException - */ - @Test(dependsOnMethods = "testImageCreated") - public void testCustomPortSsh() throws RunNodesException { - final DockerTemplateOptions options = DockerTemplateOptions.Builder - .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(); - - String nodeId = null; - try { - NodeMetadata node = Iterables - .getOnlyElement(view.getComputeService().createNodesInGroup("ssh-net-host", 1, template)); - - nodeId = node.getId(); - 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) - view.getComputeService().destroyNode(nodeId); - } - } - - - @Test(dependsOnMethods = "testImageCreated") - public void testAdvancedConfig() throws RunNodesException { - final String portId = SSH_PORT + "/tcp"; - final DockerTemplateOptions options = DockerTemplateOptions.Builder - .configBuilder( - Config.builder().env(ImmutableList.<String> of("SSH_PORT=" + SSH_PORT, "ROOT_PASSWORD=jcloudsRulez")) - .exposedPorts(ImmutableMap.<String, Object> of(portId, Maps.newHashMap())) - .hostConfig(HostConfig.builder().networkMode("bridge") - .portBindings(ImmutableMap.<String, List<Map<String, String>>> of(portId, - Lists.<Map<String, String>>newArrayList(ImmutableMap.of("HostPort", String.valueOf(SSH_PORT_BRIDGE))))) - .build()) - .image("test-if-this-value-is-correctly-overriden")) - .overrideLoginUser("root").overrideLoginPassword("jcloudsRulez").blockOnPort(SSH_PORT_BRIDGE, 30); - - final Template template = view.getComputeService().templateBuilder().imageId(image.id()).options(options).build(); - - String nodeId = null; - try { - NodeMetadata node = Iterables - .getOnlyElement(view.getComputeService().createNodesInGroup("ssh-net-bridge", 1, template)); - - nodeId = node.getId(); - ExecResponse response = view.getComputeService().runScriptOnNode(nodeId, "sh -c 'true'", - wrapInInitScript(false)); - assertEquals(response.getExitStatus(), 0); - } finally { - if (nodeId != null) - view.getComputeService().destroyNode(nodeId); - } - } - - /** - * Build a new image with 2 tags on it in the test preparation phase. - * - * @see org.jclouds.apis.BaseContextLiveTest#setupContext() - */ - @Override - @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 { - buildImageStream = api().getMiscApi().build(BaseDockerApiLiveTest.tarredDockerfile(), options); - consumeStreamSilently(buildImageStream); - } catch (IOException e) { - throw new RuntimeException("Error occured during building Docker image.", e); - } - image = api().getImageApi().inspectImage(tag); - api().getImageApi().tagImage(image.id(), IMAGE_REPOSITORY, IMAGE_TAG_2, true); - } - - /** - * After the test remove created image (with all tags). - * - * @see #setupContext() - */ - @AfterClass(alwaysRun = true) - protected void tearDown() { - removeImageIfExists(api(), toTag(IMAGE_REPOSITORY, IMAGE_TAG_1)); - removeImageIfExists(api(), toTag(IMAGE_REPOSITORY, IMAGE_TAG_2)); - } - - /** - * Configure used modules. A custom {@link LoginPortForContainer} binding is - * added among logging and SSH module. - * - * @see org.jclouds.compute.internal.BaseGenericComputeServiceContextLiveTest#setupModules() - */ - @Override - protected Iterable<Module> setupModules() { - return ImmutableSet.<Module> of(getLoggingModule(), new SshjSshClientModule(), new AbstractModule() { - @Override - protected void configure() { - bind(LoginPortForContainer.class).toInstance(new LoginPortForContainer() { - @Override - public Optional<Integer> apply(Container container) { - return Optional.of(container.name().contains("ssh-net-bridge") ? SSH_PORT_BRIDGE : SSH_PORT); - } - }); - } - }); - } - - /** - * Return DockerApi for current Context. - * - * @return - */ - private DockerApi api() { - return view.unwrapApi(DockerApi.class); - } - - /** - * Concatenate repository and tag name (if provided) in Docker format. - * - * @param repo - * @param tag - * @return - */ - private static String toTag(String repo, String tag) { - return repo + (tag != null ? ":" + tag : ""); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/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 deleted file mode 100644 index 5360097..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/ContainerToNodeMetadataTest.java +++ /dev/null @@ -1,224 +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.compute.functions; - -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.testng.Assert.assertEquals; - -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.easymock.EasyMock; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.ImageBuilder; -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; -import org.jclouds.docker.domain.NetworkSettings; -import org.jclouds.docker.domain.Port; -import org.jclouds.docker.domain.State; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationBuilder; -import org.jclouds.domain.LocationScope; -import org.jclouds.providers.ProviderMetadata; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.inject.Guice; - -/** - * Unit tests for the {@link org.jclouds.docker.compute.functions.ContainerToNodeMetadata} class. - */ -@Test(groups = "unit", testName = "ContainerToNodeMetadataTest") -public class ContainerToNodeMetadataTest { - - private ContainerToNodeMetadata function; - - private Container container; - - @BeforeMethod - public void setup() { - Config containerConfig = Config.builder() - .hostname("6d35806c1bd2") - .domainname("") - .user("") - .memory(0) - .memorySwap(0) - .cpuShares(0) - .attachStdin(false) - .attachStdout(false) - .attachStderr(false) - .exposedPorts(ImmutableMap.of("22/tcp", ImmutableMap.of())) - .tty(false) - .openStdin(false) - .stdinOnce(false) - .env(null) - .cmd(ImmutableList.of("/usr/sbin/sshd", "-D")) - .image("jclouds/ubuntu") - .workingDir("") - .entrypoint(null) - .networkDisabled(false) - .build(); - State state = State.create( // - 3626, // pid - true, // running - 0, // exitCode - "2014-03-24T20:28:37.537659054Z", // startedAt - "0001-01-01T00:00:00Z", // finishedAt - false, // paused - false, // restarting - "running", // Status - false, // OOMKilled - false, // Dead - "" // Error - ); - container = Container.builder() - .id("6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9") - .name("/hopeful_mclean") - .created(new SimpleDateFormatDateService().iso8601DateParse("2014-03-22T07:16:45.784120972Z")) - .path("/usr/sbin/sshd") - .args(Arrays.asList("-D")) - .config(containerConfig) - .state(state) - .image("af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6") - .networkSettings(NetworkSettings.builder() - .ipAddress("172.17.0.2") - .ipPrefixLen(16) - .gateway("172.17.42.1") - .bridge("docker0") - .ports(ImmutableMap.<String, List<Map<String, String>>>of("22/tcp", - ImmutableList.<Map<String, String>>of(ImmutableMap.of("HostIp", "0.0.0.0", "HostPort", - "49199")))) - .build()) - .resolvConfPath("/etc/resolv.conf") - .driver("aufs") - .execDriver("native-0.1") - .volumes(ImmutableMap.<String, String>of()) - .volumesRW(ImmutableMap.<String, Boolean>of()) - .command("") - .status("") - .hostConfig(HostConfig.builder().publishAllPorts(true).build()) - .ports(ImmutableList.<Port>of()) - .node(null) - .build(); - ProviderMetadata providerMetadata = EasyMock.createMock(ProviderMetadata.class); - expect(providerMetadata.getEndpoint()).andReturn("http://127.0.0.1:4243").atLeastOnce(); - replay(providerMetadata); - - GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class); - - Supplier<Map<String, ? extends Image>> images = new Supplier<Map<String, ? extends Image>>() { - @Override - public Map<String, ? extends Image> get() { - OperatingSystem os = OperatingSystem.builder() - .description("Ubuntu 12.04 64bit") - .family(OsFamily.UBUNTU) - .version("12.04") - .is64Bit(true) - .build(); - - return ImmutableMap.of("af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6", - new ImageBuilder() - .ids("af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6") - .name("ubuntu") - .description("Ubuntu 12.04 64bit") - .operatingSystem(os) - .status(Image.Status.AVAILABLE) - .build()); - } - }; - - Supplier<Set<? extends Location>> locations = new Supplier<Set< ? extends Location>>() { - @Override - public Set<? extends Location> get() { - - return ImmutableSet.of( - new LocationBuilder() - .id("docker") - .description("http://localhost:2375") - .scope(LocationScope.PROVIDER) - .build() - ); - } - }; - - function = new ContainerToNodeMetadata(providerMetadata, new StateToStatus(), namingConvention, images, locations, - new LoginPortForContainer.LoginPortLookupChain(null)); - } - - public void testVirtualMachineToNodeMetadata() { - NodeMetadata node = function.apply(container); - - assertEquals(node.getId(), "6d35806c1bd2b25cd92bba2d2c2c5169dc2156f53ab45c2b62d76e2d2fee14a9"); - assertEquals(node.getGroup(), "hopeful_mclean"); - assertEquals(node.getImageId(), "af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6"); - assertEquals(node.getLoginPort(), 49199); - assertEquals(node.getStatus(), NodeMetadata.Status.RUNNING); - assertEquals(node.getImageId(), "af0f59f1c19eef9471c3b8c8d587c39b8f130560b54f3766931b37d76d5de4b6"); - assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.17.0.2")); - assertEquals(node.getPublicAddresses(), ImmutableSet.of("127.0.0.1")); - } - - public void testVirtualMachineWithNetworksToNodeMetadata() { - // Example networks taken from container.json - Container containerWithNetwork = container.toBuilder() - .networkSettings(container.networkSettings().toBuilder() - .networks(ImmutableMap.<String, NetworkSettings.Details>builder() - .put("JCLOUDS_NETWORK", NetworkSettings.Details.builder() - .endpoint("1a10519f808faf1181cfdf3d1d6dd93e19ede2d1c8fed82562a4c17c297c4db3") - .gateway("172.19.0.1") - .ipAddress("172.19.0.2") - .ipPrefixLen(16) - .ipv6Gateway("") - .globalIPv6Address("") - .globalIPv6PrefixLen(0) - .macAddress("02:42:ac:13:00:02") - .build()) - .put("bridge", NetworkSettings.Details.builder() - .endpoint("9e8dcc0c8288938a923018fee0728cee8e6de7c01a5150738ee6e51c1caf8cf6") - .gateway("172.17.0.1") - .ipAddress("172.17.0.2") - .ipPrefixLen(16) - .ipv6Gateway("") - .globalIPv6Address("") - .globalIPv6PrefixLen(0) - .macAddress("02:42:ac:11:00:02") - .build()) - .build()) - .build()) - .build(); - - NodeMetadata node = function.apply(containerWithNetwork); - - // Only asserting network-related aspects; the rest is covered by testVirtualMachineToNodeMetadata - assertEquals(node.getLoginPort(), 49199); - assertEquals(node.getPrivateAddresses(), ImmutableSet.of("172.17.0.2", "172.19.0.2")); - assertEquals(node.getPublicAddresses(), ImmutableSet.of("127.0.0.1")); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/compute/functions/CustomLoginPortFromImageTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/CustomLoginPortFromImageTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/CustomLoginPortFromImageTest.java deleted file mode 100644 index 3e747d3..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/CustomLoginPortFromImageTest.java +++ /dev/null @@ -1,106 +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.compute.functions; - -import static org.jclouds.docker.compute.config.LoginPortLookupModule.loginPortLookupBinder; -import static org.testng.Assert.assertEquals; - -import org.jclouds.docker.compute.config.LoginPortLookupModule; -import org.jclouds.docker.domain.Config; -import org.jclouds.docker.domain.Container; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.inject.AbstractModule; -import com.google.inject.Guice; -import com.google.inject.Injector; -import com.google.inject.multibindings.MapBinder; - -@Test(groups = "unit") -public class CustomLoginPortFromImageTest { - - private CustomLoginPortFromImage customLoginPortFromImage; - - @BeforeClass - public void setup() { - Injector i = Guice.createInjector(new LoginPortLookupModule(), new AbstractModule() { - @Override - protected void configure() { - MapBinder<String, LoginPortForContainer> imageToFunction = loginPortLookupBinder(binder()); - imageToFunction.addBinding(".*alpine-ext.*").toInstance(LoginPortFromEnvVar); - imageToFunction.addBinding(".*ubuntu.*").toInstance(AlwaysPort22); - imageToFunction.addBinding(".*ubuntu:12\\.04.*").toInstance(AlwaysPort8080); - } - }); - customLoginPortFromImage = i.getInstance(CustomLoginPortFromImage.class); - } - - public void testPortFromEnvironmentVariables() { - Config config = Config.builder().image("alpine-ext:3.2").env(ImmutableList.of("FOO=bar", "SSH_PORT=2345")) - .build(); - Container container = Container.builder().id("id").config(config).build(); - - assertEquals(customLoginPortFromImage.apply(container).get().intValue(), 2345); - } - - public void testMostSpecificImageIsPicked() { - Config config = Config.builder().image("ubuntu:12.04").build(); - Container container = Container.builder().id("id").config(config).build(); - - assertEquals(customLoginPortFromImage.apply(container).get().intValue(), 8080); - } - - public void testNoImageFoundInMap() { - Config config = Config.builder().image("unexisting").build(); - Container container = Container.builder().id("id").config(config).build(); - - assertEquals(customLoginPortFromImage.apply(container), Optional.absent()); - } - - private static final LoginPortForContainer LoginPortFromEnvVar = new LoginPortForContainer() { - @Override - public Optional<Integer> apply(Container input) { - Optional<String> portVariable = Iterables.tryFind(input.config().env(), new Predicate<String>() { - @Override - public boolean apply(String input) { - String[] var = input.split("="); - return var[0].equals("SSH_PORT"); - } - }); - return portVariable.isPresent() ? Optional.of(Integer.valueOf(portVariable.get().split("=")[1])) : Optional - .<Integer> absent(); - } - }; - - private static final LoginPortForContainer AlwaysPort22 = new LoginPortForContainer() { - @Override - public Optional<Integer> apply(Container input) { - return Optional.of(22); - } - }; - - private static final LoginPortForContainer AlwaysPort8080 = new LoginPortForContainer() { - @Override - public Optional<Integer> apply(Container input) { - return Optional.of(8080); - } - }; -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/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 deleted file mode 100644 index 83c1c3b..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/ImageToImageTest.java +++ /dev/null @@ -1,148 +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.compute.functions; - -import static org.easymock.EasyMock.expect; -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; - -import com.google.common.collect.ImmutableList; - -/** - * Unit tests for the {@link org.jclouds.docker.compute.functions.ImageToImage} class. - */ -@Test(groups = "unit", testName = "ImageToImageTest") -public class ImageToImageTest { - - private static final org.jclouds.docker.domain.Image IMAGE_EMPTY_REPOTAGS = org.jclouds.docker.domain.Image.create( - "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.<String> of() // repoTags - ); - - private static final org.jclouds.docker.domain.Image IMAGE_REPOTAG_WITH_PORT = org.jclouds.docker.domain.Image.create( - "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("registry.company.example:8888/a/b/c/d:latest") // repoTags - ); - - private ImageToImage function; - - private org.jclouds.docker.domain.Image image; - - @BeforeMethod - public void setup() { - image = org.jclouds.docker.domain.Image.create( - "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(); - } - - public void testImageToImage() { - org.jclouds.docker.domain.Image mockImage = mockImage(); - - Image image = function.apply(mockImage); - - verify(mockImage); - - assertEquals(mockImage.id(), image.getId().toString()); - } - - public void testEmptyRepoTags() { - Image image = function.apply(IMAGE_EMPTY_REPOTAGS); - - assertEquals(image.getId(), "id"); - assertEquals(image.getDescription(), "<none>"); - assertEquals(image.getOperatingSystem().getVersion(), "<none>"); - assertEquals(image.getName(), "<none>"); - } - - public void testRepoTagWithHostPort() { - Image image = function.apply(IMAGE_REPOTAG_WITH_PORT); - - assertEquals(image.getDescription(), "registry.company.example:8888/a/b/c/d:latest"); - assertEquals(image.getOperatingSystem().getVersion(), "latest"); - assertEquals(image.getName(), "registry.company.example:8888/a/b/c/d"); - } - - private org.jclouds.docker.domain.Image mockImage() { - org.jclouds.docker.domain.Image mockImage = EasyMock.createMock(org.jclouds.docker.domain.Image.class); - - expect(mockImage.id()).andReturn(image.id()).anyTimes(); - expect(mockImage.repoTags()).andReturn(image.repoTags()).anyTimes(); - expect(mockImage.architecture()).andReturn(image.architecture()).anyTimes(); - replay(mockImage); - - return mockImage; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/compute/functions/StateToStatusTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/functions/StateToStatusTest.java b/docker/src/test/java/org/jclouds/docker/compute/functions/StateToStatusTest.java deleted file mode 100644 index f66f040..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/functions/StateToStatusTest.java +++ /dev/null @@ -1,81 +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.compute.functions; - -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.verify; -import static org.testng.Assert.assertEquals; - -import org.easymock.EasyMock; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.docker.domain.State; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -/** - * Unit tests for the {@link StateToStatus} class. - */ -@Test(groups = "unit", testName = "StateToStatusTest") -public class StateToStatusTest { - private StateToStatus function; - - @BeforeMethod - public void setup() { - function = new StateToStatus(); - } - - public void testStateRunningToStatusRunning() { - State mockState = mockStateRunning(); - - NodeMetadata.Status status = function.apply(mockState); - - verify(mockState); - - assertEquals(mockState.running(), true); - assertEquals(status, NodeMetadata.Status.RUNNING); - } - - public void testStateNotRunningToStatusTerminated() { - State mockState = mockStateNotRunning(); - - NodeMetadata.Status status = function.apply(mockState); - - verify(mockState); - - assertEquals(mockState.running(), false); - assertEquals(status, NodeMetadata.Status.TERMINATED); - } - - private State mockStateRunning() { - State mockState = EasyMock.createMock(State.class); - - expect(mockState.running()).andReturn(true).anyTimes(); - replay(mockState); - - return mockState; - } - - private State mockStateNotRunning() { - State mockState = EasyMock.createMock(State.class); - - expect(mockState.running()).andReturn(false).anyTimes(); - replay(mockState); - - return mockState; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/compute/options/DockerTemplateOptionsTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/options/DockerTemplateOptionsTest.java b/docker/src/test/java/org/jclouds/docker/compute/options/DockerTemplateOptionsTest.java deleted file mode 100644 index 73ba44e..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/options/DockerTemplateOptionsTest.java +++ /dev/null @@ -1,159 +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.compute.options; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; - -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.docker.domain.Config; -import org.jclouds.docker.domain.Config.Builder; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -/** - * Unit tests for the {@link DockerTemplateOptions} class. - */ -@Test(groups = "unit", testName = "DockerTemplateOptionsTest") -public class DockerTemplateOptionsTest { - - @Test - public void testHostname() { - TemplateOptions options = DockerTemplateOptions.Builder.hostname("hostname"); - assertEquals(options.as(DockerTemplateOptions.class).getHostname(), "hostname"); - } - - @Test - public void testMemory() { - TemplateOptions options = DockerTemplateOptions.Builder.memory(1024); - assertEquals(options.as(DockerTemplateOptions.class).getMemory(), Integer.valueOf(1024)); - } - - @Test - public void testCpuShares() { - TemplateOptions options = DockerTemplateOptions.Builder.cpuShares(2); - assertEquals(options.as(DockerTemplateOptions.class).getCpuShares(), Integer.valueOf(2)); - } - - @Test - public void testVolumes() { - TemplateOptions options = DockerTemplateOptions.Builder.volumes(ImmutableMap.of("/tmp", "/tmp")); - assertEquals(options.as(DockerTemplateOptions.class).getVolumes(), ImmutableMap.of("/tmp", "/tmp")); - } - - @Test - public void testDns() { - TemplateOptions options = DockerTemplateOptions.Builder.dns("8.8.8.8", "8.8.4.4"); - assertEquals(options.as(DockerTemplateOptions.class).getDns(), ImmutableList.of("8.8.8.8", "8.8.4.4")); - } - - @Test - public void testEntrypoint() { - TemplateOptions options = DockerTemplateOptions.Builder.entrypoint("/bin/sh", "-c"); - assertEquals(options.as(DockerTemplateOptions.class).getEntrypoint(), ImmutableList.of("/bin/sh", "-c")); - } - - @Test - public void testCommands() { - TemplateOptions options = DockerTemplateOptions.Builder.commands("chmod 666 /etc/*", "rm -rf /var/run"); - assertEquals(options.as(DockerTemplateOptions.class).getCommands(), ImmutableList.of("chmod 666 /etc/*", "rm -rf /var/run")); - } - - @Test - public void testEnv() { - TemplateOptions options = DockerTemplateOptions.Builder.env(ImmutableList.of("HOST=abc", "PORT=1234")); - assertEquals(options.as(DockerTemplateOptions.class).getEnv(), ImmutableList.of("HOST=abc", "PORT=1234")); - } - - @Test - public void testPortBindings() { - TemplateOptions options = DockerTemplateOptions.Builder.portBindings(ImmutableMap.<Integer, Integer>builder().put(8443, 443).put(8080, 80).build()); - assertEquals(options.as(DockerTemplateOptions.class).getPortBindings(), ImmutableMap.<Integer, Integer>builder().put(8443, 443).put(8080, 80).build()); - } - - - @Test - public void testNetworkMode() { - TemplateOptions options = DockerTemplateOptions.Builder.networkMode("host"); - assertEquals(options.as(DockerTemplateOptions.class).getNetworkMode(), "host"); - } - - @Test - public void testPrivilegedDefaultFalse() { - TemplateOptions options = DockerTemplateOptions.Builder.memory(2); - assertEquals(options.as(DockerTemplateOptions.class).getPrivileged(), false); - } - - @Test - public void testPrivileged() { - TemplateOptions options = DockerTemplateOptions.Builder.privileged(true); - assertEquals(options.as(DockerTemplateOptions.class).getPrivileged(), true); - } - - @Test - public void testConfigBuilder() { - Builder builder = Config.builder().memory(1024) - .cpuShares(100).cmd(ImmutableList.<String> of("/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0")) - .env(ImmutableList.<String> of("JAVA_HOME=/opt/jdk-1.8", "MGMT_USER=admin", - "MGMT_PASSWORD=Schroedinger's Cat")); - TemplateOptions options = DockerTemplateOptions.Builder.configBuilder(builder); - Builder builderInOpts = options.as(DockerTemplateOptions.class).getConfigBuilder(); - assertNotNull(builderInOpts); - Config configFromOptions = builderInOpts.build(); - assertEquals(configFromOptions, builder.build()); - assertEquals(configFromOptions.env(), ImmutableList.<String> of("JAVA_HOME=/opt/jdk-1.8", "MGMT_USER=admin", - "MGMT_PASSWORD=Schroedinger's Cat")); - } - - @Test - public void testNonDockerOptions() { - TemplateOptions options = DockerTemplateOptions.Builder.userMetadata(ImmutableMap.of("key", "value")).cpuShares(1); - assertEquals(options.as(DockerTemplateOptions.class).getUserMetadata(), ImmutableMap.of("key", "value")); - assertEquals(options.as(DockerTemplateOptions.class).getCpuShares(), Integer.valueOf(1)); - } - - @Test - public void testMultipleOptions() { - TemplateOptions options = DockerTemplateOptions.Builder.memory(512).cpuShares(4); - assertEquals(options.as(DockerTemplateOptions.class).getMemory(), Integer.valueOf(512)); - assertEquals(options.as(DockerTemplateOptions.class).getCpuShares(), Integer.valueOf(4)); - } - - @Test - public void testCopyTo() { - DockerTemplateOptions options = DockerTemplateOptions.Builder - .memory(512) - .cpuShares(4) - .entrypoint("entry", "point") - .commands("test", "abc") - .portBindings( - ImmutableMap.<Integer, Integer> builder() - .put(8443, 443).build()) - .hostname("hostname") - .networkMode("host") - .userMetadata(ImmutableMap.of("key", "value")) - .env(ImmutableList.of("HOST=abc", "PORT=1234")) - .dns("8.8.8.8", "8.8.4.4") - .volumes(ImmutableMap.of("/tmp", "/tmp")); - DockerTemplateOptions optionsCopy = new DockerTemplateOptions(); - options.copyTo(optionsCopy); - assertEquals(optionsCopy, options); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/39cd6698/docker/src/test/java/org/jclouds/docker/compute/strategy/PredicateLocateImageByNameTest.java ---------------------------------------------------------------------- diff --git a/docker/src/test/java/org/jclouds/docker/compute/strategy/PredicateLocateImageByNameTest.java b/docker/src/test/java/org/jclouds/docker/compute/strategy/PredicateLocateImageByNameTest.java deleted file mode 100644 index dd8b654..0000000 --- a/docker/src/test/java/org/jclouds/docker/compute/strategy/PredicateLocateImageByNameTest.java +++ /dev/null @@ -1,111 +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.compute.strategy; - -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; - -import java.util.Date; - -import org.jclouds.docker.domain.Config; -import org.jclouds.docker.domain.Image; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableList; - -/** - * Unit tests for finding images logic used in - * {@link DockerComputeServiceAdapter#getImage(String)} method. It's mainly a - * regression test for issue - * <a href="https://issues.apache.org/jira/browse/JCLOUDS-1158">JCLOUDS-1158</a> - * . - */ -@Test(groups = "unit", testName = "PredicateLocateImageByNameTest") -public class PredicateLocateImageByNameTest { - - private static final Image IMAGE_REPO_TAGS_MULTI = Image.create("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.<String> of("kwart/alpine-ext:3.3-ssh", "kwart/alpine-ext:latest", "my-tag:latestdock") // repoTags - ); - - private static final Image IMAGE_REPO_TAGS_EMPTY = Image.create("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.<String> of() // repoTags - ); - - private static final Image IMAGE_REPO_TAGS_WITH_HOST = Image.create("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.<String> of("docker.io/kwart/alpine-ext:3.3-ssh", "docker.io/kwart/alpine-ext:latest") // repoTags - ); - - public void testRepoTagVersion() { - final Predicate<Image> predicate = DockerComputeServiceAdapter - .createPredicateMatchingRepoTags("kwart/alpine-ext:3.3-ssh"); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_MULTI)); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_EMPTY)); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_WITH_HOST)); - } - - public void testRepoTagLatest() { - final Predicate<Image> predicate = DockerComputeServiceAdapter.createPredicateMatchingRepoTags("kwart/alpine-ext"); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_MULTI)); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_EMPTY)); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_WITH_HOST)); - } - - public void testRepoTagVersionWithHost() { - final Predicate<Image> predicate = DockerComputeServiceAdapter - .createPredicateMatchingRepoTags("docker.io/kwart/alpine-ext:3.3-ssh"); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_MULTI)); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_EMPTY)); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_WITH_HOST)); - } - - public void testRepoTagLatestWithHost() { - final Predicate<Image> predicate = DockerComputeServiceAdapter - .createPredicateMatchingRepoTags("docker.io/kwart/alpine-ext"); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_MULTI)); - assertFalse(predicate.apply(IMAGE_REPO_TAGS_EMPTY)); - assertTrue(predicate.apply(IMAGE_REPO_TAGS_WITH_HOST)); - } - -}
