/******************************************************************************* * 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.image; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.util.List; import org.eclipse.linuxtools.docker.integration.tests.AbstractDockerBotTest; import org.eclipse.linuxtools.docker.integration.tests.mock.MockUtils; import org.eclipse.linuxtools.docker.reddeer.condition.ContainerIsDeployedCondition; import org.eclipse.linuxtools.docker.reddeer.preferences.RegistryAccountsPreferencePage; import org.eclipse.linuxtools.docker.reddeer.ui.DockerImagesTab; import org.eclipse.linuxtools.docker.reddeer.ui.resources.DockerImage; import org.jboss.reddeer.common.exception.RedDeerException; import org.jboss.reddeer.common.exception.WaitTimeoutExpiredException; import org.jboss.reddeer.common.wait.TimePeriod; 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.console.ConsoleView; import org.jboss.reddeer.eclipse.ui.views.properties.PropertiesView; import org.jboss.reddeer.jface.preference.PreferenceDialog; import org.jboss.reddeer.swt.exception.SWTLayerException; import org.jboss.reddeer.swt.impl.button.OkButton; import org.jboss.reddeer.swt.impl.shell.DefaultShell; import org.jboss.reddeer.workbench.ui.dialogs.WorkbenchPreferenceDialog; import org.junit.After; /** * A base class tests that build docker images * * @author adietish@redhat.com */ public class AbstractImageBotTest extends AbstractDockerBotTest { protected static final String NAME_TAG_SEPARATOR = ":"; protected static final String IMAGE_TAG_LATEST = "latest"; protected static final String IMAGE_TEST_BUILD = "test_build"; protected static final String IMAGE_BUSYBOX = "busybox"; protected static final String IMAGE_BUSYBOX_LATEST = IMAGE_BUSYBOX + NAME_TAG_SEPARATOR + IMAGE_TAG_LATEST; protected static final String IMAGE_ALPINE = "alpine"; protected static final String IMAGE_ALPINE_TAG = "3.3"; protected static final String IMAGE_ALPINE_33 = IMAGE_ALPINE + NAME_TAG_SEPARATOR + IMAGE_ALPINE_TAG; protected static final String IMAGE_CIRROS = "cirros"; protected static final String IMAGE_CIRROS_TAG = "0.3.4"; protected static final String IMAGE_UHTTPD = "fnichol/uhttpd"; protected static final String IMAGE_HELLO_WORLD = "hello-world"; protected static final String REGISTRY_SERVER_ADDRESS = "registry.access.redhat.com"; protected static final String IMAGE_RHEL = "rhel7.2"; protected static final String DOCKERFILE_FOLDER = "resources/test-build"; protected static final String REGISTRY_URL = "https://index.docker.io"; private static final String CONSOLE_SUCCESS_MSG = "Successfully built"; protected static final String MOCKITO = System.getProperty(SYSPROP_MOCKITO); @After public void after() { cleanUpWorkspace(); } protected DockerImagesTab openDockerImagesTab() { DockerImagesTab imageTab = new DockerImagesTab(); imageTab.activate(); imageTab.refresh(); new WaitWhile(new JobIsRunning(), TimePeriod.NORMAL); return imageTab; } protected void buildImage(String imageName, String dockerFileFolder, DockerImagesTab imageTab) { try { String dockerFilePath = new File(dockerFileFolder).getCanonicalPath(); getConnection(); imageTab.buildImage(imageName, dockerFilePath); new WaitWhile(new JobIsRunning(), TimePeriod.VERY_LONG); } catch (IOException ex) { fail("Resource file not found!"); } } protected void assertConsoleSuccess() { assertConsoleContains(CONSOLE_SUCCESS_MSG); } protected void assertConsoleContains(String text) { new WaitWhile(new ConsoleHasNoChange()); ConsoleView consoleView = new ConsoleView(); consoleView.open(); if (mockitoIsUsed()) { consoleView = MockUtils.getConsoleViewText(text); } assertFalse("Console has no output!", consoleView.getConsoleText().isEmpty()); assertTrue("Build has not been successful", consoleView.getConsoleText().contains(text)); } protected void setUpRegister(String serverAddress, String email, String userName, String password) { PreferenceDialog dialog = new WorkbenchPreferenceDialog(); RegistryAccountsPreferencePage page = new RegistryAccountsPreferencePage(); dialog.open(); dialog.select(page); page.removeRegistry(serverAddress); page.addRegistry(serverAddress, email, userName, password); try { new DefaultShell("New Registry Account").setFocus(); } catch (SWTLayerException e) { new DefaultShell("Preferences").setFocus(); } new OkButton().click(); } protected void deleteRegister(String serverAddress) { PreferenceDialog dialog = new WorkbenchPreferenceDialog(); RegistryAccountsPreferencePage page = new RegistryAccountsPreferencePage(); dialog.open(); dialog.select(page); page.removeRegistry(serverAddress); new WaitWhile(new JobIsRunning()); new OkButton().click(); } protected void deleteRegisterIfExists(String serverAddress) { try { deleteRegister(serverAddress); } catch (RedDeerException e) { // swallow intentionally } } protected void pullImage(String imageName) { pullImage(imageName, null, null); } protected void pullImage(String imageName, String imageTag) { pullImage(imageName, imageTag, null); } protected void pullImage(String imageName, String imageTag, String dockerRegister) { if (mockitoIsUsed()) { MockUtils.pullImage(DEFAULT_CONNECTION_NAME, imageName, imageTag == null ? "latest" : imageTag); } else { try { getConnection().pullImage(imageName, imageTag, dockerRegister); } catch (WaitTimeoutExpiredException ex) { killRunningImageJobs(); fail("Timeout expired when pulling image:" + imageName + (imageTag == null ? "" : ":" + imageTag) + "!"); } } } protected String getCompleteImageName(String imageName) { for (String image : getConnection().getImagesNames()) { if (image.contains(imageName)) { imageName = image.replace(":", ""); } } return imageName; } protected void deleteImageIfExists(String imageName) { deleteImageIfExists(imageName, IMAGE_TAG_LATEST); } protected void deleteImageIfExists(String imageName, String imageTag) { String name = getCompleteImageName(imageName); if (imageIsDeployed(name + NAME_TAG_SEPARATOR + imageTag)) { if (mockitoIsUsed()) { MockUtils.removeImage(DEFAULT_CONNECTION_NAME, imageName, imageTag); } else { getConnection().getImage(name, imageTag).remove(); } } } protected void deleteImage(String imageName) { deleteImage(imageName, IMAGE_TAG_LATEST); } protected void deleteImage(String imageName, String imageTag) { if (mockitoIsUsed()) { MockUtils.removeImage(DEFAULT_CONNECTION_NAME, imageName, imageTag); return; } String completeImageName = getCompleteImageName(imageName); DockerImage image = getConnection().getImage(completeImageName, imageTag); if (image == null) { fail("Image " + imageName + ":" + imageTag + "(" + completeImageName + ":" + imageTag + ")" + " does not exists!"); } image.remove(); } protected void deleteImages(List<String> images) { for (String image : images) { deleteImage(image); } } protected boolean imageIsDeployed(String imageName) { return getConnection().imageIsDeployed(imageName); } protected int deployedImagesCount(String imageName) { return getConnection().deployedImagesCount(imageName); } protected boolean containerIsDeployed(String containerName) { return getConnection().containerIsDeployed(containerName); } protected void deleteContainerIfExists(String containerName) { if (containerIsDeployed(containerName)) { getConnection().getContainer(containerName).remove(); if (!mockitoIsUsed()) { new WaitWhile(new ContainerIsDeployedCondition(containerName, getConnection())); } } } protected void deleteContainer(String containerName) { if (!containerIsDeployed(containerName)) { fail("Container " + containerName + " does not exists!"); } getConnection().getContainer(containerName).remove(); if (!mockitoIsUsed()) { new WaitWhile(new ContainerIsDeployedCondition(containerName, getConnection())); } } /** * Deletes the given images. Image names may be provided with tag (ex. * "alpine:3.3"). Also kills all jobs that are still running. * * @param the * names of the image that will be deleted */ protected void deleteImageContainerAfter(String... imageContainerNames) { killRunningImageJobs(); deleteImageContainer(imageContainerNames); } /** * Deletes the given images. Image names may be provided with tag (ex. * "alpine:3.3"). * * @param the * names of the image that will be deleted */ protected void deleteImageContainer(String... imageContainerNames) { for (String imageContainerName : imageContainerNames) { String[] nameAndTag = imageContainerName.split(":"); if (imageIsDeployed(imageContainerName)) { if (nameAndTag.length == 1) { deleteImage(imageContainerName); } else { deleteImage(nameAndTag[0], nameAndTag[1]); } } if (containerIsDeployed(imageContainerName)) { deleteContainer(imageContainerName); } } } protected String getContainerIP(String containerName) { PropertiesView propertiesView = openPropertiesTabForContainer("Inspect", containerName); return propertiesView.getProperty("NetworkSettings", "IPAddress").getPropertyValue(); } protected void addTagToImage(String imageName, String imageTag){ DockerImagesTab imagesTab = openDockerImagesTab(); imagesTab.activate(); if (mockitoIsUsed()) { MockUtils.pullImage(DEFAULT_CONNECTION_NAME, imageName, imageTag); } else { imagesTab.addTagToImage(imageName, imageTag); } } protected void removeTagFromImage(String imageName, String imageTagToRemove){ DockerImagesTab imagesTab = openDockerImagesTab(); imagesTab.activate(); if (mockitoIsUsed()) { MockUtils.pullImage(DEFAULT_CONNECTION_NAME, imageName, IMAGE_TAG_LATEST); } else { imagesTab.removeTagFromImage(imageName, imageTagToRemove); } } }