diff options
Diffstat (limited to 'src/com.gluster.storage.management.client')
17 files changed, 1045 insertions, 0 deletions
diff --git a/src/com.gluster.storage.management.client/.classpath b/src/com.gluster.storage.management.client/.classpath new file mode 100644 index 00000000..b8f71a37 --- /dev/null +++ b/src/com.gluster.storage.management.client/.classpath @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <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"/> + <classpathentry combineaccessrules="false" kind="src" path="/com.gluster.storage.management.core"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/src/com.gluster.storage.management.client/.project b/src/com.gluster.storage.management.client/.project new file mode 100644 index 00000000..647c8a91 --- /dev/null +++ b/src/com.gluster.storage.management.client/.project @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>com.gluster.storage.management.client</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.ManifestBuilder</name> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.pde.SchemaBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.pde.PluginNature</nature> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/src/com.gluster.storage.management.client/.settings/org.eclipse.jdt.core.prefs b/src/com.gluster.storage.management.client/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..f8b5cc38 --- /dev/null +++ b/src/com.gluster.storage.management.client/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Wed Dec 29 15:47:13 IST 2010 +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF new file mode 100644 index 00000000..43ae7c3e --- /dev/null +++ b/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Gluster Storage Platform Client +Bundle-SymbolicName: com.gluster.storage.management.client +Bundle-Version: 1.0.0 +Bundle-Vendor: GLUSTER +Bundle-RequiredExecutionEnvironment: JavaSE-1.6 +Require-Bundle: com.gluster.storage.management.core;bundle-version="1.0.0", + org.eclipse.equinox.common;bundle-version="3.6.0" +Export-Package: com.gluster.storage.management.client, + com.gluster.storage.management.client.constants +Bundle-ClassPath: ., + lib/jersey-1.5/jersey-client-1.5.jar, + lib/jersey-1.5/jersey-core-1.5.jar diff --git a/src/com.gluster.storage.management.client/build.properties b/src/com.gluster.storage.management.client/build.properties new file mode 100644 index 00000000..271ce382 --- /dev/null +++ b/src/com.gluster.storage.management.client/build.properties @@ -0,0 +1,8 @@ +source.. = src/ +output.. = bin/ +bin.includes = .,\ + META-INF/,\ + lib/jersey-1.5/jersey-client-1.5.jar,\ + lib/jersey-1.5/jersey-core-1.5.jar +src.includes = lib/jersey-1.4/jersey-client-1.4.jar,\ + lib/jersey-1.4/jersey-core-1.4.jar diff --git a/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-client-1.5.jar b/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-client-1.5.jar Binary files differnew file mode 100644 index 00000000..62f790fa --- /dev/null +++ b/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-client-1.5.jar diff --git a/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-core-1.5.jar b/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-core-1.5.jar Binary files differnew file mode 100644 index 00000000..92b38466 --- /dev/null +++ b/src/com.gluster.storage.management.client/lib/jersey-1.5/jersey-core-1.5.jar diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java new file mode 100644 index 00000000..12fbd354 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -0,0 +1,159 @@ +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;
+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.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 securityToken;
+ private String authHeader;
+
+ public AbstractClient() {
+ URI baseURI = new ClientUtil().getServerBaseURI();
+ resource = Client.create(new DefaultClientConfig()).resource(baseURI).path(getResourceName());
+ }
+
+ public AbstractClient(String securityToken) {
+ this();
+ setSecurityToken(securityToken);
+ }
+
+ /**
+ * Fetches the given resource by dispatching a GET request
+ *
+ * @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, 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);
+ }
+
+ /**
+ * Fetches the default resource (the one returned by {@link AbstractClient#getResourceName()}) by dispatching a GET
+ * request on the resource
+ *
+ * @param responseClass
+ * Expected class of the response
+ * @return Object of responseClass received as a result of the GET request
+ */
+ @SuppressWarnings("rawtypes")
+ protected Object fetchResource(Class responseClass) {
+ Object response = fetchResource(resource, NO_PARAMS, responseClass);
+ return response;
+ }
+
+ /**
+ * Fetches the resource whose name is arrived at by appending the "subResourceName" parameter to the default
+ * resource (the one returned by {@link AbstractClient#getResourceName()})
+ *
+ * @param subResourceName
+ * Name of the sub-resource
+ * @param responseClass
+ * Expected class of the response
+ * @return Object of responseClass received as a result of the GET request on the sub-resource
+ */
+ @SuppressWarnings("rawtypes")
+ protected Object fetchSubResource(String subResourceName, Class responseClass) {
+ return fetchResource(resource.path(subResourceName), NO_PARAMS, responseClass);
+ }
+
+ /**
+ * Submits given Form using POST method to the resource and returns the object received as response
+ * @param responseClass Class of the object expected as response
+ * @param form Form to be submitted
+ * @return Object of given class received as response
+ */
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected Object postRequest(Class responseClass, Form form) {
+ return resource.type(MediaType.APPLICATION_FORM_URLENCODED_TYPE).header("Authorization", authHeader)
+ .accept(MediaType.TEXT_XML).post(responseClass, form);
+ }
+
+ /**
+ * Submits given Form using POST method to the given sub-resource and returns the object received as response
+ * @param subResourceName Name of the sub-resource to which the request is to be posted
+ * @param responseClass Class of the object expected as response
+ * @param form Form to be submitted
+ * @return Object of given class received as response
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ protected Object postRequest(String subResourceName, Class responseClass, Form form) {
+ return resource.path(subResourceName).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
+ .header("Authorization", authHeader).accept(MediaType.TEXT_XML).post(responseClass, form);
+ }
+
+ /**
+ * Submits given Form using PUT method to the given sub-resource and returns the object received as response
+ * @param subResourceName Name of the sub-resource to which the request is to be posted
+ * @param responseClass Class of the object expected as response
+ * @param form Form to be submitted
+ * @return Object of given class received as response
+ */
+ protected Object putRequest(String subResourceName, Class responseClass, Form form) {
+ return resource.path(subResourceName).type(MediaType.APPLICATION_FORM_URLENCODED_TYPE)
+ .header("Authorization", authHeader).accept(MediaType.TEXT_XML).put(responseClass, form);
+ }
+
+ /**
+ * Submits given object to the resource and returns the object received as response
+ * @param responseClass Class of the object expected as response
+ * @param requestObject the Object to be submitted
+ * @return Object of given class received as response
+ */
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected Object postObject(Class responseClass, Object requestObject) {
+ return resource.type(MediaType.TEXT_XML).header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.TEXT_XML)
+ .post(responseClass, requestObject);
+ }
+
+ public abstract String getResourceName();
+
+ /**
+ * @return the securityToken
+ */
+ protected String getSecurityToken() {
+ return securityToken;
+ }
+
+ /**
+ * @param securityToken the securityToken to set
+ */
+ protected void setSecurityToken(String securityToken) {
+ this.securityToken = securityToken;
+ authHeader = "Basic " + securityToken;
+ }
+}
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java new file mode 100644 index 00000000..0cc18037 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * 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.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"; + + public DiscoveredServersClient(String serverName, String securityToken) { + super(securityToken); + } + + @Override + public String getResourceName() { + return RESOURCE_NAME; + } + + private Object getDiscoveredServers(Boolean getDetails, Class responseClass) { + MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); + queryParams.putSingle("details", getDetails.toString()); + + 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); + } + + @SuppressWarnings("unchecked") + public Server getServer(String serverName) { + GenericResponse<Server> response = (GenericResponse<Server>) fetchSubResource(serverName, GenericResponse.class); + return response.getData(); + } + + public static void main(String[] args) { + UsersClient usersClient = new UsersClient(); + if (usersClient.authenticate("gluster", "gluster")) { + DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", + usersClient.getSecurityToken()); + 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/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java new file mode 100644 index 00000000..de0112db --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -0,0 +1,344 @@ +/******************************************************************************* + * 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.Disk.DISK_STATUS; +import com.gluster.storage.management.core.model.Event.EVENT_TYPE; +import com.gluster.storage.management.core.model.Entity; +import com.gluster.storage.management.core.model.Event; +import com.gluster.storage.management.core.model.GlusterDataModel; +import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; +import com.gluster.storage.management.core.model.ClusterListener; +import com.gluster.storage.management.core.model.LogMessage; +import com.gluster.storage.management.core.model.NetworkInterface; +import com.gluster.storage.management.core.model.RunningTask; +import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.model.RunningTaskStatus; +import com.gluster.storage.management.core.model.Volume; +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 String securityToken; + private String serverName; + private List<ClusterListener> listeners = new ArrayList<ClusterListener>(); + + private GlusterDataModelManager() { + } + + public String getSecurityToken() { + return securityToken; + } + + public void setSecurityToken(String securityToken) { + this.securityToken = securityToken; + } + + public GlusterDataModel getModel() { + return model; + } + + public static GlusterDataModelManager getInstance() { + return instance; + } + + // Renamed preferredInterfaceName to interfaceName + private GlusterServer addGlusterServer(List<GlusterServer> servers, Entity parent, String name, + SERVER_STATUS status, String interfaceName, int numOfCPUs, double cpuUsage, double totalMemory, + double memoryInUse) { + GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory, + memoryInUse); + NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed preferredInterfaceName to interfaceName + // 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); + } + + public void initializeModel(String securityToken) { + setSecurityToken(securityToken); + + // Create the dummy data model for demo + model = new GlusterDataModel("Clusters"); + Cluster cluster = new Cluster("Home", model); + + initializeGlusterServers(cluster); + initializeVolumes(cluster); + initializeAutoDiscoveredServers(cluster); + initializeDisks(); + addDisksToVolumes(); + addVolumeOptions(); + + createDummyLogMessages(); + + initializeRunningTasks(cluster); + + model.addCluster(cluster); + } + + 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); + } + } + } + + public 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) { + cluster.setServers(new GlusterServersClient(securityToken).getServers()); + } + + private void initializeAutoDiscoveredServers(Cluster cluster) { + cluster.setAutoDiscoveredServers(new DiscoveredServersClient(serverName, securityToken) + .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 void initializeRunningTasks(Cluster cluster) { + cluster.setRunningTasks(new RunningTaskClient(securityToken).getRunningTasks()); + } + + 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; + } + + public void addClusterListener(ClusterListener listener) { + listeners.add(listener); + } + + public void removeClusterListener(ClusterListener listener) { + listeners.remove(listener); + } + + public void addGlusterServer(GlusterServer server) { + Cluster cluster = (Cluster)model.getChildren().get(0); + cluster.addServer(server); + + for(ClusterListener listener : listeners) { + listener.serverAdded(server); + } + } + + public void removeDiscoveredServer(Server server) { + Cluster cluster = (Cluster)model.getChildren().get(0); + cluster.removeDiscoveredServer(server); + + for(ClusterListener listener : listeners) { + listener.discoveredServerRemoved(server); + } + } + + public void updateVolumeStatus(Volume volume, VOLUME_STATUS newStatus) { + volume.setStatus(newStatus); + for(ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus)); + } + } + + public void addVolume(Volume volume) { + Cluster cluster = (Cluster)model.getChildren().get(0); + cluster.addVolume(volume); + + for(ClusterListener listener : listeners) { + listener.volumeCreated(volume); + } + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java new file mode 100644 index 00000000..25fe3bbc --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -0,0 +1,83 @@ +/******************************************************************************* + * 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.List; + +import com.gluster.storage.management.core.model.GenericResponse; +import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.GlusterServerListResponse; +import com.gluster.storage.management.core.model.GlusterServerResponse; +import com.gluster.storage.management.core.model.Response; +import com.gluster.storage.management.core.model.Server; +import com.sun.jersey.api.representation.Form; + +public class GlusterServersClient extends AbstractClient { + private static final String RESOURCE_NAME = "/cluster/servers"; + + public GlusterServersClient(String securityToken) { + super(securityToken); + } + + @Override + public String getResourceName() { + return RESOURCE_NAME; + } + + public List<GlusterServer> getServers() { + GlusterServerListResponse response = (GlusterServerListResponse) fetchResource(GlusterServerListResponse.class); + return response.getServers(); + } + + @SuppressWarnings("unchecked") + public Server getServer(String serverName) { + GenericResponse<Server> response = (GenericResponse<Server>) fetchSubResource(serverName, GenericResponse.class); + return response.getData(); + } + + public String getServerXML(String serverName) { + return ((String) fetchSubResource(serverName, String.class)); + } + + public GlusterServerResponse addServer(Server discoveredServer) { + Form form = new Form(); + form.add("serverName", discoveredServer.getName()); + return (GlusterServerResponse)postRequest(GlusterServerResponse.class, form); + } + + public static void main(String[] args) { + UsersClient usersClient = new UsersClient(); + if (usersClient.authenticate("gluster", "gluster")) { + + GlusterServersClient serverResource = new GlusterServersClient(usersClient.getSecurityToken()); + List<GlusterServer> glusterServers = serverResource.getServers(); + for (GlusterServer server : glusterServers) { + System.out.println(server.getName()); + } + + // Add server + Server srv = new Server(); + srv.setName("server3"); + GlusterServerResponse response = serverResource.addServer(srv); + System.out.println(response.getGlusterServer().getName()); + System.out.println(response.getStatus().isSuccess()); + + } + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RESTClientTest.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RESTClientTest.java new file mode 100644 index 00000000..05e1e094 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RESTClientTest.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * 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.net.URI; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriBuilder; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.client.config.DefaultClientConfig; + +public class RESTClientTest { + public static void main(String args[]) { + WebResource service = Client.create(new DefaultClientConfig()).resource(getBaseURI()); + String name = service.path("services").path("name").accept(MediaType.TEXT_PLAIN).get(String.class); + System.out.println(name); + name = service.path("services").path("name/xml").accept(MediaType.TEXT_XML).get(String.class); + System.out.println(name); + } + + private static URI getBaseURI() { + return UriBuilder.fromUri("http://localhost:8080/glustermc").build(); + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java new file mode 100644 index 00000000..9309cdc8 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java @@ -0,0 +1,31 @@ +package com.gluster.storage.management.client; + +import java.util.List; + +import com.gluster.storage.management.core.constants.RESTConstants; +import com.gluster.storage.management.core.model.Response; +import com.gluster.storage.management.core.model.RunningTask; +import com.gluster.storage.management.core.model.RunningTaskListResponse; + +public class RunningTaskClient extends AbstractClient { + private static final String RESOURCE_NAME = RESTConstants.RESOURCE_PATH_RUNNING_TASKS; + + public RunningTaskClient(String securityToken) { + super(securityToken); + } + + @Override + public String getResourceName() { + return RESOURCE_NAME; + } + + @SuppressWarnings("rawtypes") + private Object fetchRunningTasks(Class responseClass) { + return fetchResource( responseClass ); + } + + public List<RunningTask> getRunningTasks() { + RunningTaskListResponse response = (RunningTaskListResponse) fetchRunningTasks( RunningTaskListResponse.class ); + return response.getRunningTasks(); + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java new file mode 100644 index 00000000..8d7a52fc --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * 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 com.gluster.storage.management.core.model.Status; +import com.sun.jersey.api.representation.Form; +import com.sun.jersey.core.util.Base64; + +public class UsersClient extends AbstractClient { + private static final String RESOURCE_NAME = "users"; + private static final String FORM_PARAM_OLD_PASSWORD = "oldpassword"; + private static final String FORM_PARAM_NEW_PASSWORD = "newpassword"; + + private String generateSecurityToken(String user, String password) { + return new String(Base64.encode(user + ":" + password)); + } + + public UsersClient() { + super(); + } + + public boolean authenticate(String user, String password) { + setSecurityToken(generateSecurityToken(user, password)); + try { + Status authStatus = (Status) fetchSubResource(user, Status.class); + if (authStatus.isSuccess()) { + return true; + } + } catch (Exception e) { + e.printStackTrace(); + } + + // If we reach here, it means authentication failed. Clear security token and return false. + setSecurityToken(null); + return false; + } + + public boolean changePassword(String user, String oldPassword, String newPassword) { + setSecurityToken(generateSecurityToken(user, oldPassword)); + + Form form = new Form(); + form.add(FORM_PARAM_OLD_PASSWORD, oldPassword); + form.add(FORM_PARAM_NEW_PASSWORD, newPassword); + Status status = (Status) putRequest(user, Status.class, form); + + return status.isSuccess(); + } + + public static void main(String[] args) { + UsersClient authClient = new UsersClient(); + + // authenticate user + System.out.println(authClient.authenticate("gluster", "gluster")); + + // change password to gluster1 + System.out.println(authClient.changePassword("gluster", "gluster", "gluster1")); + + // change it back to gluster + System.out.println(authClient.changePassword("gluster", "gluster1", "gluster")); + } + + /* + * (non-Javadoc) + * + * @see com.gluster.storage.management.client.AbstractClient#getResourceName() + */ + @Override + public String getResourceName() { + return RESOURCE_NAME; + } + + /* + * (non-Javadoc) + * + * @see com.gluster.storage.management.client.AbstractClient#getSecurityToken() + */ + @Override + public String getSecurityToken() { + return super.getSecurityToken(); + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java new file mode 100644 index 00000000..03e83a31 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -0,0 +1,90 @@ +/** + * VolumesClient.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.client; + +import java.util.ArrayList; +import java.util.List; + +import com.gluster.storage.management.core.constants.RESTConstants; +import com.gluster.storage.management.core.model.Disk; +import com.gluster.storage.management.core.model.Disk.DISK_STATUS; +import com.gluster.storage.management.core.model.GenericResponse; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.model.Volume; +import com.sun.jersey.api.representation.Form; + +public class VolumesClient extends AbstractClient { + + public VolumesClient(String securityToken) { + super(securityToken); + } + + @Override + public String getResourceName() { + return RESTConstants.RESOURCE_PATH_VOLUMES; + } + + @SuppressWarnings("unchecked") + public Status createVolume(Volume volume) { + GenericResponse<String> createVolumeResponse = (GenericResponse<String>) postObject(GenericResponse.class, volume); + + if (!createVolumeResponse.getStatus().isSuccess()) { + return (Status) createVolumeResponse.getStatus(); + } + return (Status) createVolumeResponse.getStatus(); + } + + private Status performOperation(String volumeName, String operation) { + Form form = new Form(); + form.add(RESTConstants.FORM_PARAM_OPERATION, operation); + + return (Status)putRequest(volumeName, Status.class, form); + } + + public Status startVolume(String volumeName) { + return performOperation(volumeName, RESTConstants.FORM_PARAM_VALUE_START); + } + + public Status stopVolume(String volumeName) { + return performOperation(volumeName, RESTConstants.FORM_PARAM_VALUE_STOP); + } + + + public static void main(String[] args) { + UsersClient usersClient = new UsersClient(); + if (usersClient.authenticate("gluster", "gluster")) { + VolumesClient VC = new VolumesClient(usersClient.getSecurityToken()); + List<Disk> disks = new ArrayList<Disk>(); + Disk diskElement = new Disk(); + diskElement.setName("sda1"); + diskElement.setStatus(DISK_STATUS.READY); + disks.add(diskElement); + diskElement.setName("sda2"); + diskElement.setStatus(DISK_STATUS.READY); + disks.add(diskElement); + + Volume vol = new Volume("vol1", null, Volume.VOLUME_TYPE.PLAIN_DISTRIBUTE, Volume.TRANSPORT_TYPE.ETHERNET, + Volume.VOLUME_STATUS.ONLINE); + // vol.setDisks(disks); + System.out.println(VC.createVolume(vol)); + } + } +} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java new file mode 100644 index 00000000..853cfe96 --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java @@ -0,0 +1,32 @@ +/** + * ClientConstants.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.client.constants; + +/** + * + */ +public class ClientConstants { + public static final String SYS_PROP_SERVER_URL = "gluster.server.url"; + public static final String DEFAULT_SERVER_URL = "http://localhost:8080/glustermc/linux.gtk.x86_64"; + public static final String WEB_CONTEXT = "glustermc"; + public static final String WEB_RESOURCE_BASE_PATH = "resources"; +} + diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java new file mode 100644 index 00000000..23d2f9fd --- /dev/null +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java @@ -0,0 +1,20 @@ +package com.gluster.storage.management.client.utils; + +import java.net.URI; + +import javax.ws.rs.core.UriBuilder; + +import com.gluster.storage.management.client.constants.ClientConstants; + +public class ClientUtil { + + public URI getServerBaseURI() { + return UriBuilder.fromUri(getBaseURL()).path(ClientConstants.WEB_RESOURCE_BASE_PATH).build(); + } + + private String getBaseURL() { + // remove the platform path (e.g. /linux.gtk.x86_64) from the URL + return System.getProperty(ClientConstants.SYS_PROP_SERVER_URL, ClientConstants.DEFAULT_SERVER_URL) + .replaceAll("glustermc\\/.*", "glustermc\\/"); + } +} |
