summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorShireesh Anjal <anjalshireesh@gmail.com>2011-05-05 18:36:36 -0700
committerShireesh Anjal <anjalshireesh@gmail.com>2011-05-05 18:36:36 -0700
commit740e91a3ad585a7c9e4a58e1e9c8f01c6c85392f (patch)
treed0d4d4a87bf777a02441edd23ddbb5f099838456 /src
parent6483de355e5c2204ad99009e4183808e00e17020 (diff)
parentc22d82f3e6cf679773a34a03759cc43b51812c54 (diff)
Merge pull request #29 from Dhandapani/master
Story #13: Remove Disk(s) Client and Resource Changes
Diffstat (limited to 'src')
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java19
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java27
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java7
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java34
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java9
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java40
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java12
7 files changed, 126 insertions, 22 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
index f8005044..b9a0ef56 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java
@@ -48,14 +48,15 @@ public abstract class AbstractClient {
return res.queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML)
.get(responseClass);
}
-
+
private Object downloadResource(WebResource res, MultivaluedMap<String, String> queryParams, Class responseClass) {
return res.queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML)
.get(responseClass);
}
-
+
protected Object downloadResource(WebResource res) {
- ClientResponse response = res.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_OCTET_STREAM).get(ClientResponse.class);
+ ClientResponse response = res.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_OCTET_STREAM)
+ .get(ClientResponse.class);
return response;
}
@@ -124,7 +125,7 @@ public abstract class AbstractClient {
Class responseClass) {
return fetchResource(resource.path(subResourceName), queryParams, responseClass);
}
-
+
/**
* Submits given Form using POST method to the resource and returns the object received as response
*
@@ -207,12 +208,12 @@ public abstract class AbstractClient {
return resource.header(HTTP_HEADER_AUTH, authHeader).delete(responseClass);
}
- @SuppressWarnings({ "unchecked", "rawtypes" })
- protected Object deleteSubResource(String subResourceName, Class responseClass, String volumeName,
- String deleteOption) {
- return resource.path(subResourceName).queryParam(RESTConstants.QUERY_PARAM_VOLUME_NAME, volumeName)
- .queryParam(RESTConstants.QUERY_PARAM_DELETE_OPTION, deleteOption).header(HTTP_HEADER_AUTH, authHeader)
+ @SuppressWarnings("unchecked")
+ protected Object deleteSubResource(String subResourceName, Class responseClass,
+ MultivaluedMap<String, String> queryParams) {
+ return resource.path(subResourceName).queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader)
.delete(responseClass);
+
}
public abstract String getResourceName();
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
index 4af70c5a..f1464211 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java
@@ -23,6 +23,7 @@ package com.gluster.storage.management.client;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+
import javax.ws.rs.core.MultivaluedMap;
import com.gluster.storage.management.core.constants.CoreConstants;
@@ -90,8 +91,9 @@ public class VolumesClient extends AbstractClient {
return (Volume) fetchSubResource(volumeName, Volume.class);
}
- public Status deleteVolume(Volume volume, String deleteOption) {
- return (Status) deleteSubResource(volume.getName(), Status.class, volume.getName(), deleteOption);
+ public Status deleteVolume(Volume volume, boolean deleteOption) {
+ MultivaluedMap<String, String> queryParams = prepareGetDeleteVolumeQueryParams(volume.getName(), deleteOption);
+ return (Status) deleteSubResource(volume.getName(), Status.class, queryParams);
}
public VolumeOptionInfoListResponse getVolumeOptionsDefaults() {
@@ -142,7 +144,28 @@ public class VolumesClient extends AbstractClient {
public void downloadLogs(String volumeName) {
downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/" + RESTConstants.SUBRESOURCE_DOWNLOAD);
}
+
+ public Status removeBricks(String volumeName, List<Disk> diskList, boolean deleteOption) {
+ String disks = StringUtil.ListToString( GlusterCoreUtil.getQualifiedDiskNames(diskList), ",");
+ MultivaluedMap<String, String> queryParams = prepareGetRemoveBrickQueryParams(volumeName, disks, deleteOption);
+ return (Status) deleteSubResource(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, queryParams);
+ }
+
+ private MultivaluedMap<String, String> prepareGetRemoveBrickQueryParams(String volumeName, String disks, boolean deleteOption) {
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ queryParams.add(RESTConstants.QUERY_PARAM_VOLUME_NAME, volumeName);
+ queryParams.add(RESTConstants.QUERY_PARAM_DISKS, disks);
+ queryParams.add(RESTConstants.QUERY_PARAM_DELETE_OPTION, "" + deleteOption);
+ return queryParams;
+ }
+ private MultivaluedMap<String, String> prepareGetDeleteVolumeQueryParams(String volumeName, boolean deleteOption) {
+ MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
+ queryParams.add(RESTConstants.QUERY_PARAM_VOLUME_NAME, volumeName);
+ queryParams.add(RESTConstants.QUERY_PARAM_DELETE_OPTION, "" + deleteOption);
+ return queryParams;
+ }
+
private MultivaluedMap<String, String> prepareGetLogQueryParams(String diskName, String severity,
Date fromTimestamp, Date toTimestamp, int messageCount) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
index d5501082..cfcf8656 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
@@ -48,7 +48,7 @@ public class DeleteVolumeAction extends AbstractActionDelegate {
Integer deleteOption = new MessageDialog(getShell(), "Delete Volume", GUIHelper.getInstance().getImage(
IImageKeys.VOLUME), warningMessage, MessageDialog.QUESTION, new String[] { "Cancel",
"Delete volume and it's data", "Delete volume, keep back-up of data" }, 2).open();
- if (deleteOption == 0) {
+ if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1)
return;
}
@@ -63,9 +63,10 @@ public class DeleteVolumeAction extends AbstractActionDelegate {
return;
}
}
- String confirmDelete = "";
+
+ boolean confirmDelete = false;
if (deleteOption == 1) {
- confirmDelete = "-d";
+ confirmDelete = true;
}
status = client.deleteVolume(volume, confirmDelete);
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
index 19cf84f7..0735b63f 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java
@@ -5,6 +5,7 @@ import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.IWorkbenchPart;
@@ -12,8 +13,9 @@ import org.eclipse.ui.IWorkbenchPart;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.VolumesClient;
import com.gluster.storage.management.core.model.Disk;
-import com.gluster.storage.management.core.model.Entity;
+import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.utils.GUIHelper;
import com.gluster.storage.management.gui.views.VolumeDisksView;
@@ -21,11 +23,34 @@ public class RemoveDiskAction extends AbstractActionDelegate {
private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
private GUIHelper guiHelper = GUIHelper.getInstance();
private List<Disk> disks;
+ private Volume volume;
@Override
protected void performAction(IAction action) {
+ final String actionDesc = action.getDescription();
+ Integer deleteOption = new MessageDialog(getShell(), "Remove Disk(s)", GUIHelper.getInstance().getImage(
+ IImageKeys.VOLUME), "Are you sure you want to remove disks from volume [" + volume.getName()
+ + "] ?", MessageDialog.QUESTION, new String[] { "Cancel", "Remove disks, delete volume data from them",
+ "Remove disks, back-up volume data from them" }, 2).open();
+ if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1)
+ return;
+ }
+
+ boolean confirmDelete = false;
+ if (deleteOption == 1) {
+ confirmDelete = true;
+ }
+
VolumesClient client = new VolumesClient(modelManager.getSecurityToken());
- // final Status status = client.removeDisk();
+ Status status = client.removeBricks(volume.getName(), disks, confirmDelete);
+
+ if (status.isSuccess()) {
+ showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] disk(s) removed successfully!");
+ modelManager.deleteVolume(volume);
+ } else {
+ showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] disk(s) could not be removed! Error: ["
+ + status + "]");
+ }
}
@Override
@@ -37,8 +62,8 @@ public class RemoveDiskAction extends AbstractActionDelegate {
super.selectionChanged(action, selection);
action.setEnabled(false);
- Volume selectedVolume = (Volume)guiHelper.getSelectedEntity(window, Volume.class);
- if (selectedVolume != null) {
+ volume = (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 disks view
IWorkbenchPart view = guiHelper.getActiveView();
if(view instanceof VolumeDisksView) {
@@ -51,6 +76,7 @@ public class RemoveDiskAction extends AbstractActionDelegate {
private List<Disk> getSelectedDisks(ISelection selection) {
List<Disk> selectedDisks = new ArrayList<Disk>();
+
if (selection instanceof IStructuredSelection) {
Iterator<Object> iter = ((IStructuredSelection) selection).iterator();
while (iter.hasNext()) {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
index e319dcca..c105fa5a 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
@@ -25,8 +25,10 @@ import java.util.Set;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
@@ -195,6 +197,7 @@ public class CreateVolumePage1 extends WizardPage {
// user has customized disks. get them from the dialog box.
volume.setDisks(dialog.getSelectedBricks());
linkCustomize.setText("" + volume.getDisks().size() + " Disk(s) (<a>customize</a>)");
+ validateForm();
}
}
});
@@ -233,6 +236,12 @@ public class CreateVolumePage1 extends WizardPage {
return Volume.getVolumeTypeStr(volumeType);
}
});
+ typeComboViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ validateForm();
+ }
+ });
}
private void createTypeLabel(Composite container) {
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 e635510a..fe03fffd 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
@@ -173,10 +173,15 @@ public class VolumesResource {
@Path("{" + PATH_PARAM_VOLUME_NAME + "}")
@Produces(MediaType.TEXT_XML)
public Status deleteVolume(@QueryParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
- @QueryParam(QUERY_PARAM_DELETE_OPTION) String deleteOption) {
+ @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
Volume volume = glusterUtil.getVolume(volumeName);
Status status = glusterUtil.deleteVolume(volumeName);
-
+
+ String deleteOption = "";
+ if(deleteFlag) {
+ deleteOption = "-d";
+ }
+
if (status.isSuccess()) {
List<String> disks = volume.getDisks();
Status postDeleteStatus = postDelete(volumeName, disks, deleteOption);
@@ -189,6 +194,35 @@ public class VolumesResource {
return status;
}
+ @DELETE
+ @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
+ @Produces(MediaType.TEXT_XML)
+ public Status removeBricks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
+ @QueryParam(QUERY_PARAM_DISKS) String disks, @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
+ List<String> bricks = Arrays.asList(disks.split(",")); // Convert from comma separated string (query parameter)
+ List<String> volumeBricks = new ArrayList<String>();
+ for (String brickInfo : bricks) {
+ String diskInfo[] = brickInfo.split(":");
+ volumeBricks.add(getBrickForDisk(getVolume(volumeName), diskInfo[1]));
+ }
+
+ Status status = glusterUtil.removeBricks(volumeName, volumeBricks);
+
+ String deleteOption = "";
+ if(deleteFlag) {
+ deleteOption = "-d";
+ }
+
+ if (status.isSuccess()) {
+ Status cleanupStatus = cleanupDirectories(bricks, volumeName, bricks.size(), deleteOption);
+ if (!cleanupStatus.isSuccess()) {
+ // append cleanup error to prepare brick error
+ status.setMessage(status.getMessage() + CoreConstants.NEWLINE + cleanupStatus.getMessage());
+ }
+ }
+ return status;
+ }
+
private Status postDelete(String volumeName, List<String> disks, String deleteFlag) {
String serverName, diskName, diskInfo[];
Status result;
@@ -545,7 +579,7 @@ public class VolumesResource {
Form form = new Form();
form.add("volumeName", volume.getName());
form.add(RESTConstants.FORM_PARAM_DELETE_OPTION, 1);
- Status status = vr.deleteVolume("Vol2", "1");
+ Status status = vr.deleteVolume("Vol2", true);
System.out.println("Code : " + status.getCode());
System.out.println("Message " + status.getMessage());
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
index 3ca11069..476b5a14 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
@@ -184,7 +184,6 @@ public class GlusterUtil {
List<String> command = prepareVolumeCreateCommand(volume, bricks, count, volumeType, transportTypeStr);
ProcessResult result = processUtil.executeCommand(command);
if (!result.isSuccess()) {
- // TODO: Perform cleanup on all nodes before returning
return new Status(result);
}
@@ -474,6 +473,17 @@ public class GlusterUtil {
return new Status(processUtil.executeCommand("gluster", "volume", "replace-brick", volumeName, diskFrom, diskTo, operation));
}
+ public Status removeBricks(String volumeName, List<String> bricks) {
+ List<String> command = new ArrayList<String>();
+ command.add("gluster");
+ command.add("volume");
+ command.add("remove-brick");
+ command.add(volumeName);
+ command.addAll(bricks);
+ return new Status(processUtil.executeCommand(command));
+ }
+
+
public static void main(String args[]) {
// List<String> names = new GlusterUtil().getGlusterServerNames();
// System.out.println(names);