diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 17:56:52 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 17:56:52 +0530 |
| commit | d20cf95b122f7b08614da2e4e14267e34b8262dd (patch) | |
| tree | 7f6c052704f49a2bffd25ee68423178506f260a9 | |
| parent | fa113e22d419fcd16f5eb8c579131ffa65ed4b5e (diff) | |
Audo discovery changes
20 files changed, 754 insertions, 180 deletions
diff --git a/com.gluster.storage.management.client/.classpath b/com.gluster.storage.management.client/.classpath index bb63c982..b8f71a37 100644 --- a/com.gluster.storage.management.client/.classpath +++ b/com.gluster.storage.management.client/.classpath @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-client-1.5.jar"/> - <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-core-1.5.jar"/> + <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-client-1.5.jar" sourcepath="/data/downloads/sun/jersey/sources/jersey-client-1.5-sources.jar"/> + <classpathentry exported="true" kind="lib" path="lib/jersey-1.5/jersey-core-1.5.jar" sourcepath="/data/downloads/sun/jersey/sources/jersey-core-1.5-sources.jar"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index 2d022055..d3ae02dd 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -3,6 +3,7 @@ package com.gluster.storage.management.client; import java.net.URI;
import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
import com.gluster.storage.management.client.utils.ClientUtil;
import com.sun.jersey.api.client.Client;
@@ -10,9 +11,11 @@ import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.representation.Form;
import com.sun.jersey.core.util.Base64;
+import com.sun.jersey.core.util.MultivaluedMapImpl;
public abstract class AbstractClient {
private static final String HTTP_HEADER_AUTH = "Authorization";
+ protected static final MultivaluedMap<String, String> NO_PARAMS = new MultivaluedMapImpl();
protected WebResource resource;
private String authHeader;
@@ -28,13 +31,29 @@ public abstract class AbstractClient { *
* @param res
* Resource to be fetched
+ * @param queryParams Query parameters to be sent for the GET request
* @param responseClass
* Expected class of the response
* @return Object of responseClass received as a result of the GET request
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
- private Object fetchResource(WebResource res, Class responseClass) {
- return res.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML).get(responseClass);
+ private Object fetchResource(WebResource res, MultivaluedMap<String, String> queryParams, Class responseClass) {
+ return res.queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML)
+ .get(responseClass);
+ }
+
+ /**
+ * Fetches the default resource (the one returned by {@link AbstractClient#getResourceName()}) by dispatching a GET
+ * request on the resource
+ *
+ * @param queryParams Query parameters to be sent for the GET request
+ * @param responseClass
+ * Expected class of the response
+ * @return Object of responseClass received as a result of the GET request
+ */
+ @SuppressWarnings("rawtypes")
+ protected Object fetchResource(MultivaluedMap<String, String> queryParams, Class responseClass) {
+ return fetchResource(resource, queryParams, responseClass);
}
/**
@@ -47,7 +66,7 @@ public abstract class AbstractClient { */
@SuppressWarnings("rawtypes")
protected Object fetchResource(Class responseClass) {
- return fetchResource(resource, responseClass);
+ return fetchResource(resource, NO_PARAMS, responseClass);
}
/**
@@ -62,7 +81,7 @@ public abstract class AbstractClient { */
@SuppressWarnings("rawtypes")
protected Object fetchSubResource(String subResourceName, Class responseClass) {
- return fetchResource(resource.path(subResourceName), responseClass);
+ return fetchResource(resource.path(subResourceName), NO_PARAMS, responseClass);
}
protected Object postRequest(Class responseClass, Form form) {
diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java index 35008135..6d9ebdd6 100644 --- a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java @@ -20,9 +20,14 @@ package com.gluster.storage.management.client; import java.util.List; +import javax.ws.rs.core.MultivaluedMap; + import com.gluster.storage.management.core.model.GenericResponse; +import com.gluster.storage.management.core.model.Response; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.ServerListResponse; +import com.gluster.storage.management.core.model.StringListResponse; +import com.sun.jersey.core.util.MultivaluedMapImpl; public class DiscoveredServersClient extends AbstractClient { private static final String RESOURCE_NAME = "discoveredservers"; @@ -35,11 +40,25 @@ public class DiscoveredServersClient extends AbstractClient { public String getResourceName() { return RESOURCE_NAME; } + + private Object getDiscoveredServers(Boolean getDetails, Class responseClass) { + MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); + queryParams.putSingle("details", getDetails.toString()); + + // TODO: Used during development to check the response contents. + // to be removed later + String response = (String) fetchResource(queryParams, String.class); + System.out.println(response); - public List<Server> getDiscoveredServers() { - @SuppressWarnings("unchecked") - ServerListResponse<Server> response = (ServerListResponse<Server>) fetchResource(ServerListResponse.class); - return response.getServers(); + return ((Response) fetchResource(queryParams, responseClass)).getData(); + } + + public List<String> getDiscoveredServerNames() { + return (List<String>)getDiscoveredServers(Boolean.FALSE, StringListResponse.class); + } + + public List<Server> getDiscoveredServerDetails() { + return (List<Server>)getDiscoveredServers(Boolean.TRUE, ServerListResponse.class); } public Server getServer(String serverName) { @@ -49,14 +68,12 @@ public class DiscoveredServersClient extends AbstractClient { return response.getData(); } - public String getServerXML(String serverName) { - return ((String) fetchSubResource(serverName, String.class)); - } - public static void main(String[] args) { - DiscoveredServersClient ServerResource = new DiscoveredServersClient("localhost", "gluster", "gluster"); - List<Server> discoveredServers = ServerResource.getDiscoveredServers(); - System.out.println(discoveredServers.size()); + DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", "gluster", "gluster"); + List<String> discoveredServerNames = serverResource.getDiscoveredServerNames(); + System.out.println(discoveredServerNames); + List<Server> discoveredServers = serverResource.getDiscoveredServerDetails(); + System.out.println(discoveredServers); // Server serverDetails = ServerResource.getServer("localhost"); // System.out.println(serverDetails.getName()); diff --git a/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java new file mode 100644 index 00000000..70356b82 --- /dev/null +++ b/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -0,0 +1,286 @@ +/******************************************************************************* + * 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.client; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.Entity; +import com.gluster.storage.management.core.model.GlusterDataModel; +import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.LogMessage; +import com.gluster.storage.management.core.model.NetworkInterface; +import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Disk.DISK_STATUS; +import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; +import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; + +public class GlusterDataModelManager { + // private Server discoveredServer1, discoveredServer2, discoveredServer3, discoveredServer4, discoveredServer5; + private GlusterServer server1, server2, server3, server4, server5; + private Volume volume1, volume2, volume3, volume4, volume5; + private Disk s1da, s1db, s2da, s2db, s2dc, s2dd, s3da, s4da, s5da, s5db; + private static List<LogMessage> logMessages = new ArrayList<LogMessage>(); + private static GlusterDataModelManager instance = new GlusterDataModelManager(); + private GlusterDataModel model; + + private GlusterDataModelManager() { + model = initializeModel(); + } + + public GlusterDataModel getModel() { + return model; + } + + public static GlusterDataModelManager getInstance() { + return instance; + } + + private GlusterServer addGlusterServer(List<GlusterServer> servers, Entity parent, String name, + SERVER_STATUS status, String preferredInterfaceName, int numOfCPUs, double cpuUsage, double totalMemory, + double memoryInUse) { + GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory, + memoryInUse); + NetworkInterface networkInterface = addNetworkInterface(glusterServer, preferredInterfaceName); + glusterServer.setPreferredNetworkInterface(networkInterface); + + servers.add(glusterServer); + return glusterServer; + } + + private NetworkInterface addNetworkInterface(Server server, String interfaceName) { + NetworkInterface networkInterface = new NetworkInterface(interfaceName, server, "192.168.1." + + Math.round(Math.random() * 255), "255.255.255.0", "192.168.1.1"); + server.setNetworkInterfaces(Arrays.asList(new NetworkInterface[] { networkInterface })); + return networkInterface; + } + + private void addDiscoveredServer(List<Server> servers, Entity parent, String name, int numOfCPUs, double cpuUsage, + double totalMemory, double memoryInUse, double totalDiskSpace, double diskSpaceInUse) { + Server server = new Server(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse); + server.addDisk(new Disk(server, "sda", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY)); + addNetworkInterface(server, "eth0"); + + servers.add(server); + } + + private GlusterDataModel initializeModel() { + // Create the dummy data model for demo + GlusterDataModel model = new GlusterDataModel("Clusters"); + Cluster cluster = new Cluster("Home", model); + + initializeGlusterServers(cluster); + initializeVolumes(cluster); + initializeAutoDiscoveredServers(cluster); + initializeDisks(); + addDisksToServers(); + addDisksToVolumes(); + addVolumeOptions(); + + createDummyLogMessages(); + + model.addCluster(cluster); + return model; + } + + private void addVolumeOptions() { + for (Volume vol : new Volume[] { volume1, volume2, volume3, volume4, volume5 }) { + for (int i = 1; i <= 5; i++) { + String key = vol.getName() + "key" + i; + String value = vol.getName() + "value" + i; + vol.setOption(key, value); + } + } + } + + private Volume addVolume(List<Volume> volumes, String name, Cluster cluster, VOLUME_TYPE volumeType, + TRANSPORT_TYPE transportType, VOLUME_STATUS status) { + Volume volume = new Volume(name, cluster, volumeType, transportType, status); + volumes.add(volume); + + return volume; + } + + private void initializeVolumes(Cluster cluster) { + List<Volume> volumes = new ArrayList<Volume>(); + + volume1 = addVolume(volumes, "Volume1", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, + VOLUME_STATUS.ONLINE); + + volume2 = addVolume(volumes, "Volume2", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, + VOLUME_STATUS.ONLINE); + + volume3 = addVolume(volumes, "Volume3", cluster, VOLUME_TYPE.DISTRIBUTED_MIRROR, TRANSPORT_TYPE.ETHERNET, + VOLUME_STATUS.OFFLINE); + volume3.setReplicaCount(2); + + volume4 = addVolume(volumes, "Volume4", cluster, VOLUME_TYPE.PLAIN_DISTRIBUTE, TRANSPORT_TYPE.ETHERNET, + VOLUME_STATUS.ONLINE); + + volume5 = addVolume(volumes, "Volume5", cluster, VOLUME_TYPE.DISTRIBUTED_STRIPE, TRANSPORT_TYPE.INFINIBAND, + VOLUME_STATUS.OFFLINE); + volume5.setStripeCount(3); + + cluster.setVolumes(volumes); + } + + private void initializeDisks() { + s1da = new Disk(server1, "sda", 100d, 80d, DISK_STATUS.READY); + s1db = new Disk(server1, "sdb", 100d, 67.83, DISK_STATUS.READY); + + s2da = new Disk(server2, "sda", 200d, 157.12, DISK_STATUS.READY); + s2db = new Disk(server2, "sdb", 200d, 182.27, DISK_STATUS.READY); + s2dc = new Disk(server2, "sdc", 200d, -1d, DISK_STATUS.UNINITIALIZED); + s2dd = new Disk(server2, "sdd", 200d, 124.89, DISK_STATUS.READY); + + s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline + + s4da = new Disk(server4, "sda", 100d, 85.39, DISK_STATUS.READY); + + s5da = new Disk(server5, "sda", 100d, 92.83, DISK_STATUS.READY); + s5db = new Disk(server5, "sdb", 200d, 185.69, DISK_STATUS.READY); + } + + private void addDisksToServers() { + server1.addDisk(s1da); + server1.addDisk(s1db); + + server2.addDisk(s2da); + server2.addDisk(s2db); + server2.addDisk(s2dc); + server2.addDisk(s2dd); + + // server3.addDisk(s3da); + + server4.addDisk(s4da); + + server5.addDisk(s5da); + server5.addDisk(s5db); + } + + private void addDisksToVolumes() { + volume1.addDisk(s1da); + + volume2.addDisk(s2da); + volume2.addDisk(s1db); + volume2.addDisk(s3da); + volume2.addDisk(s4da); + + volume3.addDisk(s2db); + volume3.addDisk(s4da); + volume3.addDisk(s5da); + + volume4.addDisk(s1da); + volume4.addDisk(s3da); + volume4.addDisk(s4da); + volume4.addDisk(s5db); + + volume5.addDisk(s2da); + volume5.addDisk(s5db); + } + + private void initializeGlusterServers(Cluster cluster) { + List<GlusterServer> servers = new ArrayList<GlusterServer>(); + server1 = addGlusterServer(servers, cluster, "Server1", SERVER_STATUS.ONLINE, "eth0", 4, 56.3, 16, 8.4); + server2 = addGlusterServer(servers, cluster, "Server2", SERVER_STATUS.ONLINE, "eth1", 8, 41.92, 32, 18.76); + server3 = addGlusterServer(servers, cluster, "Server3", SERVER_STATUS.OFFLINE, "eth0", -1, -1, -1, -1); + server4 = addGlusterServer(servers, cluster, "Server4", SERVER_STATUS.ONLINE, "eth0", 1, 92.83, 4, 3.18); + server5 = addGlusterServer(servers, cluster, "Server5", SERVER_STATUS.ONLINE, "inf0", 2, 87.24, 8, 7.23); + + cluster.setServers(servers); + } + + private void initializeAutoDiscoveredServers(Cluster cluster) { + cluster.setAutoDiscoveredServers(new DiscoveredServersClient("localhost", "gluster", "gluster") + .getDiscoveredServerDetails()); + } + + private void addMessages(List<LogMessage> messages, Disk disk, String severity, int count) { + for (int i = 1; i <= count; i++) { + String message = severity + "message" + i; + messages.add(new LogMessage(new Date(), disk, severity, message)); + } + } + + private void addMessagesForDisk(List<LogMessage> logMessages, Disk disk) { + addMessages(logMessages, disk, "SEVERE", 5); + addMessages(logMessages, disk, "WARNING", 5); + addMessages(logMessages, disk, "DEBUG", 5); + addMessages(logMessages, disk, "INFO", 5); + } + + public List<LogMessage> createDummyLogMessages() { + addMessagesForDisk(logMessages, s1da); + addMessagesForDisk(logMessages, s1db); + addMessagesForDisk(logMessages, s2da); + addMessagesForDisk(logMessages, s2db); + addMessagesForDisk(logMessages, s2dc); + addMessagesForDisk(logMessages, s2dd); + addMessagesForDisk(logMessages, s4da); + addMessagesForDisk(logMessages, s5da); + addMessagesForDisk(logMessages, s5db); + return logMessages; + } + + public static List<LogMessage> getDummyLogMessages() { + return logMessages; + } + + public List<Disk> getReadyDisksOfVolume(Volume volume) { + List<Disk> disks = new ArrayList<Disk>(); + for (Disk disk : volume.getDisks()) { + if (disk.isReady()) { + disks.add(disk); + } + } + return disks; + } + + public List<Disk> getReadyDisksOfAllVolumes() { + List<Disk> disks = new ArrayList<Disk>(); + for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) { + disks.addAll(getReadyDisksOfVolume(volume)); + } + return disks; + } + + public List<Disk> getReadyDisksOfAllServers() { + return getReadyDisksOfAllServersExcluding(new ArrayList<Disk>()); + } + + public List<Disk> getReadyDisksOfAllServersExcluding(List<Disk> excludeDisks) { + List<Disk> disks = new ArrayList<Disk>(); + + for (Server server : ((Cluster) model.getChildren().get(0)).getServers()) { + for (Disk disk : server.getDisks()) { + if (disk.isReady() && !excludeDisks.contains(disk)) { + disks.add(disk); + } + } + } + return disks; + } +} diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java index 55812ba3..abd8ba4b 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java @@ -18,10 +18,14 @@ *******************************************************************************/ package com.gluster.storage.management.core.constants; +import java.util.ArrayList; +import java.util.List; + /** * */ public class CoreConstants { public static final String NEWLINE = System.getProperty("line.separator"); + public static final String FILE_SEPARATOR = System.getProperty("file.separator"); public static final String ENCODING_UTF8 = "UTF-8"; } 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/AbstractResponse.java index c03194dd..be552bdc 100644 --- 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/AbstractResponse.java @@ -18,7 +18,7 @@ *******************************************************************************/ package com.gluster.storage.management.core.model;
-public abstract class AbstractServerResponse implements Response {
+public abstract class AbstractResponse implements Response {
private Status status;
@Override
diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java index 3e1e86db..efeed34b 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java @@ -23,13 +23,10 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "response") -public class GenericResponse<T> implements Response<T> { +public class GenericResponse<T> extends AbstractResponse { private T data; private Status status; - public GenericResponse() { - } - @Override public Status getStatus() { return status; @@ -44,13 +41,16 @@ public class GenericResponse<T> implements Response<T> { this.data = data; } - /* - * (non-Javadoc) - * - * @see com.gluster.storage.management.core.model.ServerResponse#getData() - */ + public GenericResponse() { + } + @Override public T getData() { return data; } + + public void setData(T data) { + this.data = data; + } + } 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 index 6899f67d..6a8397a6 100644 --- 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 @@ -16,24 +16,50 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.core.model;
-
+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; -
-@XmlRootElement(name="response")
-public class ServerListResponse<T extends Server> extends GenericResponse {
+import javax.xml.bind.annotation.XmlTransient; + +@XmlRootElement(name = "response") +public class ServerListResponse<T extends Server> extends AbstractResponse { + private List<T> servers = new ArrayList<T>(); + + public ServerListResponse() { + } + public ServerListResponse(Status status, List<T> servers) { - super(status, servers); - }
-
- @SuppressWarnings("unchecked") - @XmlElementWrapper(name="servers")
- @XmlElement(name="server", type=Server.class)
- public List<T> getServers() {
- return (List<T>)getData();
- }
-}
+ setStatus(status); + setServers(servers); + } + + @XmlElementWrapper(name = "servers") + @XmlElement(name = "server", type = Server.class) + public List<T> getServers() { + return servers; + } + + /** + * @param servers + * the servers to set + */ + public void setServers(List<T> servers) { + this.servers = servers; + } + + /* + * (non-Javadoc) + * + * @see com.gluster.storage.management.core.model.Response#getData() + */ + @Override + @XmlTransient + public List<T> getData() { + return getServers(); + } +} diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java new file mode 100644 index 00000000..3304692d --- /dev/null +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * 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.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; + +@XmlRootElement(name = "response") +public class StringListResponse extends AbstractResponse { + private List<String> data = new ArrayList<String>(); + + public StringListResponse() { + } + + public StringListResponse(List<String> data) { + this.data = data; + } + + @Override + @XmlElementWrapper(name = "list") + @XmlElement(name = "value", type = String.class) + public List<String> getData() { + return data; + } +}
\ No newline at end of file diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java index e8f193ce..507c6d95 100644 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java @@ -55,9 +55,9 @@ public class ProcessUtil { /** * Executes given command in foreground/background - * @param command * @param runInForeground Boolean flag indicating whether the command should * be executed in foreground + * @param command * @return {@link ProcessResult} object */ public ProcessResult executeCommand(boolean runInForeground, List<String> command) { diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java index 95a9cd62..64ff1046 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java @@ -30,9 +30,9 @@ import org.eclipse.ui.model.BaseWorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.part.ViewPart; +import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.GlusterDataModel; -import com.gluster.storage.management.core.model.GlusterDummyModel; public class NavigationView extends ViewPart { public static final String ID = "com.gluster.storage.management.gui.views.navigator"; @@ -46,7 +46,7 @@ public class NavigationView extends ViewPart { @Override public void createPartControl(Composite parent) { - model = GlusterDummyModel.getInstance().getModel(); + model = GlusterDataModelManager.getInstance().getModel(); treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); getSite().setSelectionProvider(treeViewer); diff --git a/com.gluster.storage.management.server.scripts/src/multicast_request.py b/com.gluster.storage.management.server.scripts/src/multicast_request.py index c6ae469c..e0dd1e24 100644..100755 --- a/com.gluster.storage.management.server.scripts/src/multicast_request.py +++ b/com.gluster.storage.management.server.scripts/src/multicast_request.py @@ -1,81 +1,82 @@ -#!/usr/bin/python
-# Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com>
-# This file is part of Gluster Storage Platform.
-#
-# Gluster Storage Platform is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 3 of
-# the License, or (at your option) any later version.
-#
-# Gluster Storage Platform 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 General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see
-# <http://www.gnu.org/licenses/>.
-
-import sys
-import socket
-import signal
-import struct
-import syslog
-import Globals
-import Common
-
-class TimeoutException(Exception):
- pass
-
-def timeoutSignal(signum, frame):
- raise TimeoutException, "Timed out"
-
-def serverDiscoveryRequest(multiCastGroup, port):
- servers = []
- # Sending request to all the servers
- socketSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
- socketSend.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
- socketSend.sendto("ServerDiscovery", (multiCastGroup, port))
-
- # Waiting for the response
- socketReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
- socketReceive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- socketReceive.bind(('', port))
- mreq = struct.pack("4sl", socket.inet_aton(multiCastGroup), socket.INADDR_ANY)
-
- socketReceive.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
- socketSend.sendto("ServerDiscovery", (multiCastGroup, port))
-
- try:
- while True:
- response = socketReceive.recvfrom(200)
- if response and response[0].upper() != "SERVERDISCOVERY":
- servers.append(response[0] + "\n")
- signal.signal(signal.SIGALRM, timeoutSignal)
- signal.alarm(3)
- except TimeoutException:
- return servers
- return None
-
-def main():
- syslog.openlog("discovery server request")
- servers = serverDiscoveryRequest(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT)
- if not servers:
- Common.log(syslog.LOG_ERR, "Failed to discover new servers")
- sys.exit(-1)
-
- servers = set(servers)
- try:
- fp = open(Globals.DISCOVERED_SERVER_LIST_FILENAME, "w")
- fp.writelines(list(servers))
- fp.close()
- except IOError:
- Common.log(syslog.LOG_ERR, "Unable to open file %s" % Globals.DISCOVERED_SERVER_LIST_FILENAME)
- sys.exit(-1)
-
- #for serverName in servers:
- # print serverName
- sys.exit(0)
-
-if __name__ == "__main__":
- main()
+#!/usr/bin/python +# Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com> +# This file is part of Gluster Storage Platform. +# +# Gluster Storage Platform is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 of +# the License, or (at your option) any later version. +# +# Gluster Storage Platform 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# <http://www.gnu.org/licenses/>. + +import sys +import socket +import signal +import struct +import syslog +import Globals +import Common + +class TimeoutException(Exception): + pass + +def timeoutSignal(signum, frame): + raise TimeoutException, "Timed out" + +def serverDiscoveryRequest(multiCastGroup, port): + servers = [] + # Sending request to all the servers + socketSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + socketSend.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) + socketSend.sendto("ServerDiscovery", (multiCastGroup, port)) + + # Waiting for the response + socketReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + socketReceive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + socketReceive.bind(('', port)) + mreq = struct.pack("4sl", socket.inet_aton(multiCastGroup), socket.INADDR_ANY) + + socketReceive.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + socketSend.sendto("ServerDiscovery", (multiCastGroup, port)) + + try: + while True: + response = socketReceive.recvfrom(200) + if response and response[0].upper() != "SERVERDISCOVERY": + servers.append(response[0] + "\n") + signal.signal(signal.SIGALRM, timeoutSignal) + signal.alarm(3) + except TimeoutException: + return servers + return None + +def main(): + syslog.openlog("discovery server request") + servers = serverDiscoveryRequest(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT) + if not servers: + Common.log(syslog.LOG_ERR, "Failed to discover new servers") + sys.exit(-1) + + servers = set(servers) + try: + fp = open(Globals.DISCOVERED_SERVER_LIST_FILENAME, "w") + print(list(servers)) + fp.writelines(list(servers)) + fp.close() + except IOError: + Common.log(syslog.LOG_ERR, "Unable to open file %s" % Globals.DISCOVERED_SERVER_LIST_FILENAME) + sys.exit(-1) + + #for serverName in servers: + # print serverName + sys.exit(0) + +if __name__ == "__main__": + main() diff --git a/com.gluster.storage.management.server/.project b/com.gluster.storage.management.server/.project index cb36e33f..86d34a3b 100644 --- a/com.gluster.storage.management.server/.project +++ b/com.gluster.storage.management.server/.project @@ -6,6 +6,11 @@ </projects> <buildSpec> <buildCommand> + <name>org.python.pydev.PyDevBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptValidator</name> <arguments> </arguments> @@ -32,5 +37,6 @@ <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> + <nature>org.python.pydev.pythonNature</nature> </natures> </projectDescription> diff --git a/com.gluster.storage.management.server/.pydevproject b/com.gluster.storage.management.server/.pydevproject new file mode 100644 index 00000000..a9cca037 --- /dev/null +++ b/com.gluster.storage.management.server/.pydevproject @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?eclipse-pydev version="1.0"?> + +<pydev_project> +<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> +<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> +</pydev_project> diff --git a/com.gluster.storage.management.server/WebContent/scripts/Common.py b/com.gluster.storage.management.server/WebContent/scripts/Common.py new file mode 100644 index 00000000..60f200fe --- /dev/null +++ b/com.gluster.storage.management.server/WebContent/scripts/Common.py @@ -0,0 +1,34 @@ +# Copyright (c) 2009 Gluster, Inc. <http://www.gluster.com>
+# This file is part of GlusterSP.
+#
+# GlusterSP is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 3 of the License,
+# or (at your option) any later version.
+#
+# GlusterSP 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
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see
+# <http://www.gnu.org/licenses/>.
+
+import sys
+import syslog
+
+def log(priority, message=None):
+ if type(priority) == type(""):
+ logPriority = syslog.LOG_INFO
+ logMessage = priority
+ else:
+ logPriority = priority
+ logMessage = message
+ if not logMessage:
+ return
+ #if Globals.DEBUG:
+ # sys.stderr.write(logMessage)
+ else:
+ syslog.syslog(logPriority, logMessage)
+ return
diff --git a/com.gluster.storage.management.server/WebContent/scripts/Globals.py b/com.gluster.storage.management.server/WebContent/scripts/Globals.py new file mode 100644 index 00000000..6e68adbd --- /dev/null +++ b/com.gluster.storage.management.server/WebContent/scripts/Globals.py @@ -0,0 +1,3 @@ +MULTICAST_GROUP = '224.224.1.1'
+MULTICAST_PORT = 5353
+DISCOVERED_SERVER_LIST_FILENAME = "/tmp/discovered-server-list"
diff --git a/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py b/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py new file mode 100755 index 00000000..6ac15fed --- /dev/null +++ b/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py @@ -0,0 +1,83 @@ +#!/usr/bin/python +# Copyright (C) 2009 Gluster, Inc. <http://www.gluster.com> +# This file is part of Gluster Storage Platform. +# +# Gluster Storage Platform is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 of +# the License, or (at your option) any later version. +# +# Gluster Storage Platform 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see +# <http://www.gnu.org/licenses/>. + +import sys +import socket +import signal +import struct +import syslog +import Globals +import Common + +class TimeoutException(Exception): + pass + +def timeoutSignal(signum, frame): + raise TimeoutException, "Timed out" + +def serverDiscoveryRequest(multiCastGroup, port): + servers = [] + # Sending request to all the servers + socketSend = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + socketSend.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2) + socketSend.sendto("ServerDiscovery", (multiCastGroup, port)) + + # Waiting for the response + socketReceive = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) + socketReceive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + socketReceive.bind(('', port)) + mreq = struct.pack("4sl", socket.inet_aton(multiCastGroup), socket.INADDR_ANY) + + socketReceive.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) + socketSend.sendto("ServerDiscovery", (multiCastGroup, port)) + + try: + while True: + response = socketReceive.recvfrom(200) + if response and response[0].upper() != "SERVERDISCOVERY": + servers.append(response[0]) + signal.signal(signal.SIGALRM, timeoutSignal) + signal.alarm(3) + except TimeoutException: + return servers + return None + +def main(): + syslog.openlog("discovery server request") + servers = serverDiscoveryRequest(Globals.MULTICAST_GROUP, Globals.MULTICAST_PORT) + if not servers: + Common.log(syslog.LOG_ERR, "Failed to discover new servers") + sys.exit(-1) + + servers = set(servers) + try: + #fp = open(Globals.DISCOVERED_SERVER_LIST_FILENAME, "w") + #fp.writelines(list(servers)) + #fp.close() + for server in servers: + print server + except IOError: + Common.log(syslog.LOG_ERR, "Unable to open file %s" % Globals.DISCOVERED_SERVER_LIST_FILENAME) + sys.exit(-1) + + #for serverName in servers: + # print serverName + sys.exit(0) + +if __name__ == "__main__": + main() 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 7e0221ac..63b5cdff 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 @@ -18,58 +18,52 @@ *******************************************************************************/ package com.gluster.storage.management.server.resources; -import java.io.File; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; 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.ServerListResponse; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.utils.FileUtil; -import com.gluster.storage.management.core.utils.ProcessResult; -import com.gluster.storage.management.core.utils.ProcessUtil; +import com.gluster.storage.management.core.model.StringListResponse; import com.sun.jersey.spi.resource.Singleton; @Component @Singleton @Path("/discoveredservers") public class DiscoveredServersResource { - private List<String> discoveredServerNames; + private List<String> discoveredServerNames = new ArrayList<String>(); - // 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 = "/GLUSTER/discovered-server-names"; - - private List<String> getDiscoveredServerNames() { - File discoveredServersFile = new File(DISCOVERED_SERVERS); - String serverNames = new FileUtil().readFileAsString(discoveredServersFile); - String[] parts = serverNames.split("\n"); - return Arrays.asList(parts); + public List<String> getDiscoveredServerNames() { + return discoveredServerNames; } @GET @Produces(MediaType.TEXT_XML) - public ServerListResponse<Server> getDiscoveredServers() { - return new ServerListResponse<Server>(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); + public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) { + System.out.println(getDetails); + if(getDetails != null && getDetails == true) { + return new ServerListResponse<Server>(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); + } + return new StringListResponse(getDiscoveredServerNames()); } private List<Server> getDiscoveredServerDetails() { List<Server> discoveredServers = new ArrayList<Server>(); List<String> serverNames = getDiscoveredServerNames(); for (String serverName : serverNames) { - // TODO: With the new design of dedicated management server, this logic has to change. - // DiscoveredServersClient client = new DiscoveredServersClient(serverName); - // Server server = client.getServer("me"); - // discoveredServers.add(server); + // TODO. Dummy data for now. + Server server = new Server(serverName, null, 4, 58.3d, 4d, 2.87d); + discoveredServers.add(server); } return discoveredServers; } @@ -83,29 +77,15 @@ public class DiscoveredServersResource { @Path("/{serverName}") @GET @Produces(MediaType.TEXT_XML) - public String getDiscoveredServer(@PathParam("serverName") String serverName) { - 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 DiscoveredServersClient(serverName).getServerXML("me"); - return null; - } - - public String getThisServer() { - ProcessResult result = new ProcessUtil().executeCommand("get-server-details.py"); - if (!result.isSuccess()) { - // TODO:Generate error message and return - } - return result.getOutput(); + public Server getDiscoveredServer(@PathParam("serverName") String serverName) { + Server server = new Server(serverName, null, 4, 58.3d, 4d, 2.87d); + return server; } public static void main(String[] args) { - ServerListResponse<Server> listResponse = new DiscoveredServersResource().getDiscoveredServers(); - for (Server server : listResponse.getServers()) { - System.out.println(server.getName()); + StringListResponse listResponse = (StringListResponse)new DiscoveredServersResource().getDiscoveredServers(false); + for (String server : listResponse.getData()) { + System.out.println(server); } } } 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 c4b4bdb8..9a2a7e47 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 @@ -21,6 +21,7 @@ package com.gluster.storage.management.server.tasks; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.servlet.ServletContext; @@ -28,7 +29,10 @@ import javax.servlet.ServletContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.gluster.storage.management.core.constants.CoreConstants; +import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.resources.DiscoveredServersResource; +import com.gluster.storage.management.server.utils.ServerUtil; import com.sun.jersey.spi.resource.Singleton; /** @@ -42,7 +46,10 @@ public class ServerDiscoveryTask { private static final String ENV_AWS = "aws"; private static final String ENV_VMWARE = "vmware"; private static final String ENV_PHYCAL = "physical"; + private static final String SCRIPT_NAME_SFX = "-discover-servers.py"; + @Autowired + private ServerUtil serverUtil; @Autowired private ServletContext servletContext; @@ -54,18 +61,16 @@ public class ServerDiscoveryTask { private String environment; public void discoverServers() { - System.out.println("Starting discovery in [" + environment + "] environment"); - - /** - * TODO: Flow should be as follows <br> - * 1) Get the discovery policy specific for the environment <br> - * 2) Execute discovery to get list of auto-discovered server <br> - * 3) Set the discovered servers list in the discovered servers resource <br> - */ - - List<String> discoveredServers = new ArrayList<String>(); - discoveredServers.add("yserver1"); - - discoveredServersResource.setDiscoveredServerNames(discoveredServers); + 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>()); + if(result.isSuccess()) { + String serverNames = result.getOutput(); + String[] parts = serverNames.split(CoreConstants.NEWLINE); + serverNameList = Arrays.asList(parts); + } + + discoveredServersResource.setDiscoveredServerNames(serverNameList); } }
\ No newline at end of file diff --git a/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java new file mode 100644 index 00000000..1d237461 --- /dev/null +++ b/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -0,0 +1,58 @@ +/** + * ServerUtil.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.utils; + +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.ServletContext; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.gluster.storage.management.core.constants.CoreConstants; +import com.gluster.storage.management.core.utils.ProcessResult; +import com.gluster.storage.management.core.utils.ProcessUtil; +import com.sun.jersey.spi.resource.Singleton; + +@Singleton +@Component +public class ServerUtil { + @Autowired + ServletContext servletContext; + + private static final String SCRIPT_DIR = "scripts"; + private static final String SCRIPT_COMMAND = "python"; + + public ProcessResult executeGlusterScript(boolean runInForeground, String scriptName, List<String> arguments) { + List<String> command = new ArrayList<String>(); + + command.add(SCRIPT_COMMAND); + command.add(getScriptPath(scriptName)); + command.addAll(arguments); + return new ProcessUtil().executeCommand(runInForeground, command); + } + + private String getScriptPath(String scriptName) { + String scriptPath = servletContext.getRealPath(SCRIPT_DIR) + CoreConstants.FILE_SEPARATOR + scriptName; + return scriptPath; + } +}
\ No newline at end of file |
