diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-04-13 13:48:12 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-04-13 13:48:12 +0530 |
| commit | 86856e550d8c20b51e1da94a3ca0a3dfed750e06 (patch) | |
| tree | 40e8766f5931039aa6ab3664d55a562f403acc10 /src | |
| parent | 5cf991b09c3a04c2d98a2e3e60c6d2797f306038 (diff) | |
Remote directory creation and directory cleanup script enhanced
Diffstat (limited to 'src')
2 files changed, 75 insertions, 35 deletions
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 e880df36..84241624 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,7 +25,6 @@ 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.window.Window; @@ -51,6 +50,7 @@ import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.NAS_PROTOCOL; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; +import com.gluster.storage.management.core.response.VolumeListResponse; public class CreateVolumePage1 extends WizardPage { public static final String PAGE_NAME = "create.volume.page.1"; @@ -114,6 +114,10 @@ public class CreateVolumePage1 extends WizardPage { setErrorMessage("Please enter Access Control"); } + if(volume.getDisks().size() < 1) { + setPageComplete(false); + setErrorMessage("No disk found"); + } // acl validation String[] aclList = accessControl.split(","); @@ -286,6 +290,17 @@ public class CreateVolumePage1 extends WizardPage { return btnStartVolume.getSelection(); } + public Boolean isVolumeExist(String volumeName) { + List<Volume> volumes = GlusterDataModelManager.getInstance().getModel().getCluster().getVolumes(); + for (Volume volume : volumes) { + if (volume.getName().equals(volumeName)) { + setErrorMessage("Volume name already exists."); + return false; + } + } + return true; + } + public Boolean isValidCreateVolumeForm() { IStructuredSelection selection = (IStructuredSelection)typeComboViewer.getSelection(); if (selection.getFirstElement().equals(VOLUME_TYPE.DISTRIBUTED_MIRROR) && ((int)volume.getDisks().size()) % 2 != 0 ) { @@ -295,6 +310,11 @@ public class CreateVolumePage1 extends WizardPage { setErrorMessage("Stripe type volume requires disk in multiples of four"); return false; } + + if(!isVolumeExist(txtName.getText())) { + return false; + } + return true; } } 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 4fe06cc9..c52b1d15 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 @@ -45,6 +45,8 @@ import javax.ws.rs.core.MediaType; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; +import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.VolumeListResponse; import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse; import com.gluster.storage.management.core.utils.GlusterUtil; @@ -56,8 +58,8 @@ import com.sun.jersey.spi.resource.Singleton; @Singleton @Path(RESOURCE_PATH_VOLUMES) public class VolumesResource { - private static final String PREPARE_BRICK_SCRIPT = "preVolumeCreate.py"; - private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "cleanupVolumeDirectoryCreate.py"; + private static final String PREPARE_BRICK_SCRIPT = "create_volume_directory.py"; + private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "clear_volume_directory.py"; @InjectParam private static ServerUtil serverUtil; @@ -80,22 +82,21 @@ public class VolumesResource { @POST @Consumes(MediaType.TEXT_XML) @Produces(MediaType.TEXT_XML) + @SuppressWarnings("rawtypes") public Status createVolume(Volume volume) { // Create the directories for the volume List<String> disks = volume.getDisks(); - Status result = createDirectory(disks, volume.getName()); - if (result.isSuccess()) { - List<String> bricks = Arrays.asList(result.getMessage().split(", ")); - - result = glusterUtil.createVolume(volume, bricks); - if (!result.isSuccess()) { - // Perform cleanup on all nodes before returning + GenericResponse result = createDirectory(disks, volume.getName()); + if (result.getStatus().isSuccess()) { + List<String> bricks = Arrays.asList(result.getStatus().getMessage().split(", ")); + result.setStatus(glusterUtil.createVolume(volume, bricks)); + if (result.getStatus().isSuccess()) { + result.setStatus(glusterUtil.createOptions(volume)); + } else { cleanupDirectory(disks, volume.getName(), disks.size()); - return result; } } - // Only if volume creation is success, then call the volume set options - return glusterUtil.createOptions(volume); + return result.getStatus(); } @GET @@ -140,33 +141,43 @@ public class VolumesResource { @Path(SUBRESOURCE_DEFAULT_OPTIONS) @Produces(MediaType.TEXT_XML) public VolumeOptionInfoListResponse getDefaultOptions() { - // TODO: Fetch all volume options with their default values from GlusterFS + // TODO: Fetch all volume options with their default values from + // GlusterFS // whenever such a CLI command is made available in GlusterFS return new VolumeOptionInfoListResponse(Status.STATUS_SUCCESS, volumeOptionsDefaults.getDefaults()); } - private Status prepareBrick(String disk, String volumeName) { + @SuppressWarnings("rawtypes") + private GenericResponse prepareBrick(String disk, String volumeName) { + System.out.println("Disk : " + disk); String serverName = disk.split(":")[0]; String diskName = disk.split(":")[1]; - return (Status) serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " + volumeName + " " - + diskName, Status.class); + return (GenericResponse) serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " + diskName + + " " + volumeName, GenericResponse.class); } - @SuppressWarnings("null") - private Status createDirectory(List<String> disks, String volumeName) { - List<String> brickNotation = null; + @SuppressWarnings({ "rawtypes" }) + private GenericResponse createDirectory(List<String> disks, String volumeName) { + List<String> brickNotation = new ArrayList<String>(); + GenericResponse response = new GenericResponse(); + for (int i = 0; i < disks.size(); i++) { - Status result = prepareBrick(disks.get(i), volumeName); - if (result.isSuccess()) { - brickNotation.add(result.getMessage()); + response = prepareBrick(disks.get(i), volumeName); + if (response.getStatus().isSuccess()) { + String brick = response.getStatus().getMessage().trim(); + brick = brick.replace("\n", ""); + brickNotation.add(disks.get(i).split(":")[0]+ ":" + brick); } else { - cleanupDirectory(disks, volumeName, i); - return new Status(Status.STATUS_CODE_FAILURE, "Error while preparing disk [" + disks.get(i) - + "] for volume [" + volumeName + "]"); + Status status = cleanupDirectory(disks, volumeName, i + 1); + if (!status.isSuccess()) { + response.getStatus().setMessage(response.getStatus().getMessage() + "\n" + status.getMessage()); + } + return response; } +// glusterUtil.printObject(brickNotation); // TODO: debug code } - return new Status(Status.STATUS_CODE_SUCCESS, brickNotation.toString()); - + response.getStatus().setMessage(brickNotation.toString()); + return response; } private Status cleanupDirectory(List<String> disks, String volumeName, int maxIndex) { @@ -177,8 +188,8 @@ public class VolumesResource { diskInfo = disks.get(i).split(":"); serverName = diskInfo[0]; diskName = diskInfo[1]; - result = (Status) serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + volumeName + " " - + diskName, Status.class); + result = (Status) serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + + diskName + " " + volumeName, Status.class); if (!result.isSuccess()) { return result; } @@ -188,10 +199,19 @@ public class VolumesResource { public static void main(String[] args) { VolumesResource vr = new VolumesResource(); - VolumeListResponse response = vr.getAllVolumes(); - for (Volume volume : response.getVolumes()) { - System.out.println("\nName:" + volume.getName() + "\nType: " + volume.getVolumeTypeStr() + "\nStatus: " - + volume.getStatusStr()); - } +// VolumeListResponse response = vr.getAllVolumes(); +// for (Volume volume : response.getVolumes()) { +// System.out.println("\nName:" + volume.getName() + "\nType: " + volume.getVolumeTypeStr() + "\nStatus: " +// + volume.getStatusStr()); +// } + Volume volume = new Volume(); + volume.setName("vol3"); + volume.setTransportType(TRANSPORT_TYPE.ETHERNET); + List<String> disks = new ArrayList<String>(); + disks.add("192.168.1.210:sdb"); + volume.addDisks(disks); + volume.setAccessControlList("192.168.*"); + Status status = vr.createVolume(volume); + System.out.println(status.getMessage()); } } |
