summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.server
diff options
context:
space:
mode:
Diffstat (limited to 'src/com.gluster.storage.management.server')
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java62
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java48
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java85
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java12
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java33
5 files changed, 114 insertions, 126 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 0c91a02b..8c7f54ae 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
@@ -20,17 +20,22 @@
*/
package com.gluster.storage.management.server.resources;
-import com.gluster.storage.management.core.model.Disk;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.server.utils.GlusterUtil;
+import com.gluster.storage.management.server.utils.ServerUtil;
+import com.sun.jersey.api.core.InjectParam;
/**
* Abstract resource class for servers. Abstracts basic server related functionality like "get server details".
*/
public class AbstractServersResource {
- // TODO: Used for generating dummy ip address. To be removed after implementing actual logic for fetching server
- // details
- private static int ipCount = 1;
+ @InjectParam
+ private ServerUtil serverUtil;
+
+ @InjectParam
+ private GlusterUtil glusterUtil;
/**
* Fetch details of the given server. The server name must be populated in the object before calling this method.
@@ -38,43 +43,20 @@ public class AbstractServersResource {
* @param server
* Server whose details are to be fetched
*/
-
-
-
-// public Server getServerDetails(String serverName) {
-//
-// }
-
-
-
- /**
- * @param server
- */
- private void populateDummyData(Server server) {
- server.setNumOfCPUs((int) (Math.ceil(Math.random() * 8)));
- server.setCpuUsage(Math.random() * 100);
- server.setTotalMemory(Math.ceil(Math.random() * 8));
- server.setMemoryInUse(Math.random() * server.getTotalMemory());
- addDummyDisks(server);
- //addDummyNetworkInterfaces(server, (int) Math.ceil(Math.random() * 4));
+ protected void fetchServerDetails(Server server) {
+ // fetch standard server details like cpu, disk, memory details
+ Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class);
+ if (response instanceof Status) {
+ throw new GlusterRuntimeException(((Status)response).getMessage());
+ }
+ server.copyFrom((Server) response); // Update the details in <Server> object
}
-// private void addDummyNetworkInterfaces(Server server, int interfaceCount) {
-// for (int i = 0; i < interfaceCount; i++) {
-// server.addNetworkInterface(new NetworkInterface("eth" + i, server, "192.168.1." + ipCount++,
-// "255.255.255.0", "192.168.1.1"));
-// }
-// }
+ protected void setGlusterUtil(GlusterUtil glusterUtil) {
+ this.glusterUtil = glusterUtil;
+ }
- /**
- * @param server
- */
- private void addDummyDisks(Server server) {
- double dummyDiskSpace = Math.random() * 500;
- server.addDisk(new Disk(server, "sda", 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));
- dummyDiskSpace = Math.random() * 500;
- server.addDisk(new Disk(server, "sdc", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
+ protected GlusterUtil getGlusterUtil() {
+ return glusterUtil;
}
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
index 189e75f9..eba06bf5 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
@@ -30,6 +30,7 @@ import javax.ws.rs.core.MediaType;
import org.springframework.stereotype.Component;
+import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.Status;
@@ -46,16 +47,15 @@ import com.sun.jersey.spi.resource.Singleton;
public class DiscoveredServersResource extends AbstractServersResource {
private List<String> discoveredServerNames = new ArrayList<String>();
- @InjectParam
- private static ServerUtil serverUtil;
-
public List<String> getDiscoveredServerNames() {
return discoveredServerNames;
}
+
@GET
@Produces(MediaType.TEXT_XML)
- public Object getDiscoveredServers(@QueryParam("details") Boolean getDetails) {
+ @SuppressWarnings("rawtypes")
+ public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) {
if(getDetails != null && getDetails == true) {
return getDiscoveredServerDetails();
}
@@ -65,15 +65,27 @@ public class DiscoveredServersResource extends AbstractServersResource {
private ServerListResponse getDiscoveredServerDetails() {
List<Server> discoveredServers = new ArrayList<Server>();
List<String> serverNames = getDiscoveredServerNames();
- GenericResponse<Server> discoveredServer;
+ GenericResponse<Server> discoveredServerResponse;
+ int errCount = 0;
+ StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): ");
for (String serverName : serverNames) {
- discoveredServer = getDiscoveredServer(serverName);
- if (!discoveredServer.getStatus().isSuccess()) {
- return new ServerListResponse(discoveredServer.getStatus(), discoveredServers);
+ discoveredServerResponse = getDiscoveredServer(serverName);
+ if (!discoveredServerResponse.getStatus().isSuccess()) {
+ errMsg.append(CoreConstants.NEWLINE + serverName + " : " + discoveredServerResponse.getStatus());
+ errCount++;
+ } else {
+ discoveredServers.add(discoveredServerResponse.getData());
}
- discoveredServers.add(discoveredServer.getData());
}
- return new ServerListResponse(Status.STATUS_SUCCESS, discoveredServers);
+ Status status = null;
+ if(errCount == 0) {
+ status = new Status(Status.STATUS_CODE_SUCCESS, "Success");
+ } else if(errCount == serverNames.size()) {
+ status = new Status(Status.STATUS_CODE_FAILURE, errMsg.toString());
+ } else {
+ status = new Status(Status.STATUS_CODE_PART_SUCCESS, errMsg.toString());
+ }
+ return new ServerListResponse(status, discoveredServers);
}
public void setDiscoveredServerNames(List<String> discoveredServerNames) {
@@ -87,20 +99,14 @@ public class DiscoveredServersResource extends AbstractServersResource {
@Produces(MediaType.TEXT_XML)
public GenericResponse<Server> getDiscoveredServer(@PathParam("serverName") String serverName) {
Server server = new Server(serverName);
- return fetchServerDetails(server);
- }
-
- protected GenericResponse<Server> fetchServerDetails(Server server) {
- // fetch standard server details like cpu, disk, memory details
- Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class);
- if (response instanceof Status) {
- return new GenericResponse<Server>((Status)response, server);
+ try {
+ fetchServerDetails(server);
+ } catch (Exception e) {
+ return new GenericResponse<Server>(new Status(e), null);
}
- server.copyFrom((Server) response); // Update the details in <Server> object
- return new GenericResponse<Server>( Status.STATUS_SUCCESS, (Server) response);
+ return new GenericResponse<Server>(Status.STATUS_SUCCESS, server);
}
-
public static void main(String[] args) {
StringListResponse listResponse = (StringListResponse)new DiscoveredServersResource().getDiscoveredServers(false);
for (String server : listResponse.getData()) {
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
index d01b4d3d..71c0f7db 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
@@ -32,55 +32,48 @@ import javax.ws.rs.core.MediaType;
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.model.GlusterServer;
import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
-import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.Status;
-import com.gluster.storage.management.core.response.GenericResponse;
import com.gluster.storage.management.core.response.GlusterServerListResponse;
import com.gluster.storage.management.core.response.GlusterServerResponse;
-import com.gluster.storage.management.core.utils.ProcessResult;
-import com.gluster.storage.management.core.utils.ProcessUtil;
-import com.gluster.storage.management.server.filters.GlusterResourceFilterFactory;
import com.gluster.storage.management.server.utils.GlusterUtil;
-import com.gluster.storage.management.server.utils.ServerUtil;
import com.gluster.storage.management.server.utils.SshUtil;
-import com.sun.jersey.api.core.InjectParam;
import com.sun.jersey.spi.resource.Singleton;
@Component
@Singleton
@Path("/cluster/servers")
public class GlusterServersResource extends AbstractServersResource {
- @InjectParam
- private GlusterUtil glusterUtil;
-
- @InjectParam
- private static ServerUtil serverUtil;
public static final String HOSTNAMETAG = "hostname:";
- public void setGlusterUtil(GlusterUtil glusterUtil) {
- this.glusterUtil = glusterUtil;
- }
-
- public GlusterUtil getGlusterUtil() {
- return glusterUtil;
- }
-
private GlusterServerListResponse getServerDetails(String knownServer) {
- List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(knownServer);
- GenericResponse<Server> serverResponse;
+ List<GlusterServer> glusterServers = getGlusterUtil().getGlusterServers(knownServer);
+ int errCount = 0;
+ StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): ");
+
for (GlusterServer server : glusterServers) {
if (server.getStatus() == SERVER_STATUS.ONLINE) {
- serverResponse = fetchServerDetails(server);
- if (!serverResponse.getStatus().isSuccess()) {
- return new GlusterServerListResponse(serverResponse.getStatus(), glusterServers);
+ try {
+ fetchServerDetails(server);
+ } catch (Exception e) {
+ errMsg.append(CoreConstants.NEWLINE + server.getName() + " : [" + e.getMessage() + "]");
+ errCount++;
}
}
}
- return new GlusterServerListResponse(Status.STATUS_SUCCESS, glusterServers);
+ Status status;
+ if (errCount==0) {
+ status = new Status(Status.STATUS_CODE_SUCCESS, "Success");
+ } else if(errCount == glusterServers.size()) {
+ status = new Status(Status.STATUS_CODE_FAILURE, errMsg.toString());
+ } else {
+ status = new Status(Status.STATUS_CODE_PART_SUCCESS, errMsg.toString());
+ }
+ return new GlusterServerListResponse(status, glusterServers);
}
@GET
@@ -93,46 +86,38 @@ public class GlusterServersResource extends AbstractServersResource {
@GET
@Path("{serverName}")
@Produces(MediaType.TEXT_XML)
- public GlusterServerResponse getGlusterServer(@PathParam("serverName") String serverName) {
- // TODO: Implement logic to fetch details of a single gluster server (peer)
- GlusterServer server = new GlusterServer(serverName);
- GenericResponse<Server> serverResponse = fetchServerDetails(server);
- return new GlusterServerResponse(serverResponse.getStatus(), (GlusterServer) serverResponse.getData());
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * com.gluster.storage.management.server.resources.AbstractServersResource#fetchServerDetails(com.gluster.storage
- * .management.core.model.Server)
- */
- protected GenericResponse<Server> fetchServerDetails(Server server) {
- // fetch standard server details like cpu, disk, memory details
- Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class);
- if (response instanceof Status) {
- return new GenericResponse<Server>((Status) response, server);
+ public GlusterServerResponse getGlusterServer(
+ @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer,
+ @PathParam("serverName") String serverName) {
+ GlusterServer server = getGlusterUtil().getGlusterServer(knownServer, serverName);
+ Status status = Status.STATUS_SUCCESS;
+ if(server.isOnline()) {
+ try {
+ fetchServerDetails(server);
+ } catch (Exception e) {
+ status.setCode(Status.STATUS_CODE_FAILURE);
+ }
}
- server.copyFrom((Server) response); // Update the details in <Server> object
- return new GenericResponse<Server>(Status.STATUS_SUCCESS, (Server) response);
+ return new GlusterServerResponse(status, server);
}
@POST
@Produces(MediaType.TEXT_XML)
public GlusterServerResponse addServer(@FormParam("serverName") String serverName,
@FormParam("existingServer") String existingServer) {
- Status status = glusterUtil.addServer(serverName, existingServer);
+ Status status = getGlusterUtil().addServer(serverName, existingServer);
if (!status.isSuccess()) {
return new GlusterServerResponse(status, null);
}
- return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(serverName).getGlusterServer());
+ return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(existingServer, serverName)
+ .getGlusterServer());
}
@DELETE
@Produces(MediaType.TEXT_XML)
public Status removeServer(@QueryParam("serverName") String serverName) {
- return glusterUtil.removeServer(serverName);
+ return getGlusterUtil().removeServer(serverName);
}
public static void main(String[] args) {
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 ef345e8d..030fa98a 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
@@ -99,6 +99,18 @@ public class GlusterUtil {
return server;
}
+
+ public GlusterServer getGlusterServer(String knownServer, String serverName) {
+ List<GlusterServer> servers = getGlusterServers(knownServer);
+ for(GlusterServer server : servers) {
+ if(server.getName().equals(serverName)) {
+ return server;
+ }
+ }
+ return null;
+ }
+
+
public List<GlusterServer> getGlusterServers(String knownServer) {
String output = getPeerStatus(knownServer);
if (output == null) {
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 23a8169d..5b953c3d 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
@@ -49,7 +49,7 @@ import com.gluster.storage.management.core.utils.ProcessUtil;
public class ServerUtil {
@Autowired
ServletContext servletContext;
-
+
@Autowired
private SshUtil sshUtil;
@@ -87,7 +87,7 @@ public class ServerUtil {
Class expectedClass) {
try {
String output = executeOnServer(serverName, commandWithArgs);
-System.out.println(output);
+
// In case the script execution exits ungracefully, the agent would return a GenericResponse.
// hence pass last argument as true to try GenericResponse unmarshalling in such cases.
Object response = unmarshal(expectedClass, output, expectedClass != GenericResponse.class);
@@ -105,13 +105,13 @@ System.out.println(output);
private String executeOnServer(String serverName, String commandWithArgs) {
ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs);
- if(!result.isSuccess()) {
+ if (!result.isSuccess()) {
throw new GlusterRuntimeException("Command [" + commandWithArgs + "] failed on [" + serverName
+ "] with error [" + result.getExitValue() + "][" + result.getOutput() + "]");
}
return result.getOutput();
}
-
+
// This is the old executeOnServer that used socket communication.
// We can keep it commented for the time being.
// private String executeOnServerUsingSocket(String serverName, String commandWithArgs) {
@@ -148,9 +148,9 @@ System.out.println(output);
// throw new GlusterRuntimeException("Error during remote execution: [" + e.getMessage() + "]");
// }
// }
-
+
public String getFileFromServer(String serverName, String fileName) {
- return executeOnServer(serverName, "get_file " + fileName);
+ return executeOnServer(serverName, "get_file " + fileName);
}
/**
@@ -174,27 +174,30 @@ System.out.println(output);
Unmarshaller um = context.createUnmarshaller();
return um.unmarshal(new ByteArrayInputStream(input.getBytes()));
} catch (JAXBException e) {
- if(tryGenericResponseOnFailure) {
+ if (tryGenericResponseOnFailure) {
// unmarshalling failed. try to unmarshal a GenericResponse object
return unmarshal(GenericResponse.class, input, false);
}
-
+
return new Status(Status.STATUS_CODE_FAILURE, "Error during unmarshalling string [" + input
+ "] for class [" + expectedClass.getName() + ": [" + e.getMessage() + "]");
}
}
- public static void main(String args[]) throws Exception {
- // CreateVolumeExportDirectory.py md0 testvol
- System.out.println(new ServerUtil().getFileFromServer("localhost", "/tmp/python/PeerAgent.py"));
- }
-
/**
- * @param serverName Server on which the directory is present
- * @param brickDir Directory whose disk is to be fetched
+ * @param serverName
+ * Server on which the directory is present
+ * @param brickDir
+ * Directory whose disk is to be fetched
* @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);
}
+
+ public static void main(String args[]) throws Exception {
+ // CreateVolumeExportDirectory.py md0 testvol
+ System.out.println(new ServerUtil().getFileFromServer("localhost", "/tmp/python/PeerAgent.py"));
+ }
+
}