summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.gui
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-06-07 21:38:15 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-06-07 21:38:15 +0530
commitccea7d5048c969a9c53de060b6e8bc3d883b7e32 (patch)
treedc052ab74db0114d8519e428df1bdaca04ee3f0e /src/com.gluster.storage.management.gui
parent6fb507e1e43552f877301cab678291fcbbc15308 (diff)
add/remove server
Diffstat (limited to 'src/com.gluster.storage.management.gui')
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java10
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java78
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java123
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java34
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java17
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java18
6 files changed, 228 insertions, 52 deletions
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
index 1c5a3c72..859d76db 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
@@ -18,6 +18,8 @@
*******************************************************************************/
package com.gluster.storage.management.gui.actions;
+import java.util.Set;
+
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
@@ -26,8 +28,10 @@ import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
+import org.eclipse.ui.internal.UIPlugin;
import com.gluster.storage.management.core.model.Entity;
+import com.gluster.storage.management.gui.utils.GUIHelper;
/**
* All action delegates in the application should extend from this class. It provides common functionality of grabbing
@@ -36,6 +40,8 @@ import com.gluster.storage.management.core.model.Entity;
*/
public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDelegate {
protected IWorkbenchWindow window;
+
+ // the latest selected entity
protected Entity selectedEntity;
@Override
@@ -79,6 +85,10 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe
}
return window.getShell();
}
+
+ protected IWorkbenchWindow getWindow() {
+ return window == null ? UIPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow() : window;
+ }
protected void showInfoDialog(final String title, final String message) {
MessageDialog.openInformation(getShell(), title, message);
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
index fa48670d..8be1c672 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
@@ -18,33 +18,87 @@
*******************************************************************************/
package com.gluster.storage.management.gui.actions;
+import java.util.HashSet;
+import java.util.Set;
+
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.GlusterServersClient;
+import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.model.Entity;
import com.gluster.storage.management.core.model.EntityGroup;
import com.gluster.storage.management.core.model.Server;
+import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.response.GlusterServerResponse;
+import com.gluster.storage.management.gui.utils.GUIHelper;
public class AddServerAction extends AbstractActionDelegate {
@Override
- protected void performAction(IAction action) {
- final String actionDesc = action.getDescription();
- GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
- GlusterServersClient glusterServersClient = new GlusterServersClient();
- Server server = (Server) selectedEntity;
- GlusterServerResponse response = glusterServersClient.addServer(server);
- if (response.getStatus().isSuccess()) {
- modelManager.removeDiscoveredServer(server);
- modelManager.addGlusterServer(response.getGlusterServer());
- showInfoDialog(actionDesc, "Server [" + server.getName() + "] added successfully!");
+ protected void performAction(final IAction action) {
+ Display.getDefault().asyncExec(new Runnable() {
+
+ @Override
+ public void run() {
+ GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
+ GlusterServersClient glusterServersClient = new GlusterServersClient();
+
+ Set<Server> selectedServers = GUIHelper.getInstance().getSelectedEntities(getWindow(), Server.class);
+ Set<Server> successServers = new HashSet<Server>();
+ Set<Server> partSuccessServers = new HashSet<Server>();
+ String errMsg = "";
+ String partErrMsg = "";
+ for (Server server : selectedServers) {
+ GlusterServerResponse response = glusterServersClient.addServer(server);
+ Status status = response.getStatus();
+ if (status.isSuccess()) {
+ modelManager.removeDiscoveredServer(server);
+ modelManager.addGlusterServer(response.getGlusterServer());
+ successServers.add(server);
+ } else if (status.isPartSuccess()) {
+ modelManager.removeDiscoveredServer(server);
+ modelManager.addGlusterServer(response.getGlusterServer());
+ partSuccessServers.add(server);
+ partErrMsg += "[" + server.getName() + "] : " + status;
+ } else {
+ errMsg += "[" + server.getName() + "] : " + status;
+ }
+ }
+
+ showStatusMessage(action.getDescription(), selectedServers, successServers, errMsg, partErrMsg);
+ }
+ });
+ }
+
+ private void showStatusMessage(String dialogTitle, Set<Server> selectedServers, Set<Server> successServers,
+ String errMsg, String partErrMsg) {
+ if (successServers.size() == selectedServers.size()) {
+ if (selectedServers.size() == 1) {
+ showInfoDialog(dialogTitle, "Server [" + selectedServers.iterator().next() + "] added successfully!");
+ } else {
+ showInfoDialog(dialogTitle, "Following servers added successfully!" + CoreConstants.NEWLINE
+ + selectedServers);
+ }
+ return;
+ }
+
+ String finalMsg = "";
+ if (successServers.size() == 0) {
+ finalMsg = "Server Addition Failed! Error(s):" + CoreConstants.NEWLINE + errMsg;
} else {
- showErrorDialog(actionDesc, "Server [" + server.getName() + " could not be added to cluster! Error: ["
- + response.getStatus().getMessage() + "]");
+ finalMsg = "Following servers added successfully : "
+ + CoreConstants.NEWLINE
+ + successServers
+ + (partErrMsg.isEmpty() ? "" : CoreConstants.NEWLINE
+ + "Following servers were added to cluster, but with some errors: " + CoreConstants.NEWLINE
+ + partErrMsg)
+ + (errMsg.isEmpty() ? "" : CoreConstants.NEWLINE
+ + "Following errors occurred on other selected servers: " + CoreConstants.NEWLINE + errMsg);
}
+ showErrorDialog(dialogTitle, finalMsg);
}
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
index b0b863ab..c7e437e8 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
@@ -19,57 +19,120 @@
package com.gluster.storage.management.gui.actions;
import java.util.ArrayList;
+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.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.GlusterServersClient;
+import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.model.Cluster;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
-import com.gluster.storage.management.core.utils.StringUtil;
+import com.gluster.storage.management.gui.utils.GUIHelper;
public class RemoveServerAction extends AbstractActionDelegate {
-
- private GlusterServer server;
private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
@Override
- protected void performAction(IAction action) {
- final String actionDesc = action.getDescription();
+ protected void performAction(final IAction action) {
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ final String actionDesc = action.getDescription();
- List<String> configuredVolumes = getServerVolumeNames(server.getName());
+ Set<GlusterServer> selectedServers = GUIHelper.getInstance().getSelectedEntities(getWindow(),
+ GlusterServer.class);
- if (configuredVolumes.size() > 0) {
- String volumes = StringUtil.ListToString(configuredVolumes, ", ");
- showErrorDialog(actionDesc, "Server cannot be removed as it is being used by following volumes: ["
- + volumes + "]");
- return;
- }
+ if (!validate(action, selectedServers)) {
+ return;
+ }
- boolean confirmed = showConfirmDialog(actionDesc,
- "Are you sure you want to remove this server [" + server.getName() + "] ?");
- if (!confirmed) {
+ 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 = "";
+ for (GlusterServer server : selectedServers) {
+ GlusterServersClient client = new GlusterServersClient();
+ Status status = client.removeServer(server.getName());
+ if (status.isSuccess()) {
+ GlusterServer glusterServer = (GlusterServer) server;
+ modelManager.removeGlusterServer(glusterServer);
+ successServers.add(server);
+ } else {
+ errMsg += "[" + server.getName() + "] : " + status;
+ }
+ }
+
+ showStatusMessage(action.getDescription(), selectedServers, successServers, errMsg);
+ }
+ });
+ }
+
+ 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);
+ }
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);
+ }
- GlusterServersClient client = new GlusterServersClient();
- Status status = client.removeServer(server.getName());
+ 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 = getServerVolumeNames(server.getName());
- if (status.isSuccess()) {
- showInfoDialog(actionDesc, "Server removed successfully");
- GlusterServer glusterServer = (GlusterServer) server;
- GlusterDataModelManager.getInstance().removeGlusterServer(glusterServer);
- } else {
- showErrorDialog(actionDesc, "Server could not be removed. Error: [" + status + "]");
+ 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;
}
private List<String> getServerVolumeNames(String serverName) {
- Cluster cluster = GlusterDataModelManager.getInstance().getModel().getCluster();
+ Cluster cluster = modelManager.getModel().getCluster();
List<String> volumeNames = new ArrayList<String>();
for (Volume volume : cluster.getVolumes()) {
for (String brick : volume.getDisks()) {
@@ -82,16 +145,6 @@ public class RemoveServerAction extends AbstractActionDelegate {
return volumeNames;
}
- @Override
public void dispose() {
- System.out.println("Disposing [" + this.getClass().getSimpleName() + "]");
- }
-
- @Override
- public void selectionChanged(IAction action, ISelection selection) {
- super.selectionChanged(action, selection);
- if (selectedEntity instanceof GlusterServer) {
- server = (GlusterServer) selectedEntity;
- }
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
index 09bd40d6..d08030be 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
@@ -18,7 +18,9 @@
*******************************************************************************/
package com.gluster.storage.management.gui.utils;
+import java.util.HashSet;
import java.util.Iterator;
+import java.util.Set;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
@@ -355,10 +357,12 @@ public class GUIHelper {
* Type of the selected object to look for
* @return The selected object of given type if found, else null
*/
+ @SuppressWarnings("rawtypes")
public Object getSelectedEntity(IWorkbenchSite site, Class expectedType) {
return getSelectedEntity(site.getWorkbenchWindow(), expectedType);
}
+ @SuppressWarnings({ "unchecked", "rawtypes" })
public Object getSelectedEntity(IWorkbenchWindow window, Class expectedType) {
ISelection selection = window.getSelectionService().getSelection(NavigationView.ID);
if (selection instanceof IStructuredSelection) {
@@ -372,6 +376,36 @@ public class GUIHelper {
}
return null;
}
+
+ /**
+ * Fetches the currently selected objects from the workbench site and returns those of given type. If none of the
+ * selected objects are of given type, returns null
+ *
+ * @param site
+ * The workbench site
+ * @param expectedType
+ * Type of the selected objects to look for
+ * @return The selected objects of given type if found, else null
+ */
+ public <T> Set<T> getSelectedEntities(IWorkbenchSite site, Class<T> expectedType) {
+ return getSelectedEntities(site.getWorkbenchWindow(), expectedType);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> Set<T> getSelectedEntities(IWorkbenchWindow window, Class<T> expectedType) {
+ Set<T> selectedEntities = new HashSet<T>();
+ ISelection selection = window.getSelectionService().getSelection();
+ if (selection instanceof IStructuredSelection) {
+ Iterator<Object> iter = ((IStructuredSelection) selection).iterator();
+ while (iter.hasNext()) {
+ Object selectedObj = iter.next();
+ if (selectedObj.getClass() == expectedType) {
+ selectedEntities.add((T) selectedObj);
+ }
+ }
+ }
+ return selectedEntities;
+ }
public void showProgressView() {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
index ef104fe2..c9fab9e0 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
@@ -19,9 +19,12 @@
package com.gluster.storage.management.gui.views.details;
import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
@@ -47,7 +50,7 @@ import com.gluster.storage.management.gui.utils.GUIHelper;
public class GlusterServersPage extends Composite {
private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
- private TableViewer tableViewer;
+ private CheckboxTableViewer tableViewer;
private GUIHelper guiHelper = GUIHelper.getInstance();
public enum GLUSTER_SERVER_TABLE_COLUMN_INDICES {
@@ -90,6 +93,14 @@ public class GlusterServersPage extends Composite {
parent.layout();
}
});
+
+ tableViewer.addCheckStateListener(new ICheckStateListener() {
+
+ @Override
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
+ }
+ });
}
public void addDoubleClickListener(IDoubleClickListener listener) {
@@ -122,8 +133,8 @@ public class GlusterServersPage extends Composite {
//setColumnProperties(table, SERVER_DISK_TABLE_COLUMN_INDICES.DISK_SPACE_IN_USE, SWT.CENTER, 90);
}
- private TableViewer createServerTableViewer(Composite parent) {
- TableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
+ private CheckboxTableViewer createServerTableViewer(Composite parent) {
+ CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
//TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.setLabelProvider(new GlusterServerTableLabelProvider());
tableViewer.setContentProvider(new EntityGroupContentProvider<GlusterServer>());
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
index 6be3e78c..5a6a9d40 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
@@ -18,10 +18,16 @@
*******************************************************************************/
package com.gluster.storage.management.gui.views.pages;
+import java.util.ArrayList;
+import java.util.List;
+
import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
@@ -39,6 +45,7 @@ import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.forms.widgets.FormToolkit;
+import com.gluster.storage.management.core.model.Entity;
import com.gluster.storage.management.core.model.EntityGroup;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.gui.EntityGroupContentProvider;
@@ -129,13 +136,20 @@ public class ServersPage extends Composite {
}
private TableViewer createServerTableViewer(Composite parent) {
- TableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
+ final CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
// TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.setLabelProvider(new ServerTableLabelProvider());
tableViewer.setContentProvider(new EntityGroupContentProvider<Server>());
setupServerTable(parent, tableViewer.getTable());
-
+
+ tableViewer.addCheckStateListener(new ICheckStateListener() {
+
+ @Override
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
+ }
+ });
return tableViewer;
}