diff options
Diffstat (limited to 'src')
12 files changed, 280 insertions, 126 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java index 864418a7..25ba6b10 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -18,6 +18,8 @@ *******************************************************************************/ package com.gluster.storage.management.client; +import java.net.ConnectException; + import javax.ws.rs.core.Response; import com.gluster.storage.management.core.model.Status; @@ -42,22 +44,25 @@ public class UsersClient extends AbstractClient { setSecurityToken(generateSecurityToken(user, password)); try { Status authStatus = (Status) fetchSubResource(user, Status.class); - if(!authStatus.isSuccess()) { + if (!authStatus.isSuccess()) { // authentication failed. clear security token. setSecurityToken(null); } return authStatus; - } catch (Exception e) { - if (e instanceof UniformInterfaceException - && ((UniformInterfaceException) e).getResponse().getStatus() == Response.Status.UNAUTHORIZED - .getStatusCode()) { + } catch (UniformInterfaceException e) { + if ((e.getResponse().getStatus() == Response.Status.UNAUTHORIZED.getStatusCode())) { // authentication failed. clear security token. setSecurityToken(null); return new Status(Status.STATUS_CODE_FAILURE, "Invalid user id or password!"); } else { - return new Status(Status.STATUS_CODE_FAILURE, "Exception during authentication: [" + e.getMessage() - + "]"); + throw e; + } + } catch (Exception e) { + Throwable cause = e.getCause(); + if(cause != null && cause instanceof ConnectException) { + return new Status(Status.STATUS_CODE_FAILURE, "Couldn't connect to Gluster Management Gateway!"); } + return new Status(Status.STATUS_CODE_FAILURE, "Exception during authentication: [" + e.getMessage() + "]"); } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java index e721d052..b905afc3 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java @@ -80,4 +80,9 @@ public class Entity extends PlatformObject implements Filterable { public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName(), filterString, caseSensitive); } + + @Override + public String toString() { + return name; + } } 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/dialogs/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java index d480e503..9db0f0e8 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java @@ -200,7 +200,8 @@ public class LoginDialog extends Dialog { String password = connectionDetails.getPassword(); UsersClient usersClient = new UsersClient(); - if (usersClient.authenticate(user, password).isSuccess()) { + Status loginStatus = usersClient.authenticate(user, password); + if (loginStatus.isSuccess()) { close(); ClustersClient clustersClient = new ClustersClient(usersClient.getSecurityToken()); List<String> clusterNames = getClusterNames(clustersClient); @@ -250,7 +251,7 @@ public class LoginDialog extends Dialog { close(); } } else { - MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password"); + MessageDialog.openError(getShell(), "Authentication Failed", loginStatus.getMessage()); } } 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/details/VolumeOptionsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeOptionsPage.java index cc37270b..1386b037 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeOptionsPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/VolumeOptionsPage.java @@ -92,14 +92,14 @@ public class VolumeOptionsPage extends Composite { setupPageLayout(); filterText = guiHelper.createFilterText(toolkit, this); - - createAddButtonOnTop(); + + addTopButton = createAddButton(); setupOptionsTableViewer(filterText); - createAddButtonOnBottom(); + addBottomButton = createAddButton(); if (defaultVolumeOptions.size() == volume.getOptions().size()) { - enableOrDisableButtons(false); + setAddButtonsEnabled(false); } tableViewer.setInput(volume.getOptions().entrySet()); @@ -108,54 +108,14 @@ public class VolumeOptionsPage extends Composite { registerListeners(parent); } - private void createAddButtonOnTop() { - addTopButton = toolkit.createButton(this, "&Add", SWT.FLAT); - addTopButton.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - // add an empty option to be filled up by user - volume.setOption("", ""); - - tableViewer.refresh(); - tableViewer.setSelection(new StructuredSelection(getEntry(""))); - keyColumn.getViewer().editElement(getEntry(""), 0); // edit newly created entry - - // disable the add button AND search filter textbox till user fills up the new option - enableOrDisableButtons(false); - filterText.setEnabled(false); - } - - private Entry<String, String> getEntry(String key) { - for (Entry<String, String> entry : volume.getOptions().entrySet()) { - if (entry.getKey().equals(key)) { - return entry; - } - } - return null; - } - }); - - // Make sure that add button is enabled only when search filter textbox is empty - filterText.addModifyListener(new ModifyListener() { - @Override - public void modifyText(ModifyEvent e) { - if (filterText.getText().length() > 0) { - enableOrDisableButtons(false); - } else { - enableOrDisableButtons(true); - } - } - }); - } - - private void enableOrDisableButtons(boolean flag) { - addTopButton.setEnabled(flag); - addBottomButton.setEnabled(flag); + private void setAddButtonsEnabled(boolean enable) { + addTopButton.setEnabled(enable); + addBottomButton.setEnabled(enable); } - private void createAddButtonOnBottom() { - addBottomButton = toolkit.createButton(this, "&Add", SWT.FLAT); - addBottomButton.addSelectionListener(new SelectionAdapter() { + private Button createAddButton() { + Button button = toolkit.createButton(this, "&Add", SWT.FLAT); + button.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { // add an empty option to be filled up by user @@ -166,7 +126,7 @@ public class VolumeOptionsPage extends Composite { keyColumn.getViewer().editElement(getEntry(""), 0); // edit newly created entry // disable the add button AND search filter textbox till user fills up the new option - enableOrDisableButtons(false); + setAddButtonsEnabled(false); filterText.setEnabled(false); } @@ -185,12 +145,17 @@ public class VolumeOptionsPage extends Composite { @Override public void modifyText(ModifyEvent e) { if (filterText.getText().length() > 0) { - enableOrDisableButtons(false); + setAddButtonsEnabled(false); } else { - enableOrDisableButtons(true); + if (defaultVolumeOptions.size() == volume.getOptions().size()) { + setAddButtonsEnabled(false); + } else { + setAddButtonsEnabled(true); + } } } }); + return button; } private void registerListeners(final Composite parent) { @@ -248,12 +213,12 @@ public class VolumeOptionsPage extends Composite { if (isNewOption(volume, eventEntry.getKey())) { // option has been set successfully by the user. re-enable the add button and search filter // textbox - enableOrDisableButtons(true); + setAddButtonsEnabled(true); filterText.setEnabled(true); } - + if (defaultVolumeOptions.size() == volume.getOptions().size()) { - enableOrDisableButtons(false); + setAddButtonsEnabled(false); } if (tableViewer.getTable().getItemCount() < volume.getOptions().size()) { 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; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 7de9015d..728da2dc 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -206,7 +206,11 @@ public class GlusterServersResource extends AbstractServersResource { Status status; try { - status = glusterUtil.addServer(serverName, onlineServer.getName()); + status = glusterUtil.addServer(onlineServer.getName(), serverName); + if(status.isSuccess()) { + // other peer probe to ensure that host names appear in peer probe on both sides + status = glusterUtil.addServer(serverName, onlineServer.getName()); + } } catch(ConnectionException e) { onlineServer = getNewOnlineServer(clusterName); if(onlineServer == null) { @@ -307,7 +311,7 @@ public class GlusterServersResource extends AbstractServersResource { } try { - return glusterUtil.removeServer(onlineServer.getName(), serverName); + status = glusterUtil.removeServer(onlineServer.getName(), serverName); } catch (ConnectionException e) { // online server has gone offline! try with a different one. onlineServer = getNewOnlineServer(clusterName, serverName); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java index 8df8d5c4..d6c41475 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java @@ -69,8 +69,6 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.StreamingOutput; -import org.springframework.beans.factory.annotation.Autowired; - import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.ConnectionException; @@ -106,20 +104,20 @@ public class VolumesResource { @InjectParam private GlusterServersResource glusterServersResource; - @Autowired + @InjectParam private ServerUtil serverUtil; - @Autowired + @InjectParam private GlusterUtil glusterUtil; - @Autowired + @InjectParam private ClusterService clusterService; - private FileUtil fileUtil = new FileUtil(); - @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; + private FileUtil fileUtil = new FileUtil(); + @GET @Produces(MediaType.TEXT_XML) public VolumeListResponse getAllVolumes(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) { |
