diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 21:30:21 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 21:30:21 +0530 |
| commit | 685135f3fc4dce58e975d225e19336cde9382e3d (patch) | |
| tree | 5d733bc0bb9ae74a2d62468f191e0042b86ef86c | |
| parent | d20cf95b122f7b08614da2e4e14267e34b8262dd (diff) | |
Introduced abstract servers resource
9 files changed, 170 insertions, 62 deletions
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java index c45f5b4a..72b47e6b 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import com.gluster.storage.management.core.utils.StringUtil; @@ -83,6 +84,7 @@ public class Disk extends Entity { return server; } + @XmlTransient public void setServer(Server server) { this.server = server; } diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java index 8fa07334..e721d052 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import org.eclipse.core.runtime.PlatformObject; @@ -47,6 +48,7 @@ public class Entity extends PlatformObject implements Filterable { this.name = name; } + @XmlTransient public Entity getParent() { return parent; } diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java index e26b86a9..eebc7c69 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import com.gluster.storage.management.core.utils.StringUtil; @@ -33,6 +34,10 @@ public class GlusterServer extends Server { private NetworkInterface preferredNetworkInterface; private Cluster cluster; + public GlusterServer(String name) { + super(name); + } + public GlusterServer(String name, Entity parent, SERVER_STATUS status, int numOfCPUs, double cpuUsage, double totalMemory, double memoryInUse) { super(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse); @@ -66,6 +71,7 @@ public class GlusterServer extends Server { preferredNetworkInterface.setPreferred(true); } + @XmlTransient public Cluster getCluster() { return cluster; } diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java index 73f2af7e..bc0c42bc 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java @@ -27,7 +27,7 @@ import javax.xml.bind.annotation.XmlRootElement; import com.gluster.storage.management.core.utils.StringUtil; -@XmlRootElement(name="server") +@XmlRootElement(name = "server") public class Server extends Entity { private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>(); private int numOfCPUs; @@ -39,9 +39,13 @@ public class Server extends Entity { private List<Disk> disks = new ArrayList<Disk>(); public Server() { - + + } + + public Server(String name) { + super(name, null); } - + public Server(String name, Entity parent, int numOfCPUs, double cpuUsage, double totalMemory, double memoryInUse) { super(name, parent); setNumOfCPUs(numOfCPUs); @@ -86,12 +90,21 @@ public class Server extends Entity { return totalDiskSpace; } + /** + * Total disk space is automatically calculated, and hence this method should never be called. It is required only + * to make sure that the element "totalDiskSpace" gets added to the XML tag when jersey converts the server object + * to XML for sending to client. + */ + public void setTotalDiskSpace(double totalDiskSpace) { + this.totalDiskSpace = totalDiskSpace; + } + public double getDiskSpaceInUse() { return diskSpaceInUse; } - @XmlElementWrapper(name="networkInterfaces") - @XmlElement(name="networkInterface", type=NetworkInterface.class) + @XmlElementWrapper(name = "networkInterfaces") + @XmlElement(name = "networkInterface", type = NetworkInterface.class) public List<NetworkInterface> getNetworkInterfaces() { return networkInterfaces; } @@ -100,12 +113,16 @@ public class Server extends Entity { this.networkInterfaces = networkInterfaces; } - @XmlElementWrapper(name="disks") - @XmlElement(name="disk", type=Disk.class) + @XmlElementWrapper(name = "disks") + @XmlElement(name = "disk", type = Disk.class) public List<Disk> getDisks() { return disks; } + public void addNetworkInterface(NetworkInterface networkInterface) { + networkInterfaces.add(networkInterface); + } + public void addDisk(Disk disk) { if (disks.add(disk)) { totalDiskSpace += disk.getSpace(); @@ -114,7 +131,7 @@ public class Server extends Entity { } public void addDisks(List<Disk> disks) { - for(Disk disk : disks) { + for (Disk disk : disks) { addDisk(disk); } } @@ -131,7 +148,7 @@ public class Server extends Entity { totalDiskSpace = 0; diskSpaceInUse = 0; } - + public void setDisks(List<Disk> disks) { removeAllDisks(); addDisks(disks); diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java index 768b5ac5..ef89d946 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java @@ -26,32 +26,39 @@ import java.util.List; import com.gluster.storage.management.core.constants.CoreConstants; /** - * @author root * */ public class GlusterUtil { public static final String HOSTNAMETAG = "hostname:"; private static final ProcessUtil processUtil = new ProcessUtil(); - - private static final String parse(String line, String tagName) { - if (line.toLowerCase().contains(tagName)) { - for(String token : line.split(",")) { - if (token.toLowerCase().contains(tagName)) { - return token.split(tagName)[1]; - } - } - } - return null; - } + + /** + * Extract value of given token from given line. It is assumed that the token, if present, will be of the following form: + * <code>token: value</code> + * @param line Line to be analyzed + * @param tokenName Token whose value is to be extracted + * @return Value of the token, if present in the line + */ + private final String extractToken(String line, String tokenName) { + if (line.toLowerCase().contains(tokenName)) { + for(String part : line.split(",")) { + if (part.toLowerCase().contains(tokenName)) { + return part.split(tokenName)[1].trim(); + } + } + } + return null; + } public List<String> getGlusterServerNames() { ProcessResult result = processUtil.executeCommand("gluster", "peer", "status"); - if (!result.isSuccess()) - return null; - + if (!result.isSuccess()) { + return null; + } + List<String> glusterServerNames = new ArrayList<String>(); for (String line : result.getOutput().split(CoreConstants.NEWLINE)) { - String hostName = parse(line, HOSTNAMETAG); + String hostName = extractToken(line, HOSTNAMETAG); if (hostName != null) { glusterServerNames.add(hostName); } diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java new file mode 100644 index 00000000..004160a7 --- /dev/null +++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java @@ -0,0 +1,79 @@ +/** + * AbstractServersResource.java + * + * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * <http://www.gnu.org/licenses/>. + */ +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; + +/** + * 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; + + /** + * Fetch details of the given server. The server name must be populated in the object before calling this method. + * + * @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); + } + + /** + * @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)); + } + + 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 + */ + 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)); + } +} diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java index 63b5cdff..82d0551d 100644 --- a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java +++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java @@ -40,7 +40,7 @@ import com.sun.jersey.spi.resource.Singleton; @Component @Singleton @Path("/discoveredservers") -public class DiscoveredServersResource { +public class DiscoveredServersResource extends AbstractServersResource { private List<String> discoveredServerNames = new ArrayList<String>(); public List<String> getDiscoveredServerNames() { @@ -50,7 +50,6 @@ public class DiscoveredServersResource { @GET @Produces(MediaType.TEXT_XML) public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) { - System.out.println(getDetails); if(getDetails != null && getDetails == true) { return new ServerListResponse<Server>(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); } @@ -61,9 +60,7 @@ public class DiscoveredServersResource { List<Server> discoveredServers = new ArrayList<Server>(); List<String> serverNames = getDiscoveredServerNames(); for (String serverName : serverNames) { - // TODO. Dummy data for now. - Server server = new Server(serverName, null, 4, 58.3d, 4d, 2.87d); - discoveredServers.add(server); + discoveredServers.add(getDiscoveredServer(serverName)); } return discoveredServers; } @@ -78,7 +75,8 @@ public class DiscoveredServersResource { @GET @Produces(MediaType.TEXT_XML) public Server getDiscoveredServer(@PathParam("serverName") String serverName) { - Server server = new Server(serverName, null, 4, 58.3d, 4d, 2.87d); + Server server = new Server(serverName); + fetchServerDetails(server); return server; } diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index e160bc2f..342444f1 100644 --- a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -32,60 +32,57 @@ import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; import com.gluster.storage.management.core.model.GenericResponse; +import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.ServerListResponse; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.utils.GlusterUtil; import com.gluster.storage.management.core.utils.ProcessResult; -import com.gluster.storage.management.core.utils.ProcessUtil; import com.sun.jersey.spi.resource.Singleton; @Component @Singleton @Path("/cluster/servers") -public class GlusterServersResource { +public class GlusterServersResource extends AbstractServersResource { private GlusterUtil glusterUtil = new GlusterUtil(); public static final String HOSTNAMETAG = "hostname:"; - private List<Server> getServerDetails() { - List<Server> glusterServers = new ArrayList<Server>(); - List<String> serverNames = glusterUtil.getGlusterServerNames(); - for (String serverName : serverNames) { - // TODO: With the new design of dedicated management server, this logic has to change. - // GlusterServersClient client = new GlusterServersClient(serverName); - // Server server = client.getServer("me"); - // glusterServers.add(server); + private List<GlusterServer> getServerDetails() { + List<GlusterServer> glusterServers = new ArrayList<GlusterServer>(); + for (String serverName : glusterUtil.getGlusterServerNames()) { + glusterServers.add(getGlusterServer(serverName)); } return glusterServers; } @GET @Produces(MediaType.TEXT_XML) - public ServerListResponse<Server> getServers() { - return new ServerListResponse<Server>(Status.STATUS_SUCCESS, getServerDetails()); + public ServerListResponse<GlusterServer> getGlusterServers() { + return new ServerListResponse<GlusterServer>(Status.STATUS_SUCCESS, getServerDetails()); } @GET @Path("{serverName}") @Produces(MediaType.TEXT_XML) - public String getGlusterServer(@PathParam("serverName") String serverName) { - // TODO: With new design of dedicated management server, this concept won't work. Need to change. - if (serverName.equals("me")) { - return getThisServer(); - } - - // TODO: With the new design of dedicated management server, this logic has to change. - // Fetch details of given server by sending a REST request to that server - // return new GlusterServersClient(serverName).getServerXML("me"); - return null; + public GlusterServer getGlusterServer(@PathParam("serverName") String serverName) { + GlusterServer server = new GlusterServer(serverName); + fetchServerDetails(server); + return server; } - public String getThisServer() { - ProcessResult result = new ProcessUtil().executeCommand("get-server-details.py"); - if (!result.isSuccess()) { - // TODO:Generate error message and return - } - return result.getOutput(); + /* + * (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 } @POST @@ -94,9 +91,10 @@ public class GlusterServersResource { ProcessResult result = glusterUtil.addServer(serverName); if (!result.isSuccess()) { - return new GenericResponse<String>(Status.STATUS_FAILURE, "Add server failed: [" + result.getOutput() + "]"); + return new GenericResponse<String>(Status.STATUS_FAILURE, "Add server failed: ]" + result.getExitValue() + + "][" + result.getOutput() + "]"); } - return new GenericResponse<String>(Status.STATUS_SUCCESS, "Server added successfully!"); + return new GenericResponse<String>(Status.STATUS_SUCCESS, "Server [" + serverName + "] added successfully!"); } public static void main(String[] args) { diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java index 9a2a7e47..9fcb28e6 100644 --- a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java +++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java @@ -61,7 +61,6 @@ public class ServerDiscoveryTask { private String environment; public void discoverServers() { - System.out.println("Starting auto-discovery in [" + environment + "] environment"); List<String> serverNameList = new ArrayList<String>(); ProcessResult result = serverUtil.executeGlusterScript(true, environment + SCRIPT_NAME_SFX, new ArrayList<String>()); |
