From ad070fa40d7bcb7c504d5798510874d4a7e6db3a Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Sun, 31 Jul 2011 18:33:21 +0530 Subject: Task #149 - Version based call to python scripts --- .../gateway/resources/v1_0/VolumesResource.java | 17 +++++----- .../gateway/tasks/InitializeDiskTask.java | 22 ++++++------- .../gateway/tasks/RebalanceVolumeTask.java | 15 +++------ .../gateway/utils/AbstractStatsFactory.java | 3 +- .../management/gateway/utils/GlusterUtil.java | 6 ++-- .../management/gateway/utils/ServerUtil.java | 36 +++++++++++++++++++--- 6 files changed, 59 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/resources/v1_0/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/resources/v1_0/VolumesResource.java index fad19e7e..45df1ae7 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/resources/v1_0/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/resources/v1_0/VolumesResource.java @@ -84,6 +84,7 @@ import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.exceptions.GlusterValidationException; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Status; @@ -368,13 +369,13 @@ public class VolumesResource extends AbstractResource { } } - private Status performOperation(String volumeName, String operation, GlusterServer onlineServer) { + private void performOperation(String volumeName, String operation, GlusterServer onlineServer) { if (operation.equals(TASK_START)) { - return glusterUtil.startVolume(volumeName, onlineServer.getName()); + glusterUtil.startVolume(volumeName, onlineServer.getName()); } else if (operation.equals(TASK_STOP)) { - return glusterUtil.stopVolume(volumeName, onlineServer.getName()); + glusterUtil.stopVolume(volumeName, onlineServer.getName()); } else { - return new Status(Status.STATUS_CODE_FAILURE, "Invalid operation code [" + operation + "]"); + throw new GlusterValidationException("Invalid operation code [" + operation + "]"); } } @@ -500,7 +501,7 @@ public class VolumesResource extends AbstractResource { String brickDirectory = brickInfo[1]; String mountPoint = brickDirectory.substring(0, brickDirectory.lastIndexOf("/")); - Object response = serverUtil.executeOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + Object response = serverUtil.executeScriptOnServer(true, serverName, VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + mountPoint + " " + volumeName + " " + (deleteFlag ? "-d" : ""), GenericResponse.class); if (response instanceof GenericResponse) { result = ((GenericResponse) response).getStatus(); @@ -524,7 +525,7 @@ public class VolumesResource extends AbstractResource { String brickDirectory = brick.getBrickDirectory(); String mountPoint = brickDirectory.substring(0, brickDirectory.lastIndexOf("/")); - result = (Status) serverUtil.executeOnServer(true, brick.getServerName(), VOLUME_DIRECTORY_CLEANUP_SCRIPT + result = (Status) serverUtil.executeScriptOnServer(true, brick.getServerName(), VOLUME_DIRECTORY_CLEANUP_SCRIPT + " " + mountPoint + " " + volumeName + (deleteFlag ? " -d" : ""), Status.class); if (!result.isSuccess()) { throw new GlusterRuntimeException("Error in post-delete operation of volume [" + volumeName + "]: " @@ -652,8 +653,8 @@ public class VolumesResource extends AbstractResource { String logFilePath = logDir + CoreConstants.FILE_SEPARATOR + logFileName; // Usage: get_volume_disk_log.py - Object responseObj = serverUtil.executeOnServer(true, brick.getServerName(), VOLUME_BRICK_LOG_SCRIPT + " " - + logFilePath + " " + lineCount, LogMessageListResponse.class); + Object responseObj = serverUtil.executeScriptOnServer(true, brick.getServerName(), VOLUME_BRICK_LOG_SCRIPT + + " " + logFilePath + " " + lineCount, LogMessageListResponse.class); LogMessageListResponse response = null; if (responseObj instanceof LogMessageListResponse) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java index f5cc5332..e7da1de6 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java @@ -33,6 +33,7 @@ import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.gateway.services.ClusterService; import com.gluster.storage.management.gateway.utils.GlusterUtil; +import com.gluster.storage.management.gateway.utils.ServerUtil; import com.gluster.storage.management.gateway.utils.SshUtil; import com.sun.jersey.core.util.Base64; @@ -43,7 +44,7 @@ public class InitializeDiskTask extends Task { private String serverName; private String diskName; private String fsType; - private SshUtil sshUtil; + private ServerUtil serverUtil; private GlusterUtil glusterUtil; public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName, String fsType) { @@ -65,7 +66,7 @@ public class InitializeDiskTask extends Task { private void init() { ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); glusterUtil = ctx.getBean(GlusterUtil.class); - sshUtil = ctx.getBean(SshUtil.class); + serverUtil = ctx.getBean(ServerUtil.class); } @Override @@ -118,17 +119,12 @@ public class InitializeDiskTask extends Task { private void startInitializeDisk(String serverName) { String fsTypeCommand = (getFsType().equals(GlusterConstants.FSTYPE_DEFAULT)) ? "" : " -t " + getFsType(); - ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + fsTypeCommand + " " - + getDiskName()); - if (processResult.isSuccess()) { - TaskStatus taskStatus = new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput())); - taskStatus.setPercentageSupported((getFsType().equals(GlusterConstants.FSTYPE_XFS)) ? false : true); - getTaskInfo().setStatus(taskStatus); - return; - } - - // if we reach here, it means Initialize disk start failed. - throw new GlusterRuntimeException(processResult.toString()); + + String output = (String) serverUtil.executeScriptOnServer(true, serverName, INITIALIZE_DISK_SCRIPT + + fsTypeCommand + " " + getDiskName(), String.class); + TaskStatus taskStatus = new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, output)); + taskStatus.setPercentageSupported((getFsType().equals(GlusterConstants.FSTYPE_XFS)) ? false : true); + getTaskInfo().setStatus(taskStatus); } @Override diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/RebalanceVolumeTask.java index 3038f961..c53f0252 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/RebalanceVolumeTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/RebalanceVolumeTask.java @@ -31,6 +31,7 @@ import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.gateway.services.ClusterService; import com.gluster.storage.management.gateway.utils.GlusterUtil; +import com.gluster.storage.management.gateway.utils.ServerUtil; import com.gluster.storage.management.gateway.utils.SshUtil; import com.sun.jersey.core.util.Base64; @@ -38,7 +39,7 @@ public class RebalanceVolumeTask extends Task { private String layout; private String serverName; - private SshUtil sshUtil; + private ServerUtil serverUtil; private GlusterUtil glusterUtil; public RebalanceVolumeTask(ClusterService clusterService, String clusterName, String volumeName, String layout) { @@ -51,7 +52,7 @@ public class RebalanceVolumeTask extends Task { private void init() { ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); - sshUtil = ctx.getBean(SshUtil.class); + serverUtil = ctx.getBean(ServerUtil.class); glusterUtil = ctx.getBean(GlusterUtil.class); } @@ -74,14 +75,8 @@ public class RebalanceVolumeTask extends Task { private void startRebalance(String serverName) { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - if (processResult.isSuccess()) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); - return; - } - - // if we reach here, it means rebalance start failed. - throw new GlusterRuntimeException(processResult.toString()); + String output = (String)serverUtil.executeOnServer(true, serverName, command, String.class); + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, output))); } @Override diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/AbstractStatsFactory.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/AbstractStatsFactory.java index 0e73297f..13a58729 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/AbstractStatsFactory.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/AbstractStatsFactory.java @@ -155,7 +155,8 @@ public abstract class AbstractStatsFactory implements StatsFactory { argsStr += " " + arg; } } - Object output = serverUtil.executeOnServer(true, serverName, getStatsScriptName() + argsStr + " " + period, ServerStats.class); + Object output = serverUtil.executeScriptOnServer(true, serverName, getStatsScriptName() + argsStr + " " + + period, ServerStats.class); //String cpuUsageData = " 1310468100 300 1310471700 13 3 user system total 13104681002.23802952e-14.3747778209e-016.6128073384e-01 13104684002.3387347338e-014.4642717442e-016.8030064780e-01 13104687005.5043873220e+006.2462376636e+001.1750624986e+01 13104690002.4350593653e+012.6214585217e+015.0565178869e+01 13104693004.0786489953e+014.6784713828e+018.7571203781e+01 13104696004.1459955508e+015.2546309044e+019.4006264551e+01 13104699004.2312286165e+015.2390588332e+019.4702874497e+01 13104702004.2603794982e+015.1598861493e+019.4202656475e+01 13104705003.8238751290e+014.5312089966e+018.3550841256e+01 13104708001.7949961224e+012.1282058418e+013.9232019642e+01 13104711001.2330371421e-014.6347832868e-015.8678204289e-01 13104714001.6313260492e-015.4088119561e-017.0401380052e-01 1310471700NaNNaNNaN "; //Object output = unmarshal(ServerStats.class, cpuUsageData, false); if(output instanceof Status) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/GlusterUtil.java index 7622d283..55909d54 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/GlusterUtil.java @@ -42,7 +42,6 @@ import com.gluster.storage.management.core.model.Server.SERVER_STATUS; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskStatus; 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_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; @@ -50,7 +49,6 @@ import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.StringUtil; import com.gluster.storage.management.gateway.resources.v1_0.TasksResource; -import com.sun.jersey.api.core.InjectParam; @Component public class GlusterUtil { @@ -617,8 +615,8 @@ public class GlusterUtil { } public TaskStatus getInitializingDeviceStatus(String serverName, String diskName) { - Object response = serverUtil.executeOnServer(true, serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName, - InitDiskStatusResponse.class); + Object response = serverUtil.executeScriptOnServer(true, serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + + diskName, InitDiskStatusResponse.class); TaskStatus taskStatus = new TaskStatus(); if (response instanceof Status) { diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/ServerUtil.java index 0fae0078..91c7c81c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/ServerUtil.java @@ -22,6 +22,7 @@ package com.gluster.storage.management.gateway.utils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; import java.util.ArrayList; import java.util.List; @@ -54,12 +55,17 @@ public class ServerUtil { @Autowired private SshUtil sshUtil; + @Autowired + private String appVersion; + private static final Logger logger = Logger.getLogger(ServerUtil.class); private static final String SCRIPT_DIR = "scripts"; private static final String SCRIPT_COMMAND = "python"; private static final String REMOTE_SCRIPT_GET_DISK_FOR_DIR = "get_disk_for_dir.py"; private static final String REMOTE_SCRIPT_GET_SERVER_DETAILS = "get_server_details.py"; + private static final String REMOTE_SCRIPT_BASE_DIR = "/opt/glustermg"; + private static final String REMOTE_SCRIPT_DIR_NAME = "backend"; public void setSshUtil(SshUtil sshUtil) { this.sshUtil = sshUtil; @@ -75,8 +81,11 @@ public class ServerUtil { } private String getScriptPath(String scriptName) { - String scriptPath = servletContext.getRealPath(SCRIPT_DIR) + CoreConstants.FILE_SEPARATOR + scriptName; - return scriptPath; + return servletContext.getRealPath(SCRIPT_DIR) + CoreConstants.FILE_SEPARATOR + scriptName; + } + + private String getRemoteScriptDir() { + return REMOTE_SCRIPT_BASE_DIR + File.separator + appVersion + File.separator + REMOTE_SCRIPT_DIR_NAME; } /** @@ -98,12 +107,31 @@ public class ServerUtil { private Object fetchServerDetails(String serverName) { // fetch standard server details like cpu, disk, memory details - Object response = executeOnServer(true, serverName, REMOTE_SCRIPT_GET_SERVER_DETAILS, Server.class); + Object response = executeScriptOnServer(true, serverName, REMOTE_SCRIPT_GET_SERVER_DETAILS, Server.class); if (response instanceof Status) { throw new GlusterRuntimeException(((Status) response).getMessage()); } return response; } + + /** + * Executes given script on given server. Since the remote server may contain multiple versions of backend, this + * method will invoke the script present in directory of same version as the gateway. + * + * @param runInForeground + * @param serverName + * @param scriptWithArgs + * The script name followed by arguments to be passed. Note that the script name should not contain path + * as it will be automatically identified by the method. + * @param expectedClass + * Class of the object expected from script execution + * @return Object of the expected class from remote execution of the command. In case the remote execution fails + * ungracefully, an object of class {@link Status} will be returned. + */ + public Object executeScriptOnServer(boolean runInForeground, String serverName, String scriptWithArgs, + @SuppressWarnings("rawtypes") Class expectedClass) { + return executeOnServer(runInForeground, serverName, getRemoteScriptDir() + File.separator + scriptWithArgs, expectedClass); + } /** * Executes given command on given server @@ -232,7 +260,7 @@ public class ServerUtil { * @return Status object containing the disk name, or error message in case the remote script fails. */ public Status getDiskForDir(String serverName, String brickDir) { - return (Status) executeOnServer(true, serverName, REMOTE_SCRIPT_GET_DISK_FOR_DIR + " " + brickDir, Status.class); + return (Status) executeScriptOnServer(true, serverName, REMOTE_SCRIPT_GET_DISK_FOR_DIR + " " + brickDir, Status.class); } public static void main(String[] args) { -- cgit