/******************************************************************************* * Copyright (c) 2006-2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. * * Gluster Management Console is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * Gluster Management Console is distributed in the hope that it * will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR * PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ package org.gluster.storage.management.console.actions; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.gluster.storage.management.client.GlusterServersClient; import org.gluster.storage.management.console.GlusterDataModelManager; import org.gluster.storage.management.console.utils.GUIHelper; import org.gluster.storage.management.console.utils.GlusterLogger; import org.gluster.storage.management.core.constants.CoreConstants; import org.gluster.storage.management.core.model.GlusterServer; public class RemoveServerAction extends AbstractMonitoredActionDelegate { private static final GlusterLogger logger = GlusterLogger.getInstance(); private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); private GUIHelper guiHelper = GUIHelper.getInstance(); @Override protected void performAction(final IAction action, IProgressMonitor monitor) { final String actionDesc = action.getDescription(); Set<GlusterServer> selectedServers = guiHelper.getSelectedEntities(getWindow(), GlusterServer.class); if (!validate(action, selectedServers)) { return; } boolean confirmed = showConfirmDialog(actionDesc, "Are you sure you want to remove the server(s) " + selectedServers + " ?"); if (!confirmed) { return; } Set<GlusterServer> successServers = new HashSet<GlusterServer>(); String errMsg = ""; monitor.beginTask("Removing Selected Servers...", selectedServers.size()); for (GlusterServer server : selectedServers) { monitor.setTaskName("Removing server [" + server.getName() + "]..."); GlusterServersClient client = new GlusterServersClient(); try { client.removeServer(server.getName()); GlusterServer glusterServer = server; modelManager.removeGlusterServer(glusterServer); successServers.add(server); } catch (Exception e) { if (!serverExists(server.getName())) { modelManager.removeGlusterServer(server); } errMsg += "[" + server.getName() + "] : " + e.getMessage() + CoreConstants.NEWLINE; } monitor.worked(1); } monitor.done(); showStatusMessage(action.getDescription(), selectedServers, successServers, errMsg); } private Boolean serverExists(String serverName) { try { GlusterServersClient client = new GlusterServersClient(); GlusterServer server = client.getGlusterServer(serverName); return (server != null && server.getName().length() > 0); } catch (Exception e) { logger.error("Error while getting server info", e); return false; } } private void showStatusMessage(String dialogTitle, Set<GlusterServer> selectedServers, Set<GlusterServer> successServers, String errMsg) { if (successServers.size() == selectedServers.size()) { if(selectedServers.size() == 1) { showInfoDialog(dialogTitle, "Server [" + selectedServers.iterator().next() + "] removed successfully!"); } else { showInfoDialog(dialogTitle, "Following servers removed successfully: " + CoreConstants.NEWLINE + selectedServers + CoreConstants.NEWLINE + errMsg); } return; } if (successServers.size() == 0) { errMsg = "Server Removal Failed! Error(s):" + CoreConstants.NEWLINE + errMsg; } else { errMsg = "Following servers removed successfully : " + CoreConstants.NEWLINE + successServers + CoreConstants.NEWLINE + "Following errors occurred on other selected servers: " + CoreConstants.NEWLINE + errMsg; } showErrorDialog(dialogTitle, errMsg); } private boolean validate(IAction action, Set<GlusterServer> selectedServers) { Map<GlusterServer, List<String>> usedServers = new HashMap<GlusterServer, List<String>>(); for (GlusterServer server : selectedServers) { List<String> configuredVolumes = modelManager.getVolumesOfServer(server.getName()); if (configuredVolumes.size() > 0) { usedServers.put(server, configuredVolumes); } } if (usedServers.size() > 0) { if (usedServers.size() == 1) { showErrorDialog(action.getDescription(), "Server [" + usedServers.keySet().iterator().next() + "] cannot be removed as it is being used by volume(s): " + CoreConstants.NEWLINE + usedServers.values().iterator().next() ); } else { String serverList = ""; for (Entry<GlusterServer, List<String>> entry : usedServers.entrySet()) { serverList += entry.getKey() + " -> " + entry.getValue() + CoreConstants.NEWLINE; } showErrorDialog(action.getDescription(), "Following servers cannot be removed as they are being used by volume(s): " + CoreConstants.NEWLINE + serverList ); } return false; } return true; } public void dispose() { } @Override public void selectionChanged(IAction action, ISelection selection) { Set<GlusterServer> selectedServers = GUIHelper.getInstance().getSelectedEntities(getWindow(), GlusterServer.class); if(selectedServers == null || selectedServers.isEmpty()) { action.setEnabled(false); } else { action.setEnabled(true); } } }