/******************************************************************************* * 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.resources; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.eclipse.linuxtools.docker.reddeer.ui.AbstractDockerExplorerItem; 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.ShellWithTextIsAvailable; import org.jboss.reddeer.jface.exception.JFaceLayerException; import org.jboss.reddeer.swt.api.Combo; import org.jboss.reddeer.swt.api.Shell; import org.jboss.reddeer.swt.api.TreeItem; import org.jboss.reddeer.swt.condition.ShellIsAvailable; import org.jboss.reddeer.swt.condition.WidgetIsEnabled; import org.jboss.reddeer.swt.impl.button.FinishButton; import org.jboss.reddeer.swt.impl.button.PushButton; import org.jboss.reddeer.swt.impl.combo.DefaultCombo; import org.jboss.reddeer.swt.impl.menu.ContextMenu; import org.jboss.reddeer.swt.impl.shell.DefaultShell; import org.jboss.reddeer.swt.impl.text.LabeledText; import org.jboss.reddeer.swt.impl.toolbar.DefaultToolItem; /** * * @author jkopriva@redhat.com, mlabuda@redhat.com * */ public class DockerConnection extends AbstractDockerExplorerItem { // image name label in dialog private static final String IMAGE_NAME_LABEL_DIALOG = "Image name:"; public DockerConnection(TreeItem treeItem) { super(treeItem); } public void enableConnection() { select(); new DefaultToolItem("Enable Connection").click(); new WaitWhile(new JobIsRunning()); } /** * Gets docker image with specified image name and latest tag. * * @param imageName * docker image name * @return tree item of docker image or null if does not exist */ public DockerImage getImage(String imageName) { return getImage(imageName, "latest"); } /** * Gets docker image with specified image name and specified tag. * * @param imageName * docker image name * @param tag * image tag * @return tree item of docker image or null if does not exist */ public DockerImage getImage(String imageName, String tag) { try { List<TreeItem> images = treeViewerHandler.getTreeItems(item, "Images", imageName + ":"); for (TreeItem item : images) { if (hasTag(tag, item)) { return new DockerImage(item); } } } catch (JFaceLayerException ex) { } return null; } private boolean hasTag(String tag, TreeItem item) { String[] styledTexts = treeViewerHandler.getStyledTexts(item); if (styledTexts == null || styledTexts.length == 0) { return false; } return StringUtils.contains(styledTexts[0].trim(), tag); } /** * Refresh images. */ public void refreshImages() { treeViewerHandler.getTreeItem(item, "Images").select(); new ContextMenu("Refresh").select(); new WaitWhile(new JobIsRunning()); } /** * Refresh containers. */ public void refreshContainers() { treeViewerHandler.getTreeItem(item, "Containers").select(); new ContextMenu("Refresh").select(); new WaitWhile(new JobIsRunning()); } /** * Refresh images and containers. */ public void refresh() { refreshImages(); refreshContainers(); } public void pullImage(String imageName) { pullImage(imageName, null, null); } /** * Pull docker image with specified name and tag. If tag is null, latest tag * is assumed. If image exists, nothing happens. * * @param imageName * name of docker image to pull * @param tag * tag of docker image to null */ public void pullImage(String imageName, String imageTag) { pullImage(imageName, imageTag, null); } public void pullImage(String imageName, String imageTag, String dockerRegister) { if (getImage(imageName, imageTag) == null) { refreshImages(); treeViewerHandler.getTreeItem(item, "Images").select(); new ContextMenu("Pull...").select(); new WaitUntil(new ShellWithTextIsAvailable("Pull Image"), TimePeriod.NORMAL); Shell pullShell = new DefaultShell("Pull Image"); // select register if (dockerRegister != null) { Combo combo = new DefaultCombo(); combo.setSelection(dockerRegister); } new LabeledText(IMAGE_NAME_LABEL_DIALOG).setFocus(); new LabeledText(IMAGE_NAME_LABEL_DIALOG).setText(imageTag == null ? imageName : imageName + ":" + imageTag); new WaitUntil(new WidgetIsEnabled(new FinishButton())); new FinishButton().click(); new WaitWhile(new ShellIsAvailable(pullShell)); new WaitWhile(new JobIsRunning(), TimePeriod.VERY_LONG); } } public void openImageSearchDialog(String imageName, String imageTag, String dockerRegister) { refreshImages(); treeViewerHandler.getTreeItem(item, "Images").select(); new ContextMenu("Pull...").select(); new WaitUntil(new ShellWithTextIsAvailable("Pull Image"), TimePeriod.NORMAL); // select register if (dockerRegister != null) { Combo combo = new DefaultCombo(); combo.setSelection(dockerRegister); } new LabeledText(IMAGE_NAME_LABEL_DIALOG).setFocus(); new LabeledText(IMAGE_NAME_LABEL_DIALOG).setText(imageTag == null ? imageName : imageName + ":" + imageTag); new PushButton("Search...").click(); } public boolean imageIsDeployed(String imageName) { return deployedImagesCount(imageName) >= 1; } public int deployedImagesCount(String imageName) { int count = 0; select(); List<String> imagesNames = getImagesNames(true); for (String imageNameFromList : imagesNames) { if (imageNameFromList.contains(imageName)) { count++; } } return count; } public boolean containerIsDeployed(String containerName) { return getContainer(containerName) != null; } public void removeConnection() { select(); new DefaultToolItem("Remove Connection").click(); new WaitWhile(new JobIsRunning()); } public DockerContainer getContainer(String containerName) { try { List<TreeItem> containers = treeViewerHandler.getTreeItems(item, "Containers", containerName); return new DockerContainer(containers.get(0)); } catch (JFaceLayerException ex) { // Container does not exist. return null; } } /** * Returns all the names of all image, without the tag. * * @return */ public List<String> getImagesNames() { return getImagesNames(false); } public List<String> getImagesNames(boolean withTag) { select(); List<String> imagesNames = new ArrayList<String>(); List<TreeItem> images = treeViewerHandler.getTreeItem(item, "Images").getItems(); for (TreeItem item : images) { String imageName = treeViewerHandler.getNonStyledText(item); if (withTag) { String imageTag = getImageTag(item); imagesNames.add(imageName + imageTag); } else { imagesNames.add(imageName); } } return imagesNames; } private String getImageTag(TreeItem item) { String[] styledTexts = treeViewerHandler.getStyledTexts(item); if (styledTexts == null || styledTexts.length == 0) { return null; } return styledTexts[0]; } public List<String> getContainersNames() { select(); List<String> containersNames = new ArrayList<String>(); List<TreeItem> containers = treeViewerHandler.getTreeItem(item, "Containers").getItems(); for (TreeItem item : containers) { containersNames.add(treeViewerHandler.getNonStyledText(item)); } return containersNames; } public String getName() { return treeViewerHandler.getNonStyledText(this.item); } }