summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--com.gluster.storage.management.client/.classpath4
-rw-r--r--com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java27
-rw-r--r--com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java39
-rw-r--r--com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java286
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java4
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java (renamed from com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java)2
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java18
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java56
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java45
-rw-r--r--com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/ProcessUtil.java2
-rw-r--r--com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java4
-rwxr-xr-x[-rw-r--r--]com.gluster.storage.management.server.scripts/src/multicast_request.py163
-rw-r--r--com.gluster.storage.management.server/.project6
-rw-r--r--com.gluster.storage.management.server/.pydevproject7
-rw-r--r--com.gluster.storage.management.server/WebContent/scripts/Common.py34
-rw-r--r--com.gluster.storage.management.server/WebContent/scripts/Globals.py3
-rwxr-xr-xcom.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py83
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java62
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java31
-rw-r--r--com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java58
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