summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-03-14 21:30:21 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-03-14 21:30:21 +0530
commit685135f3fc4dce58e975d225e19336cde9382e3d (patch)
tree5d733bc0bb9ae74a2d62468f191e0042b86ef86c
parentd20cf95b122f7b08614da2e4e14267e34b8262dd (diff)
Introduced abstract servers resource
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java2
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java2
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java6
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java35
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java39
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java79
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java10
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java58
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java1
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>());