summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhandapani <dhandapani@gluster.com>2011-04-11 10:40:26 +0530
committerDhandapani <dhandapani@gluster.com>2011-04-11 10:40:26 +0530
commita74db3659cb4102cb654ae83f5bd710b751acd46 (patch)
tree6285b78b42e3c21f197faa728fda23cc2ec61f70
parentf519a04fd95c7dba349a9a1b4275ef55e8e55990 (diff)
Create Reexport directory on remote nodes
Clean up the created directories in case of failure
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java6
-rw-r--r--src/com.gluster.storage.management.gui/META-INF/MANIFEST.MF3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java11
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java85
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();