diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-05-20 15:10:54 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-05-20 15:10:54 +0530 |
| commit | dfc27f51da469160e50e20d8ff59e714b5942546 (patch) | |
| tree | 7e85da4a3b24f150fde36ada059269ddd969e635 /src/com.gluster.storage.management.server | |
| parent | ee1867b0fbf7b66f82082c20c2d06238a2c6a6b9 (diff) | |
Story #77: Change "Disk" in volume context to "Brick"
Diffstat (limited to 'src/com.gluster.storage.management.server')
3 files changed, 59 insertions, 102 deletions
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java index 004160a7..13147465 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java @@ -70,10 +70,10 @@ public class AbstractServersResource { */ private void addDummyDisks(Server server) { double dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sda", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); + server.addDisk(new Disk(server, "sda", "/export/md0", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sdb", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); + server.addDisk(new Disk(server, "sdb", "/export/md1", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sdc", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); + server.addDisk(new Disk(server, "sdc", "/export/md2", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); } } 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 5db84994..4af22814 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 @@ -21,10 +21,8 @@ package com.gluster.storage.management.server.resources; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_PAUSE; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_SOURCE; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_START; -import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STATUS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STOP; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_TARGET; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_VOLUME_NAME; @@ -45,8 +43,6 @@ import static com.gluster.storage.management.core.constants.RESTConstants.SUBRES import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_OPTIONS; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; @@ -55,7 +51,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; -import java.util.zip.GZIPOutputStream; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; @@ -69,28 +64,27 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.LogMessage; 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.LogMessageListResponse; import com.gluster.storage.management.core.response.VolumeListResponse; import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse; import com.gluster.storage.management.core.utils.DateUtil; import com.gluster.storage.management.core.utils.FileUtil; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.server.constants.VolumeOptionsDefaults; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.api.core.InjectParam; -import com.sun.jersey.api.representation.Form; import com.sun.jersey.spi.resource.Singleton; @Singleton @@ -102,11 +96,13 @@ public class VolumesResource { @InjectParam private static ServerUtil serverUtil; - + @InjectParam private static GlusterUtil glusterUtil; - + private static final FileUtil fileUtil = new FileUtil(); + + private static GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; @@ -127,25 +123,13 @@ public class VolumesResource { @Consumes(MediaType.TEXT_XML) @Produces(MediaType.TEXT_XML) public Status createVolume(Volume volume) { - // Create the directories for the volume - List<String> disks = volume.getDisks(); - Status status = createDirectories(disks, volume.getName()); + List<String> brickDirectories = glusterCoreUtil.getQualifiedBrickList(volume.getBricks()); + Status status = glusterUtil.createVolume(volume, brickDirectories); if (status.isSuccess()) { - List<String> bricks = Arrays.asList(status.getMessage().split(" ")); - status = glusterUtil.createVolume(volume, bricks); - if (status.isSuccess()) { - Status optionsStatus = glusterUtil.createOptions(volume); - if (!optionsStatus.isSuccess()) { - status.setCode(Status.STATUS_CODE_PART_SUCCESS); - status.setMessage("Error while setting volume options: " + optionsStatus); - } - } else { - Status cleanupStatus = cleanupDirectories(disks, volume.getName(), disks.size(), "-d"); // delete - // permanently - if (!cleanupStatus.isSuccess()) { - status.setMessage(status.getMessage() + CoreConstants.NEWLINE + "Cleanup errors: " - + CoreConstants.NEWLINE + cleanupStatus); - } + Status optionsStatus = glusterUtil.createOptions(volume); + if (!optionsStatus.isSuccess()) { + status.setCode(Status.STATUS_CODE_PART_SUCCESS); + status.setMessage("Error while setting volume options: " + optionsStatus); } } return status; @@ -180,12 +164,12 @@ public class VolumesResource { @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) { Volume volume = glusterUtil.getVolume(volumeName); Status status = glusterUtil.deleteVolume(volumeName); - + String deleteOption = ""; - if(deleteFlag) { + if (deleteFlag) { deleteOption = "-d"; } - + if (status.isSuccess()) { List<String> disks = volume.getDisks(); Status postDeleteStatus = postDelete(volumeName, disks, deleteOption); @@ -204,18 +188,14 @@ public class VolumesResource { 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) { - volumeBricks.add(getBrickForDisk(getVolume(volumeName), brickInfo)); - } - Status status = glusterUtil.removeBricks(volumeName, volumeBricks); + Status status = glusterUtil.removeBricks(volumeName, bricks); String deleteOption = ""; - if(deleteFlag) { + if (deleteFlag) { deleteOption = "-d"; } - + if (status.isSuccess()) { Status cleanupStatus = cleanupDirectories(bricks, volumeName, bricks.size(), deleteOption); if (!cleanupStatus.isSuccess()) { @@ -269,14 +249,14 @@ public class VolumesResource { @SuppressWarnings("rawtypes") private Status prepareBrick(String serverName, String diskName, String volumeName) { - Object response = serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " - + diskName + " " + volumeName, GenericResponse.class); - if(response instanceof GenericResponse) { - return ((GenericResponse)response).getStatus(); + Object response = serverUtil.executeOnServer(true, serverName, PREPARE_BRICK_SCRIPT + " " + diskName + " " + + volumeName, GenericResponse.class); + if (response instanceof GenericResponse) { + return ((GenericResponse) response).getStatus(); } else { // in case of script failure on server, a Status object will be returned return (Status) response; - } + } } private Status createDirectories(List<String> disks, String volumeName) { @@ -324,11 +304,11 @@ public class VolumesResource { diskInfo = disks.get(i).split(":"); serverName = diskInfo[0]; diskName = diskInfo[1]; - - Object response = serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT - + " " + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class); - if(response instanceof GenericResponse) { - result = ((GenericResponse)response).getStatus(); + + Object response = serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + + diskName + " " + volumeName + " " + deleteFlag, GenericResponse.class); + if (response instanceof GenericResponse) { + result = ((GenericResponse) response).getStatus(); if (!result.isSuccess()) { // TODO: append error and continue with cleaning up of other directories return result; @@ -336,12 +316,12 @@ public class VolumesResource { } else { // TODO: append error and continue with cleaning up of other directories // In case of script execution failure, a Status object will be returned. - return (Status)response; + return (Status) response; } } return new Status(Status.STATUS_CODE_SUCCESS, "Directories cleaned up successfully!"); } - + private List<LogMessage> getBrickLogs(Volume volume, String brickName, Integer lineCount) throws GlusterRuntimeException { // brick name format is <serverName>:<brickDirectory> @@ -378,13 +358,13 @@ public class VolumesResource { } return logMessages; } - + @GET @Produces(MediaType.APPLICATION_OCTET_STREAM) @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_LOGS + "/" + SUBRESOURCE_DOWNLOAD) public StreamingOutput getLogs(@PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) { return new StreamingOutput() { - + @Override public void write(OutputStream output) throws IOException, WebApplicationException { Volume volume = getVolume(volumeName); @@ -404,13 +384,13 @@ public class VolumesResource { // create temporary directory File tempDir = fileUtil.createTempDir(); String tempDirPath = tempDir.getPath(); - - for(String brickName : volume.getBricks()) { + + for (String brickName : glusterCoreUtil.getQualifiedBrickList(volume.getBricks())) { // brick name format is <serverName>:<brickDirectory> String[] brickParts = brickName.split(":"); String serverName = brickParts[0]; String brickDir = brickParts[1]; - + String logDir = glusterUtil.getLogLocation(volume.getName(), brickName); String logFileName = glusterUtil.getLogFileNameForBrickDir(brickDir); String logFilePath = logDir + CoreConstants.FILE_SEPARATOR + logFileName; @@ -418,13 +398,13 @@ public class VolumesResource { String logContents = serverUtil.getFileFromServer(serverName, logFilePath); fileUtil.createTextFile(tempDirPath + CoreConstants.FILE_SEPARATOR + logFileName, logContents); } - + String gzipPath = fileUtil.getTempDirName() + CoreConstants.FILE_SEPARATOR + volume.getName() + "-logs.tar.gz"; new ProcessUtil().executeCommand("tar", "czvf", gzipPath, "-C", tempDir.getParent(), tempDir.getName()); - + // delete the temp directory fileUtil.recursiveDelete(tempDir); - + return gzipPath; } @@ -434,8 +414,7 @@ public class VolumesResource { @QueryParam(QUERY_PARAM_DISK_NAME) String diskName, @QueryParam(QUERY_PARAM_LOG_SEVERITY) String severity, @QueryParam(QUERY_PARAM_FROM_TIMESTAMP) String fromTimestamp, @QueryParam(QUERY_PARAM_TO_TIMESTAMP) String toTimestamp, - @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount, - @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) { + @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount, @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) { List<LogMessage> logMessages = null; try { @@ -499,7 +478,7 @@ public class VolumesResource { List<LogMessage> logMessages; logMessages = new ArrayList<LogMessage>(); // fetch logs for every brick of the volume - for (String brick : volume.getBricks()) { + for (String brick : glusterCoreUtil.getQualifiedBrickList(volume.getBricks())) { logMessages.addAll(getBrickLogs(volume, brick, lineCount)); } @@ -518,25 +497,7 @@ public class VolumesResource { @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS) public Status addDisks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(QUERY_PARAM_DISKS) String disks) { - - List<String> diskList = Arrays.asList(disks.split(",")); // Convert from comma separated sting (query parameter) - // to list - Status status = createDirectories(diskList, volumeName); - if (status.isSuccess()) { - List<String> bricks = Arrays.asList(status.getMessage().split(" ")); - status = glusterUtil.addBricks(volumeName, bricks); - - if (!status.isSuccess()) { - Status cleanupStatus = cleanupDirectories(diskList, volumeName, diskList.size(), "-d"); // Remove the - // directories - // if created - if (!cleanupStatus.isSuccess()) { - // append cleanup error to prepare brick error - status.setMessage(status.getMessage() + CoreConstants.NEWLINE + cleanupStatus.getMessage()); - } - } - } - return status; + return glusterUtil.addBricks(volumeName, Arrays.asList(disks)); } @PUT @@ -549,7 +510,7 @@ public class VolumesResource { private String getBrickForDisk(Volume volume, String diskName) { int index = volume.getDisks().indexOf(diskName); - return volume.getBricks().get(index); + return volume.getBricks().get(index).getBrickDirectory(); } private String getDiskForBrick(Volume volume, String brickName) { 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 7299a135..6db6bffc 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 @@ -28,8 +28,8 @@ import java.util.Map.Entry; import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; -import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.Status; @@ -169,7 +169,7 @@ public class GlusterUtil { return new Status(processUtil.executeCommand("gluster", "volume", "reset", volumeName)); } - public Status createVolume(Volume volume, List<String> bricks) { + public Status createVolume(Volume volume, List<String> brickDirectories) { int count = 1; // replica or stripe count String volumeType = null; VOLUME_TYPE volType = volume.getVolumeType(); @@ -184,7 +184,7 @@ public class GlusterUtil { String transportTypeStr = null; TRANSPORT_TYPE transportType = volume.getTransportType(); transportTypeStr = (transportType == TRANSPORT_TYPE.ETHERNET) ? "tcp" : "rdma"; - List<String> command = prepareVolumeCreateCommand(volume, bricks, count, volumeType, transportTypeStr); + List<String> command = prepareVolumeCreateCommand(volume, brickDirectories, count, volumeType, transportTypeStr); ProcessResult result = processUtil.executeCommand(command); if (!result.isSuccess()) { return new Status(result); @@ -193,8 +193,8 @@ public class GlusterUtil { return createOptions(volume); } - private List<String> prepareVolumeCreateCommand(Volume volume, List<String> bricks, int count, String volumeType, - String transportTypeStr) { + private List<String> prepareVolumeCreateCommand(Volume volume, List<String> brickDirectories, int count, + String volumeType, String transportTypeStr) { List<String> command = new ArrayList<String>(); command.add("gluster"); command.add("volume"); @@ -206,7 +206,7 @@ public class GlusterUtil { } command.add("transport"); command.add(transportTypeStr); - command.addAll(bricks); + command.addAll(brickDirectories); return command; } @@ -276,7 +276,6 @@ public class GlusterUtil { return false; } - private void readReplicaOrStripeCount(Volume volume, String line) { if (extractToken(line, "x") != null) { // expected formated of line is "Number of Bricks: 3 x 2 = 6" @@ -286,7 +285,7 @@ public class GlusterUtil { } else if (volume.getVolumeType() == VOLUME_TYPE.DISTRIBUTED_MIRROR) { volume.setReplicaCount(count); volume.setStripeCount(0); - } + } } return; @@ -316,15 +315,14 @@ public class GlusterUtil { String[] brickParts = line.split(":"); String serverName = brickParts[1].trim(); String brickDir = brickParts[2].trim(); - - volume.addBrick(serverName + ":" + brickDir); + Brick brick = new Brick(serverName, brickDir.split("/")[2].trim(), brickDir); + volume.addBrick(brick); detectAndAddDiskToVolume(volume, serverName, brickDir); return true; } return false; } - private void detectAndAddDiskToVolume(Volume volume, String serverName, String brickDir) { // brick directory should be of the form /export/<diskname>/volume-name try { @@ -343,7 +341,6 @@ public class GlusterUtil { } } - private boolean readBrickGroup(String line) { return extractToken(line, VOLUME_BRICKS_GROUP_PFX) != null; } @@ -435,7 +432,6 @@ public class GlusterUtil { return volumes; } - public Status addBricks(String volumeName, List<String> bricks) { List<String> command = new ArrayList<String>(); command.add("gluster"); @@ -446,7 +442,6 @@ public class GlusterUtil { return new Status(processUtil.executeCommand(command)); } - public String getLogLocation(String volumeName, String brickName) { ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "log", "locate", volumeName, brickName); @@ -471,11 +466,12 @@ public class GlusterUtil { logFileName = logFileName.replaceAll(CoreConstants.FILE_SEPARATOR, "-") + ".log"; return logFileName; } - - public Status migrateDisk( String volumeName, String diskFrom, String diskTo, String operation ) { - return new Status(processUtil.executeCommand("gluster", "volume", "replace-brick", volumeName, diskFrom, diskTo, operation)); + + public Status migrateDisk(String volumeName, String diskFrom, String diskTo, String operation) { + 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"); |
