diff options
| author | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-05-25 05:34:33 -0700 |
|---|---|---|
| committer | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-05-25 05:34:33 -0700 |
| commit | 6c38028fcae5bcd7dac5a170edab618f2d1b580c (patch) | |
| tree | ccdbd897715bc23af9903c4cbb596e263cb219bf /src/com.gluster.storage.management.server | |
| parent | 6350fa9d8fca9614fcff5bb6bc98e19519a0da0e (diff) | |
| parent | f9a4bbb6e4e2f0ae97b649c053bbf92612647065 (diff) | |
Merge pull request #40 from Selvasundaram/master
Intergrate interface changes in the server, model and UI
Diffstat (limited to 'src/com.gluster.storage.management.server')
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 004160a7..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", 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 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 13b8ef28..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 @@ -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")); + } + } |
