Add Network autovalue builder and tests
Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs/commit/b28fe7c6 Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs/tree/b28fe7c6 Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs/diff/b28fe7c6 Branch: refs/heads/master Commit: b28fe7c6d8a9fffbb6767b5770bc5b11309aadd3 Parents: 3cd3cac Author: Andrew Donald Kennedy <[email protected]> Authored: Sat Jul 2 15:39:49 2016 +0100 Committer: Ignasi Barrera <[email protected]> Committed: Mon Aug 1 11:42:31 2016 +0200 ---------------------------------------------------------------------- .../java/org/jclouds/docker/domain/Network.java | 152 ++++++++++++++++--- .../DockerComputeServiceAdapterLiveTest.java | 39 ++++- 2 files changed, 161 insertions(+), 30 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/b28fe7c6/docker/src/main/java/org/jclouds/docker/domain/Network.java ---------------------------------------------------------------------- diff --git a/docker/src/main/java/org/jclouds/docker/domain/Network.java b/docker/src/main/java/org/jclouds/docker/domain/Network.java index 74f9e81..d6de0d7 100644 --- a/docker/src/main/java/org/jclouds/docker/domain/Network.java +++ b/docker/src/main/java/org/jclouds/docker/domain/Network.java @@ -17,48 +17,91 @@ package org.jclouds.docker.domain; import static org.jclouds.docker.internal.NullSafeCopies.copyOf; +import static org.jclouds.docker.internal.NullSafeCopies.copyWithNullOf; + import java.util.List; import java.util.Map; +import com.google.auto.value.AutoValue; + import org.jclouds.javax.annotation.Nullable; import org.jclouds.json.SerializedNames; -import com.google.auto.value.AutoValue; - @AutoValue public abstract class Network { @AutoValue public abstract static class IPAM { - IPAM() {} // For AutoValue only! + IPAM() { } - @Nullable - public abstract String driver(); + @Nullable public abstract String driver(); public abstract List<Config> config(); @SerializedNames({"Driver", "Config"}) - public static IPAM create(String driver, List<Config> config) { - return new AutoValue_Network_IPAM(driver, copyOf(config)); + public static IPAM create(@Nullable String driver, List<Config> config) { + return builder() + .driver(driver) + .config(config) + .build(); + } + + public static Builder builder() { + return new AutoValue_Network_IPAM.Builder(); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder driver(@Nullable String driver); + + public abstract Builder config(List<Config> config); + + abstract List<Config> config(); + + abstract IPAM autoBuild(); + + public IPAM build() { + return config(copyOf(config())) + .autoBuild(); + } } @AutoValue public abstract static class Config { - Config() {} // For AutoValue only! + Config() { } public abstract String subnet(); - @Nullable - public abstract String ipRange(); + @Nullable public abstract String ipRange(); - @Nullable - public abstract String gateway(); + @Nullable public abstract String gateway(); @SerializedNames({"Subnet", "IPRange", "Gateway"}) - public static Config create(String subnet, String ipRange, String gateway) { - return new AutoValue_Network_IPAM_Config(subnet, ipRange, gateway); + public static Config create(String subnet, @Nullable String ipRange, @Nullable String gateway) { + return builder() + .subnet(subnet) + .ipRange(ipRange) + .gateway(gateway) + .build(); + } + + public static Builder builder() { + return new AutoValue_Network_IPAM_Config.Builder(); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder subnet(String subnet); + + public abstract Builder ipRange(@Nullable String ipRange); + + public abstract Builder gateway(@Nullable String gateway); + + abstract Config build(); } } } @@ -66,7 +109,7 @@ public abstract class Network { @AutoValue public abstract static class Details { - Details() {} // For AutoValue only! + Details() { } public abstract String endpoint(); @@ -78,7 +121,30 @@ public abstract class Network { @SerializedNames({ "EndpointID", "MacAddress", "IPv4Address", "IPv6Address" }) public static Details create(String endpoint, String macAddress, String ipv4address, String ipv6address) { - return new AutoValue_Network_Details(endpoint, macAddress, ipv4address, ipv6address); + return builder() + .endpoint(endpoint) + .macAddress(macAddress) + .ipv4address(ipv4address) + .ipv6address(ipv6address) + .build(); + } + + public static Builder builder() { + return new AutoValue_Network_Details.Builder(); + } + + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder endpoint(String endpoint); + + public abstract Builder macAddress(String macAddress); + + public abstract Builder ipv4address(String ipv4address); + + public abstract Builder ipv6address(String ipv6address); + + abstract Details build(); } } @@ -92,16 +158,58 @@ public abstract class Network { @Nullable public abstract IPAM ipam(); - public abstract Map<String, Details> containers(); + @Nullable public abstract Map<String, Details> containers(); - public abstract Map<String, String> options(); + @Nullable public abstract Map<String, String> options(); - Network() {} + Network() { } @SerializedNames({ "Name", "Id", "Scope", "Driver", "IPAM", "Containers", "Options" }) - public static Network create(String name, String id, String scope, String driver, IPAM ipam, - Map<String, Details> containers, Map<String, String> options) { - return new AutoValue_Network(name, id, scope, driver, ipam, copyOf(containers), copyOf(options)); + public static Network create(@Nullable String name, @Nullable String id, @Nullable String scope, + @Nullable String driver, @Nullable IPAM ipam, @Nullable Map<String, Details> containers, + @Nullable Map<String, String> options) { + return builder() + .name(name) + .id(id) + .scope(scope) + .driver(driver) + .ipam(ipam) + .containers(containers) + .options(options) + .build(); + } + + public static Builder builder() { + return new AutoValue_Network.Builder(); } + @AutoValue.Builder + public abstract static class Builder { + + public abstract Builder name(@Nullable String name); + + public abstract Builder id(@Nullable String id); + + public abstract Builder scope(@Nullable String scope); + + public abstract Builder driver(@Nullable String driver); + + public abstract Builder ipam(@Nullable IPAM ipam); + + public abstract Builder containers(@Nullable Map<String, Details> containers); + + public abstract Builder options(@Nullable Map<String, String> options); + + abstract Map<String, Details> containers(); + + abstract Map<String, String> options(); + + abstract Network autoBuild(); + + public Network build() { + return containers(copyWithNullOf(containers())) + .options(copyOf(options())) + .autoBuild(); + } + } } http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/b28fe7c6/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 3480d88..cb8ca3e 100644 --- a/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java +++ b/docker/src/test/java/org/jclouds/docker/compute/DockerComputeServiceAdapterLiveTest.java @@ -18,12 +18,17 @@ 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; @@ -40,10 +45,8 @@ 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.sshj.config.SshjSshClientModule; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; @Test(groups = "live", singleThreaded = true, testName = "DockerComputeServiceAdapterLiveTest") public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { @@ -51,6 +54,8 @@ 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; @@ -62,6 +67,8 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { super.initialize(); String imageName = SSHABLE_IMAGE + ":" + SSHABLE_IMAGE_TAG; defaultImage = adapter.getImage(imageName); + network1 = api.getNetworkApi().createNetwork(Network.builder().name("network1").driver("overlay").build()); + network2 = api.getNetworkApi().createNetwork(Network.builder().name("network2").driver("overlay").build()); assertNotNull(defaultImage); } @@ -73,6 +80,12 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { 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(); } @@ -85,14 +98,11 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { } public void testCreateNodeWithGroupEncodedIntoNameThenStoreCredentials() { - String group = "foo"; 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(group, name, template); + guest = adapter.createNodeWithGroupEncodedIntoName("test", name, template); assertEquals(guest.getNodeId(), guest.getNode().id()); } @@ -106,7 +116,6 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { } 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)); @@ -117,6 +126,20 @@ public class DockerComputeServiceAdapterLiveTest extends BaseDockerApiLiveTest { 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().secondaryIPAddresses().size(), 2); + } + private Image findImageFromListImages(final String image) { return Iterables.find(adapter.listImages(), new Predicate<Image>() { @Override
