diff options
| author | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 17:56:52 +0530 |
|---|---|---|
| committer | Shireesh Anjal <shireesh@gluster.com> | 2011-03-14 17:56:52 +0530 |
| commit | d20cf95b122f7b08614da2e4e14267e34b8262dd (patch) | |
| tree | 7f6c052704f49a2bffd25ee68423178506f260a9 /com.gluster.storage.management.server | |
| parent | fa113e22d419fcd16f5eb8c579131ffa65ed4b5e (diff) | |
Audo discovery changes
Diffstat (limited to 'com.gluster.storage.management.server')
8 files changed, 230 insertions, 54 deletions
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 |
