diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-04-20 19:32:00 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-04-20 19:37:09 +0530 |
| commit | f73a94f87bab4088d7b95ee54f98f29b2dd72876 (patch) | |
| tree | af5d42781fd26a664fdac21cfaa7eaa6ce728b40 /src/com.gluster.storage.management.server | |
| parent | 9eab8a53fd4fc13ff35e61ebb68c024747020efe (diff) | |
Story#34 - Volume logs - REST server changes
Diffstat (limited to 'src/com.gluster.storage.management.server')
2 files changed, 60 insertions, 1 deletions
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 a4ecfcc6..0bf781cf 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 @@ -24,8 +24,11 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P 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_STOP; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_VOLUME_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DISK_NAME; +import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_LINE_COUNT; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_VOLUMES; import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS; +import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_LOGS; import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_OPTIONS; import java.util.ArrayList; @@ -40,14 +43,18 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; 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.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.server.constants.VolumeOptionsDefaults; @@ -61,6 +68,7 @@ import com.sun.jersey.spi.resource.Singleton; public class VolumesResource { private static final String PREPARE_BRICK_SCRIPT = "create_volume_directory.py"; private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "clear_volume_directory.py"; + private static final String VOLUME_DISK_LOG_SCRIPT = "get_volume_disk_log.py"; @InjectParam private static ServerUtil serverUtil; @@ -212,6 +220,56 @@ public class VolumesResource { } return new Status(Status.STATUS_CODE_SUCCESS, "Directories cleaned up successfully!"); } + + private List<LogMessage> getDiskLogs(String volumeName, String diskName, Integer lineCount) + throws GlusterRuntimeException { + String[] diskParts = diskName.split(":"); + String server = diskParts[0]; + String disk = diskParts[1]; + + // Usage: get_volume_disk_log.py <volumeName> <diskName> <lineCount> + Status logStatus = (Status) serverUtil.executeOnServer(true, server, VOLUME_DISK_LOG_SCRIPT + " " + volumeName + + " " + disk + " " + lineCount, Status.class); + if(!logStatus.isSuccess()) { + throw new GlusterRuntimeException(logStatus.toString()); + } + + return extractLogMessages(logStatus.getMessage()); + } + + private List<LogMessage> extractLogMessages(String logContent) { + List<LogMessage> logMessages = new ArrayList<LogMessage>(); + for(String logMessage : logContent.split(CoreConstants.NEWLINE)) { + logMessages.add(new LogMessage(logMessage)); + } + + return logMessages; + } + + @GET + @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_LOGS) + public LogMessageListResponse getLogs(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, + @QueryParam(QUERY_PARAM_DISK_NAME) String diskName, @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount) { + List<LogMessage> logMessages = null; + + try { + if (diskName == null || diskName.isEmpty()) { + logMessages = new ArrayList<LogMessage>(); + // fetch logs for every brick of the volume + Volume volume = getVolume(volumeName); + for (String volumeDisk : volume.getDisks()) { + logMessages.addAll(getDiskLogs(volumeName, volumeDisk, lineCount)); + } + } else { + // fetch logs for given brick of the volume + logMessages = getDiskLogs(volumeName, diskName, lineCount); + } + } catch (Exception e) { + return new LogMessageListResponse(new Status(e), null); + } + + return new LogMessageListResponse(Status.STATUS_SUCCESS, logMessages); + } public static void main(String[] args) { VolumesResource vr = new VolumesResource(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 4f99172d..47657c2a 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -39,7 +39,6 @@ import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.ProcessUtil; @@ -75,6 +74,7 @@ public class ServerUtil { * @param expectedClass Class of the object expected from script execution * @return Response from remote execution of the command */ + @SuppressWarnings("rawtypes") public Object executeOnServer(boolean runInForeground, String serverName, String commandWithArgs, Class expectedClass) { StringBuffer output = new StringBuffer(); try { @@ -114,6 +114,7 @@ public class ServerUtil { * class Status. If that also fails, a status object with exception message is created and returned. * @return Object of given expected class, or a status object in case first unmarshalling fails. */ + @SuppressWarnings("rawtypes") private Object unmarshal(Class expectedClass, String input, boolean tryStatusOnFailure) { try { // create JAXB context and instantiate marshaller |
