diff options
| author | Selvam <selvam@gluster.com> | 2011-05-06 14:58:27 +0530 | 
|---|---|---|
| committer | Selvam <selvam@gluster.com> | 2011-05-06 14:58:27 +0530 | 
| commit | 10429a6c2c197ac82205fc904ccc5f6513c2b4ef (patch) | |
| tree | cf08ca25ab8a076ed08d7ab3fa37ac631331d22b /src | |
| parent | a46390ce97935a2c629f86c86a72e7407fc19740 (diff) | |
| parent | 740e91a3ad585a7c9e4a58e1e9c8f01c6c85392f (diff) | |
Merge remote branch 'upstream/master'
Diffstat (limited to 'src')
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);  | 
