diff options
| author | selvam <selvam@selvam-Studio-XPS-1340.(none)> | 2011-05-25 17:43:21 +0530 |
|---|---|---|
| committer | selvam <selvam@selvam-Studio-XPS-1340.(none)> | 2011-05-25 17:43:21 +0530 |
| commit | f9a4bbb6e4e2f0ae97b649c053bbf92612647065 (patch) | |
| tree | ccdbd897715bc23af9903c4cbb596e263cb219bf /src/com.gluster.storage.management.server | |
| parent | ebe241c7f0e8b38066a2dc76fda69b3da1dcba7b (diff) | |
| parent | f3e001d3f468c466e04f7e0580f5ee225916a47f (diff) | |
Merge branch 'feedback'
Conflicts:
src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
Diffstat (limited to 'src/com.gluster.storage.management.server')
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")); + } + } |
