From d20cf95b122f7b08614da2e4e14267e34b8262dd Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Mon, 14 Mar 2011 17:56:52 +0530 Subject: Audo discovery changes --- com.gluster.storage.management.client/.classpath | 4 +- .../storage/management/client/AbstractClient.java | 27 +- .../management/client/DiscoveredServersClient.java | 39 ++- .../management/client/GlusterDataModelManager.java | 286 +++++++++++++++++++++ .../management/core/constants/CoreConstants.java | 4 + .../management/core/model/AbstractResponse.java | 32 +++ .../core/model/AbstractServerResponse.java | 32 --- .../management/core/model/GenericResponse.java | 18 +- .../management/core/model/ServerListResponse.java | 56 ++-- .../management/core/model/StringListResponse.java | 45 ++++ .../storage/management/core/utils/ProcessUtil.java | 2 +- .../gui/views/navigator/NavigationView.java | 4 +- .../src/multicast_request.py | 163 ++++++------ com.gluster.storage.management.server/.project | 6 + .../.pydevproject | 7 + .../WebContent/scripts/Common.py | 34 +++ .../WebContent/scripts/Globals.py | 3 + .../WebContent/scripts/vmware-discover-servers.py | 83 ++++++ .../resources/DiscoveredServersResource.java | 62 ++--- .../server/tasks/ServerDiscoveryTask.java | 31 ++- .../management/server/utils/ServerUtil.java | 58 +++++ 21 files changed, 785 insertions(+), 211 deletions(-) create mode 100644 com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java create mode 100644 com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java delete mode 100644 com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java create mode 100644 com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java mode change 100644 => 100755 com.gluster.storage.management.server.scripts/src/multicast_request.py create mode 100644 com.gluster.storage.management.server/.pydevproject create mode 100644 com.gluster.storage.management.server/WebContent/scripts/Common.py create mode 100644 com.gluster.storage.management.server/WebContent/scripts/Globals.py create mode 100755 com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py create mode 100644 com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java 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 @@ - - + + 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 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 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 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 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 getDiscoveredServers() { - @SuppressWarnings("unchecked") - ServerListResponse response = (ServerListResponse) fetchResource(ServerListResponse.class); - return response.getServers(); + return ((Response) fetchResource(queryParams, responseClass)).getData(); + } + + public List getDiscoveredServerNames() { + return (List)getDiscoveredServers(Boolean.FALSE, StringListResponse.class); + } + + public List getDiscoveredServerDetails() { + return (List)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 discoveredServers = ServerResource.getDiscoveredServers(); - System.out.println(discoveredServers.size()); + DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", "gluster", "gluster"); + List discoveredServerNames = serverResource.getDiscoveredServerNames(); + System.out.println(discoveredServerNames); + List 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. + * 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 + * . + *******************************************************************************/ +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 logMessages = new ArrayList(); + 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 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 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 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 volumes = new ArrayList(); + + 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 servers = new ArrayList(); + 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 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 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 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 getDummyLogMessages() { + return logMessages; + } + + public List getReadyDisksOfVolume(Volume volume) { + List disks = new ArrayList(); + for (Disk disk : volume.getDisks()) { + if (disk.isReady()) { + disks.add(disk); + } + } + return disks; + } + + public List getReadyDisksOfAllVolumes() { + List disks = new ArrayList(); + for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) { + disks.addAll(getReadyDisksOfVolume(volume)); + } + return disks; + } + + public List getReadyDisksOfAllServers() { + return getReadyDisksOfAllServersExcluding(new ArrayList()); + } + + public List getReadyDisksOfAllServersExcluding(List excludeDisks) { + List disks = new ArrayList(); + + 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/AbstractResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java new file mode 100644 index 00000000..be552bdc --- /dev/null +++ b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * 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 + * . + *******************************************************************************/ +package com.gluster.storage.management.core.model; + +public abstract class AbstractResponse implements Response { + private Status status; + + @Override + public Status getStatus() { + return status; + } + + public void setStatus(Status status) { + this.status = status; + } +} \ No newline at end of file diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java b/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java deleted file mode 100644 index c03194dd..00000000 --- a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractServerResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * 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 - * . - *******************************************************************************/ -package com.gluster.storage.management.core.model; - -public abstract class AbstractServerResponse implements Response { - private Status status; - - @Override - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } -} \ No newline at end of file diff --git a/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/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 implements Response { +public class GenericResponse extends AbstractResponse { private T data; private Status status; - public GenericResponse() { - } - @Override public Status getStatus() { return status; @@ -44,13 +41,16 @@ public class GenericResponse implements Response { 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 * . *******************************************************************************/ -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 extends GenericResponse { +import javax.xml.bind.annotation.XmlTransient; + +@XmlRootElement(name = "response") +public class ServerListResponse extends AbstractResponse { + private List servers = new ArrayList(); + + public ServerListResponse() { + } + public ServerListResponse(Status status, List servers) { - super(status, servers); - } - - @SuppressWarnings("unchecked") - @XmlElementWrapper(name="servers") - @XmlElement(name="server", type=Server.class) - public List getServers() { - return (List)getData(); - } -} + setStatus(status); + setServers(servers); + } + + @XmlElementWrapper(name = "servers") + @XmlElement(name = "server", type = Server.class) + public List getServers() { + return servers; + } + + /** + * @param servers + * the servers to set + */ + public void setServers(List servers) { + this.servers = servers; + } + + /* + * (non-Javadoc) + * + * @see com.gluster.storage.management.core.model.Response#getData() + */ + @Override + @XmlTransient + public List 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. + * 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 + * . + *******************************************************************************/ +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 data = new ArrayList(); + + public StringListResponse() { + } + + public StringListResponse(List data) { + this.data = data; + } + + @Override + @XmlElementWrapper(name = "list") + @XmlElement(name = "value", type = String.class) + public List 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 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 old mode 100644 new mode 100755 index c6ae469c..e0dd1e24 --- 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. -# 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 -# . - -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. +# 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 +# . + +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 @@ -5,6 +5,11 @@ + + org.python.pydev.PyDevBuilder + + + org.eclipse.wst.jsdt.core.javascriptValidator @@ -32,5 +37,6 @@ org.eclipse.wst.common.project.facet.core.nature org.eclipse.jdt.core.javanature org.eclipse.wst.jsdt.core.jsNature + org.python.pydev.pythonNature 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 @@ + + + + +Default +python 2.7 + 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. +# 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 +# . + +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. +# 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 +# . + +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 discoveredServerNames; + private List discoveredServerNames = new ArrayList(); - // 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 getDiscoveredServerNames() { - File discoveredServersFile = new File(DISCOVERED_SERVERS); - String serverNames = new FileUtil().readFileAsString(discoveredServersFile); - String[] parts = serverNames.split("\n"); - return Arrays.asList(parts); + public List getDiscoveredServerNames() { + return discoveredServerNames; } @GET @Produces(MediaType.TEXT_XML) - public ServerListResponse getDiscoveredServers() { - return new ServerListResponse(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); + public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) { + System.out.println(getDetails); + if(getDetails != null && getDetails == true) { + return new ServerListResponse(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); + } + return new StringListResponse(getDiscoveredServerNames()); } private List getDiscoveredServerDetails() { List discoveredServers = new ArrayList(); List 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 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
- * 1) Get the discovery policy specific for the environment
- * 2) Execute discovery to get list of auto-discovered server
- * 3) Set the discovered servers list in the discovered servers resource
- */ - - List discoveredServers = new ArrayList(); - discoveredServers.add("yserver1"); - - discoveredServersResource.setDiscoveredServerNames(discoveredServers); + System.out.println("Starting auto-discovery in [" + environment + "] environment"); + List serverNameList = new ArrayList(); + + ProcessResult result = serverUtil.executeGlusterScript(true, environment + SCRIPT_NAME_SFX, new ArrayList()); + 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. + * 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 + * . + */ +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 arguments) { + List command = new ArrayList(); + + 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 -- cgit