/******************************************************************************* * Copyright (c) 2017 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributor: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.eclipse.linuxtools.docker.integration.tests.container; import static org.junit.Assert.assertTrue; import org.eclipse.linuxtools.docker.integration.tests.image.AbstractImageBotTest; import org.eclipse.linuxtools.docker.integration.tests.mock.MockDockerConnectionManager; import org.eclipse.linuxtools.docker.integration.tests.mock.MockDockerTerminal; import org.eclipse.linuxtools.docker.reddeer.condition.ContainerIsDeployedCondition; import org.eclipse.linuxtools.docker.reddeer.core.ui.wizards.ImageRunSelectionPage; import org.eclipse.linuxtools.docker.reddeer.ui.DockerImagesTab; import org.eclipse.linuxtools.docker.reddeer.ui.DockerTerminal; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockContainerInfoFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerClientFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockDockerConnectionFactory; import org.eclipse.linuxtools.internal.docker.ui.testutils.MockImageFactory; import org.jboss.reddeer.common.wait.WaitUntil; import org.jboss.reddeer.common.wait.WaitWhile; import org.jboss.reddeer.core.condition.JobIsRunning; import org.jboss.reddeer.eclipse.condition.ConsoleHasNoChange; import org.jboss.reddeer.eclipse.ui.views.properties.PropertiesView; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.spotify.docker.client.DockerClient; /** * * @author jkopriva@redhat.com * */ public class LinkContainersTest extends AbstractImageBotTest { private static final String IMAGE_ALPINE_CURL = "byrnedo/alpine-curl"; private static final String CONTAINER_NAME_HTTP_SERVER = "test_run_httpd"; private static final String CONTAINER_NAME_CLIENT_ALPINE = "test_connect_httpd"; @Before public void before() { deleteAllConnections(); getConnection(); pullImage(IMAGE_ALPINE_CURL); pullImage(IMAGE_UHTTPD); } private ImageRunSelectionPage openImageRunSelectionPage(String containerName, boolean publishAllExposedPorts) { ImageRunSelectionPage page = new ImageRunSelectionPage(); page.setContainerName(containerName); page.setPublishAllExposedPorts(publishAllExposedPorts); return page; } @Test public void testLinkContainers() { runUhttpServer(IMAGE_UHTTPD, CONTAINER_NAME_HTTP_SERVER); runAlpineLinux(IMAGE_ALPINE_CURL, CONTAINER_NAME_CLIENT_ALPINE); } public void runUhttpServer(String imageName, String containerName) { DockerImagesTab imagesTab = openDockerImagesTab(); imagesTab.runImage(imageName); ImageRunSelectionPage firstPage = openImageRunSelectionPage(containerName, false); firstPage.setContainerName(containerName); firstPage.setPublishAllExposedPorts(false); firstPage.finish(); if (mockitoIsUsed()) { mockServerContainer(); new WaitUntil(new ContainerIsDeployedCondition(containerName, getConnection())); } else { new WaitWhile(new JobIsRunning()); new WaitWhile(new ConsoleHasNoChange()); } } public void runAlpineLinux(String imageName, String containerName) { String serverAddress = getHttpServerAddress(CONTAINER_NAME_HTTP_SERVER); DockerImagesTab imagesTab = openDockerImagesTab(); imagesTab.runImage(imageName); ImageRunSelectionPage firstPage = openImageRunSelectionPage(containerName, false); firstPage.setContainerName(containerName); firstPage.setCommand(serverAddress + ":80"); firstPage.addLinkToContainer(CONTAINER_NAME_HTTP_SERVER, "http_server"); firstPage.setPublishAllExposedPorts(false); firstPage.setAllocatePseudoTTY(); firstPage.setKeepSTDINOpen(); firstPage.finish(); new WaitWhile(new JobIsRunning()); DockerTerminal dt = new DockerTerminal(); dt.open(); if (mockitoIsUsed()) { mockServerContainer(); dt = MockDockerTerminal.setText("text").build(); } String terminalText = dt.getTextFromPage("/" + containerName); assertTrue("No output from terminal!", !terminalText.isEmpty()); assertTrue("Containers are not linked!", !terminalText.contains("Connection refused")); } private String getHttpServerAddress(String containerName) { PropertiesView propertiesView = new PropertiesView(); propertiesView.open(); getConnection().getContainer(containerName).select(); propertiesView.selectTab("Inspect"); return propertiesView.getProperty("NetworkSettings", "IPAddress").getPropertyValue(); } @After public void after() { deleteContainerIfExists(CONTAINER_NAME_CLIENT_ALPINE); deleteContainerIfExists(CONTAINER_NAME_HTTP_SERVER); deleteImageIfExists(IMAGE_ALPINE_CURL); } private void mockServerContainer() { final DockerClient client = MockDockerClientFactory .container(MockContainerFactory.name(CONTAINER_NAME_HTTP_SERVER).status("Stopped").build(), MockContainerInfoFactory.link(IMAGE_ALPINE).privilegedMode(true).id("TestServerTestServer") .ipAddress("127.0.0.1").build()) .image(MockImageFactory.id("1a2b3c4d5e6f7g").name(IMAGE_UHTTPD + ":" + IMAGE_TAG_LATEST).build()) .image(MockImageFactory.id("1a2b3c4d5e6f7g").name(IMAGE_ALPINE_CURL + ":" + IMAGE_TAG_LATEST).build()) .build(); final org.eclipse.linuxtools.internal.docker.core.DockerConnection dockerConnection = MockDockerConnectionFactory .from(DEFAULT_CONNECTION_NAME, client).withDefaultTCPConnectionSettings(); MockDockerConnectionManager.configureConnectionManager(dockerConnection); } }