| /******************************************************************************* |
| * 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.reddeer.ui; |
| |
| import static org.junit.Assert.assertFalse; |
| import static org.junit.Assert.assertTrue; |
| |
| import org.eclipse.linuxtools.docker.reddeer.core.ui.wizards.ImageSearchPage; |
| import org.eclipse.linuxtools.docker.reddeer.core.ui.wizards.ImageTagSelectionPage; |
| import org.eclipse.linuxtools.docker.reddeer.perspective.DockerPerspective; |
| import org.jboss.reddeer.common.wait.TimePeriod; |
| 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.core.condition.ProgressInformationShellIsActive; |
| import org.jboss.reddeer.core.condition.ShellWithTextIsAvailable; |
| import org.jboss.reddeer.eclipse.debug.ui.launchConfigurations.LaunchConfiguration; |
| import org.jboss.reddeer.eclipse.exception.EclipseLayerException; |
| import org.jboss.reddeer.swt.api.Table; |
| import org.jboss.reddeer.swt.impl.button.CheckBox; |
| import org.jboss.reddeer.swt.impl.button.OkButton; |
| import org.jboss.reddeer.swt.impl.button.PushButton; |
| import org.jboss.reddeer.swt.impl.button.RadioButton; |
| import org.jboss.reddeer.swt.impl.combo.DefaultCombo; |
| import org.jboss.reddeer.swt.impl.combo.LabeledCombo; |
| import org.jboss.reddeer.swt.impl.ctab.DefaultCTabItem; |
| import org.jboss.reddeer.swt.impl.menu.ShellMenu; |
| import org.jboss.reddeer.swt.impl.shell.DefaultShell; |
| import org.jboss.reddeer.swt.impl.table.DefaultTable; |
| import org.jboss.reddeer.swt.impl.text.LabeledText; |
| import org.jboss.reddeer.swt.impl.toolbar.DefaultToolItem; |
| import org.jboss.reddeer.swt.impl.tree.DefaultTreeItem; |
| |
| /** |
| * |
| * @author jkopriva@redhat.com |
| * |
| */ |
| |
| public class RunDockerImageLaunchConfiguration extends LaunchConfiguration { |
| |
| private static final String MAIN_TAB_LABEL = "Main"; |
| private static final String VOLUMES_TAB_LABEL = "Volumes"; |
| private static final String PORTS_TAB_LABEL = "Ports"; |
| private static final String LINKS_TAB_LABEL = "Links"; |
| private static final String ENVIRONMENT_TAB_LABEL = "Environment"; |
| private static final String LABELS_TAB_LABEL = "Labels"; |
| private static final String RESOURCES_TAB_LABEL = "Resources"; |
| private static final String DELETE_LAUNCH_CONFIGURATION_LABEL = "Delete selected launch configuration(s)"; |
| |
| public RunDockerImageLaunchConfiguration() { |
| super("Run Docker Image"); |
| } |
| |
| /** |
| * Opens Run configuration dialog |
| */ |
| public void open() { |
| DockerPerspective p = new DockerPerspective(); |
| p.open(); |
| new ShellMenu("Run", "Run Configurations...").select(); |
| new WaitUntil(new ShellWithTextIsAvailable("Run Configurations")); |
| } |
| |
| /** |
| * Creates new Docker launch configuration |
| */ |
| public void createNewConfiguration(String configurationName) { |
| new DefaultTreeItem("Run Docker Image").select(); |
| new DefaultToolItem("New launch configuration").click(); |
| setName(configurationName); |
| } |
| |
| /** |
| * Select configuration name |
| * |
| * @param confName |
| * configuration name |
| */ |
| public void selectConfiguration(String confName) { |
| new DefaultTreeItem("Run Docker Image", confName).select(); |
| } |
| |
| private void addValueInTable(String tabName, String shellName, String newValueName, String newValue) { |
| selectTab(tabName); |
| new PushButton("Add...").click(); |
| new WaitUntil(new ShellWithTextIsAvailable(shellName)); |
| new LabeledText("Name:").setText(newValueName); |
| new LabeledText("Value:").setText(newValue); |
| new OkButton().click(); |
| } |
| |
| private void editValueInTable(String tabName, String shellName, String oldValueName, String newValueName, |
| String newValue) { |
| selectTab(tabName); |
| if (selectItemInTable(oldValueName)) { |
| new PushButton("Edit..."); |
| new WaitWhile(new ShellWithTextIsAvailable(shellName)); |
| new LabeledText("Name:").setText(newValueName); |
| new LabeledText("Value:").setText(newValue); |
| new OkButton().click(); |
| } else { |
| throw new EclipseLayerException("There is no " + oldValueName + " in table on tab " + tabName); |
| } |
| } |
| |
| private void removeValueInTable(String tabName, String valueName) { |
| selectTab(LABELS_TAB_LABEL); |
| if (selectItemInTable(valueName)) { |
| new PushButton("Remove").click(); |
| } else { |
| throw new EclipseLayerException("There is no " + valueName + " in table on tab " + tabName); |
| } |
| } |
| |
| public void setConfigurationName(String configurationName) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledText("Name:").setText(configurationName); |
| } |
| |
| // Main tab |
| public void selectConnection(String connectionName) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledCombo("Connection:").setSelection(connectionName); |
| } |
| |
| public void selectImage(String imageName) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledCombo("Image:").setSelection(imageName); |
| } |
| |
| public void searchImage(String imageName, String tag) { |
| selectTab(MAIN_TAB_LABEL); |
| new PushButton("Search..."); |
| ImageSearchPage pageOne = new ImageSearchPage(); |
| pageOne.searchImage(imageName); |
| pageOne.next(); |
| new WaitWhile(new ProgressInformationShellIsActive(), TimePeriod.NORMAL); |
| ImageTagSelectionPage pageTwo = new ImageTagSelectionPage(); |
| assertFalse("Search tags are empty!", pageTwo.getTags().isEmpty()); |
| new WaitWhile(new JobIsRunning(), TimePeriod.NORMAL); |
| assertTrue("Search results do not contains tag:" + tag + "!", pageTwo.tagsContains(tag)); |
| pageTwo.selectTag(tag); |
| pageTwo.finish(); |
| new DefaultShell("Pull Image"); |
| new PushButton("Finish").click(); |
| new WaitWhile(new JobIsRunning(), TimePeriod.VERY_LONG); |
| } |
| |
| public void setContainerName(String containerName) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledText("Container Name:").setText(containerName); |
| } |
| |
| public void setEntrypoint(String entrypoint) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledText("Entrypoint:").setText(entrypoint); |
| } |
| |
| public void setCommand(String command) { |
| selectTab(MAIN_TAB_LABEL); |
| new LabeledText("Command:").setText(command); |
| } |
| |
| public void setKeepSTDINopentoConsoleevenifnotattachedi(boolean checked) { |
| selectTab(MAIN_TAB_LABEL); |
| new CheckBox("Keep STDIN open to Console even if not attached (-i)").toggle(checked); |
| } |
| |
| public void setAllocatepseudoTTYfromConsolet(boolean checked) { |
| selectTab(MAIN_TAB_LABEL); |
| new CheckBox("Allocate pseudo-TTY from Console (-t)").toggle(checked); |
| } |
| |
| public void setRemoveContainerOnExit(boolean checked) { |
| selectTab(MAIN_TAB_LABEL); |
| new CheckBox("Automatically remove the container when it exits (--rm)").toggle(checked); |
| } |
| |
| public void setPrivilegedMode(boolean checked) { |
| selectTab(MAIN_TAB_LABEL); |
| new CheckBox("Give extended privileges to this container (--privileged)").toggle(checked); |
| } |
| |
| // volumes tab |
| public void removeVolume(String valueName) { |
| removeValueInTable(VOLUMES_TAB_LABEL, valueName); |
| } |
| |
| public void addDataVolumeNoExternalMount(String containerPath) { |
| selectTab(VOLUMES_TAB_LABEL); |
| new PushButton("Add..").click(); |
| new LabeledText("Container path:").setText(containerPath); |
| new RadioButton("No external mount").click(); |
| new OkButton().click(); |
| } |
| |
| public void addDataVolumeToHost(String containerPath, String path) { |
| addDataVolumeToHost(containerPath, path, false); |
| } |
| |
| public void addDataVolumeToHost(String containerPath, String path, boolean readOnly) { |
| selectTab(VOLUMES_TAB_LABEL); |
| new PushButton("Add...").click(); |
| new LabeledText("Container path:").setText(containerPath); |
| new RadioButton("Mount a host directory or host file").click(); |
| new LabeledText("Path:").setText(path); |
| new CheckBox("Read-only access").toggle(readOnly); |
| new OkButton().click(); |
| } |
| |
| public void addDataVolumeToContainer(String containerPath, String containerName) { |
| selectTab(VOLUMES_TAB_LABEL); |
| new PushButton("Add...").click(); |
| new LabeledText("Container path:").setText(containerPath); |
| new RadioButton("Mount a data volume container").click(); |
| new DefaultCombo("Container").setText(containerName); |
| new OkButton().click(); |
| } |
| |
| // ports tab |
| public void setPublishAllExposedPortsToRandomPorts(boolean checked) { |
| new CheckBox("Publish all exposed ports to random ports on the host interfaces").toggle(checked); |
| } |
| |
| public void addPort(String containerPort, String hostAddress, String hostPort) { |
| selectTab(PORTS_TAB_LABEL); |
| setPublishAllExposedPortsToRandomPorts(false); |
| new PushButton("Add...").click(); |
| new WaitUntil(new ShellWithTextIsAvailable("Exposing a Container Port")); |
| new LabeledText("Container port:").setText(containerPort); |
| new LabeledText("Host address:").setText(hostAddress); |
| new LabeledText("Host port:").setText(hostPort); |
| new OkButton().click(); |
| } |
| |
| public void editPort(String oldContainerPort, String newContainerPort, String newHostAddress, String newHostPort) { |
| selectTab(PORTS_TAB_LABEL); |
| setPublishAllExposedPortsToRandomPorts(false); |
| if (selectItemInTable(oldContainerPort)) { |
| new PushButton("Edit..."); |
| new WaitUntil(new ShellWithTextIsAvailable("Exposing a Container Port")); |
| new LabeledText("Container port:").setText(newContainerPort); |
| new LabeledText("Host address:").setText(newHostAddress); |
| new LabeledText("Host port:").setText(newHostPort); |
| new OkButton().click(); |
| } else { |
| throw new EclipseLayerException("There is no " + oldContainerPort + " in table on tab " + PORTS_TAB_LABEL); |
| } |
| } |
| |
| public void removePort(String valueName) { |
| setPublishAllExposedPortsToRandomPorts(false); |
| removeValueInTable(PORTS_TAB_LABEL, valueName); |
| } |
| |
| // links tab |
| public void addLink(String containerName, String alias) { |
| selectTab(LINKS_TAB_LABEL); |
| new PushButton("Add...").click(); |
| new WaitWhile(new ShellWithTextIsAvailable("Container Linking")); |
| new LabeledText("Container:").setText(containerName); |
| new LabeledText("Value:").setText(alias); |
| new OkButton().click(); |
| } |
| |
| public void editLink(String oldContainer, String newContainer, String newAlias) { |
| selectTab(LINKS_TAB_LABEL); |
| if (selectItemInTable(oldContainer)) { |
| new PushButton("Edit...").click(); |
| new WaitWhile(new ShellWithTextIsAvailable("Container Linking")); |
| new LabeledText("Container:").setText(newContainer); |
| new LabeledText("Value:").setText(newAlias); |
| new OkButton().click(); |
| } else { |
| throw new EclipseLayerException("There is no " + oldContainer + " in table on tab " + LINKS_TAB_LABEL); |
| } |
| } |
| |
| public void removeLink(String linkName) { |
| removeValueInTable(LINKS_TAB_LABEL, linkName); |
| } |
| |
| // environment tab |
| public void addEnvironmentVariable(String variableName, String variableValue) { |
| addValueInTable(ENVIRONMENT_TAB_LABEL, "Environment Variable", variableName, variableValue); |
| } |
| |
| public void editEnvironmentVariable(String oldVariable, String newVariable, String newValue) { |
| editValueInTable(ENVIRONMENT_TAB_LABEL, "Environment Variable", oldVariable, newVariable, newValue); |
| } |
| |
| public void removeEnvironmentVariable(String variableName) { |
| removeValueInTable(ENVIRONMENT_TAB_LABEL, variableName); |
| } |
| |
| // labels tab |
| public void addLabel(String name, String value) { |
| addValueInTable(LABELS_TAB_LABEL, "Label", name, value); |
| } |
| |
| public void removeLabel(String label) { |
| removeValueInTable(LABELS_TAB_LABEL, label); |
| } |
| |
| public void editLabel(String label, String newName, String newValue) { |
| editValueInTable(LABELS_TAB_LABEL, "Label", label, newName, newValue); |
| } |
| |
| // resources tab |
| public void setHigh() { |
| setEnableResourceLimitations(true); |
| new RadioButton("High").click(); |
| } |
| |
| public void setMedium() { |
| setEnableResourceLimitations(true); |
| new RadioButton("Medium").click(); |
| } |
| |
| public void setLow() { |
| setEnableResourceLimitations(true); |
| new RadioButton("Low").click(); |
| } |
| |
| public void setEnableResourceLimitations(boolean check) { |
| selectTab(RESOURCES_TAB_LABEL); |
| new CheckBox("Enable resource limitations").toggle(check); |
| } |
| |
| public void setMemoryLimit(String memoryLimit) { |
| selectTab(RESOURCES_TAB_LABEL); |
| new CheckBox("Enable resource limitations").toggle(true); |
| new LabeledText("Memory limit:").setText(memoryLimit); |
| } |
| |
| public String getMemoryLimit() { |
| selectTab(RESOURCES_TAB_LABEL); |
| new CheckBox("Enable resource limitations").toggle(true); |
| return new LabeledText("Memory limit:").getText(); |
| } |
| |
| /** |
| * Selects tab with a given label. |
| * |
| * @param label |
| * Label |
| * @return |
| */ |
| public DefaultCTabItem selectTab(String label) { |
| DefaultCTabItem tab = new DefaultCTabItem(label); |
| tab.activate(); |
| return tab; |
| } |
| |
| private boolean selectItemInTable(String itemName) { |
| Table table = new DefaultTable(); |
| if (table.containsItem(itemName)) { |
| table.select(itemName); |
| return true; |
| } else { |
| return false; |
| } |
| } |
| |
| public void deleteRunConfiguration(String configuratioName) { |
| selectConfiguration(configuratioName); |
| new DefaultToolItem(DELETE_LAUNCH_CONFIGURATION_LABEL).click(); |
| new WaitUntil(new ShellWithTextIsAvailable("Confirm Launch Configuration Deletion")); |
| new PushButton("Yes").click(); |
| new WaitUntil(new ShellWithTextIsAvailable("Run Configurations")); |
| } |
| |
| public void runConfiguration(String configurationName) { |
| selectConfiguration(configurationName); |
| new PushButton("Run").click(); |
| } |
| |
| public void close() { |
| new PushButton("Close").click(); |
| } |
| |
| } |