package org.arquillian.cube.servlet; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.Network; import com.github.dockerjava.core.command.ExecStartResultCallback; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import org.arquillian.cube.HostIp; import org.arquillian.cube.HostPort; import org.arquillian.cube.docker.impl.requirement.RequiresDockerMachine; import org.arquillian.cube.requirement.ArquillianConditionalRunner; import org.assertj.core.groups.Tuple; import org.jboss.arquillian.test.api.ArquillianResource; import org.junit.Test; import org.junit.runner.RunWith; import static org.assertj.core.api.Assertions.assertThat; @RunWith(ArquillianConditionalRunner.class) @RequiresDockerMachine(name = "dev") public class PingPongTest { @HostIp String ip; @HostPort(containerName = "pingpong", value = 8080) int port; @ArquillianResource DockerClient dockerClient; @Test public void should_receive_ok_message() throws IOException { URL obj = new URL("http://" + ip + ":" + port); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // optional default is GET con.setRequestMethod("GET"); //add request header con.setRequestProperty("User-Agent", "Http URL"); int responseCode = con.getResponseCode(); BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream())); String inputLine; StringBuilder response = new StringBuilder(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); assertThat(response.toString()).isEqualToIgnoringWhitespace("{ \"status\": \"OK\"}"); } @Test public void container_should_be_attached_to_front_network() { final InspectContainerResponse pingpong = dockerClient.inspectContainerCmd("pingpong").exec(); final Network front = dockerClient.inspectNetworkCmd().withNetworkId("front").exec(); assertThat(front.getContainers()).containsOnlyKeys(pingpong.getId()); } @Test public void container_should_be_attached_to_back_network() { final InspectContainerResponse pingpong = dockerClient.inspectContainerCmd("pingpong").exec(); final Network front = dockerClient.inspectNetworkCmd().withNetworkId("back").exec(); assertThat(front.getContainers()).containsOnlyKeys(pingpong.getId()); } @Test public void network_should_be_used_provided_ipam() { final Network app_net = dockerClient.inspectNetworkCmd().withNetworkId("app_net").exec(); assertThat(app_net.getIpam().getDriver()).isEqualTo("default"); assertThat(app_net.getIpam().getConfig()).extracting("subnet", "gateway") .contains(Tuple.tuple("172.16.238.0/24", "172.16.238.1"), Tuple.tuple("2001:3984:3989::/64", "2001:3984:3989::1")); } @Test public void network_should_be_start_with_driver_opts() { final Network app_net = dockerClient.inspectNetworkCmd().withNetworkId("app_net").exec(); assertThat(app_net.getOptions()).containsEntry("com.docker.network.enable_ipv6", "true"); } @Test public void container_should_have_static_ip_for_app_net_network() throws InterruptedException, IOException { final InspectContainerResponse pingpong = dockerClient.inspectContainerCmd("pingpong").exec(); ExecCreateCmdResponse execCreateCmdResponse = dockerClient.execCreateCmd(pingpong.getId()) .withAttachStdout(true).withAttachStdin(true).withAttachStderr(true).withTty(false).withCmd("ifconfig") .exec(); try (OutputStream outputStream = new ByteArrayOutputStream(); OutputStream errorStream = new ByteArrayOutputStream()) { dockerClient.execStartCmd(execCreateCmdResponse.getId()).withDetach(false) .exec(new ExecStartResultCallback(outputStream, errorStream)).awaitCompletion(); assertThat(outputStream.toString()).contains("inet addr:172.16.238.10", "inet6 addr: fe80::42:acff:fe10:ee0a/64"); } } }