summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-02-07 11:54:37 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-02-07 11:54:37 +0530
commit2407f1c133f256718dbdc3eb411c384db470b43d (patch)
tree4864e683a4e3e1b0d0c3c9cce40b4bd248974834
parent35a759331e88d926330b9f4a072b13a2fbd186a7 (diff)
auto-discovery service
Signed-off-by: Shireesh Anjal <shireesh@gluster.com>
-rw-r--r--com.gluster.storage.management.client/src/com/gluster/storage/management/client/ServerResource.java33
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java14
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java7
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Entity.java7
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java7
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java13
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java23
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerResponse.java19
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java44
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ServerResource.java35
10 files changed, 202 insertions, 0 deletions
diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ServerResource.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ServerResource.java
new file mode 100644
index 00000000..e541ca74
--- /dev/null
+++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ServerResource.java
@@ -0,0 +1,33 @@
+package com.gluster.storage.management.client;
+
+import java.net.URI;
+import java.util.List;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import com.gluster.storage.management.core.model.ServerListResponse;
+import com.gluster.storage.management.core.model.Server;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+
+public class ServerResource {
+ private final URI BASE_URI = UriBuilder.fromUri("http://localhost:8080/glustermc").build();
+
+ public List<Server> discoverServers() {
+ WebResource service = Client.create(new DefaultClientConfig()).resource(BASE_URI);
+
+ @SuppressWarnings("unchecked")
+ ServerListResponse<Server> response = service.path("services").path("server").path("discover")
+ .accept(MediaType.TEXT_XML).get(ServerListResponse.class);
+
+ return response.getData();
+ }
+
+ public static void main(String[] args) {
+ ServerResource ServerResource = new ServerResource();
+ List<Server> discoveredServers = ServerResource.discoverServers();
+ System.out.println(discoveredServers.size());
+ }
+}
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java
new file mode 100644
index 00000000..3a695600
--- /dev/null
+++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java
@@ -0,0 +1,14 @@
+package com.gluster.storage.management.core.model;
+
+public abstract class AbstractServerResponse implements ServerResponse {
+ private Status status;
+
+ @Override
+ public Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+} \ No newline at end of file
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 b5093627..1da6ae29 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
@@ -1,7 +1,10 @@
package com.gluster.storage.management.core.model;
+import javax.xml.bind.annotation.XmlRootElement;
+
import com.gluster.storage.management.core.utils.StringUtils;
+@XmlRootElement
public class Disk extends Entity {
public enum DISK_STATUS {
READY, UNINITIALIZED, INITIALIZING, OFFLINE
@@ -14,6 +17,10 @@ public class Disk extends Entity {
private Double spaceInUse;
private DISK_STATUS status;
+ public Disk() {
+
+ }
+
public Double getSpace() {
return space;
}
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 8c56a035..cc29b3fb 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
@@ -3,10 +3,13 @@ package com.gluster.storage.management.core.model;
import java.util.ArrayList;
import java.util.List;
+import javax.xml.bind.annotation.XmlRootElement;
+
import org.eclipse.core.runtime.PlatformObject;
import com.gluster.storage.management.core.utils.StringUtils;
+@XmlRootElement
public class Entity extends PlatformObject implements Filterable {
private static final long serialVersionUID = 1L;
@@ -14,6 +17,10 @@ public class Entity extends PlatformObject implements Filterable {
protected List<Entity> children = new ArrayList<Entity>();
private Entity parent;
+ public Entity() {
+
+ }
+
public String getName() {
return name;
}
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java
index 375b1971..7e950bb7 100644
--- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java
+++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java
@@ -1,11 +1,18 @@
package com.gluster.storage.management.core.model;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
public class NetworkInterface extends Entity {
private String ipAddress;
private String netMask;
private String defaultGateway;
private boolean isPreferred;
+ public NetworkInterface() {
+
+ }
+
public boolean isPreferred() {
return isPreferred;
}
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 b7e56ba4..d45b7268 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
@@ -3,8 +3,13 @@ package com.gluster.storage.management.core.model;
import java.util.ArrayList;
import java.util.List;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
import com.gluster.storage.management.core.utils.StringUtils;
+@XmlRootElement
public class Server extends Entity {
private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>();
private int numOfCPUs;
@@ -15,6 +20,10 @@ public class Server extends Entity {
private double diskSpaceInUse = 0;
private List<Disk> disks = new ArrayList<Disk>();
+ public Server() {
+
+ }
+
public Server(String name, Entity parent, int numOfCPUs, double cpuUsage, double totalMemory, double memoryInUse) {
super(name, parent);
setNumOfCPUs(numOfCPUs);
@@ -63,6 +72,8 @@ public class Server extends Entity {
return diskSpaceInUse;
}
+ @XmlElementWrapper(name="networkInterfaces")
+ @XmlElement(name="networkInterface", type=NetworkInterface.class)
public List<NetworkInterface> getNetworkInterfaces() {
return networkInterfaces;
}
@@ -71,6 +82,8 @@ public class Server extends Entity {
this.networkInterfaces = networkInterfaces;
}
+ @XmlElementWrapper(name="disks")
+ @XmlElement(name="disk", type=Disk.class)
public List<Disk> getDisks() {
return disks;
}
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java
new file mode 100644
index 00000000..8f142a70
--- /dev/null
+++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java
@@ -0,0 +1,23 @@
+package com.gluster.storage.management.core.model;
+
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name="response")
+public class ServerListResponse<T extends Server> extends AbstractServerResponse {
+ private List<T> servers;
+
+ @Override
+ @XmlElementWrapper(name="servers")
+ @XmlElement(name="server", type=Server.class)
+ public List<T> getData() {
+ return servers;
+ }
+
+ public void setServers(List<T> data) {
+ this.servers = data;
+ }
+}
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerResponse.java
new file mode 100644
index 00000000..3edf2627
--- /dev/null
+++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerResponse.java
@@ -0,0 +1,19 @@
+package com.gluster.storage.management.core.model;
+
+/**
+ * Interface for server response. Any request handled by the Gluster Management
+ * Server will result in a response that must be an instance of a class
+ * implementing this interface.
+ */
+public interface ServerResponse {
+ /**
+ * @return Status of request processing
+ */
+ public Status getStatus();
+
+ /**
+ * @return Data associated with the response. e.g. A "discover servers"
+ * request will return the list of discovered servers.
+ */
+ public Object getData();
+}
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
new file mode 100644
index 00000000..37d2e18c
--- /dev/null
+++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
@@ -0,0 +1,44 @@
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import com.gluster.storage.management.core.utils.ProcessResult;
+
+@XmlRootElement(name="status")
+public class Status {
+ @XmlElement(name="code", type=Integer.class)
+ private Integer code;
+
+ private String message;
+
+ public Status() {
+ }
+
+ public boolean isSuccess() {
+ return code == 0;
+ }
+
+ public Status(Integer executionStatus, String xmlData) {
+ this.code = executionStatus;
+ }
+
+ public Status(ProcessResult result) {
+ this.code = result.getExitValue();
+ }
+
+ public String getCode() {
+ return code.toString();
+ }
+
+ public void setCode(Integer executionStatus) {
+ this.code = executionStatus;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+} \ No newline at end of file
diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ServerResource.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ServerResource.java
new file mode 100644
index 00000000..ccbb77e6
--- /dev/null
+++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/services/ServerResource.java
@@ -0,0 +1,35 @@
+package com.gluster.storage.management.server.services;
+
+import java.io.File;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import com.gluster.storage.management.core.utils.FileUtil;
+
+@Path("/server")
+public class ServerResource {
+ // TODO: xml should be read from a "work" directory under the tomcat server.
+ // Use relative path - do not hard code the absolute path.
+ public static final String DISCOVERED_SERVERS_XML = "/GLUSTER/discovered-servers.xml";
+
+ /**
+ * Discover newly available servers
+ *
+ * @return list of discovered servers
+ */
+ private String GetDiscoveredServers() {
+ File discoveredServersFile = new File(DISCOVERED_SERVERS_XML);
+ String serverNames = new FileUtil().readFileAsString(discoveredServersFile);
+ return serverNames;
+ }
+
+ @Path("/discover")
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public String discoveredServers() {
+ return GetDiscoveredServers();
+ }
+}