summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.server
diff options
context:
space:
mode:
authorDhandapani <dhandapani@gluster.com>2011-05-25 18:14:24 +0530
committerDhandapani <dhandapani@gluster.com>2011-05-25 18:14:24 +0530
commit4d229fb2c145a9ed6905760d1481cef965c5b44d (patch)
treead7f4432577837498ec109b5e0c7e31839fe7d98 /src/com.gluster.storage.management.server
parent4968a929c59d5ddac86acc057c40e6d82cbdd865 (diff)
parent6c38028fcae5bcd7dac5a170edab618f2d1b580c (diff)
Merge commit 'upstream/master'
Conflicts: src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
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.java57
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java47
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java94
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java20
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java101
5 files changed, 183 insertions, 136 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 13147465..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.model.NetworkInterface;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Server;
+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.
@@ -39,41 +44,19 @@ public class AbstractServersResource {
* Server whose details are to be fetched
*/
protected void fetchServerDetails(Server server) {
- String serverName = server.getName();
-
- // TODO: Fetch the server details and populate in the object.
- // For now, populating dummy data.
- populateDummyData(server);
- }
-
- /**
- * @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));
+ // 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", "/export/md0", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY));
- dummyDiskSpace = Math.random() * 500;
- 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", "/export/md2", 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 c1ddffd1..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,11 +30,15 @@ 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;
+import com.gluster.storage.management.core.response.GenericResponse;
import com.gluster.storage.management.core.response.ServerListResponse;
import com.gluster.storage.management.core.response.StringListResponse;
+import com.gluster.storage.management.server.utils.ServerUtil;
+import com.sun.jersey.api.core.InjectParam;
import com.sun.jersey.spi.resource.Singleton;
@Component
@@ -42,29 +46,48 @@ import com.sun.jersey.spi.resource.Singleton;
@Path("/discoveredservers")
public class DiscoveredServersResource extends AbstractServersResource {
private List<String> discoveredServerNames = new ArrayList<String>();
-
+
public List<String> getDiscoveredServerNames() {
return discoveredServerNames;
}
+
@GET
@Produces(MediaType.TEXT_XML)
+ @SuppressWarnings("rawtypes")
public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) {
if(getDetails != null && getDetails == true) {
- return new ServerListResponse(Status.STATUS_SUCCESS, getDiscoveredServerDetails());
+ return getDiscoveredServerDetails();
}
return new StringListResponse(getDiscoveredServerNames());
}
- private List<Server> getDiscoveredServerDetails() {
+ private ServerListResponse getDiscoveredServerDetails() {
List<Server> discoveredServers = new ArrayList<Server>();
List<String> serverNames = getDiscoveredServerNames();
+ GenericResponse<Server> discoveredServerResponse;
+ int errCount = 0;
+ StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): ");
for (String serverName : serverNames) {
- discoveredServers.add(getDiscoveredServer(serverName));
+ discoveredServerResponse = getDiscoveredServer(serverName);
+ if (!discoveredServerResponse.getStatus().isSuccess()) {
+ errMsg.append(CoreConstants.NEWLINE + serverName + " : " + discoveredServerResponse.getStatus());
+ errCount++;
+ } else {
+ discoveredServers.add(discoveredServerResponse.getData());
+ }
+ }
+ 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 discoveredServers;
+ return new ServerListResponse(status, discoveredServers);
}
-
+
public void setDiscoveredServerNames(List<String> discoveredServerNames) {
synchronized (discoveredServerNames) {
this.discoveredServerNames = discoveredServerNames;
@@ -74,12 +97,16 @@ public class DiscoveredServersResource extends AbstractServersResource {
@Path("/{serverName}")
@GET
@Produces(MediaType.TEXT_XML)
- public Server getDiscoveredServer(@PathParam("serverName") String serverName) {
+ public GenericResponse<Server> getDiscoveredServer(@PathParam("serverName") String serverName) {
Server server = new Server(serverName);
- fetchServerDetails(server);
- return server;
+ try {
+ fetchServerDetails(server);
+ } catch (Exception e) {
+ return new GenericResponse<Server>(new Status(e), null);
+ }
+ 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 3092e80d..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,92 +32,92 @@ 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.GlusterServerListResponse;
import com.gluster.storage.management.core.response.GlusterServerResponse;
import com.gluster.storage.management.server.utils.GlusterUtil;
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;
-
- public static final String HOSTNAMETAG = "hostname:";
-
- public void setGlusterUtil(GlusterUtil glusterUtil) {
- this.glusterUtil = glusterUtil;
- }
- public GlusterUtil getGlusterUtil() {
- return glusterUtil;
- }
+ public static final String HOSTNAMETAG = "hostname:";
- private List<GlusterServer> getServerDetails(String knownServer) {
- List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(knownServer);
+ private GlusterServerListResponse getServerDetails(String knownServer) {
+ 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) {
+ try {
fetchServerDetails(server);
+ } catch (Exception e) {
+ errMsg.append(CoreConstants.NEWLINE + server.getName() + " : [" + e.getMessage() + "]");
+ errCount++;
+ }
}
}
- return 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
@Produces(MediaType.TEXT_XML)
- public GlusterServerListResponse getGlusterServers(@QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) {
- return new GlusterServerListResponse(Status.STATUS_SUCCESS, getServerDetails(knownServer));
+ public GlusterServerListResponse getGlusterServers(
+ @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) {
+ return getServerDetails(knownServer);
}
@GET
@Path("{serverName}")
@Produces(MediaType.TEXT_XML)
- public GlusterServer getGlusterServer(@PathParam("serverName") String serverName) {
- // TODO: Implement logic to fetch details of a single gluster server (peer)
- GlusterServer server = new GlusterServer(serverName);
- fetchServerDetails(server);
- server.setStatus(SERVER_STATUS.ONLINE);
- return server;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * com.gluster.storage.management.server.resources.AbstractServersResource#fetchServerDetails(com.gluster.storage
- * .management.core.model.Server)
- */
- @Override
- protected void fetchServerDetails(Server server) {
- // fetch standard server details like cpu, disk, memory details
- super.fetchServerDetails(server);
-
- // TODO: Fetch gluster server details like status
+ 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);
+ }
+ }
+ 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);
+ public GlusterServerResponse addServer(@FormParam("serverName") String serverName,
+ @FormParam("existingServer") String existingServer) {
+ Status status = getGlusterUtil().addServer(serverName, existingServer);
if (!status.isSuccess()) {
return new GlusterServerResponse(status, null);
}
- return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(serverName));
+ 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) {
@@ -125,10 +125,10 @@ public class GlusterServersResource extends AbstractServersResource {
GlusterUtil glusterUtil = new GlusterUtil();
glusterUtil.setSshUtil(new SshUtil());
glusterServersResource.setGlusterUtil(glusterUtil);
- System.out.println(glusterServersResource.getServerDetails("127.0.0.1").size());
+ // System.out.println(glusterServersResource.getServerDetails("127.0.0.1").size());
// To add a server
-// GlusterServerResponse response = glusterServersResource.addServer("my-server");
-// System.out.println(response.getData().getName());
+ // GlusterServerResponse response = glusterServersResource.addServer("my-server");
+ // System.out.println(response.getData().getName());
}
}
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 91f809b8..a7ce9bc5 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
@@ -92,6 +92,25 @@ public class GlusterUtil {
return null;
}
+ private GlusterServer getKnownServer(String knownServer) {
+ GlusterServer server = new GlusterServer(knownServer);
+ server.setStatus(SERVER_STATUS.ONLINE); //TODO: If pingable
+ //NOTE: No UUID assumed, it can be fetch while getting server details
+ 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) {
@@ -99,6 +118,7 @@ public class GlusterUtil {
}
List<GlusterServer> glusterServers = new ArrayList<GlusterServer>();
+ glusterServers.add(getKnownServer(knownServer)); // Append the known server
GlusterServer server = null;
boolean foundHost = false;
boolean foundUuid = false;
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 20f5252d..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
@@ -50,6 +50,9 @@ public class ServerUtil {
@Autowired
ServletContext servletContext;
+ @Autowired
+ private SshUtil sshUtil;
+
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";
@@ -101,42 +104,53 @@ public class ServerUtil {
}
private String executeOnServer(String serverName, String commandWithArgs) {
- try {
- InetAddress address = InetAddress.getByName(serverName);
- Socket connection = new Socket(address, 50000);
-
- PrintWriter writer = new PrintWriter(connection.getOutputStream(), true);
- writer.println(commandWithArgs);
- writer.println(); // empty line means end of request
-
- InputStream inputStream = connection.getInputStream();
- int available = inputStream.available();
-
- StringBuffer output = new StringBuffer();
- if( available > 0 ) {
- // This happens when PeerAgent sends complete file
- byte[] responseData = new byte[available];
- inputStream.read(responseData);
- output.append(new String(responseData, "UTF-8"));
- } else {
- // This happens in case of normal XML response from PeerAgent
- BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
-
- String line;
- while (!(line = reader.readLine()).trim().isEmpty()) {
- output.append(line + CoreConstants.NEWLINE);
- }
- }
- connection.close();
-
- return output.toString();
- } catch (Exception e) {
- throw new GlusterRuntimeException("Error during remote execution: [" + e.getMessage() + "]");
+ ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs);
+ 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) {
+ // try {
+ // InetAddress address = InetAddress.getByName(serverName);
+ // Socket connection = new Socket(address, 50000);
+ //
+ // PrintWriter writer = new PrintWriter(connection.getOutputStream(), true);
+ // writer.println(commandWithArgs);
+ // writer.println(); // empty line means end of request
+ //
+ // InputStream inputStream = connection.getInputStream();
+ // int available = inputStream.available();
+ //
+ // StringBuffer output = new StringBuffer();
+ // if( available > 0 ) {
+ // // This happens when PeerAgent sends complete file
+ // byte[] responseData = new byte[available];
+ // inputStream.read(responseData);
+ // output.append(new String(responseData, "UTF-8"));
+ // } else {
+ // // This happens in case of normal XML response from PeerAgent
+ // BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
+ //
+ // String line;
+ // while (!(line = reader.readLine()).trim().isEmpty()) {
+ // output.append(line + CoreConstants.NEWLINE);
+ // }
+ // }
+ // connection.close();
+ //
+ // return output.toString();
+ // } catch (Exception e) {
+ // 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);
}
/**
@@ -160,27 +174,30 @@ public class ServerUtil {
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"));
+ }
+
}