diff options
author | Dhandapani <dhandapani@gluster.com> | 2011-11-02 12:40:12 +0530 |
---|---|---|
committer | Dhandapani <dhandapani@gluster.com> | 2011-11-03 16:14:06 +0530 |
commit | c0870fcad01a8efa38c674795259aa2784e3a47b (patch) | |
tree | 63f1f607dcdd831ada0f874729798dcac1a59b4c | |
parent | 3fd5258868fd6361d5cc2856be619e6243458fad (diff) |
Story #70: "Force" option in volume stop
8 files changed, 136 insertions, 45 deletions
diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/GlusterDataModelManager.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/GlusterDataModelManager.java index e43bcbae..5fff61b9 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/GlusterDataModelManager.java @@ -882,6 +882,12 @@ public class GlusterDataModelManager { } } + public void alertsRemoved() { + for (ClusterListener listener : listeners) { + listener.alertsRemoved(); + } + } + public List<VolumeOptionInfo> getVolumeOptionsInfo() { if(volumeOptionsInfo == null || volumeOptionsInfo.isEmpty()) { initializeVolumeOptionsInfo(getModel().getCluster()); diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java index f5f7d209..d764dcc0 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java @@ -40,6 +40,9 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { private List<Volume> selectedVolumes = new ArrayList<Volume>(); private List<String> selectedVolumeNames = new ArrayList<String>(); private List<String> onlineVolumeNames = new ArrayList<String>(); + private List<String> deletedVolumeNames = new ArrayList<String>(); + private List<Volume> failedVolumes = new ArrayList<Volume>(); + private List<String> failedVolumeNames = new ArrayList<String>(); @Override protected void performAction(final IAction action, IProgressMonitor monitor) { @@ -76,18 +79,55 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { return; } + String errorMessage = performDeleteVolume(monitor,selectedVolumes, directoryDeleteOption, false); + + // Display the success or failure info + if (deletedVolumeNames.size() == 0) { // No volume(s) deleted successfully + String message = "volumes " + failedVolumeNames + " could not be delete! " + CoreConstants.NEWLINE + + "Error: [" + errorMessage + "]"; + errorMessage = performForceStopAndDeleteVolume(monitor, actionDesc, failedVolumes, directoryDeleteOption, + message); + } else { + String info = "Volumes " + deletedVolumeNames + " deleted successfully!"; + if (!errorMessage.equals("")) { + String message = info + CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumeNames + + " could not be deleted! [" + errorMessage + "]"; + errorMessage = performForceStopAndDeleteVolume(monitor, actionDesc, failedVolumes, + directoryDeleteOption, message); + } + if (errorMessage.equals("")) { + errorMessage = info; + } + } + showInfoDialog(actionDesc, errorMessage); + } + + private String performForceStopAndDeleteVolume(IProgressMonitor monitor, String actionDesc, List<Volume> volumesToDelete, + Integer directoryDeleteOption, String message) { + boolean forceStop = showConfirmDialog(actionDesc, message + CoreConstants.NEWLINE + CoreConstants.NEWLINE + + "Do you want to stop forcefully and delete?"); + if (!forceStop) { + return ""; + } + return performDeleteVolume(monitor, volumesToDelete, directoryDeleteOption, true); + } + + private String performDeleteVolume(IProgressMonitor monitor, List<Volume> volumeNeedsToDelete, + final Integer directoryDeleteOption, Boolean force) { + deletedVolumeNames.clear(); + failedVolumeNames.clear(); + failedVolumes.clear(); VolumesClient vc = new VolumesClient(); boolean confirmDeleteDir = (directoryDeleteOption == 1) ? true : false; - List<String> deletedVolumeNames = new ArrayList<String>(); - List<String> failedVolumes = new ArrayList<String>(); + String errorMessage = ""; - monitor.beginTask("Deleting Selected Volumes...", selectedVolumes.size()); - for (Volume volume : selectedVolumes.toArray(new Volume[0])) { + monitor.beginTask("Deleting Selected Volumes...", volumeNeedsToDelete.size()); + for (Volume volume : volumeNeedsToDelete.toArray(new Volume[0])) { try { monitor.setTaskName("Deleting volume [" + volume.getName() + "]"); if (volume.getStatus() == VOLUME_STATUS.ONLINE) { // stop if online volume - vc.stopVolume(volume.getName(), false); + vc.stopVolume(volume.getName(), force); } vc.deleteVolume(volume.getName(), confirmDeleteDir); modelManager.deleteVolume(volume); @@ -96,7 +136,8 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { // Volume delete succeeded and post delete operation (directory cleanup, CIFS etc) may fail if (vc.volumeExists(volume.getName())) { errorMessage += CoreConstants.NEWLINE + "[" + volume.getName() + "] : [" + e.getMessage() + "]"; - failedVolumes.add(volume.getName()); + failedVolumeNames.add(volume.getName()); + failedVolumes.add(volume); } else { errorMessage += CoreConstants.NEWLINE + "Volume deleted, but following error occured: [" + e.getMessage() + "]"; @@ -107,19 +148,7 @@ public class DeleteVolumeAction extends AbstractMonitoredActionDelegate { monitor.worked(1); } monitor.done(); - - // Display the success or failure info - if (deletedVolumeNames.size() == 0) { // No volume(s) deleted successfully - showErrorDialog(actionDesc, "volumes " + failedVolumes + " could not be delete! " + CoreConstants.NEWLINE - + "Error: [" + errorMessage + "]"); - } else { - String info = "Volumes " + deletedVolumeNames + " deleted successfully!"; - if (!errorMessage.equals("")) { - info += CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumes - + " could not be deleted! [" + errorMessage + "]"; - } - showInfoDialog(actionDesc, info); - } + return errorMessage; } private void collectVolumeNames() { diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/ForceStartVolumeAction.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/ForceStartVolumeAction.java index 101b7982..9201aadb 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/ForceStartVolumeAction.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/ForceStartVolumeAction.java @@ -47,7 +47,7 @@ public class ForceStartVolumeAction extends AbstractActionDelegate { @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); - + action.setEnabled(false); volume = guiHelper.getSelectedEntity(window, Volume.class); if (volume != null) { // a volume is selected on navigation tree. Let's check if the currently open view is volume bricks view diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StartVolumeAction.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StartVolumeAction.java index 6407b322..09b01805 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StartVolumeAction.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StartVolumeAction.java @@ -26,13 +26,16 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; +import org.eclipse.osgi.internal.signedcontent.Base64; import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.console.AlertsManager; import com.gluster.storage.management.console.GlusterDataModelManager; import com.gluster.storage.management.console.IImageKeys; import com.gluster.storage.management.console.utils.GUIHelper; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Alert.ALERT_TYPES; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; public class StartVolumeAction extends AbstractMonitoredActionDelegate { @@ -98,6 +101,11 @@ public class StartVolumeAction extends AbstractMonitoredActionDelegate { try { newVolume = vc.getVolume(volume.getName()); modelManager.volumeChanged(volume, newVolume); + // Remove the offline volume alert from the AlertsManager + AlertsManager alertManager = new AlertsManager(modelManager.getModel().getCluster()); + alertManager.removeAlert(Base64.encode( + (ALERT_TYPES.OFFLINE_VOLUME_ALERT + "-" + volume.getName()).getBytes()).toString()); + modelManager.alertsRemoved(); } catch (Exception e) { errorMessage += "Updating volume info failed on UI. [" + e.getMessage() + "]"; } diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StopVolumeAction.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StopVolumeAction.java index dad5d4ac..21bf3432 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StopVolumeAction.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StopVolumeAction.java @@ -28,10 +28,13 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.console.AlertsManager; import com.gluster.storage.management.console.GlusterDataModelManager; import com.gluster.storage.management.console.IImageKeys; import com.gluster.storage.management.console.utils.GUIHelper; import com.gluster.storage.management.core.constants.CoreConstants; +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.Alert.ALERT_TYPES; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; @@ -40,6 +43,9 @@ public class StopVolumeAction extends AbstractMonitoredActionDelegate { private List<Volume> selectedVolumes = new ArrayList<Volume>(); private List<String> selectedVolumeNames = new ArrayList<String>(); private List<String> onlineVolumeNames = new ArrayList<String>(); + private List<String> stoppedVolumes = new ArrayList<String>(); + private List<String> failedVolumeNames = new ArrayList<String>(); + private List<Volume> failedVolumes = new ArrayList<Volume>(); @Override protected void performAction(final IAction action, IProgressMonitor monitor) { @@ -61,10 +67,6 @@ public class StopVolumeAction extends AbstractMonitoredActionDelegate { return; } - VolumesClient vc = new VolumesClient(); - List<String> stoppedVolumes = new ArrayList<String>(); - List<String> failedVolumes = new ArrayList<String>(); - String errorMessage = ""; List<String> cifsVolumes = GlusterDataModelManager.getInstance().getCifsEnabledVolumeNames(selectedVolumes); List<String> offlineServers = GlusterDataModelManager.getInstance().getOfflineServers(); // One or more servers are offline, Show warning if cifs is enabled @@ -80,10 +82,49 @@ public class StopVolumeAction extends AbstractMonitoredActionDelegate { } } + String errorMessage = performStopVolume(monitor, selectedVolumes, false); + + // Display the success or failure info + if (stoppedVolumes.size() == 0) { // No volume(s) stopped successfully + String message = "Volumes " + failedVolumeNames + " could not be stopped! " + CoreConstants.NEWLINE + + "Error: [" + errorMessage + "]"; + errorMessage = performForceStopVolume(monitor, actionDesc, message); + + } else { + String info = "Volumes " + stoppedVolumes + " stopped successfully!"; + if (!errorMessage.equals("")) { + String message = info + CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumeNames + + " failed to stop! [" + errorMessage + "]"; + errorMessage = performForceStopVolume(monitor, actionDesc, message); + } + if (errorMessage.equals("")) { + errorMessage = info; + } + } + showInfoDialog(actionDesc, errorMessage); + } + + + private String performForceStopVolume(IProgressMonitor monitor, String actionDesc, String message) { + boolean forceStop = showConfirmDialog(actionDesc, + message + CoreConstants.NEWLINE + "Do you want to stop forcefully?"); + if (!forceStop) { + return ""; + } + return performStopVolume(monitor, failedVolumes, true); + } + + private String performStopVolume(IProgressMonitor monitor, List<Volume> volumesNeedsToStop, Boolean force) { + VolumesClient vc = new VolumesClient(); Volume newVolume = new Volume(); + stoppedVolumes.clear(); + failedVolumeNames.clear(); + failedVolumes.clear(); + String errorMessage = ""; + List<Alert> volumeStopAlert = new ArrayList<Alert>(); - monitor.beginTask("Stopping Selected Volumes...", selectedVolumes.size()); - for (Volume volume : selectedVolumes.toArray(new Volume[0])) { + monitor.beginTask("Stopping Selected Volumes...", volumesNeedsToStop.size()); + for (Volume volume : volumesNeedsToStop.toArray(new Volume[0])) { if(monitor.isCanceled()) { break; } @@ -94,11 +135,15 @@ public class StopVolumeAction extends AbstractMonitoredActionDelegate { } try { monitor.setTaskName("Stopping volume [" + volume.getName() + "]"); - vc.stopVolume(volume.getName(), false); + vc.stopVolume(volume.getName(), force); // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); stoppedVolumes.add(volume.getName()); + volumeStopAlert.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_ALERT, volume.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_ALERT.ordinal()] + " [" + volume.getName() + + "]")); } catch (Exception e) { - failedVolumes.add(volume.getName()); + failedVolumeNames.add(volume.getName()); + failedVolumes.add(volume); // If any post volume stop activity failed, update the volume status if (vc.getVolume(volume.getName()).getStatus() == VOLUME_STATUS.OFFLINE) { modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); @@ -117,18 +162,13 @@ public class StopVolumeAction extends AbstractMonitoredActionDelegate { } monitor.done(); - // Display the success or failure info - if (stoppedVolumes.size() == 0) { // No volume(s) stopped successfully - showErrorDialog(actionDesc, "Volumes " + failedVolumes + " could not be stopped! " + CoreConstants.NEWLINE - + "Error: [" + errorMessage + "]"); - } else { - String info = "Volumes " + stoppedVolumes + " stopped successfully!"; - if (!errorMessage.equals("")) { - info += CoreConstants.NEWLINE + CoreConstants.NEWLINE + "Volumes " + failedVolumes - + " failed to stop! [" + errorMessage + "]"; - } - showInfoDialog(actionDesc, info); + // Add the offline volume alert in AlertsManager + if (volumeStopAlert.size() > 0) { + AlertsManager alertManager = new AlertsManager(modelManager.getModel().getCluster()); + alertManager.addAlerts(volumeStopAlert); + modelManager.alertsGenerated(); } + return errorMessage; } private void collectVolumeNames() { diff --git a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/VolumesSummaryView.java b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/VolumesSummaryView.java index 376345e6..944956f7 100644 --- a/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/VolumesSummaryView.java +++ b/src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/VolumesSummaryView.java @@ -103,7 +103,6 @@ public class VolumesSummaryView extends ViewPart { public void volumeChanged(Volume volume, Event event) { super.volumeChanged(volume, event); updateSummarySection(); - updateAlertSection(); } private void updateSummarySection() { @@ -119,6 +118,13 @@ public class VolumesSummaryView extends ViewPart { guiHelper.clearSection(alertsSection); populateAlertSection(); } + + @Override + public void alertsRemoved() { + super.alertsRemoved(); + guiHelper.clearSection(alertsSection); + populateAlertSection(); + } @Override public void taskAdded(TaskInfo taskInfo) { @@ -142,11 +148,6 @@ public class VolumesSummaryView extends ViewPart { guiHelper.clearSection(tasksSection); populateTasks(); } - - private void updateAlertSection() { - guiHelper.clearSection(alertsSection); - populateAlertSection(); - } }; GlusterDataModelManager.getInstance().addClusterListener(clusterListener); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java index bff717b7..e0bb9c63 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java @@ -50,4 +50,6 @@ public interface ClusterListener { public void alertsGenerated(); public void aggregatedStatsChanged(); + + public void alertsRemoved(); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java index f09d78bb..50a5d2ac 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java @@ -105,4 +105,9 @@ public class DefaultClusterListener implements ClusterListener { public void aggregatedStatsChanged() { modelChanged(); } + + @Override + public void alertsRemoved() { + modelChanged(); + } } |