diff options
| author | selvam <selvam@selvam-Studio-XPS-1340.(none)> | 2011-05-24 20:03:21 +0530 |
|---|---|---|
| committer | selvam <selvam@selvam-Studio-XPS-1340.(none)> | 2011-05-24 20:03:21 +0530 |
| commit | 7b78baadb7dd100940a4d6ddb5ca33826a3a5ce1 (patch) | |
| tree | c351ecdcdc4fe22c51d6186d921a6f95889e0985 /src/com.gluster.storage.management.server | |
| parent | b321add074a8b8413f9285bac7458a1d4ceea60c (diff) | |
Story:#15 task:#81 Intergrate interface changes in the server, model and UI
Diffstat (limited to 'src/com.gluster.storage.management.server')
4 files changed, 128 insertions, 77 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..0c91a02b 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 @@ -21,8 +21,8 @@ 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.model.Server; +import com.gluster.storage.management.core.response.GenericResponse; /** * Abstract resource class for servers. Abstracts basic server related functionality like "get server details". @@ -38,14 +38,15 @@ public class AbstractServersResource { * @param server * 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); - } + + +// public Server getServerDetails(String serverName) { +// +// } + + + /** * @param server */ @@ -55,15 +56,15 @@ public class AbstractServersResource { server.setTotalMemory(Math.ceil(Math.random() * 8)); server.setMemoryInUse(Math.random() * server.getTotalMemory()); addDummyDisks(server); - addDummyNetworkInterfaces(server, (int) Math.ceil(Math.random() * 4)); + //addDummyNetworkInterfaces(server, (int) Math.ceil(Math.random() * 4)); } - 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")); - } - } +// 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")); +// } +// } /** * @param server 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..189e75f9 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 @@ -33,8 +33,11 @@ import org.springframework.stereotype.Component; 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,6 +45,9 @@ import com.sun.jersey.spi.resource.Singleton; @Path("/discoveredservers") public class DiscoveredServersResource extends AbstractServersResource { private List<String> discoveredServerNames = new ArrayList<String>(); + + @InjectParam + private static ServerUtil serverUtil; public List<String> getDiscoveredServerNames() { return discoveredServerNames; @@ -49,22 +55,27 @@ public class DiscoveredServersResource extends AbstractServersResource { @GET @Produces(MediaType.TEXT_XML) - public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) { + public Object 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> discoveredServer; for (String serverName : serverNames) { - discoveredServers.add(getDiscoveredServer(serverName)); + discoveredServer = getDiscoveredServer(serverName); + if (!discoveredServer.getStatus().isSuccess()) { + return new ServerListResponse(discoveredServer.getStatus(), discoveredServers); + } + discoveredServers.add(discoveredServer.getData()); } - return discoveredServers; + return new ServerListResponse(Status.STATUS_SUCCESS, discoveredServers); } - + public void setDiscoveredServerNames(List<String> discoveredServerNames) { synchronized (discoveredServerNames) { this.discoveredServerNames = discoveredServerNames; @@ -74,11 +85,21 @@ 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; + 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); + } + server.copyFrom((Server) response); // Update the details in <Server> object + return new GenericResponse<Server>( Status.STATUS_SUCCESS, (Server) response); } + public static void main(String[] args) { StringListResponse listResponse = (StringListResponse)new DiscoveredServersResource().getDiscoveredServers(false); 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..d01b4d3d 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 @@ -37,9 +37,14 @@ 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; @@ -50,7 +55,10 @@ import com.sun.jersey.spi.resource.Singleton; 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) { @@ -61,31 +69,35 @@ public class GlusterServersResource extends AbstractServersResource { return glusterUtil; } - private List<GlusterServer> getServerDetails(String knownServer) { + private GlusterServerListResponse getServerDetails(String knownServer) { List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(knownServer); + GenericResponse<Server> serverResponse; for (GlusterServer server : glusterServers) { if (server.getStatus() == SERVER_STATUS.ONLINE) { - fetchServerDetails(server); + serverResponse = fetchServerDetails(server); + if (!serverResponse.getStatus().isSuccess()) { + return new GlusterServerListResponse(serverResponse.getStatus(), glusterServers); + } } } - return glusterServers; + return new GlusterServerListResponse(Status.STATUS_SUCCESS, 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) { + public GlusterServerResponse 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; + GenericResponse<Server> serverResponse = fetchServerDetails(server); + return new GlusterServerResponse(serverResponse.getStatus(), (GlusterServer) serverResponse.getData()); } /* @@ -95,25 +107,28 @@ public class GlusterServersResource extends AbstractServersResource { * com.gluster.storage.management.server.resources.AbstractServersResource#fetchServerDetails(com.gluster.storage * .management.core.model.Server) */ - @Override - protected void fetchServerDetails(Server server) { + protected GenericResponse<Server> fetchServerDetails(Server server) { // fetch standard server details like cpu, disk, memory details - super.fetchServerDetails(server); - - // TODO: Fetch gluster server details like status + Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class); + if (response instanceof Status) { + return new GenericResponse<Server>((Status) response, server); + } + server.copyFrom((Server) response); // Update the details in <Server> object + return new GenericResponse<Server>(Status.STATUS_SUCCESS, (Server) response); } @POST @Produces(MediaType.TEXT_XML) - public GlusterServerResponse addServer(@FormParam("serverName") String serverName, @FormParam("existingServer") String existingServer) { + public GlusterServerResponse addServer(@FormParam("serverName") String serverName, + @FormParam("existingServer") String existingServer) { Status status = glusterUtil.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(serverName).getGlusterServer()); } - + @DELETE @Produces(MediaType.TEXT_XML) public Status removeServer(@QueryParam("serverName") String serverName) { @@ -125,10 +140,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/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 20f5252d..23a8169d 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,6 +49,9 @@ import com.gluster.storage.management.core.utils.ProcessUtil; public class ServerUtil { @Autowired ServletContext servletContext; + + @Autowired + private SshUtil sshUtil; private static final String SCRIPT_DIR = "scripts"; private static final String SCRIPT_COMMAND = "python"; @@ -84,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); @@ -101,40 +104,51 @@ 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); } |
