From e7ef1498345fcf97ee09f8004b71daee584d8cf6 Mon Sep 17 00:00:00 2001 From: Aslak Knutsen Date: Wed, 18 Nov 2015 12:23:01 +0000 Subject: [PATCH] Return ContainerConfig exposedPorts if no HostConfig boundPorts found In this scenario boundPort is set to -1. fixes #208 --- .../impl/await/PollingAwaitStrategy.java | 3 +++ .../CubeContainerObjectTestEnricher.java | 2 +- .../cube/docker/impl/util/BindingUtil.java | 21 ++++++++++++------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/await/PollingAwaitStrategy.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/await/PollingAwaitStrategy.java index 0b4a49f3f..b7f367641 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/await/PollingAwaitStrategy.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/await/PollingAwaitStrategy.java @@ -95,6 +95,9 @@ public boolean await() { switch(this.type) { case "ping": { + if(ports.getBindingPort() == -1) { + throw new IllegalArgumentException("Can not use polling of type " + type + " on non externally bound port " + ports.getExposedPort()); + } if (!Ping.ping(bindings.getIP(), ports.getBindingPort(), this.pollIterations, this.sleepPollTime, this.timeUnit)) { return false; diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricher.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricher.java index b9c357d87..05a9dec7a 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricher.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/client/containerobject/CubeContainerObjectTestEnricher.java @@ -178,7 +178,7 @@ private void enrichHostPort(Object containerObjectInstance, org.arquillian.cube. if (hostPortValue > 0) { final Binding.PortBinding bindingForExposedPort = cube.bindings().getBindingForExposedPort(hostPortValue); - if (bindingForExposedPort != null) { + if (bindingForExposedPort != null && bindingForExposedPort.getBindingPort() != -1) { field.set(containerObjectInstance, bindingForExposedPort.getBindingPort()); } else { throw new IllegalArgumentException(String.format("Container Object %s contains field %s annotated with %s but exposed port %s is not exposed on container object.", containerObjectInstance.getClass().getSimpleName(), field.getName(), HostPort.class.getSimpleName(), hostPortValue)); diff --git a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/BindingUtil.java b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/BindingUtil.java index 5b336682f..7349fa45f 100644 --- a/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/BindingUtil.java +++ b/docker/docker/src/main/java/org/arquillian/cube/docker/impl/util/BindingUtil.java @@ -8,6 +8,7 @@ import org.arquillian.cube.spi.Binding; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.ContainerConfig; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; @@ -22,16 +23,22 @@ private BindingUtil() { public static Binding binding(DockerClientExecutor executor, String cubeId) { InspectContainerResponse inspectResponse = executor.getDockerClient().inspectContainerCmd( cubeId ).exec(); - HostConfig hostConfig = inspectResponse.getHostConfig(); - String dockerIp = getDockerServerIp(executor); Binding binding = new Binding(dockerIp); - for (Entry bind : hostConfig.getPortBindings() - .getBindings().entrySet()) { - com.github.dockerjava.api.model.Ports.Binding[] allBindings = bind.getValue(); - for (com.github.dockerjava.api.model.Ports.Binding bindings : allBindings) { - binding.addPortBinding(bind.getKey().getPort(), bindings.getHostPort()); + HostConfig hostConfig = inspectResponse.getHostConfig(); + if(hostConfig.getPortBindings() != null) { + for (Entry bind : hostConfig.getPortBindings() + .getBindings().entrySet()) { + com.github.dockerjava.api.model.Ports.Binding[] allBindings = bind.getValue(); + for (com.github.dockerjava.api.model.Ports.Binding bindings : allBindings) { + binding.addPortBinding(bind.getKey().getPort(), bindings.getHostPort()); + } + } + } else { + ContainerConfig connectionConfig = inspectResponse.getConfig(); + for(ExposedPort port : connectionConfig.getExposedPorts()) { + binding.addPortBinding(port.getPort(), -1); } } return binding;