summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-07-31 18:33:21 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-07-31 18:33:21 +0530
commitad070fa40d7bcb7c504d5798510874d4a7e6db3a (patch)
tree88c8f889417f49cd00c679fb8814ad9d4ac4a02a
parent36c1b154f509b4dcfd22fb1a4cb60ecad7e175e1 (diff)
Task #149 - Version based call to python scripts
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/resources/v1_0/VolumesResource.java17
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/InitializeDiskTask.java22
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/tasks/RebalanceVolumeTask.java15
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/AbstractStatsFactory.java3
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/GlusterUtil.java6
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/gateway/utils/ServerUtil.java36
6 files changed, 59 insertions, 40 deletions
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 <volumeName> <diskName> <lineCount>
- 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 = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> <xport> <meta> <start>1310468100</start> <step>300</step> <end>1310471700</end> <rows>13</rows> <columns>3</columns> <legend> <entry>user</entry> <entry>system</entry> <entry>total</entry> </legend> </meta> <data> <row><t>1310468100</t><v>2.23802952e-1</v><v>4.3747778209e-01</v><v>6.6128073384e-01</v></row> <row><t>1310468400</t><v>2.3387347338e-01</v><v>4.4642717442e-01</v><v>6.8030064780e-01</v></row> <row><t>1310468700</t><v>5.5043873220e+00</v><v>6.2462376636e+00</v><v>1.1750624986e+01</v></row> <row><t>1310469000</t><v>2.4350593653e+01</v><v>2.6214585217e+01</v><v>5.0565178869e+01</v></row> <row><t>1310469300</t><v>4.0786489953e+01</v><v>4.6784713828e+01</v><v>8.7571203781e+01</v></row> <row><t>1310469600</t><v>4.1459955508e+01</v><v>5.2546309044e+01</v><v>9.4006264551e+01</v></row> <row><t>1310469900</t><v>4.2312286165e+01</v><v>5.2390588332e+01</v><v>9.4702874497e+01</v></row> <row><t>1310470200</t><v>4.2603794982e+01</v><v>5.1598861493e+01</v><v>9.4202656475e+01</v></row> <row><t>1310470500</t><v>3.8238751290e+01</v><v>4.5312089966e+01</v><v>8.3550841256e+01</v></row> <row><t>1310470800</t><v>1.7949961224e+01</v><v>2.1282058418e+01</v><v>3.9232019642e+01</v></row> <row><t>1310471100</t><v>1.2330371421e-01</v><v>4.6347832868e-01</v><v>5.8678204289e-01</v></row> <row><t>1310471400</t><v>1.6313260492e-01</v><v>5.4088119561e-01</v><v>7.0401380052e-01</v></row> <row><t>1310471700</t><v>NaN</v><v>NaN</v><v>NaN</v></row> </data> </xport>";
//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) {