diff options
Diffstat (limited to 'src')
4 files changed, 67 insertions, 38 deletions
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java index 35bba55d..38de196a 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java @@ -178,11 +178,9 @@ 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); } - - return createOptions(volume); + return new Status(result); } private List<String> prepareVolumeCreateCommand(Volume volume, List<String> bricks, int count, String volumeType, @@ -202,7 +200,7 @@ public class GlusterUtil { return command; } - private Status createOptions(Volume volume) { + public Status createOptions(Volume volume) { Map<String, String> options = volume.getOptions(); if (options != null) { for (Entry<String, String> option : options.entrySet()) { diff --git a/src/com.gluster.storage.management.gui/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.gui/META-INF/MANIFEST.MF index 2e59c854..13fb07dc 100644 --- a/src/com.gluster.storage.management.gui/META-INF/MANIFEST.MF +++ b/src/com.gluster.storage.management.gui/META-INF/MANIFEST.MF @@ -21,7 +21,8 @@ Require-Bundle: org.eclipse.ui;bundle-version="3.6.1", org.eclipse.birt.chart.device.swt;bundle-version="2.6.1", com.ibm.icu;bundle-version="4.2.1", com.richclientgui.rcptoolbox;bundle-version="1.0.5", - org.eclipse.core.resources + org.eclipse.core.resources, + org.eclipse.equinox.common.source;bundle-version="3.6.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . 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 b09bbb44..e880df36 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 @@ -234,6 +234,7 @@ public class CreateVolumePage1 extends WizardPage { new Label(container, SWT.NONE); btnNfs = new Button(container, SWT.CHECK); + btnNfs.setEnabled(false); btnNfs.setSelection(true); btnNfs.setText("NFS"); @@ -251,7 +252,7 @@ public class CreateVolumePage1 extends WizardPage { new Label(container, SWT.NONE); Label lblAccessControlInfo = new Label(container, SWT.TOP); lblAccessControlInfo.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false, 1, 1)); - lblAccessControlInfo.setText("(Comma separated list of IP addresses)"); + lblAccessControlInfo.setText("(Comma separated list of IP addresses/Hostname)"); Label lblStartVolume = new Label(container, SWT.NONE); lblStartVolume.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); @@ -270,9 +271,11 @@ public class CreateVolumePage1 extends WizardPage { volume.setTransportType(TRANSPORT_TYPE.ETHERNET); Set<NAS_PROTOCOL> nasProtocols = new HashSet<Volume.NAS_PROTOCOL>(); nasProtocols.add(NAS_PROTOCOL.GLUSTERFS); - if(btnNfs.getSelection()) { - nasProtocols.add(NAS_PROTOCOL.NFS); - } + nasProtocols.add(NAS_PROTOCOL.NFS); + +// if(btnNfs.getSelection()) { +// nasProtocols.add(NAS_PROTOCOL.NFS); +// } volume.setAccessControlList(txtAccessControl.getText()); 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 49fb1e0d..c7184b59 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 @@ -29,6 +29,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.SUBRES import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_OPTIONS; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.ws.rs.Consumes; @@ -55,8 +56,9 @@ import com.sun.jersey.spi.resource.Singleton; @Singleton @Path(RESOURCE_PATH_VOLUMES) public class VolumesResource { - private static final String SCRIPT_NAME = "preVolumeCreate.py"; - + private static final String PREPARE_BRICK_SCRIPT = "preVolumeCreate.py"; + private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "cleanupVolumeDirectoryCreate.py"; + @InjectParam private static ServerUtil serverUtil; private final GlusterUtil glusterUtil = new GlusterUtil(); @@ -79,24 +81,20 @@ public class VolumesResource { @Consumes(MediaType.TEXT_XML) @Produces(MediaType.TEXT_XML) public Status createVolume(Volume volume) { - //Create the directories for the volume - List<String> bricks = new ArrayList<String>(); - for(String disk : volume.getDisks()) { - - String brickNotation = prepareBrick(volume, disk); - if (brickNotation != null) { - bricks.add(brickNotation); - } else { - int failedIndex = volume.getDisks().indexOf(disk); - // TODO: Perform cleanup on all previously prepared bricks - // i.e. those disks with index < failedIndex - - return new Status(Status.STATUS_CODE_FAILURE, "Error while preparing disk [" + disk + "] for volume [" - + volume.getName() + "]"); + // 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 + cleanupDirectory(disks, volume.getName(), disks.size()); + return result; } } - - return glusterUtil.createVolume(volume, bricks); + return glusterUtil.createOptions(volume); } @GET @@ -105,7 +103,7 @@ public class VolumesResource { public Volume getVolume(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) { return glusterUtil.getVolume(volumeName); } - + @PUT @Path("{" + PATH_PARAM_VOLUME_NAME + "}") @Produces(MediaType.TEXT_XML) @@ -129,7 +127,7 @@ public class VolumesResource { @FormParam(RESTConstants.FORM_PARAM_OPTION_VALUE) String value) { return glusterUtil.setOption(volumeName, key, value); } - + @PUT @Path("{" + PATH_PARAM_VOLUME_NAME + " }/" + SUBRESOURCE_OPTIONS) @Produces(MediaType.TEXT_XML) @@ -145,19 +143,48 @@ public class VolumesResource { // whenever such a CLI command is made available in GlusterFS return new VolumeOptionInfoListResponse(Status.STATUS_SUCCESS, volumeOptionsDefaults.getDefaults()); } - - private String prepareBrick(Volume vol, String disk) { + + private Status prepareBrick(String disk, String volumeName) { String serverName = disk.split(":")[0]; String diskName = disk.split(":")[1]; - Status result = (Status)serverUtil.executeOnServer(true, serverName, SCRIPT_NAME + " " + vol.getName() + " " + diskName, Status.class); - - if(result.isSuccess()) { - return result.getMessage(); - } else { - return null; + return (Status) serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " + volumeName + " " + + diskName, Status.class); + } + + @SuppressWarnings("null") + private Status createDirectory(List<String> disks, String volumeName) { + List<String> brickNotation = null; + for (int i = 0; i < disks.size(); i++) { + Status result = prepareBrick(disks.get(i), volumeName); + if (result.isSuccess()) { + brickNotation.add(result.getMessage()); + } else { + cleanupDirectory(disks, volumeName, i); + return new Status(Status.STATUS_CODE_FAILURE, "Error while preparing disk [" + disks.get(i) + + "] for volume [" + volumeName + "]"); + } + } + return new Status(Status.STATUS_CODE_SUCCESS, brickNotation.toString()); + + } + + private Status cleanupDirectory(List<String> disks, String volumeName, int maxIndex) { + String serverName, diskName, diskInfo[]; + Status result; + for (int i = 0; i < maxIndex; i++) { + // TODO: Call to delete the volume directory + 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); + if (!result.isSuccess()) { + return result; + } } + return new Status(Status.STATUS_CODE_SUCCESS, "Directories cleanedup..."); } - + public static void main(String[] args) { VolumesResource vr = new VolumesResource(); VolumeListResponse response = vr.getAllVolumes(); |
