summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhandapani <dhandapani@gluster.com>2011-11-02 12:40:12 +0530
committerDhandapani <dhandapani@gluster.com>2011-11-03 16:14:06 +0530
commitc0870fcad01a8efa38c674795259aa2784e3a47b (patch)
tree63f1f607dcdd831ada0f874729798dcac1a59b4c
parent3fd5258868fd6361d5cc2856be619e6243458fad (diff)
Story #70: "Force" option in volume stop
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/GlusterDataModelManager.java6
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/DeleteVolumeAction.java67
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/ForceStartVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StartVolumeAction.java8
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/actions/StopVolumeAction.java78
-rw-r--r--src/com.gluster.storage.management.console/src/com/gluster/storage/management/console/views/VolumesSummaryView.java13
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java2
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java5
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();
+ }
}