summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java37
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java12
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java89
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java16
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java107
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java27
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java18
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java2
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java45
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java31
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/ConnectionException.java37
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java14
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java177
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java (renamed from src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java)53
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java (renamed from src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java)3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java146
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java136
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java60
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java117
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java265
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java73
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java270
-rw-r--r--src/com.gluster.storage.management.server/.settings/org.eclipse.wst.common.component1
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/antlr-2.7.6.jarbin0 -> 443432 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/commons-collections-3.1.jarbin0 -> 559366 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/dom4j-1.6.1.jarbin0 -> 313898 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.0.Final.jarbin0 -> 100884 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate3.jarbin0 -> 4133342 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/javassist-3.12.0.GA.jarbin0 -> 633312 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/jta-1.1.jarbin0 -> 10899 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/log4j-1.2.16.jarbin0 -> 481534 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/slf4j-api-1.6.1.jarbin0 -> 25496 bytes
-rw-r--r--src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/0-version.sql2
-rw-r--r--src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/1-security-schema.sql (renamed from src/com.gluster.storage.management.server/src/data/scripts/security-schema.sql)0
-rw-r--r--src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/2-users-authorities-groups.sql (renamed from src/com.gluster.storage.management.server/src/data/scripts/users-authorities-groups.sql)0
-rw-r--r--src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/3-cluster-servers.sql16
-rw-r--r--src/com.gluster.storage.management.server/WebContent/scripts/Common.py34
-rw-r--r--src/com.gluster.storage.management.server/WebContent/scripts/Globals.py3
-rwxr-xr-xsrc/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py83
-rw-r--r--src/com.gluster.storage.management.server/src/META-INF/persistence.xml5
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java74
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java108
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java65
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java13
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java4
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java112
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java143
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java4
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java101
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java97
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java19
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java29
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java21
-rw-r--r--src/com.gluster.storage.management.server/src/log4j.properties12
-rw-r--r--src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml71
61 files changed, 1282 insertions, 1483 deletions
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
index d532c754..10064341 100644
--- 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
@@ -21,18 +21,29 @@ public abstract class AbstractClient {
private static final String HTTP_HEADER_AUTH = "Authorization";
protected static final MultivaluedMap<String, String> NO_PARAMS = new MultivaluedMapImpl();
+ protected String clusterName;
protected WebResource resource;
private String securityToken;
private String authHeader;
public AbstractClient() {
+ createResource();
+ }
+
+ private void createResource() {
URI baseURI = new ClientUtil().getServerBaseURI();
- resource = Client.create(new DefaultClientConfig()).resource(baseURI).path(getResourceName());
+ resource = Client.create(new DefaultClientConfig()).resource(baseURI).path(getResourcePath());
}
- public AbstractClient(String securityToken) {
- this();
+ public AbstractClient(String securityToken, String clusterName) {
+ this.clusterName = clusterName;
setSecurityToken(securityToken);
+ // this must be after setting clusterName as sub-classes may refer to cluster name in the getResourcePath method
+ createResource();
+ }
+
+ public AbstractClient(String clusterName) {
+ this(GlusterDataModelManager.getInstance().getSecurityToken(), clusterName);
}
/**
@@ -56,15 +67,15 @@ public abstract class AbstractClient {
ClientResponse response = res.header(HTTP_HEADER_AUTH, authHeader).accept(MediaType.APPLICATION_OCTET_STREAM)
.get(ClientResponse.class);
try {
- if(!response.hasEntity()) {
+ if (!response.hasEntity()) {
throw new GlusterRuntimeException("No entity in response!");
}
-
+
InputStream inputStream = response.getEntityInputStream();
byte[] data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
-
+
FileOutputStream os = new FileOutputStream(filePath);
os.write(data);
os.close();
@@ -74,7 +85,7 @@ public abstract class AbstractClient {
}
/**
- * Fetches the default resource (the one returned by {@link AbstractClient#getResourceName()}) by dispatching a GET
+ * Fetches the default resource (the one returned by {@link AbstractClient#getResourcePath()}) by dispatching a GET
* request on the resource
*
* @param queryParams
@@ -89,7 +100,7 @@ public abstract class AbstractClient {
}
/**
- * Fetches the default resource (the one returned by {@link AbstractClient#getResourceName()}) by dispatching a GET
+ * Fetches the default resource (the one returned by {@link AbstractClient#getResourcePath()}) by dispatching a GET
* request on the resource
*
* @param responseClass
@@ -104,7 +115,7 @@ public abstract class AbstractClient {
/**
* Fetches the resource whose name is arrived at by appending the "subResourceName" parameter to the default
- * resource (the one returned by {@link AbstractClient#getResourceName()})
+ * resource (the one returned by {@link AbstractClient#getResourcePath()})
*
* @param subResourceName
* Name of the sub-resource
@@ -123,7 +134,7 @@ public abstract class AbstractClient {
/**
* Fetches the resource whose name is arrived at by appending the "subResourceName" parameter to the default
- * resource (the one returned by {@link AbstractClient#getResourceName()})
+ * resource (the one returned by {@link AbstractClient#getResourcePath()})
*
* @param subResourceName
* Name of the sub-resource
@@ -226,10 +237,14 @@ public abstract class AbstractClient {
MultivaluedMap<String, String> queryParams) {
return resource.path(subResourceName).queryParams(queryParams).header(HTTP_HEADER_AUTH, authHeader)
.delete(responseClass);
+ }
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected Object deleteSubResource(String subResourceName, Class responseClass) {
+ return resource.path(subResourceName).header(HTTP_HEADER_AUTH, authHeader).delete(responseClass);
}
- public abstract String getResourceName();
+ public abstract String getResourcePath();
/**
* @return the securityToken
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java
index 6adf198b..37aca4cd 100644
--- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java
@@ -8,13 +8,17 @@ import com.gluster.storage.management.core.model.AlertListResponse;
public class AlertsClient extends AbstractClient {
- public AlertsClient(String securityToken) {
- super(securityToken);
+ public AlertsClient(String clusterName) {
+ super(clusterName);
+ }
+
+ public AlertsClient(String securityToken,String clusterName) {
+ super(securityToken, clusterName);
}
@Override
- public String getResourceName() {
- return RESTConstants.RESOURCE_PATH_ALERTS;
+ public String getResourcePath() {
+ return RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESTConstants.RESOURCE_ALERTS;
}
@SuppressWarnings("rawtypes")
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java
new file mode 100644
index 00000000..08c380e0
--- /dev/null
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/ClustersClient.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * 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 static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_CLUSTER_NAME;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
+
+import java.util.List;
+
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.response.StringListResponse;
+import com.sun.jersey.api.representation.Form;
+
+/**
+ *
+ */
+public class ClustersClient extends AbstractClient {
+ public ClustersClient() {
+ super();
+ }
+
+ public ClustersClient(String securityToken) {
+ super();
+ setSecurityToken(securityToken);
+ }
+
+ /* (non-Javadoc)
+ * @see com.gluster.storage.management.client.AbstractClient#getResourcePath()
+ */
+ @Override
+ public String getResourcePath() {
+ return RESOURCE_PATH_CLUSTERS;
+ }
+
+ public StringListResponse getClusters() {
+ return (StringListResponse)fetchResource(StringListResponse.class);
+ }
+
+ public Status createCluster(String clusterName) {
+ Form form = new Form();
+ form.add(FORM_PARAM_CLUSTER_NAME, clusterName);
+ return (Status)postRequest(Status.class, form);
+ }
+
+ public Status deleteCluster(String clusterName) {
+ return (Status)deleteSubResource(clusterName, Status.class);
+ }
+
+ public static void main(String args[]) {
+ UsersClient usersClient = new UsersClient();
+ Status authStatus = usersClient.authenticate("gluster", "gluster");
+ if (authStatus.isSuccess()) {
+ ClustersClient client = new ClustersClient();
+ client.setSecurityToken(usersClient.getSecurityToken());
+ StringListResponse response = client.getClusters();
+ List<String> clusters = response.getData();
+ if(clusters.size() == 0) {
+ Status status = client.createCluster("myCluster1");
+ System.out.println(status);
+ }
+ response = client.getClusters();
+ clusters = response.getData();
+ System.out.println(clusters);
+
+ System.out.println(client.deleteCluster("myCluster1"));
+ response = client.getClusters();
+ clusters = response.getData();
+ System.out.println(clusters);
+ } else {
+ System.out.println("authentication failed: " + authStatus);
+ }
+ }
+}
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
index a1dad796..e055a2dd 100644
--- 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
@@ -24,18 +24,22 @@ import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.response.GenericResponse;
import com.gluster.storage.management.core.response.ServerListResponse;
import com.gluster.storage.management.core.response.StringListResponse;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_DISCOVERED_SERVERS;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class DiscoveredServersClient extends AbstractClient {
- private static final String RESOURCE_NAME = "discoveredservers";
-
- public DiscoveredServersClient(String securityToken) {
- super(securityToken);
+
+ public DiscoveredServersClient(String clusterName) {
+ super(clusterName);
+ }
+
+ public DiscoveredServersClient(String securityToken, String clusterName) {
+ super(securityToken, clusterName);
}
@Override
- public String getResourceName() {
- return RESOURCE_NAME;
+ public String getResourcePath() {
+ return RESOURCE_PATH_DISCOVERED_SERVERS;
}
@SuppressWarnings("rawtypes")
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
index 873c26f6..356e1e0d 100644
--- 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
@@ -19,7 +19,6 @@
package com.gluster.storage.management.client;
import java.util.ArrayList;
-import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
@@ -32,7 +31,6 @@ import com.gluster.storage.management.core.model.Event;
import com.gluster.storage.management.core.model.Event.EVENT_TYPE;
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.Server;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
@@ -48,15 +46,12 @@ import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse
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 List<ClusterListener> listeners = new ArrayList<ClusterListener>();
private List<VolumeOptionInfo> volumeOptionsDefaults;
+ private String clusterName;
private GlusterDataModelManager() {
}
@@ -69,6 +64,14 @@ public class GlusterDataModelManager {
this.securityToken = securityToken;
}
+ public void setClusterName(String clusterName) {
+ this.clusterName = clusterName;
+ }
+
+ public String getClusterName() {
+ return clusterName;
+ }
+
public GlusterDataModel getModel() {
return model;
}
@@ -76,20 +79,38 @@ public class GlusterDataModelManager {
public static GlusterDataModelManager getInstance() {
return instance;
}
+
+ public void initializeModelWithNewCluster(String securityToken, String clusterName) {
+ model = new GlusterDataModel("Gluster Data Model");
+ setSecurityToken(securityToken);
+
+ Cluster cluster = new Cluster(clusterName, model);
+
+ cluster.setServers(new ArrayList<GlusterServer>());
+ cluster.setVolumes(new ArrayList<Volume>());
+
+ initializeAutoDiscoveredServers(cluster);
+ // initializeDisks();
+
+ initializeRunningTasks(cluster);
+ initializeAlerts(cluster);
+
+ model.addCluster(cluster);
+ }
- public void initializeModel(String securityToken, String knownServer) {
+ public void initializeModel(String securityToken, String clusterName) {
model = new GlusterDataModel("Gluster Data Model");
setSecurityToken(securityToken);
- Cluster cluster = new Cluster("Home", model);
+ setClusterName(clusterName);
+
+ Cluster cluster = new Cluster(clusterName, model);
- initializeGlusterServers(cluster, knownServer);
+ initializeGlusterServers(cluster);
initializeVolumes(cluster);
initializeAutoDiscoveredServers(cluster);
// initializeDisks();
- createDummyLogMessages(cluster);
-
initializeRunningTasks(cluster);
initializeAlerts(cluster);
initializeVolumeOptionsDefaults();
@@ -97,9 +118,9 @@ public class GlusterDataModelManager {
model.addCluster(cluster);
}
- private void initializeGlusterServers(Cluster cluster, String knownServer) {
- GlusterServerListResponse glusterServerListResponse = new GlusterServersClient(securityToken)
- .getServers(knownServer);
+ private void initializeGlusterServers(Cluster cluster) {
+ GlusterServerListResponse glusterServerListResponse = new GlusterServersClient(clusterName)
+ .getServers();
if (!glusterServerListResponse.getStatus().isSuccess()) {
throw new GlusterRuntimeException(glusterServerListResponse.getStatus().getMessage());
}
@@ -125,7 +146,7 @@ public class GlusterDataModelManager {
}
private void initializeVolumeOptionsDefaults() {
- VolumeOptionInfoListResponse response = new VolumesClient(getSecurityToken()).getVolumeOptionsDefaults();
+ VolumeOptionInfoListResponse response = new VolumesClient(clusterName).getVolumeOptionsDefaults();
if (!response.getStatus().isSuccess()) {
throw new GlusterRuntimeException("Error fetching volume option defaults: ["
+ response.getStatus().getMessage() + "]");
@@ -134,7 +155,7 @@ public class GlusterDataModelManager {
}
public void initializeRunningTasks(Cluster cluster) {
- RunningTaskListResponse runningTaskResponse = new RunningTaskClient(securityToken).getRunningTasks();
+ RunningTaskListResponse runningTaskResponse = new RunningTaskClient(cluster.getName()).getRunningTasks();
if (!runningTaskResponse.getStatus().isSuccess()) {
throw new GlusterRuntimeException(runningTaskResponse.getStatus().getMessage());
}
@@ -142,17 +163,7 @@ public class GlusterDataModelManager {
}
public void initializeAlerts(Cluster cluster) {
- cluster.setAlerts(new AlertsClient(securityToken).getAllAlerts());
- }
-
- 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);
- }
- }
+ cluster.setAlerts(new AlertsClient(cluster.getName()).getAllAlerts());
}
public Volume addVolume(List<Volume> volumes, String name, Cluster cluster, VOLUME_TYPE volumeType,
@@ -163,47 +174,6 @@ public class GlusterDataModelManager {
return volume;
}
- 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.getQualifiedName(), 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);
- }
-
- private List<Disk> getAllDisks(Cluster cluster) {
- List<Disk> disks = new ArrayList<Disk>();
- for (GlusterServer server : cluster.getServers()) {
- disks.addAll(server.getDisks());
- }
- return disks;
- }
- public List<LogMessage> createDummyLogMessages(Cluster cluster) {
- for(Disk disk: getAllDisks(cluster)) {
- addMessagesForDisk(logMessages, disk);
- }
-
- // 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;
- }
-
/**
* @param serverPartition
* Qualified name of the disk to be returned (serverName:diskName)
@@ -398,6 +368,7 @@ public class GlusterDataModelManager {
return null;
}
+ @SuppressWarnings({ "rawtypes", "unchecked" })
private Entry<String, String> getOptionEntry(Volume volume, String optionKey) {
for (Entry entry : volume.getOptions().entrySet()) {
if (entry.getKey().equals(optionKey)) {
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
index 8368ceea..3d1720ec 100644
--- 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
@@ -23,6 +23,7 @@ import java.util.List;
import javax.ws.rs.core.MultivaluedMap;
import com.gluster.storage.management.core.constants.RESTConstants;
+import static com.gluster.storage.management.core.constants.RESTConstants.*;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.Status;
@@ -33,22 +34,21 @@ import com.sun.jersey.api.representation.Form;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class GlusterServersClient extends AbstractClient {
- private static final String RESOURCE_NAME = "/cluster/servers";
-
- public GlusterServersClient(String securityToken) {
- super(securityToken);
+ public GlusterServersClient(String clusterName) {
+ super(clusterName);
+ }
+
+ public GlusterServersClient(String securityToken, String clusterName) {
+ super(securityToken, clusterName);
}
@Override
- public String getResourceName() {
- return RESOURCE_NAME;
+ public String getResourcePath() {
+ return RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_SERVERS;
}
- public GlusterServerListResponse getServers(String knownServer) {
- MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
- queryParams.add(RESTConstants.QUERY_PARAM_KNOWN_SERVER, knownServer);
- GlusterServerListResponse response = (GlusterServerListResponse) fetchResource(queryParams, GlusterServerListResponse.class);
- return response; //.getServers();
+ public GlusterServerListResponse getServers() {
+ return (GlusterServerListResponse) fetchResource(GlusterServerListResponse.class);
}
@SuppressWarnings("unchecked")
@@ -76,9 +76,8 @@ public class GlusterServersClient extends AbstractClient {
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
if (usersClient.authenticate("gluster", "gluster").isSuccess()) {
-
- GlusterServersClient glusterServersClient = new GlusterServersClient(usersClient.getSecurityToken());
- List<GlusterServer> glusterServers = glusterServersClient.getServers("127.0.0.1").getData();
+ GlusterServersClient glusterServersClient = new GlusterServersClient(usersClient.getSecurityToken(), "cluster1");
+ List<GlusterServer> glusterServers = glusterServersClient.getServers().getData();
for (GlusterServer server : glusterServers) {
System.out.println(server.getName());
}
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
index f9c26eb0..cfeddcc2 100644
--- 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
@@ -1,21 +1,23 @@
package com.gluster.storage.management.client;
-import java.util.List;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_RUNNING_TASKS;
-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.response.RunningTaskListResponse;
public class RunningTaskClient extends AbstractClient {
- public RunningTaskClient(String securityToken) {
- super(securityToken);
+ public RunningTaskClient(String clusterName) {
+ super(clusterName);
+ }
+
+ public RunningTaskClient(String securityToken, String clusterName) {
+ super(securityToken, clusterName);
}
@Override
- public String getResourceName() {
- return RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
+ public String getResourcePath() {
+ return RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_RUNNING_TASKS;
}
public RunningTaskListResponse 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
index 0f2b5f86..099b64a0 100644
--- 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
@@ -89,7 +89,7 @@ public class UsersClient extends AbstractClient {
* @see com.gluster.storage.management.client.AbstractClient#getResourceName()
*/
@Override
- public String getResourceName() {
+ public String getResourcePath() {
return RESOURCE_NAME;
}
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
index 0555e322..96517766 100644
--- 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
@@ -41,13 +41,17 @@ import com.sun.jersey.api.representation.Form;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class VolumesClient extends AbstractClient {
- public VolumesClient(String securityToken) {
- super(securityToken);
+ public VolumesClient(String clusterName) {
+ super(clusterName);
+ }
+
+ public VolumesClient(String securityToken, String clusterName) {
+ super(securityToken, clusterName);
}
@Override
- public String getResourceName() {
- return RESTConstants.RESOURCE_PATH_VOLUMES;
+ public String getResourcePath() {
+ return RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESTConstants.RESOURCE_VOLUMES;
}
public Status createVolume(Volume volume) {
@@ -73,11 +77,11 @@ public class VolumesClient extends AbstractClient {
Form form = new Form();
form.add(RESTConstants.FORM_PARAM_OPTION_KEY, key);
form.add(RESTConstants.FORM_PARAM_OPTION_VALUE, value);
- return (Status) postRequest(volume + "/" + RESTConstants.SUBRESOURCE_OPTIONS, Status.class, form);
+ return (Status) postRequest(volume + "/" + RESTConstants.RESOURCE_OPTIONS, Status.class, form);
}
public Status resetVolumeOptions(String volume) {
- return (Status) putRequest(volume + "/" + RESTConstants.SUBRESOURCE_OPTIONS, Status.class);
+ return (Status) putRequest(volume + "/" + RESTConstants.RESOURCE_OPTIONS, Status.class);
}
public VolumeListResponse getAllVolumes() {
@@ -94,7 +98,7 @@ public class VolumesClient extends AbstractClient {
}
public VolumeOptionInfoListResponse getVolumeOptionsDefaults() {
- return ((VolumeOptionInfoListResponse) fetchSubResource(RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS,
+ return ((VolumeOptionInfoListResponse) fetchSubResource(RESTConstants.RESOURCE_DEFAULT_OPTIONS,
VolumeOptionInfoListResponse.class));
}
@@ -102,7 +106,7 @@ public class VolumesClient extends AbstractClient {
String bricks = StringUtil.ListToString(brickList, ",");
Form form = new Form();
form.add(RESTConstants.FORM_PARAM_BRICKS, bricks);
- return (Status) postRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+ return (Status) postRequest(volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, form);
}
/**
@@ -129,21 +133,20 @@ public class VolumesClient extends AbstractClient {
MultivaluedMap<String, String> queryParams = prepareGetLogQueryParams(diskName, severity, fromTimestamp,
toTimestamp, messageCount);
- return (LogMessageListResponse) fetchSubResource(volumeName + "/" + RESTConstants.SUBRESOURCE_LOGS,
+ return (LogMessageListResponse) fetchSubResource(volumeName + "/" + RESTConstants.RESOURCE_LOGS,
queryParams, LogMessageListResponse.class);
}
public void downloadLogs(String volumeName, String filePath) {
- downloadSubResource((volumeName) + "/" + RESTConstants.SUBRESOURCE_LOGS + "/"
- + RESTConstants.SUBRESOURCE_DOWNLOAD, filePath);
+ downloadSubResource((volumeName) + "/" + RESTConstants.RESOURCE_LOGS + "/" + RESTConstants.RESOURCE_DOWNLOAD, filePath);
}
public Status removeBricks(String volumeName, List<Brick> BrickList, boolean deleteOption) {
String bricks = StringUtil.ListToString(GlusterCoreUtil.getQualifiedBrickList(BrickList), ",");
MultivaluedMap<String, String> queryParams = prepareRemoveBrickQueryParams(volumeName, bricks, deleteOption);
- return (Status) deleteSubResource(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, queryParams);
+ return (Status) deleteSubResource(volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, queryParams);
}
-
+
private MultivaluedMap<String, String> prepareRemoveBrickQueryParams(String volumeName, String bricks,
boolean deleteOption) {
MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
@@ -189,8 +192,8 @@ public class VolumesClient extends AbstractClient {
form.add(RESTConstants.FORM_PARAM_SOURCE, brickFrom);
form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_START);
-
- return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, form);
}
public Status stopMigration(String volumeName, String brickFrom, String brickkTo) {
@@ -198,8 +201,8 @@ public class VolumesClient extends AbstractClient {
form.add(RESTConstants.FORM_PARAM_SOURCE, brickFrom);
form.add(RESTConstants.FORM_PARAM_TARGET, brickkTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STOP);
-
- return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, form);
}
public Status pauseMigration(String volumeName, String brickFrom, String brickTo) {
@@ -207,8 +210,8 @@ public class VolumesClient extends AbstractClient {
form.add(RESTConstants.FORM_PARAM_SOURCE, brickFrom);
form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_PAUSE);
-
- return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, form);
}
public Status statusMigration(String volumeName, String brickFrom, String brickTo) {
@@ -216,8 +219,8 @@ public class VolumesClient extends AbstractClient {
form.add(RESTConstants.FORM_PARAM_SOURCE, brickFrom);
form.add(RESTConstants.FORM_PARAM_TARGET, brickTo);
form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.FORM_PARAM_VALUE_STATUS);
-
- return (Status) putRequest(volumeName + "/" + RESTConstants.SUBRESOURCE_DISKS, Status.class, form);
+
+ return (Status) putRequest( volumeName + "/" + RESTConstants.RESOURCE_DISKS, Status.class, form);
}
public static void main(String[] args) {
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
index 1b70b84d..80622992 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java
@@ -24,15 +24,22 @@ package com.gluster.storage.management.core.constants;
* All constants related to the Gluster REST server and client
*/
public class RESTConstants {
- // Volumes Resource
- public static final String RESOURCE_PATH_VOLUMES = "/cluster/volumes";
- public static final String SUBRESOURCE_DEFAULT_OPTIONS = "defaultoptions";
- public static final String SUBRESOURCE_OPTIONS = "options";
- public static final String SUBRESOURCE_LOGS = "logs";
- public static final String SUBRESOURCE_DOWNLOAD = "download";
- public static final String SUBRESOURCE_DISKS = "disks";
-
+ // REST Resource paths
+ public static final String RESOURCE_PATH_CLUSTERS = "/clusters";
+ public static final String RESOURCE_PATH_DISCOVERED_SERVERS = "/discoveredservers";
+ // REST Resource names
+ public static final String RESOURCE_VOLUMES = "volumes";
+ public static final String RESOURCE_DEFAULT_OPTIONS = "defaultoptions";
+ public static final String RESOURCE_OPTIONS = "options";
+ public static final String RESOURCE_LOGS = "logs";
+ public static final String RESOURCE_DOWNLOAD = "download";
+ public static final String RESOURCE_DISKS = "disks";
+ public static final String RESOURCE_RUNNING_TASKS = "runningtasks";
+ public static final String RESOURCE_ALERTS = "alerts";
+ public static final String RESOURCE_SERVERS = "servers";
+
+ public static final String FORM_PARAM_CLUSTER_NAME = "clusterName";
public static final String FORM_PARAM_DISKS = "disks";
public static final String FORM_PARAM_OPERATION = "operation";
public static final String FORM_PARAM_VALUE_START = "start";
@@ -46,7 +53,8 @@ public class RESTConstants {
public static final String FORM_PARAM_BRICKS = "bricks";
public static final String PATH_PARAM_VOLUME_NAME = "volumeName";
- public static final String FORM_PARAM_DELETE_OPTION = "value";
+ public static final String PATH_PARAM_CLUSTER_NAME = "clusterName";
+ public static final String PATH_PARAM_SERVER_NAME = "serverName";
public static final String QUERY_PARAM_DISK_NAME = "diskName";
public static final String QUERY_PARAM_DISKS = "disks";
@@ -59,9 +67,4 @@ public class RESTConstants {
public static final String QUERY_PARAM_TO_TIMESTAMP = "toTimestamp";
public static final String QUERY_PARAM_DOWNLOAD = "download";
public static final String QUERY_PARAM_SERVER_NAME = "serverName";
- public static final String QUERY_PARAM_KNOWN_SERVER = "knownServer";
-
- // Running tasks resource
- public static final String RESOURCE_PATH_RUNNING_TASKS = "/cluster/runningtasks";
- public static final String RESOURCE_PATH_ALERTS = "/cluster/alerts";
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/ConnectionException.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/ConnectionException.java
new file mode 100644
index 00000000..ec19ffd8
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/exceptions/ConnectionException.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
+ * This file is part of Gluster Management Console.
+ *
+ * Gluster Management Console is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License as published
+ * by the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Gluster Management Console is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *******************************************************************************/
+package com.gluster.storage.management.core.exceptions;
+
+/**
+ *
+ */
+public class ConnectionException extends GlusterRuntimeException {
+
+ private static final long serialVersionUID = 1L;
+
+
+ public ConnectionException(String message) {
+ super(message);
+ }
+
+ public ConnectionException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java
index f94884b9..785c6efb 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java
@@ -25,6 +25,8 @@ import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
+import com.gluster.storage.management.core.model.Status;
+
@XmlRootElement(name = "response")
public class StringListResponse extends AbstractResponse {
private List<String> data = new ArrayList<String>();
@@ -34,6 +36,7 @@ public class StringListResponse extends AbstractResponse {
public StringListResponse(List<String> data) {
this.data = data;
+ setStatus(Status.STATUS_SUCCESS);
}
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
index 47f2cfd9..0e269c3a 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java
@@ -34,7 +34,7 @@ import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.PlatformUI;
import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.gui.login.LoginDialog;
+import com.gluster.storage.management.gui.dialogs.LoginDialog;
/**
* This class controls all aspects of the application's execution
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java
index 78f703ea..4f303ff4 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java
@@ -21,7 +21,7 @@ package com.gluster.storage.management.gui;
import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.model.NetworkInterface;
-import com.gluster.storage.management.gui.views.details.tabcreators.GlusterServerTabCreator.NETWORK_INTERFACE_TABLE_COLUMN_INDICES;
+import com.gluster.storage.management.gui.views.GlusterServerSummaryView.NETWORK_INTERFACE_TABLE_COLUMN_INDICES;
public class NetworkInterfaceTableLabelProvider extends TableLabelProviderAdapter {
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
index 7f06bc96..1b412617 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
@@ -19,8 +19,11 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.core.model.EntityGroup;
@@ -36,7 +39,16 @@ public class CreateVolumeAction extends AbstractActionDelegate {
public void run() {
CreateVolumeWizard wizard = new CreateVolumeWizard();
- WizardDialog dialog = new WizardDialog(getShell(), wizard);
+ WizardDialog dialog = new WizardDialog(getShell(), wizard) {
+ @Override
+ protected Button createButton(Composite parent, int id, String label, boolean defaultButton) {
+ Button button = super.createButton(parent, id, label, defaultButton);
+ if(id == IDialogConstants.FINISH_ID) {
+ button.setText("&Create");
+ }
+ return button;
+ }
+ };
dialog.create();
dialog.getShell().setSize(500, 550);
dialog.open();
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java
new file mode 100644
index 00000000..7bc6eb58
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * 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.gui.dialogs;
+
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.fieldassist.ControlDecoration;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+
+import com.gluster.storage.management.gui.IImageKeys;
+import com.gluster.storage.management.gui.utils.GUIHelper;
+
+/**
+ * Cluster selection dialog, which prompts for the cluster name to be managed
+ */
+public class ClusterSelectionDialog extends Dialog {
+ private Combo clusterNameCombo = null;
+ private Button okButton;
+
+ private final GUIHelper guiHelper = GUIHelper.getInstance();
+ private Composite composite;
+ private ControlDecoration errorDecoration;
+ private List<String> clusters;
+ private String clusterName;
+
+ public ClusterSelectionDialog(Shell parentShell, List<String> clusters) {
+ super(parentShell);
+ this.clusters = clusters;
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+
+ newShell.setText("Gluster Management Console - Select Cluster");
+ addEscapeListener(newShell);
+ }
+
+ private void addEscapeListener(Shell shell) {
+ shell.addTraverseListener(new TraverseListener() {
+
+ @Override
+ public void keyTraversed(TraverseEvent e) {
+ if (e.keyCode == SWT.ESC) {
+ cancelPressed();
+ }
+ }
+ });
+ }
+
+ private void createClusterNameLabel(Composite composite) {
+ Label userIdLabel = new Label(composite, SWT.NONE);
+ userIdLabel.setText("&Cluster to Manage:");
+ userIdLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false));
+ }
+
+ private void createClusterNameCombo(Composite composite) {
+ clusterNameCombo = new Combo(composite, SWT.BORDER);
+ clusterNameCombo.setItems(clusters.toArray(new String[0]));
+ clusterNameCombo.select(0);
+
+// GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false);
+// layoutData.widthHint = convertWidthInCharsToPixels(32);
+// clusterNameCombo.setLayoutData(layoutData);
+ }
+
+ private void configureDialogLayout(Composite composite) {
+ GridLayout layout = (GridLayout) composite.getLayout();
+ layout.numColumns = 2;
+ layout.marginLeft = 20;
+ layout.marginRight = 20;
+ layout.marginTop = 20;
+ layout.horizontalSpacing = 20;
+ layout.verticalSpacing = 20;
+ }
+
+ /**
+ * Overriding to make sure that the dialog is centered in screen
+ */
+ @Override
+ protected void initializeBounds() {
+ super.initializeBounds();
+
+ guiHelper.centerShellInScreen(getShell());
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE));
+ // Makes sure that child composites inherit the same background
+ parent.setBackgroundMode(SWT.INHERIT_FORCE);
+
+ composite = (Composite) super.createDialogArea(parent);
+ configureDialogLayout(composite);
+
+ createClusterNameLabel(composite);
+ createClusterNameCombo(composite);
+ createErrorDecoration();
+
+ return composite;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+
+ setupDataBinding();
+ }
+
+ private void createErrorDecoration() {
+ errorDecoration = guiHelper.createErrorDecoration(clusterNameCombo);
+ errorDecoration.setDescriptionText("Please select an existing cluster name, or enter a new one!");
+ errorDecoration.hide();
+ }
+
+ /**
+ * Sets up data binding between the text fields and the connection details object. Also attaches a "string required"
+ * validator to the "password" text field. This validator is configured to do the following on validation failure<br>
+ * <li>show an ERROR decorator</li><li>disable the "Login" button
+ */
+ private void setupDataBinding() {
+ clusterNameCombo.addModifyListener(new ModifyListener() {
+
+ @Override
+ public void modifyText(ModifyEvent e) {
+ if(clusterNameCombo.getText().trim().isEmpty()) {
+ okButton.setEnabled(false);
+ errorDecoration.show();
+ } else {
+ okButton.setEnabled(true);
+ errorDecoration.hide();
+ }
+ }
+ });
+ }
+
+ @Override
+ protected void okPressed() {
+ clusterName = clusterNameCombo.getText();
+ super.okPressed();
+ }
+
+ public String getClusterName() {
+ return clusterName;
+ }
+}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
index 7705a631..947a8747 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java
@@ -16,7 +16,10 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
-package com.gluster.storage.management.gui.login;
+package com.gluster.storage.management.gui.dialogs;
+
+import java.util.ArrayList;
+import java.util.List;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.UpdateValueStrategy;
@@ -26,6 +29,7 @@ import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
@@ -39,9 +43,13 @@ import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
+import com.gluster.storage.management.client.ClustersClient;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.UsersClient;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.ConnectionDetails;
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.response.StringListResponse;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.utils.GUIHelper;
import com.gluster.storage.management.gui.validators.StringRequiredValidator;
@@ -192,9 +200,35 @@ public class LoginDialog extends Dialog {
UsersClient usersClient = new UsersClient();
if (usersClient.authenticate(user, password).isSuccess()) {
+ close();
+ ClustersClient clustersClient = new ClustersClient(usersClient.getSecurityToken());
+ List<String> clusterNames = getClusterNames(clustersClient);
+ ClusterSelectionDialog clusterDialog = new ClusterSelectionDialog(getParentShell(),
+ clusterNames);
+ int userAction = clusterDialog.open();
+ if (userAction == Window.CANCEL) {
+ MessageDialog.openError(getShell(), "Login Cancelled",
+ "User cancelled login at cluster selection. Application will close!");
+ cancelPressed();
+ return;
+ }
try {
- GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), "127.0.0.1");
+ String clusterName = clusterDialog.getClusterName();
+ if(clusterNames.contains(clusterName)) {
+ GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(),
+ clusterName);
+ } else {
+ Status status = createCluster(clustersClient, clusterName);
+ if(!status.isSuccess()) {
+ MessageDialog.openError(getShell(), "Cluster Creation Failed!", status.toString());
+ setReturnCode(RETURN_CODE_ERROR);
+ return;
+ }
+ GlusterDataModelManager.getInstance().initializeModelWithNewCluster(usersClient.getSecurityToken(),
+ clusterName);
+ }
super.okPressed();
+
} catch (Exception e) {
setReturnCode(RETURN_CODE_ERROR);
MessageDialog.openError(getShell(), "Initialization Error", e.getMessage());
@@ -204,4 +238,19 @@ public class LoginDialog extends Dialog {
MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password");
}
}
+
+ private Status createCluster(ClustersClient clustersClient, String clusterName) {
+ return clustersClient.createCluster(clusterName);
+ }
+
+ private List<String> getClusterNames(ClustersClient clustersClient) {
+ StringListResponse clustersResponse = clustersClient.getClusters();
+ List<String> clusters = new ArrayList<String>();
+ if (clustersResponse.getStatus().isSuccess()) {
+ clusters = clustersResponse.getData();
+ } else {
+ throw new GlusterRuntimeException("Could not fetch cluster names. Error: " + clustersResponse.getStatus());
+ }
+ return clusters;
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java
index 4e3d808a..ad8e2fa3 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java
@@ -16,7 +16,7 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
-package com.gluster.storage.management.gui.views.details.tabcreators;
+package com.gluster.storage.management.gui.utils;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -57,7 +57,6 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
-import com.gluster.storage.management.gui.utils.GlusterChartPalette;
/**
*
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
index c37bcd76..efecbf7a 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java
@@ -54,7 +54,7 @@ import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.actions.IActionConstants;
import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite;
+import com.gluster.storage.management.gui.utils.PieChartViewerComposite;
/**
* @author root
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java
index 080ebace..ba9faca4 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java
@@ -34,7 +34,7 @@ import com.gluster.storage.management.core.model.EntityGroup;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite;
+import com.gluster.storage.management.gui.utils.PieChartViewerComposite;
/**
*
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java
index bc136b61..88ca96c5 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java
@@ -39,7 +39,7 @@ import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite;
+import com.gluster.storage.management.gui.utils.PieChartViewerComposite;
/**
*
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java
deleted file mode 100644
index 571afb2e..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ImageHyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.core.model.Cluster;
-import com.gluster.storage.management.core.model.Entity;
-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.Volume;
-import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-
-public class ClusterTabCreator implements TabCreator {
- private GUIHelper guiHelper = GUIHelper.getInstance();
-
- private int getVolumeCountByStatus(Cluster cluster, VOLUME_STATUS status) {
- int count = 0;
- for (Volume volume : cluster.getVolumes()) {
- if (volume.getStatus() == status) {
- count++;
- }
- }
- return count;
- }
-
- private int getServerCountByStatus(Cluster cluster, SERVER_STATUS status) {
- int count = 0;
- for (GlusterServer server : cluster.getServers()) {
- if (server.getStatus() == status) {
- count++;
- }
- }
- return count;
- }
-
- private void createVolumesSection(Cluster cluster, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Volumes", null, 1, false);
-
- // toolkit.createLabel(sectionClient, "Number of Volumes: ", SWT.NONE);
- // toolkit.createLabel(sectionClient, "12", SWT.NONE);
- //
- // toolkit.createLabel(sectionClient, "Online: ", SWT.NONE);
- // Label labelOnlineCount = toolkit.createLabel(sectionClient, "9", SWT.NONE);
- // labelOnlineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN));
- //
- // toolkit.createLabel(sectionClient, "Offline: ", SWT.NONE);
- // Label lblOfflineCount = toolkit.createLabel(sectionClient, "3", SWT.NONE);
- // lblOfflineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
-
- Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(cluster, VOLUME_STATUS.ONLINE)),
- Double.valueOf(getVolumeCountByStatus(cluster, VOLUME_STATUS.OFFLINE)) };
- createStatusChart(toolkit, section, values);
- }
-
- private void createServersSection(Cluster cluster, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Servers", null, 1, false);
-
-// toolkit.createLabel(sectionClient, "Number of Servers: ", SWT.NONE);
-// toolkit.createLabel(sectionClient, "7", SWT.NONE);
-//
-// toolkit.createLabel(sectionClient, "Online: ", SWT.NONE);
-// Label labelOnlineCount = toolkit.createLabel(sectionClient, "6", SWT.NONE);
-// labelOnlineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN));
-//
-// toolkit.createLabel(sectionClient, "Offline: ", SWT.NONE);
-// Label lblOfflineCount = toolkit.createLabel(sectionClient, "1", SWT.NONE);
-// lblOfflineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
-
- Double[] values = new Double[] { Double.valueOf(getServerCountByStatus(cluster, SERVER_STATUS.ONLINE)),
- Double.valueOf(getServerCountByStatus(cluster, SERVER_STATUS.OFFLINE)) };
-
- createStatusChart(toolkit, section, values);
- }
-
- private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) {
- String[] categories = new String[] { "Online", "Offline" };
- PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories, values);
-
- GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
- data.widthHint = 250;
- data.heightHint = 250;
- chartViewerComposite.setLayoutData(data);
- }
-
- private void createActionsSection(final Cluster cluster, final FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Actions", null, 1, false);
-
- ImageHyperlink imageHyperlink = toolkit.createImageHyperlink(section, SWT.NONE);
- imageHyperlink.setText("Create Volume");
- imageHyperlink.setImage(guiHelper.getImage(IImageKeys.CREATE_VOLUME_BIG));
- imageHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
- // TODO: Override appropriate method and handle hyperlink event
- });
-
- imageHyperlink = toolkit.createImageHyperlink(section, SWT.NONE);
- imageHyperlink.setText("Add Server(s)");
- imageHyperlink.setImage(guiHelper.getImage(IImageKeys.ADD_SERVER_BIG));
- imageHyperlink.addHyperlinkListener(new HyperlinkAdapter() {
- // TODO: Override appropriate method and handle hyperlink event
- });
- }
-
- private void createClusterSummaryTab(final Cluster cluster, final TabFolder tabFolder, final FormToolkit toolkit) {
- Composite summaryTab = guiHelper.createTab(tabFolder, cluster.getName(), IImageKeys.CLUSTER);
-
- final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Cluster Summary");
- createVolumesSection(cluster, toolkit, form);
- createServersSection(cluster, toolkit, form);
- createActionsSection(cluster, toolkit, form);
-
- summaryTab.layout(); // IMP: lays out the form properly
- }
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createClusterSummaryTab((Cluster) entity, tabFolder, toolkit);
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java
deleted file mode 100644
index 3c94c3cc..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.core.model.Disk;
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.EntityGroup;
-import com.gluster.storage.management.core.model.GlusterServer;
-import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.NavigationView;
-import com.gluster.storage.management.gui.views.details.DisksPage;
-import com.gluster.storage.management.gui.views.details.GlusterServersPage;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-
-public class EntityGroupGlusterServerTabCreator implements TabCreator, IDoubleClickListener {
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- private int getServerCountByStatus(EntityGroup<GlusterServer> servers, SERVER_STATUS status) {
- int count = 0;
- for (GlusterServer server : (List<GlusterServer>)servers.getEntities()) {
- if (server.getStatus() == status) {
- count++;
- }
- }
- return count;
- }
-
- private void createAlertsSection(final EntityGroup<GlusterServer> servers, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false);
-
- toolkit.createLabel(section, "Any alerts related to servers\nwill be displayed here.");
- }
-
- private void createRunningTasksSection(final EntityGroup<GlusterServer> servers, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false);
-
- toolkit.createLabel(section, "List of running tasks related to\nservers will be displayed here.");
- }
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createSummaryTab((EntityGroup<GlusterServer>)entity, tabFolder, toolkit);
- createServersTab((EntityGroup<GlusterServer>)entity, tabFolder, toolkit);
- createDisksTab((EntityGroup<GlusterServer>)entity, tabFolder, toolkit, site);
- }
-
- private void createServersTab(EntityGroup<GlusterServer> servers, TabFolder tabFolder, FormToolkit toolkit) {
- Composite serversTab = guiHelper.createTab(tabFolder, "Servers", IImageKeys.SERVERS);
- GlusterServersPage page = new GlusterServersPage(serversTab, SWT.NONE, servers);
- page.addDoubleClickListener(this);
- }
-
- private void createSummaryTab(EntityGroup<GlusterServer> servers, TabFolder tabFolder, FormToolkit toolkit) {
- Composite summaryTab = guiHelper.createTab(tabFolder, "Summary", IImageKeys.SERVERS);
- final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Servers - Summary");
- createSummarySection(servers, toolkit, form);
- createRunningTasksSection(servers, toolkit, form);
- createAlertsSection(servers, toolkit, form);
-
- summaryTab.layout(); // IMP: lays out the form properly
- }
-
- private void createSummarySection(final EntityGroup<GlusterServer> servers, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false);
-
- Double[] values = new Double[] { Double.valueOf(getServerCountByStatus(servers, SERVER_STATUS.ONLINE)),
- Double.valueOf(getServerCountByStatus(servers, SERVER_STATUS.OFFLINE)) };
- createStatusChart(toolkit, section, values);
- }
-
- private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) {
- String[] categories = new String[] { "Online", "Offline" };
- PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories, values);
-
- GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
- data.widthHint = 250;
- data.heightHint = 250;
- chartViewerComposite.setLayoutData(data);
- }
-
-
- private void createDisksTab(EntityGroup<GlusterServer> servers, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- Composite disksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.SERVERS);
- DisksPage page = new DisksPage(disksTab, SWT.NONE, site, getAllDisks(servers));
-
- disksTab.layout(); // IMP: lays out the form properly
- }
-
- private List<Disk> getAllDisks(EntityGroup<GlusterServer> servers) {
- List<Disk> disks = new ArrayList<Disk>();
- for(GlusterServer server : (List<GlusterServer>)servers.getEntities()) {
- disks.addAll(server.getDisks());
- }
- return disks;
- }
-
- @Override
- public void doubleClick(DoubleClickEvent event) {
- NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID);
- if (clusterView != null) {
- clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement());
- }
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java
deleted file mode 100644
index 3f49ba6b..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.EntityGroup;
-import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.NavigationView;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-import com.gluster.storage.management.gui.views.pages.ServersPage;
-
-public class EntityGroupServerTabCreator implements TabCreator, IDoubleClickListener {
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createServersTab((EntityGroup<Server>) entity, tabFolder);
- }
-
- private void createServersTab(EntityGroup<Server> servers, TabFolder tabFolder) {
- Composite serversTab = guiHelper.createTab(tabFolder, "Discovered Servers", IImageKeys.SERVERS);
- ServersPage page = new ServersPage(serversTab, null, servers);
- page.addDoubleClickListener(this);
- }
-
- @Override
- public void doubleClick(DoubleClickEvent event) {
- NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID);
- if (clusterView != null) {
- clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement());
- }
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java
deleted file mode 100644
index 22ffd94d..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.EntityGroup;
-import com.gluster.storage.management.core.model.Volume;
-import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.NavigationView;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-import com.gluster.storage.management.gui.views.pages.VolumesPage;
-
-public class EntityGroupVolumeTabCreator implements TabCreator, IDoubleClickListener {
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createSummaryTab((EntityGroup<Volume>) entity, tabFolder, toolkit);
- createVolumesTab((EntityGroup<Volume>) entity, tabFolder, toolkit);
- }
-
- private int getVolumeCountByStatus(EntityGroup<Volume> volumes, VOLUME_STATUS status) {
- int count = 0;
- for (Volume volume : (List<Volume>) volumes.getEntities()) {
- if (volume.getStatus() == status) {
- count++;
- }
- }
- return count;
- }
-
- private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) {
- String[] categories = new String[] { "Online", "Offline" };
- PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories,
- values);
-
- GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
- data.widthHint = 250;
- data.heightHint = 250;
- chartViewerComposite.setLayoutData(data);
- }
-
- private void createAlertsSection(final EntityGroup<Volume> volumes, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false);
-
- toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here.");
- }
-
- private void createRunningTasksSection(final EntityGroup<Volume> volumes, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false);
-
- toolkit.createLabel(section, "List of running tasks related to\nvolumes will be displayed here.");
- }
-
- private void createSummarySection(final EntityGroup<Volume> volumes, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false);
-
- Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)),
- Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.OFFLINE)) };
- createStatusChart(toolkit, section, values);
- }
-
- private void createSummaryTab(final EntityGroup<Volume> volumes, TabFolder tabFolder, FormToolkit toolkit) {
- Composite summaryTab = guiHelper.createTab(tabFolder, "Summary", IImageKeys.VOLUMES);
- final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Volumes - Summary");
- createSummarySection(volumes, toolkit, form);
- createRunningTasksSection(volumes, toolkit, form);
- createAlertsSection(volumes, toolkit, form);
-
- summaryTab.layout(); // IMP: lays out the form properly
- }
-
- private void createVolumesTab(EntityGroup<Volume> volumes, TabFolder tabFolder, FormToolkit toolkit) {
- Composite volumesTab = guiHelper.createTab(tabFolder, "Volumes", IImageKeys.VOLUMES);
- VolumesPage page = new VolumesPage(volumesTab, null, volumes);
- page.addDoubleClickListener(this);
- }
-
- @Override
- public void doubleClick(DoubleClickEvent event) {
- NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID);
- if (clusterView != null) {
- clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement());
- }
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java
deleted file mode 100644
index 00318373..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.GlusterServer;
-import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS;
-import com.gluster.storage.management.core.utils.NumberUtil;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.NetworkInterfaceTableLabelProvider;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.ServerDisksPage;
-import com.gluster.storage.management.gui.views.details.ServerLogsPage;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-import com.richclientgui.toolbox.gauges.CoolGauge;
-
-public class GlusterServerTabCreator implements TabCreator {
- public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES {
- INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY
- };
-
- private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "Model", "Speed", "IP Address",
- "Netmask", "Gateway" };
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- private void createServerSummarySection(GlusterServer server, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Summary", null, 2, false);
-
- // toolkit.createLabel(section, "Preferred Network: ", SWT.NONE);
- // toolkit.createLabel(section, server.getPreferredNetworkInterface().getName(), SWT.NONE);
-
- boolean online = server.getStatus() == SERVER_STATUS.ONLINE;
-
- if (online) {
- toolkit.createLabel(section, "Number of CPUs: ", SWT.NONE);
- toolkit.createLabel(section, "" + server.getNumOfCPUs(), SWT.NONE);
-
- // toolkit.createLabel(section, "CPU Usage (%): ", SWT.NONE);
- // toolkit.createLabel(section, online ? "" + server.getCpuUsage() : "NA", SWT.NONE);
-
- toolkit.createLabel(section, "% CPU Usage (avg): ", SWT.NONE);
- CoolGauge gauge = new CoolGauge(section, guiHelper.getImage(IImageKeys.GAUGE_SMALL));
- gauge.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));
- gauge.setGaugeNeedleColour(Display.getDefault().getSystemColor(SWT.COLOR_RED));
- gauge.setGaugeNeedleWidth(2);
- gauge.setGaugeNeedlePivot(new Point(66, 65));
-
- gauge.setPoints(getPnts());
- gauge.setLevel(server.getCpuUsage() / 100);
- gauge.setToolTipText(server.getCpuUsage() + "%");
-
- toolkit.createLabel(section, "Memory Usage: ", SWT.NONE);
- ProgressBar memoryUsageBar = new ProgressBar(section, SWT.SMOOTH);
- memoryUsageBar.setMinimum(0);
- memoryUsageBar.setMaximum((int) Math.round(server.getTotalMemory()));
- memoryUsageBar.setSelection((int) Math.round(server.getMemoryInUse()));
- memoryUsageBar.setToolTipText("Total: " + server.getTotalMemory() + "GB, In Use: "
- + server.getMemoryInUse() + "GB");
-
- // toolkit.createLabel(section, "Memory Usage: ", SWT.NONE);
- // final CoolProgressBar bar = new CoolProgressBar(section,SWT.HORIZONTAL,
- // guiHelper.getImage(IImageKeys.PROGRESS_BAR_LEFT),
- // guiHelper.getImage(IImageKeys.PROGRESS_BAR_FILLED),
- // guiHelper.getImage(IImageKeys.PROGRESS_BAR_EMPTY),
- // guiHelper.getImage(IImageKeys.PROGRESS_BAR_RIGHT));
- // bar.updateProgress(server.getMemoryInUse() / server.getTotalMemory());
-
- // toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE);
- // toolkit.createLabel(section, online ? "" + server.getTotalDiskSpace() : "NA", SWT.NONE);
- //
- // toolkit.createLabel(section, "Disk Space in Use (GB): ", SWT.NONE);
- // toolkit.createLabel(section, online ? "" + server.getDiskSpaceInUse() : "NA", SWT.NONE);
-
- toolkit.createLabel(section, "Disk Usage: ", SWT.NONE);
- ProgressBar diskUsageBar = new ProgressBar(section, SWT.SMOOTH);
- diskUsageBar.setMinimum(0);
- diskUsageBar.setMaximum((int) Math.round(server.getTotalDiskSpace()));
- diskUsageBar.setSelection((int) Math.round(server.getDiskSpaceInUse()));
- diskUsageBar.setToolTipText("Total: " + NumberUtil.formatNumber(server.getTotalDiskSpace())
- + "GB, In Use: " + NumberUtil.formatNumber(server.getDiskSpaceInUse()) + "GB");
- }
-
- toolkit.createLabel(section, "Status: ", SWT.NONE);
- CLabel lblStatusValue = new CLabel(section, SWT.NONE);
- lblStatusValue.setText(server.getStatusStr());
- lblStatusValue.setImage(server.getStatus() == GlusterServer.SERVER_STATUS.ONLINE ? guiHelper
- .getImage(IImageKeys.STATUS_ONLINE) : guiHelper.getImage(IImageKeys.STATUS_OFFLINE));
- toolkit.adapt(lblStatusValue, true, true);
- }
-
- private List<Point> getPnts() {
- final List<Point> pnts = new ArrayList<Point>();
- pnts.add(new Point(47, 98));
- pnts.add(new Point(34, 84));
- pnts.add(new Point(29, 65));
- pnts.add(new Point(33, 48));
- pnts.add(new Point(48, 33));
- pnts.add(new Point(66, 28));
- pnts.add(new Point(83, 32));
- pnts.add(new Point(98, 47));
- pnts.add(new Point(103, 65));
- pnts.add(new Point(98, 83));
- pnts.add(new Point(84, 98));
- return pnts;
- }
-
- private void createServerSummaryTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit) {
- String serverName = server.getName();
- Composite serverSummaryTab = guiHelper.createTab(tabFolder, serverName, IImageKeys.SERVER);
- final ScrolledForm form = guiHelper.setupForm(serverSummaryTab, toolkit, "Server Summary [" + serverName + "]");
- createServerSummarySection(server, toolkit, form);
-
- if (server.getStatus() == SERVER_STATUS.ONLINE) {
- Composite section = createNetworkInterfacesSection(server, toolkit, form);
- }
-
- serverSummaryTab.layout(); // IMP: lays out the form properly
- }
-
- private void setupNetworkInterfaceTable(Composite parent, Table table) {
- table.setHeaderVisible(true);
- table.setLinesVisible(false);
-
- TableColumnLayout tableColumnLayout = guiHelper.createTableColumnLayout(table,
- NETWORK_INTERFACE_TABLE_COLUMN_NAMES);
- parent.setLayout(tableColumnLayout);
-
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE, SWT.CENTER, 70);
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.MODEL, SWT.CENTER, 70);
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.SPEED, SWT.CENTER, 70);
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.IP_ADDRESS, SWT.CENTER, 100);
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.NETMASK, SWT.CENTER, 70);
- setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.GATEWAY, SWT.CENTER, 70);
- // setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.PREFERRED, SWT.CENTER, 70);
- }
-
- /**
- * Sets properties for alignment and weight of given column of given table
- *
- * @param table
- * @param columnIndex
- * @param alignment
- * @param weight
- */
- public void setColumnProperties(Table table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES columnIndex, int alignment,
- int weight) {
- TableColumn column = table.getColumn(columnIndex.ordinal());
- column.setAlignment(alignment);
-
- TableColumnLayout tableColumnLayout = (TableColumnLayout) table.getParent().getLayout();
- tableColumnLayout.setColumnData(column, new ColumnWeightData(weight));
- }
-
- private TableViewer createNetworkInterfacesTableViewer(final Composite parent, GlusterServer server) {
- TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
- // TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
- tableViewer.setLabelProvider(new NetworkInterfaceTableLabelProvider());
- tableViewer.setContentProvider(new ArrayContentProvider());
-
- setupNetworkInterfaceTable(parent, tableViewer.getTable());
- tableViewer.setInput(server.getNetworkInterfaces().toArray());
-
- return tableViewer;
- }
-
- private Composite createTableViewerComposite(Composite parent) {
- Composite tableViewerComposite = new Composite(parent, SWT.NO);
- tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL));
- GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
- tableLayoutData.widthHint = 400;
- tableLayoutData.minimumWidth = 400;
- // tableLayoutData.grabExcessHorizontalSpace = true;
- tableViewerComposite.setLayoutData(tableLayoutData);
- return tableViewerComposite;
- }
-
- private Composite createNetworkInterfacesSection(GlusterServer server, FormToolkit toolkit, ScrolledForm form) {
- final Composite section = guiHelper.createSection(form, toolkit, "Network Interfaces", null, 1, false);
- createNetworkInterfacesTableViewer(createTableViewerComposite(section), server);
- // Hyperlink changePreferredNetworkLink = toolkit.createHyperlink(section, "Change Preferred Network",
- // SWT.NONE);
- // changePreferredNetworkLink.addHyperlinkListener(new HyperlinkAdapter() {
- //
- // @Override
- // public void linkActivated(HyperlinkEvent e) {
- // new MessageDialog(
- // section.getShell(),
- // "Gluster Storage Platform",
- // guiHelper.getImage(IImageKeys.SERVER),
- // "This will show additional controls to help user choose a new network interface. TO BE IMPLEMENTED.",
- // MessageDialog.INFORMATION, new String[] { "OK" }, 0).open();
- // }
- // });
- return section;
- }
-
- private void createServerLogsTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit) {
- String serverName = server.getName();
- Composite serverLogsTab = guiHelper.createTab(tabFolder, "Logs", IImageKeys.SERVER);
- ServerLogsPage logsPage = new ServerLogsPage(serverLogsTab, SWT.NONE, server);
-
- serverLogsTab.layout(); // IMP: lays out the form properly
- }
-
- private void createServerDisksTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit,
- IWorkbenchSite site) {
- Composite serverDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.SERVER);
- ServerDisksPage page = new ServerDisksPage(serverDisksTab, SWT.NONE, site, server.getDisks());
-
- serverDisksTab.layout(); // IMP: lays out the form properly
- }
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- GlusterServer server = (GlusterServer) entity;
-
- createServerSummaryTab(server, tabFolder, toolkit);
- if (server.getStatus() == SERVER_STATUS.ONLINE) {
- createServerDisksTab(server, tabFolder, toolkit, site);
- createServerLogsTab(server, tabFolder, toolkit);
- }
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java
deleted file mode 100644
index d634253e..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.core.utils.NumberUtil;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-
-public class ServerTabCreator implements TabCreator {
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- private void createServerSummarySection(Server server, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Summary", null, 2, false);
-
- toolkit.createLabel(section, "Number of CPUs: ", SWT.NONE);
- toolkit.createLabel(section, "" + server.getNumOfCPUs(), SWT.NONE);
-
-// toolkit.createLabel(section, "CPU Usage (%): ", SWT.NONE);
-// toolkit.createLabel(section, "" + server.getCpuUsage(), SWT.NONE);
-
- toolkit.createLabel(section, "Total Memory (GB): ", SWT.NONE);
- toolkit.createLabel(section, "" + server.getTotalMemory(), SWT.NONE);
-
-// toolkit.createLabel(section, "Memory in Use (GB): ", SWT.NONE);
-// toolkit.createLabel(section, "" + server.getMemoryInUse(), SWT.NONE);
-
- toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE);
- toolkit.createLabel(section, "" + NumberUtil.formatNumber(server.getTotalDiskSpace()), SWT.NONE);
-
-// toolkit.createLabel(section, "Disk Space in Use (GB): ", SWT.NONE);
-// toolkit.createLabel(section, "" + server.getDiskSpaceInUse(), SWT.NONE);
- }
-
- private void createServerSummaryTab(Server server, TabFolder tabFolder, FormToolkit toolkit) {
- String serverName = server.getName();
- Composite serverSummaryTab = guiHelper.createTab(tabFolder, serverName, IImageKeys.SERVER);
- final ScrolledForm form = guiHelper.setupForm(serverSummaryTab, toolkit, "Discovered Server Summary [" + serverName + "]");
- createServerSummarySection(server, toolkit, form);
-
- serverSummaryTab.layout(); // IMP: lays out the form properly
- }
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createServerSummaryTab((Server) entity, tabFolder, toolkit);
- }
-}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java
deleted file mode 100644
index dc3186e1..00000000
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * 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.gui.views.details.tabcreators;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbenchSite;
-import org.eclipse.ui.forms.events.HyperlinkAdapter;
-import org.eclipse.ui.forms.events.HyperlinkEvent;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Hyperlink;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-
-import com.gluster.storage.management.client.GlusterDataModelManager;
-import com.gluster.storage.management.core.model.Entity;
-import com.gluster.storage.management.core.model.Volume;
-import com.gluster.storage.management.core.model.Volume.NAS_PROTOCOL;
-import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
-import com.gluster.storage.management.core.utils.NumberUtil;
-import com.gluster.storage.management.gui.IImageKeys;
-import com.gluster.storage.management.gui.utils.GUIHelper;
-import com.gluster.storage.management.gui.views.details.BricksPage;
-import com.gluster.storage.management.gui.views.details.DisksPage;
-import com.gluster.storage.management.gui.views.details.TabCreator;
-import com.gluster.storage.management.gui.views.details.VolumeLogsPage;
-import com.gluster.storage.management.gui.views.details.VolumeOptionsPage;
-
-public class VolumeTabCreator implements TabCreator {
- private static final GUIHelper guiHelper = GUIHelper.getInstance();
-
- private void createVolumePropertiesSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Properties", null, 3, false);
-
- createVolumeTypeField(volume, toolkit, section);
-
- VOLUME_TYPE volumeType = volume.getVolumeType();
- if (volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
- createReplicaCountField(volume, toolkit, section);
- }
-
- if (volumeType == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
- createStripeCountField(volume, toolkit, section);
- }
-
- createNumOfDisksField(volume, toolkit, section);
- createDiskSpaceField(volume, toolkit, section);
- createTransportTypeField(volume, toolkit, section);
- createNASProtocolField(volume, toolkit, section);
- createAccessControlField(volume, toolkit, section);
- createStatusField(volume, toolkit, section);
- }
-
- private void createDiskSpaceField(final Volume volume, FormToolkit toolkit, Composite section) {
- Label diskSpaceLabel = toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE);
- diskSpaceLabel.setToolTipText("<b>bold</b>normal");
- toolkit.createLabel(section, "" + NumberUtil.formatNumber(volume.getTotalDiskSpace()), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createStatusField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Status: ", SWT.NONE);
-
- CLabel lblStatusValue = new CLabel(section, SWT.NONE);
- lblStatusValue.setText(volume.getStatusStr());
- lblStatusValue.setImage(volume.getStatus() == Volume.VOLUME_STATUS.ONLINE ? guiHelper
- .getImage(IImageKeys.STATUS_ONLINE) : guiHelper.getImage(IImageKeys.STATUS_OFFLINE));
-
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createTransportTypeField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Transport Type: ", SWT.NONE);
- toolkit.createLabel(section, "" + volume.getTransportTypeStr(), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createNumOfDisksField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Number of Disks: ", SWT.NONE);
- toolkit.createLabel(section, "" + volume.getNumOfDisks(), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createStripeCountField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Stripe Count: ", SWT.NONE);
- toolkit.createLabel(section, "" + volume.getStripeCount(), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createReplicaCountField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Replica Count: ", SWT.NONE);
- toolkit.createLabel(section, "" + volume.getReplicaCount(), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE); // dummy
- }
-
- private void createVolumeTypeField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Volume Type: ", SWT.NONE);
- toolkit.createLabel(section, volume.getVolumeTypeStr(), SWT.NONE);
- toolkit.createLabel(section, "", SWT.NONE);
- }
-
- private void createVolumeAlertsSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 3, false);
- toolkit.createLabel(section, "Volume related alerts will be displayed here");
- }
-
- private void createVolumeMountingInfoSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) {
- Composite section = guiHelper.createSection(form, toolkit, "Mounting Information", null, 3, false);
- toolkit.createLabel(section, "Information about mounting the\nvolume will be printed here");
- }
-
- private GridData createDefaultLayoutData() {
- GridData layoutData = new GridData();
- layoutData.minimumWidth = 150;
- layoutData.widthHint = 150;
- return layoutData;
- }
-
- private void createAccessControlField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "Access Control: ", SWT.NONE);
- Text accessControlText = toolkit.createText(section, volume.getAccessControlList());
- accessControlText.setLayoutData(createDefaultLayoutData());
- accessControlText.setEnabled(false);
- createChangeLinkForAccessControl(volume, toolkit, section, accessControlText);
- }
-
- private void createChangeLinkForAccessControl(final Volume volume, FormToolkit toolkit, Composite section,
- final Text accessControlText) {
- final Hyperlink changeLink = toolkit.createHyperlink(section, "change", SWT.NONE);
- changeLink.addHyperlinkListener(new HyperlinkAdapter() {
-
- private void finishEdit() {
- // TODO: Update value to back-end
- // TODO: Validation of entered text
- volume.setAccessControlList(accessControlText.getText());
- accessControlText.setEnabled(false);
- changeLink.setText("change");
- }
-
- private void startEdit() {
- accessControlText.setEnabled(true);
- changeLink.setText("update");
- }
-
- @Override
- public void linkActivated(HyperlinkEvent e) {
- if (accessControlText.isEnabled()) {
- // we were already in edit mode.
- finishEdit();
- } else {
- // Get in to edit mode
- startEdit();
- }
- }
- });
- }
-
- private void createNASProtocolField(final Volume volume, FormToolkit toolkit, Composite section) {
- toolkit.createLabel(section, "NAS Protocols: ", SWT.NONE);
-
- Composite nasProtocolsComposite = toolkit.createComposite(section);
- nasProtocolsComposite.setLayout(new FillLayout());
-
- createCheckbox(toolkit, nasProtocolsComposite, "Gluster", true);
- final Button nfsCheckBox = createCheckbox(toolkit, nasProtocolsComposite, "NFS", volume.getNASProtocols().contains(NAS_PROTOCOL.NFS));
-
- createChangeLinkForNASProtocol(volume, toolkit, section, nfsCheckBox);
- }
-
- private void createChangeLinkForNASProtocol(final Volume volume, FormToolkit toolkit, Composite section,
- final Button nfsCheckBox) {
- final Hyperlink changeLink = toolkit.createHyperlink(section, "change", SWT.NONE);
- changeLink.addHyperlinkListener(new HyperlinkAdapter() {
-
- private void finishEdit() {
- // TODO: Update value to back-end
- if (nfsCheckBox.getSelection()) {
- volume.enableNFS();
- } else {
- volume.disableNFS();
- }
- nfsCheckBox.setEnabled(false);
- changeLink.setText("change");
- }
-
- private void startEdit() {
- nfsCheckBox.setEnabled(true);
- changeLink.setText("update");
- }
-
- @Override
- public void linkActivated(HyperlinkEvent e) {
- if (nfsCheckBox.isEnabled()) {
- // we were already in edit mode.
- finishEdit();
- } else {
- // Get in to edit mode
- startEdit();
- }
- }
- });
- }
-
- private Button createCheckbox(FormToolkit toolkit, Composite parent, String label, boolean selected) {
- final Button checkBox = toolkit.createButton(parent, label, SWT.CHECK);
- checkBox.setEnabled(false);
- checkBox.setSelection(selected);
- return checkBox;
- }
-
- private void createVolumePropertiesTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) {
- Composite volumeTab = guiHelper.createTab(tabFolder, volume.getName() + " - Properties", IImageKeys.VOLUME);
- final ScrolledForm form = guiHelper.setupForm(volumeTab, toolkit, "Volume Properties [" + volume.getName() + "]");
- createVolumePropertiesSection(volume, toolkit, form);
- createVolumeMountingInfoSection(volume, toolkit, form);
- createVolumeAlertsSection(volume, toolkit, form);
-
- volumeTab.layout(); // IMP: lays out the form properly
- }
-
- private void createVolumeLogsTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) {
- Composite volumeTab = guiHelper.createTab(tabFolder, "Logs", IImageKeys.VOLUME);
- VolumeLogsPage logsPage = new VolumeLogsPage(volumeTab, SWT.NONE, volume);
-
- volumeTab.layout(); // IMP: lays out the form properly
- }
-
- private void createVolumeDisksTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- Composite volumeDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.VOLUME);
- BricksPage page = new BricksPage(volumeDisksTab, SWT.NONE, site, GlusterDataModelManager.getInstance().getOnlineBricks(volume));
- volumeDisksTab.layout(); // IMP: lays out the form properly
- }
-
- private void createVolumeOptionsTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) {
- Composite volumeTab = guiHelper.createTab(tabFolder, "Options", IImageKeys.VOLUME);
- //VolumeOptionsPage page = new VolumeOptionsPage(volumeTab, SWT.NONE, volume);
-
- volumeTab.layout(); // IMP: lays out the form properly
- }
-
- @Override
- public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
- createVolumePropertiesTab((Volume) entity, tabFolder, toolkit);
- createVolumeDisksTab((Volume) entity, tabFolder, toolkit, site);
- createVolumeOptionsTab((Volume) entity, tabFolder, toolkit);
- createVolumeLogsTab((Volume) entity, tabFolder, toolkit);
- }
-}
diff --git a/src/com.gluster.storage.management.server/.settings/org.eclipse.wst.common.component b/src/com.gluster.storage.management.server/.settings/org.eclipse.wst.common.component
index bb2eaf45..e9b43da9 100644
--- a/src/com.gluster.storage.management.server/.settings/org.eclipse.wst.common.component
+++ b/src/com.gluster.storage.management.server/.settings/org.eclipse.wst.common.component
@@ -3,6 +3,7 @@
<wb-module deploy-name="com.gluster.storage.management.server">
<wb-resource deploy-path="/" source-path="/WebContent"/>
<wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/junit"/>
<property name="java-output-path" value="/com.gluster.storage.management.server/build/classes"/>
<property name="context-root" value="glustermc"/>
</wb-module>
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/antlr-2.7.6.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/antlr-2.7.6.jar
new file mode 100644
index 00000000..3702b645
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/antlr-2.7.6.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/commons-collections-3.1.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/commons-collections-3.1.jar
new file mode 100644
index 00000000..41e230fe
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/commons-collections-3.1.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/dom4j-1.6.1.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/dom4j-1.6.1.jar
new file mode 100644
index 00000000..c8c4dbb9
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/dom4j-1.6.1.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar
new file mode 100644
index 00000000..4c9ac4e9
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate-jpa-2.0-api-1.0.0.Final.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate3.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate3.jar
new file mode 100644
index 00000000..c1c81141
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate3.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/javassist-3.12.0.GA.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/javassist-3.12.0.GA.jar
new file mode 100644
index 00000000..8f692f4f
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/javassist-3.12.0.GA.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/jta-1.1.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/jta-1.1.jar
new file mode 100644
index 00000000..6d225b76
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/jta-1.1.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/log4j-1.2.16.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/log4j-1.2.16.jar
new file mode 100644
index 00000000..3f9d8476
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/log4j-1.2.16.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/slf4j-api-1.6.1.jar b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/slf4j-api-1.6.1.jar
new file mode 100644
index 00000000..f1f4fdd2
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/slf4j-api-1.6.1.jar
Binary files differ
diff --git a/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/0-version.sql b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/0-version.sql
new file mode 100644
index 00000000..4c3d81d1
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/0-version.sql
@@ -0,0 +1,2 @@
+create table version (version varchar(16) not null primary key);
+insert into version(version) values('1.0.0'); \ No newline at end of file
diff --git a/src/com.gluster.storage.management.server/src/data/scripts/security-schema.sql b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/1-security-schema.sql
index fdde5823..fdde5823 100644
--- a/src/com.gluster.storage.management.server/src/data/scripts/security-schema.sql
+++ b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/1-security-schema.sql
diff --git a/src/com.gluster.storage.management.server/src/data/scripts/users-authorities-groups.sql b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/2-users-authorities-groups.sql
index 35ccf965..35ccf965 100644
--- a/src/com.gluster.storage.management.server/src/data/scripts/users-authorities-groups.sql
+++ b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/2-users-authorities-groups.sql
diff --git a/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/3-cluster-servers.sql b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/3-cluster-servers.sql
new file mode 100644
index 00000000..17ca62d2
--- /dev/null
+++ b/src/com.gluster.storage.management.server/WebContent/data/scripts/1.0.0/3-cluster-servers.sql
@@ -0,0 +1,16 @@
+create table cluster_info (
+ id bigint generated by default as identity,
+ name varchar(255),
+ primary key (id));
+
+create unique index ix_cluster_name on cluster_info (name);
+
+create table server_info (
+ id bigint generated by default as identity,
+ name varchar(255),
+ cluster_id bigint,
+ primary key (id));
+
+create unique index ix_cluster_server on server_info (name, cluster_id);
+
+alter table server_info add constraint FK_CLUSTER_ID foreign key (cluster_id) references cluster_info(id); \ No newline at end of file
diff --git a/src/com.gluster.storage.management.server/WebContent/scripts/Common.py b/src/com.gluster.storage.management.server/WebContent/scripts/Common.py
deleted file mode 100644
index 60f200fe..00000000
--- a/src/com.gluster.storage.management.server/WebContent/scripts/Common.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# 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/src/com.gluster.storage.management.server/WebContent/scripts/Globals.py b/src/com.gluster.storage.management.server/WebContent/scripts/Globals.py
deleted file mode 100644
index 6e68adbd..00000000
--- a/src/com.gluster.storage.management.server/WebContent/scripts/Globals.py
+++ /dev/null
@@ -1,3 +0,0 @@
-MULTICAST_GROUP = '224.224.1.1'
-MULTICAST_PORT = 5353
-DISCOVERED_SERVER_LIST_FILENAME = "/tmp/discovered-server-list"
diff --git a/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py b/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py
deleted file mode 100755
index 6ac15fed..00000000
--- a/src/com.gluster.storage.management.server/WebContent/scripts/vmware-discover-servers.py
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/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/src/com.gluster.storage.management.server/src/META-INF/persistence.xml b/src/com.gluster.storage.management.server/src/META-INF/persistence.xml
new file mode 100644
index 00000000..36b252ea
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/META-INF/persistence.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
+ <persistence-unit name="gluster-management-gateway" transaction-type="RESOURCE_LOCAL" />
+</persistence> \ No newline at end of file
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java
new file mode 100644
index 00000000..093423f0
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ClusterInfo.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * 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.data;
+
+import java.util.List;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.tool.hbm2ddl.SchemaExport;
+
+@Entity(name="cluster_info")
+public class ClusterInfo {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ private String name;
+
+ @OneToMany(mappedBy="cluster")
+ private List<ServerInfo> servers;
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setServers(List<ServerInfo> servers) {
+ this.servers = servers;
+ }
+
+ public List<ServerInfo> getServers() {
+ return servers;
+ }
+
+ public static void main(String args[]) {
+ AnnotationConfiguration config = new AnnotationConfiguration();
+ config.addAnnotatedClass(ClusterInfo.class);
+ config.addAnnotatedClass(ServerInfo.class);
+ config.configure();
+ new SchemaExport(config).create(true, true);
+ }
+
+}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java
new file mode 100644
index 00000000..6fd7ecdc
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/PersistenceDao.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * 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.data;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityTransaction;
+import javax.persistence.PersistenceUnit;
+import javax.persistence.Query;
+
+/**
+ *
+ */
+public class PersistenceDao<T> {
+ private Class<T> type;
+
+ private EntityManager entityManager;
+
+ @PersistenceUnit
+ private EntityManagerFactory entityManagerFactory;
+
+ public PersistenceDao(Class<T> type) {
+ this.type = type;
+ }
+
+ public EntityTransaction startTransaction() {
+ EntityTransaction txn = getEntityManager().getTransaction();
+ txn.begin();
+ return txn;
+ }
+
+ private synchronized EntityManager getEntityManager() {
+ if (entityManager == null) {
+ entityManager = entityManagerFactory.createEntityManager();
+ }
+ return entityManager;
+ }
+
+ public Object getSingleResult(String query) {
+ return getEntityManager().createQuery(query).getSingleResult();
+ }
+
+ public Object getSingleResult(String queryString, String... params) {
+ return createQuery(queryString, params).getSingleResult();
+ }
+
+ private Query createQuery(String queryString, String... params) {
+ Query query = getEntityManager().createQuery(queryString);
+ for (int i = 0; i < params.length; i++) {
+ query.setParameter(i + 1, params[i]);
+ }
+ return query;
+ }
+
+ public Object getSingleResultFromSQL(String sqlQuery) {
+ return getEntityManager().createNativeQuery(sqlQuery).getSingleResult();
+ }
+
+ public T findById(int id) {
+ return getEntityManager().find(type, id);
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<T> findAll() {
+ return getEntityManager().createQuery("select t from " + type.getName() + " t").getResultList();
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<T> findBy(String whereClause) {
+ return getEntityManager().createQuery("select t from " + type.getName() + " t where " + whereClause)
+ .getResultList();
+ }
+
+ @SuppressWarnings("unchecked")
+ public List<T> findBy(String whereClause, String... params) {
+ return createQuery("select t from " + type.getName() + " t where " + whereClause, params).getResultList();
+ }
+
+ public void save(T obj) {
+ getEntityManager().persist(obj);
+ }
+
+ public T update(T obj) {
+ return getEntityManager().merge(obj);
+ }
+
+ public void delete(T obj) {
+ getEntityManager().remove(obj);
+ }
+}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java
new file mode 100644
index 00000000..88ce51ca
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/data/ServerInfo.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * 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.data;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ *
+ */
+@Entity(name="server_info")
+public class ServerInfo {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ private String name;
+
+ @ManyToOne
+ @JoinColumn(name="cluster_id")
+ private ClusterInfo cluster;
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setCluster(ClusterInfo cluster) {
+ this.cluster = cluster;
+ }
+
+ public ClusterInfo getCluster() {
+ return cluster;
+ }
+}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
index 8c7f54ae..ce408502 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java
@@ -32,10 +32,10 @@ import com.sun.jersey.api.core.InjectParam;
*/
public class AbstractServersResource {
@InjectParam
- private ServerUtil serverUtil;
+ protected ServerUtil serverUtil;
@InjectParam
- private GlusterUtil glusterUtil;
+ protected GlusterUtil glusterUtil;
/**
* Fetch details of the given server. The server name must be populated in the object before calling this method.
@@ -47,16 +47,9 @@ public class AbstractServersResource {
// fetch standard server details like cpu, disk, memory details
Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class);
if (response instanceof Status) {
+ // TODO: check if this happened because the server is not reachable, and if yes, set it's status as offline
throw new GlusterRuntimeException(((Status)response).getMessage());
}
server.copyFrom((Server) response); // Update the details in <Server> object
}
-
- protected void setGlusterUtil(GlusterUtil glusterUtil) {
- this.glusterUtil = glusterUtil;
- }
-
- protected GlusterUtil getGlusterUtil() {
- return glusterUtil;
- }
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java
index e33e06c9..4283b5d6 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java
@@ -1,6 +1,6 @@
package com.gluster.storage.management.server.resources;
-import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_ALERTS;
+import static com.gluster.storage.management.core.constants.RESTConstants.*;
import java.util.ArrayList;
import java.util.List;
@@ -16,7 +16,7 @@ import com.gluster.storage.management.core.model.AlertListResponse;
import com.gluster.storage.management.core.model.Alert;
@Component
-@Path(RESOURCE_PATH_ALERTS)
+@Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_ALERTS)
public class AlertsResource {
@GET
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java
new file mode 100644
index 00000000..f04941cf
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * 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.resources;
+
+import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_CLUSTER_NAME;
+import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityTransaction;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.response.StringListResponse;
+import com.gluster.storage.management.server.data.ClusterInfo;
+import com.gluster.storage.management.server.data.PersistenceDao;
+import com.sun.jersey.api.core.InjectParam;
+
+/**
+ *
+ */
+@Path(RESOURCE_PATH_CLUSTERS)
+public class ClustersResource {
+
+ @InjectParam
+ private PersistenceDao clusterDao;
+
+ public void setClusterDao(PersistenceDao clusterDao) {
+ this.clusterDao = clusterDao;
+ }
+
+ public PersistenceDao getClusterDao() {
+ return clusterDao;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public StringListResponse getClusters() {
+ List<ClusterInfo> clusters = getClusterDao().findAll();
+ List<String> clusterList = new ArrayList<String>();
+ for (ClusterInfo cluster : clusters) {
+ clusterList.add(cluster.getName());
+ }
+ return new StringListResponse(clusterList);
+ }
+
+ @POST
+ @Produces(MediaType.TEXT_XML)
+ public Status createCluster(@FormParam(FORM_PARAM_CLUSTER_NAME) String clusterName) {
+ EntityTransaction txn = clusterDao.startTransaction();
+ ClusterInfo cluster = new ClusterInfo();
+ cluster.setName(clusterName);
+
+ try {
+ clusterDao.save(cluster);
+ txn.commit();
+ return Status.STATUS_SUCCESS;
+ } catch (Exception e) {
+ txn.rollback();
+ return new Status(Status.STATUS_CODE_FAILURE, "Exception while trying to save cluster [" + clusterName
+ + "]: [" + e.getMessage() + "]");
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Path("{" + PATH_PARAM_CLUSTER_NAME + "}")
+ @DELETE
+ @Produces(MediaType.TEXT_XML)
+ public Status deleteCluster(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) {
+ List<ClusterInfo> clusters = clusterDao.findBy("name = ?1", clusterName);
+ if (clusters == null || clusters.size() == 0) {
+ return new Status(Status.STATUS_CODE_FAILURE, "Cluster [" + clusterName + "] doesn't exist!");
+ }
+
+ ClusterInfo cluster = clusters.get(0);
+ EntityTransaction txn = clusterDao.startTransaction();
+ try {
+ clusterDao.delete(cluster);
+ txn.commit();
+ return Status.STATUS_SUCCESS;
+ } catch (Exception e) {
+ txn.rollback();
+ return new Status(Status.STATUS_CODE_FAILURE, "Exception while trying to delete cluster [" + clusterName
+ + "]: [" + e.getMessage() + "]");
+ }
+ }
+}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
index 71c0f7db..58f72ffd 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java
@@ -18,6 +18,12 @@
*******************************************************************************/
package com.gluster.storage.management.server.resources;
+import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME;
+import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_SERVERS;
+
+import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.DELETE;
@@ -27,38 +33,101 @@ import javax.ws.rs.POST;
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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.gluster.storage.management.core.constants.CoreConstants;
-import com.gluster.storage.management.core.constants.RESTConstants;
+import com.gluster.storage.management.core.exceptions.ConnectionException;
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.Status;
import com.gluster.storage.management.core.response.GlusterServerListResponse;
import com.gluster.storage.management.core.response.GlusterServerResponse;
+import com.gluster.storage.management.core.utils.LRUCache;
+import com.gluster.storage.management.server.data.ClusterInfo;
+import com.gluster.storage.management.server.data.PersistenceDao;
+import com.gluster.storage.management.server.data.ServerInfo;
import com.gluster.storage.management.server.utils.GlusterUtil;
import com.gluster.storage.management.server.utils.SshUtil;
import com.sun.jersey.spi.resource.Singleton;
@Component
@Singleton
-@Path("/cluster/servers")
+@Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_SERVERS)
public class GlusterServersResource extends AbstractServersResource {
public static final String HOSTNAMETAG = "hostname:";
-
- private GlusterServerListResponse getServerDetails(String knownServer) {
- List<GlusterServer> glusterServers = getGlusterUtil().getGlusterServers(knownServer);
+ private LRUCache<String, GlusterServer> clusterServerCache = new LRUCache<String, GlusterServer>(3);
+
+ @Autowired
+ private PersistenceDao<ClusterInfo> clusterDao;
+
+ protected void fetchServerDetails(GlusterServer server) {
+ try {
+ super.fetchServerDetails(server);
+ } catch(ConnectionException e) {
+ server.setStatus(SERVER_STATUS.OFFLINE);
+ }
+ }
+
+ // uses cache
+ public GlusterServer getOnlineServer(String clusterName) {
+ GlusterServer server = clusterServerCache.get(clusterName);
+ if(server != null) {
+ return server;
+ }
+
+ return getNewOnlineServer(clusterName);
+ }
+
+ // Doesn't use cache
+ public GlusterServer getNewOnlineServer(String clusterName) {
+ // no known online server for this cluster. find one.
+ ClusterInfo cluster = clusterDao.findBy("name = ?1", clusterName).get(0);
+ for(ServerInfo serverInfo : cluster.getServers()) {
+ GlusterServer server = new GlusterServer(serverInfo.getName());
+ try {
+ fetchServerDetails(server);
+ // server is online. add it to cache and return
+ clusterServerCache.put(clusterName, server);
+ return server;
+ } catch(ConnectionException e) {
+ // server is offline. check the next server.
+ }
+ }
+
+ // no online server found.
+ return null;
+ }
+
+ private GlusterServerListResponse getServerDetails(String clusterName) {
+ GlusterServer onlineServer = getOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new GlusterServerListResponse(Status.STATUS_SUCCESS, new ArrayList<GlusterServer>());
+ }
+
+ List<GlusterServer> glusterServers;
+ try {
+ glusterServers = glusterUtil.getGlusterServers(onlineServer);
+ } catch(ConnectionException e) {
+ // online server has gone offline! try with a different one.
+ onlineServer = getNewOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new GlusterServerListResponse(Status.STATUS_SUCCESS, new ArrayList<GlusterServer>());
+ }
+
+ glusterServers = glusterUtil.getGlusterServers(onlineServer);
+ }
+
int errCount = 0;
StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): ");
for (GlusterServer server : glusterServers) {
- if (server.getStatus() == SERVER_STATUS.ONLINE) {
+ if (server.getStatus() == SERVER_STATUS.ONLINE && !server.getName().equals(onlineServer.getName())) {
try {
- fetchServerDetails(server);
+ fetchServerDetails(server);
} catch (Exception e) {
errMsg.append(CoreConstants.NEWLINE + server.getName() + " : [" + e.getMessage() + "]");
errCount++;
@@ -79,17 +148,17 @@ public class GlusterServersResource extends AbstractServersResource {
@GET
@Produces(MediaType.TEXT_XML)
public GlusterServerListResponse getGlusterServers(
- @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) {
- return getServerDetails(knownServer);
+ @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) {
+ return getServerDetails(clusterName);
}
@GET
@Path("{serverName}")
@Produces(MediaType.TEXT_XML)
public GlusterServerResponse getGlusterServer(
- @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer,
+ @PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
@PathParam("serverName") String serverName) {
- GlusterServer server = getGlusterUtil().getGlusterServer(knownServer, serverName);
+ GlusterServer server = glusterUtil.getGlusterServer(getOnlineServer(clusterName), serverName);
Status status = Status.STATUS_SUCCESS;
if(server.isOnline()) {
try {
@@ -103,21 +172,59 @@ public class GlusterServersResource extends AbstractServersResource {
@POST
@Produces(MediaType.TEXT_XML)
- public GlusterServerResponse addServer(@FormParam("serverName") String serverName,
- @FormParam("existingServer") String existingServer) {
- Status status = getGlusterUtil().addServer(serverName, existingServer);
+ public GlusterServerResponse addServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @FormParam("serverName") String serverName) {
+ GlusterServer onlineServer = getOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE,
+ "No online server found in cluster [" + clusterName + "]"), null);
+ }
+
+ Status status;
+ try {
+ status = glusterUtil.addServer(serverName, onlineServer.getName());
+ } catch(ConnectionException e) {
+ onlineServer = getNewOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new GlusterServerResponse(new Status(Status.STATUS_CODE_FAILURE,
+ "No online server found in cluster [" + clusterName + "]"), null);
+ }
+ status = glusterUtil.addServer(serverName, onlineServer.getName());
+ }
if (!status.isSuccess()) {
return new GlusterServerResponse(status, null);
}
- return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(existingServer, serverName)
+
+ return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(clusterName, serverName)
.getGlusterServer());
}
@DELETE
@Produces(MediaType.TEXT_XML)
- public Status removeServer(@QueryParam("serverName") String serverName) {
- return getGlusterUtil().removeServer(serverName);
+ public Status removeServer(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_SERVER_NAME) String serverName) {
+ GlusterServer onlineServer = getOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new Status(Status.STATUS_CODE_FAILURE,
+ "No online server found in cluster [" + clusterName + "]");
+ }
+
+ Status status;
+ try {
+ return glusterUtil.removeServer(onlineServer.getName(), serverName);
+ } catch(ConnectionException e) {
+ onlineServer = getNewOnlineServer(clusterName);
+ if(onlineServer == null) {
+ return new Status(Status.STATUS_CODE_FAILURE,
+ "No online server found in cluster [" + clusterName + "]");
+ }
+ return glusterUtil.removeServer(onlineServer.getName(), serverName);
+ }
+ }
+
+ private void setGlusterUtil(GlusterUtil glusterUtil) {
+ this.glusterUtil = glusterUtil;
}
public static void main(String[] args) {
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java
index ea2cdf5d..10ce5da3 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java
@@ -30,7 +30,7 @@ import javax.ws.rs.core.MediaType;
import org.springframework.stereotype.Component;
-import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
+import static 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.RunningTaskStatus;
@@ -40,7 +40,7 @@ import com.gluster.storage.management.core.utils.StringUtil;
import com.gluster.storage.management.server.runningtasks.managers.RunningTaskManager;
@Component
-@Path(RESOURCE_PATH_RUNNING_TASKS)
+@Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_RUNNING_TASKS)
public class RunningTaskResource {
private static final String PKG = "com.gluster.storage.management.server.runningtasks.managers";
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
index 84980851..3857f104 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
@@ -26,6 +26,7 @@ import static com.gluster.storage.management.core.constants.RESTConstants.FORM_P
import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_TARGET;
import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_START;
import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_VALUE_STOP;
+import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_VOLUME_NAME;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_BRICKS;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DELETE_OPTION;
@@ -36,12 +37,13 @@ import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_LOG_SEVERITY;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_TO_TIMESTAMP;
import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_VOLUME_NAME;
-import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_VOLUMES;
-import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS;
-import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_DISKS;
-import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_DOWNLOAD;
-import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_LOGS;
-import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_OPTIONS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DEFAULT_OPTIONS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DISKS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_DOWNLOAD;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_LOGS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_OPTIONS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_CLUSTERS;
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_VOLUMES;
import java.io.File;
import java.io.IOException;
@@ -89,7 +91,7 @@ import com.sun.jersey.api.core.InjectParam;
import com.sun.jersey.spi.resource.Singleton;
@Singleton
-@Path(RESOURCE_PATH_VOLUMES)
+@Path(RESOURCE_PATH_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_VOLUMES)
public class VolumesResource {
private static final String PREPARE_BRICK_SCRIPT = "create_volume_directory.py";
private static final String VOLUME_DIRECTORY_CLEANUP_SCRIPT = "clear_volume_directory.py";
@@ -110,8 +112,9 @@ public class VolumesResource {
@GET
@Produces(MediaType.TEXT_XML)
- public VolumeListResponse getAllVolumes() {
+ public VolumeListResponse getAllVolumes(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) {
try {
+ // TODO: pass cluster name to getAllVolumes
return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes());
} catch (Exception e) {
// TODO: log the error
@@ -123,7 +126,9 @@ public class VolumesResource {
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
- public Status createVolume(Volume volume) {
+ public Status createVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName, Volume volume) {
+ // TODO: Create volume on given cluster
+ // Create the directories for the volume
List<String> brickDirectories = glusterCoreUtil.getQualifiedBrickList(volume.getBricks());
Status status = glusterUtil.createVolume(volume, brickDirectories);
if (status.isSuccess()) {
@@ -139,16 +144,18 @@ public class VolumesResource {
@GET
@Path("{" + PATH_PARAM_VOLUME_NAME + "}")
@Produces(MediaType.TEXT_XML)
- public Volume getVolume(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
+ public Volume getVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
+ // TODO: Pass cluster name to getVolume
return glusterUtil.getVolume(volumeName);
}
@PUT
@Path("{" + PATH_PARAM_VOLUME_NAME + "}")
@Produces(MediaType.TEXT_XML)
- public Status performOperation(@FormParam(FORM_PARAM_OPERATION) String operation,
- @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
-
+ public Status performOperation(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_OPERATION) String operation) {
+ // TODO: Perform the operation on given cluster
if (operation.equals(FORM_PARAM_VALUE_START)) {
return glusterUtil.startVolume(volumeName);
}
@@ -161,8 +168,10 @@ public class VolumesResource {
@DELETE
@Path("{" + PATH_PARAM_VOLUME_NAME + "}")
@Produces(MediaType.TEXT_XML)
- public Status deleteVolume(@QueryParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
+ public Status deleteVolume(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @QueryParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
@QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
+ // TODO: Delete volume on given cluster
Volume volume = glusterUtil.getVolume(volumeName);
Status status = glusterUtil.deleteVolume(volumeName);
@@ -184,12 +193,14 @@ public class VolumesResource {
}
@DELETE
- @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
+ @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_DISKS)
@Produces(MediaType.TEXT_XML)
- public Status removeBricks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
- @QueryParam(QUERY_PARAM_BRICKS) String bricks, @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
+ public Status removeBricks(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @QueryParam(QUERY_PARAM_BRICKS) String bricks,
+ @QueryParam(QUERY_PARAM_DELETE_OPTION) boolean deleteFlag) {
List<String> brickList = Arrays.asList(bricks.split(",")); // Convert from comma separated string (query parameter)
+ // TODO: pass clusterName to removeBricks
Status status = glusterUtil.removeBricks(volumeName, brickList);
String deleteOption = "";
@@ -224,25 +235,29 @@ public class VolumesResource {
}
@POST
- @Path("{" + PATH_PARAM_VOLUME_NAME + " }/" + SUBRESOURCE_OPTIONS)
+ @Path("{" + PATH_PARAM_VOLUME_NAME + " }/" + RESOURCE_OPTIONS)
@Produces(MediaType.TEXT_XML)
- public Status setOption(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName,
+ public Status setOption(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName,
@FormParam(RESTConstants.FORM_PARAM_OPTION_KEY) String key,
@FormParam(RESTConstants.FORM_PARAM_OPTION_VALUE) String value) {
+ // TODO: pass cluster name to setOption
return glusterUtil.setOption(volumeName, key, value);
}
@PUT
- @Path("{" + PATH_PARAM_VOLUME_NAME + " }/" + SUBRESOURCE_OPTIONS)
+ @Path("{" + PATH_PARAM_VOLUME_NAME + " }/" + RESOURCE_OPTIONS)
@Produces(MediaType.TEXT_XML)
- public Status resetOptions(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
+ public Status resetOptions(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName) {
+ // TODO: pass clusterName to resetOptions
return glusterUtil.resetOptions(volumeName);
}
@GET
- @Path(SUBRESOURCE_DEFAULT_OPTIONS)
+ @Path(RESOURCE_DEFAULT_OPTIONS)
@Produces(MediaType.TEXT_XML)
- public VolumeOptionInfoListResponse getDefaultOptions() {
+ public VolumeOptionInfoListResponse getDefaultOptions(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName) {
// TODO: Fetch all volume options with their default values from GlusterFS
// whenever such a CLI command is made available in GlusterFS
return new VolumeOptionInfoListResponse(Status.STATUS_SUCCESS, volumeOptionsDefaults.getDefaults());
@@ -362,14 +377,16 @@ public class VolumesResource {
@GET
@Produces(MediaType.APPLICATION_OCTET_STREAM)
- @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_LOGS + "/" + SUBRESOURCE_DOWNLOAD)
- public StreamingOutput getLogs(@PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) {
+ @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + RESOURCE_LOGS + "/" + RESOURCE_DOWNLOAD)
+ public StreamingOutput getLogs(@PathParam(PATH_PARAM_CLUSTER_NAME) final String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) final String volumeName) {
return new StreamingOutput() {
@Override
public void write(OutputStream output) throws IOException, WebApplicationException {
- Volume volume = getVolume(volumeName);
+ Volume volume = getVolume(clusterName, volumeName);
try {
+ // TODO: pass clusterName to downloadLogs
File archiveFile = new File(downloadLogs(volume));
output.write(fileUtil.readFileAsByteArray(archiveFile));
archiveFile.delete();
@@ -405,21 +422,24 @@ public class VolumesResource {
}
@GET
- @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_LOGS)
- public LogMessageListResponse getLogs(@PathParam(PATH_PARAM_VOLUME_NAME) String volumeName,
- @QueryParam(QUERY_PARAM_DISK_NAME) String brickName, @QueryParam(QUERY_PARAM_LOG_SEVERITY) String severity,
+ @Path("{" + PATH_PARAM_VOLUME_NAME + "}/" + RESOURCE_LOGS)
+ public LogMessageListResponse getLogs(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(PATH_PARAM_VOLUME_NAME) String volumeName,
+ @QueryParam(QUERY_PARAM_DISK_NAME) String brickName,
+ @QueryParam(QUERY_PARAM_LOG_SEVERITY) String severity,
@QueryParam(QUERY_PARAM_FROM_TIMESTAMP) String fromTimestamp,
@QueryParam(QUERY_PARAM_TO_TIMESTAMP) String toTimestamp,
- @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount, @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) {
+ @QueryParam(QUERY_PARAM_LINE_COUNT) Integer lineCount,
+ @QueryParam(QUERY_PARAM_DOWNLOAD) Boolean download) {
List<LogMessage> logMessages = null;
try {
- Volume volume = getVolume(volumeName);
+ // TODO: Fetch logs from brick(s) of given cluster only
+ Volume volume = getVolume(clusterName, volumeName);
if (brickName == null || brickName.isEmpty() || brickName.equals(CoreConstants.ALL)) {
logMessages = getLogsForAllBricks(volume, lineCount);
} else {
// fetch logs for given brick of the volume
- // logMessages = getBrickLogs(volume, getBrickForDisk(volume, brickName), lineCount);
logMessages = getBrickLogs(volume, brickName, lineCount);
}
} catch (Exception e) {
@@ -491,17 +511,18 @@ public class VolumesResource {
}
@POST
- @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
- public Status addBricks(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
- @FormParam(FORM_PARAM_BRICKS) String bricks) {
+ @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_DISKS)
+ public Status addBricks(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_BRICKS) String bricks) {
return glusterUtil.addBricks(volumeName, Arrays.asList(bricks.split(",")));
}
@PUT
- @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + SUBRESOURCE_DISKS)
- public Status replaceDisk(@PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName,
- @FormParam(FORM_PARAM_SOURCE) String diskFrom, @FormParam(FORM_PARAM_TARGET) String diskTo,
- @FormParam(FORM_PARAM_OPERATION) String operation) {
+ @Path("{" + QUERY_PARAM_VOLUME_NAME + "}/" + RESOURCE_DISKS)
+ public Status replaceDisk(@PathParam(PATH_PARAM_CLUSTER_NAME) String clusterName,
+ @PathParam(QUERY_PARAM_VOLUME_NAME) String volumeName, @FormParam(FORM_PARAM_SOURCE) String diskFrom,
+ @FormParam(FORM_PARAM_TARGET) String diskTo, @FormParam(FORM_PARAM_OPERATION) String operation) {
+ // TODO: Migrate disk on given cluster only
return glusterUtil.migrateDisk(volumeName, diskFrom, diskTo, operation);
}
@@ -533,7 +554,7 @@ public class VolumesResource {
// System.out.println("Code : " + status.getCode());
// System.out.println("Message " + status.getMessage());
- Status status1 = vr.removeBricks("test", "192.168.1.210:sdb", true);
+ Status status1 = vr.removeBricks("testCluster", "test", "192.168.1.210:sdb", true);
System.out.println("Code : " + status1.getCode());
System.out.println("Message " + status1.getMessage());
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java
index d96db6ca..8e38bd40 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitServerTask.java
@@ -21,19 +21,26 @@
package com.gluster.storage.management.server.tasks;
import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import javax.servlet.ServletContext;
import org.apache.derby.tools.ij;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.RowCallbackHandler;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
-import com.gluster.storage.management.core.utils.FileUtil;
+import com.gluster.storage.management.server.data.ClusterInfo;
+import com.gluster.storage.management.server.data.PersistenceDao;
/**
* Initializes the Gluster Management Server.
@@ -42,6 +49,17 @@ public class InitServerTask extends JdbcDaoSupport {
@Autowired
private PasswordEncoder passwordEncoder;
+ @Autowired
+ private String appVersion;
+
+ @Autowired
+ private PersistenceDao<ClusterInfo> clusterDao;
+
+ @Autowired
+ ServletContext servletContext;
+
+ private static final String SCRIPT_DIR = "data/scripts/";
+
public void securePasswords() {
getJdbcTemplate().query("select username, password from users", new RowCallbackHandler() {
@Override
@@ -55,45 +73,90 @@ public class InitServerTask extends JdbcDaoSupport {
});
}
- private void executeScript(String script) {
+ private void executeScript(File script) {
ByteArrayOutputStream sqlOut = new ByteArrayOutputStream();
int numOfExceptions;
try {
- numOfExceptions = ij.runScript(getJdbcTemplate().getDataSource().getConnection(),
- new FileUtil().loadResource(script), CoreConstants.ENCODING_UTF8, sqlOut,
- CoreConstants.ENCODING_UTF8);
+ numOfExceptions = ij.runScript(getJdbcTemplate().getDataSource().getConnection(), new FileInputStream(
+ script), CoreConstants.ENCODING_UTF8, sqlOut, CoreConstants.ENCODING_UTF8);
String output = sqlOut.toString();
sqlOut.close();
- logger.debug("Data script [" + script + "] returned with exit status [" + numOfExceptions
+ logger.debug("Data script [" + script.getName() + "] returned with exit status [" + numOfExceptions
+ "] and output [" + output + "]");
if (numOfExceptions != 0) {
- throw new GlusterRuntimeException("Server data initialization script [ " + script + "] failed with ["
- + numOfExceptions + "] exceptions! [" + output + "]");
+ throw new GlusterRuntimeException("Server data initialization script [ " + script.getName()
+ + "] failed with [" + numOfExceptions + "] exceptions! [" + output + "]");
}
} catch (Exception ex) {
- ex.printStackTrace();
- throw new GlusterRuntimeException("Server data initialization script [" + script + "] failed!", ex);
+ throw new GlusterRuntimeException("Server data initialization script [" + script.getName() + "] failed!",
+ ex);
}
}
private void initDatabase() {
logger.debug("Initializing server data...");
- executeScript("data/scripts/security-schema.sql");
- executeScript("data/scripts/users-authorities-groups.sql");
+ executeScriptsFrom(getDirFromRelativePath(SCRIPT_DIR + appVersion));
+
securePasswords(); // encrypt the passwords
}
+ private File getDirFromRelativePath(String relativePath) {
+ String scriptDirPath = servletContext.getRealPath(relativePath);
+ File scriptDir = new File(scriptDirPath);
+ return scriptDir;
+ }
+
+ private void executeScriptsFrom(File scriptDir) {
+ if (!scriptDir.exists()) {
+ throw new GlusterRuntimeException("Script directory [" + scriptDir.getAbsolutePath() + "] doesn't exist!");
+ }
+
+ List<File> scripts = Arrays.asList(scriptDir.listFiles());
+ if(scripts.size() == 0) {
+ throw new GlusterRuntimeException("Script directory [" + scriptDir.getAbsolutePath() + "] is empty!");
+ }
+
+ Collections.sort(scripts);
+ for (File script : scripts) {
+ executeScript(script);
+ }
+ }
+
/**
* Initializes the server database, if running for the first time.
*/
public synchronized void initServer() {
try {
- // Query to check whether the user table exists
- getJdbcTemplate().queryForInt("select count(*) from users");
- logger.debug("Server data is already initialized!");
- } catch (DataAccessException ex) {
+ String dbVersion = getDBVersion();
+ if (!appVersion.equals(dbVersion)) {
+ logger.info("App version [" + appVersion + "] differs from data version [" + dbVersion
+ + "]. Trying to upgrade data...");
+ upgradeData(dbVersion, appVersion);
+ }
+ } catch (Exception ex) {
+ ex.printStackTrace();
// Database not created yet. Create it!
initDatabase();
}
+
+ // For development time debugging. To be removed later.
+ List<ClusterInfo> clusters = clusterDao.findAll();
+ logger.info(clusters.size());
+
+ if (clusters.size() > 0) {
+ for (ClusterInfo cluster : clusters) {
+ logger.info("Cluster: [" + cluster.getId() + "][" + cluster.getName() + "]");
+ }
+ } else {
+ logger.info("No cluster created yet.");
+ }
+ }
+
+ private void upgradeData(String fromVersion, String toVersion) {
+ executeScriptsFrom(getDirFromRelativePath(SCRIPT_DIR + fromVersion + "-" + toVersion));
+ }
+
+ private String getDBVersion() {
+ return (String) clusterDao.getSingleResultFromSQL("select version from version");
}
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
index b7cfd2ea..64595e5f 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
@@ -101,8 +101,8 @@ public class GlusterUtil {
}
- public GlusterServer getGlusterServer(String knownServer, String serverName) {
- List<GlusterServer> servers = getGlusterServers(knownServer);
+ public GlusterServer getGlusterServer(GlusterServer onlineServer, String serverName) {
+ List<GlusterServer> servers = getGlusterServers(onlineServer);
for(GlusterServer server : servers) {
if(server.getName().equals(serverName)) {
return server;
@@ -112,14 +112,15 @@ public class GlusterUtil {
}
- public List<GlusterServer> getGlusterServers(String knownServer) {
- String output = getPeerStatus(knownServer);
+ public List<GlusterServer> getGlusterServers(GlusterServer knownServer) {
+ String output = getPeerStatus(knownServer.getName());
if (output == null) {
return null;
}
List<GlusterServer> glusterServers = new ArrayList<GlusterServer>();
- glusterServers.add(getKnownServer(knownServer)); // Append the known server
+ // TODO: Append the known server. But where? Order matters in replication/striping
+ glusterServers.add(knownServer);
GlusterServer server = null;
boolean foundHost = false;
boolean foundUuid = false;
@@ -193,8 +194,8 @@ public class GlusterUtil {
return output;
}
- public Status addServer(String serverName, String existingServer) {
- return new Status(sshUtil.executeRemote(existingServer, "gluster peer probe " + serverName));
+ public Status addServer(String existingServer, String newServer) {
+ return new Status(sshUtil.executeRemote(existingServer, "gluster peer probe " + newServer));
}
public Status startVolume(String volumeName) {
@@ -522,8 +523,8 @@ public class GlusterUtil {
return new Status(processUtil.executeCommand(command));
}
- public Status removeServer(String serverName) {
- return new Status(processUtil.executeCommand("gluster", "peer", "detach", serverName));
+ public Status removeServer(String existingServer, String serverName) {
+ return new Status(sshUtil.executeRemote(existingServer, "gluster peer detach " + serverName));
}
public static void main(String args[]) {
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
index 5b953c3d..4a72ebce 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
@@ -22,6 +22,7 @@ package com.gluster.storage.management.server.utils;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
+import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
@@ -39,6 +40,7 @@ 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.exceptions.ConnectionException;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.response.GenericResponse;
@@ -57,6 +59,14 @@ public class ServerUtil {
private static final String SCRIPT_COMMAND = "python";
private static final String REMOTE_SCRIPT_GET_DISK_FOR_DIR = "get_disk_for_dir.py";
+ public void setSshUtil(SshUtil sshUtil) {
+ this.sshUtil = sshUtil;
+ }
+
+ public SshUtil getSshUtil() {
+ return sshUtil;
+ }
+
public ProcessResult executeGlusterScript(boolean runInForeground, String scriptName, List<String> arguments) {
List<String> command = new ArrayList<String>();
@@ -97,14 +107,19 @@ public class ServerUtil {
return ((GenericResponse) response).getStatus();
}
return response;
- } catch (Exception e) {
- // any other exception means unexpected error. return status with error from exception.
- return new Status(e);
+ } catch (RuntimeException e) {
+ // Except for connection exception, wrap any other exception in the a object and return it.
+ if (e instanceof ConnectionException) {
+ throw e;
+ } else {
+ // error during unmarshalling. return status with error from exception.
+ return new Status(e);
+ }
}
}
private String executeOnServer(String serverName, String commandWithArgs) {
- ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs);
+ ProcessResult result = getSshUtil().executeRemote(serverName, commandWithArgs);
if (!result.isSuccess()) {
throw new GlusterRuntimeException("Command [" + commandWithArgs + "] failed on [" + serverName
+ "] with error [" + result.getExitValue() + "][" + result.getOutput() + "]");
@@ -196,8 +211,10 @@ public class ServerUtil {
}
public static void main(String args[]) throws Exception {
- // CreateVolumeExportDirectory.py md0 testvol
- System.out.println(new ServerUtil().getFileFromServer("localhost", "/tmp/python/PeerAgent.py"));
+ ServerUtil su = new ServerUtil();
+ su.setSshUtil(new SshUtil());
+ // Object result = new ServerUtil().executeOnServer(true, "serverName", "ls -lrt", String.class);
+ // System.out.println(result);
}
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java
index 5816533b..cac71f9c 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java
@@ -34,6 +34,7 @@ import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;
import com.gluster.storage.management.core.constants.CoreConstants;
+import com.gluster.storage.management.core.exceptions.ConnectionException;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.utils.LRUCache;
import com.gluster.storage.management.core.utils.ProcessResult;
@@ -71,18 +72,18 @@ public class SshUtil {
private void authenticateWithPublicKey(Connection conn) {
try {
if (!supportsPublicKeyAuthentication(conn)) {
- throw new GlusterRuntimeException("Public key authentication not supported on [" + conn.getHostname()
+ throw new ConnectionException("Public key authentication not supported on [" + conn.getHostname()
+ "]");
}
// TODO: Introduce password for the PEM file (third argument) so that it is more secure
if (!conn.authenticateWithPublicKey(USER_NAME, PEM_FILE, null)) {
- throw new GlusterRuntimeException("SSH Authentication (public key) failed for server ["
+ throw new ConnectionException("SSH Authentication (public key) failed for server ["
+ conn.getHostname() + "]");
}
} catch (IOException e) {
e.printStackTrace();
- throw new GlusterRuntimeException("Exception during SSH authentication (public key) for server ["
+ throw new ConnectionException("Exception during SSH authentication (public key) for server ["
+ conn.getHostname() + "]", e);
}
}
@@ -90,18 +91,18 @@ public class SshUtil {
private void authenticateWithPassword(Connection conn) {
try {
if (!supportsPasswordAuthentication(conn)) {
- throw new GlusterRuntimeException("Password authentication not supported on [" + conn.getHostname()
+ throw new ConnectionException("Password authentication not supported on [" + conn.getHostname()
+ "]");
}
// TODO: Introduce password for the PEM file (third argument) so that it is more secure
if (!conn.authenticateWithPassword(USER_NAME, DEFAULT_PASSWORD)) {
- throw new GlusterRuntimeException("SSH Authentication (password) failed for server ["
+ throw new ConnectionException("SSH Authentication (password) failed for server ["
+ conn.getHostname() + "]");
}
} catch (IOException e) {
e.printStackTrace();
- throw new GlusterRuntimeException("Exception during SSH authentication (password) for server ["
+ throw new ConnectionException("Exception during SSH authentication (password) for server ["
+ conn.getHostname() + "]", e);
}
}
@@ -121,8 +122,7 @@ public class SshUtil {
conn.connect();
} catch (IOException e) {
e.printStackTrace();
- throw new GlusterRuntimeException("Exception while creating SSH connection with server [" + serverName
- + "]", e);
+ throw new ConnectionException("Exception while creating SSH connection with server [" + serverName + "]", e);
}
return conn;
}
@@ -159,10 +159,9 @@ public class SshUtil {
session.close();
return result;
} catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
+ throw new GlusterRuntimeException("Exception while executing command [" + command + "] on ["
+ + sshConnection.getHostname() + "]", e);
}
- return null;
}
private ProcessResult getResultOfExecution(Session session, BufferedReader stdoutReader, BufferedReader stderrReader) {
diff --git a/src/com.gluster.storage.management.server/src/log4j.properties b/src/com.gluster.storage.management.server/src/log4j.properties
new file mode 100644
index 00000000..d7712c96
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/log4j.properties
@@ -0,0 +1,12 @@
+log4j.rootLogger=INFO, CONSOLE
+
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.immediateFlush=true
+log4j.appender.CONSOLE.target=System.out
+log4j.appender.CONSOLE.threshold=DEBUG
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=%d{dd MMM, yyyy HH:mm:ss} %p: %c %t - %m%n
+
+log4j.logger.org.springframework=ERROR
+log4j.logger.org.springframework.aop=DEBUG
+log4j.logger.com.gluster=INFO \ No newline at end of file
diff --git a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml
index 86a8708f..e65ef3a9 100644
--- a/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml
+++ b/src/com.gluster.storage.management.server/src/spring/gluster-server-base.xml
@@ -1,50 +1,73 @@
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
- xmlns:task="http://www.springframework.org/schema/task"
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:context="http://www.springframework.org/schema/context" xmlns:task="http://www.springframework.org/schema/task"
+ xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
- http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
+ http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<context:component-scan base-package="com.gluster.storage.management.server" />
<task:scheduler id="taskScheduler" />
<task:executor id="taskExecutor" pool-size="1" />
- <task:annotation-driven executor="taskExecutor"
- scheduler="taskScheduler" />
+ <task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />
<task:scheduled-tasks>
- <task:scheduled ref="serverDiscoveryTask" method="discoverServers"
- fixed-delay="60000" />
+ <task:scheduled ref="serverDiscoveryTask" method="discoverServers" fixed-delay="60000" />
</task:scheduled-tasks>
+ <!-- Cluster environment. Valid values: vmware, aws, baremetal -->
<bean id="environment" class="java.lang.String">
<constructor-arg value="vmware" />
</bean>
+ <!-- Gluster Management Gateway Version -->
+ <bean id="appVersion" class="java.lang.String">
+ <constructor-arg value="1.0.0" />
+ </bean>
+
<!-- Derby embedded data source -->
- <!-- bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"
- lazy-init="false"> <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver"
- /> <property name="url" value="jdbc:derby:work/data;create=true" /> <property
- name="username" value="gluster" /> <property name="password" value="gluster"
- /> </bean -->
-
- <bean id="dataSourceFactory"
- class="com.gluster.storage.management.server.data.GlusterDataSource" />
- <bean id="dataSource"
- class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
+ <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="false">
+ <property name="driverClassName" value="org.apache.derby.jdbc.EmbeddedDriver" />
+ <property name="url" value="jdbc:derby:/etc/glustermg/data;create=true" />
+ <property name="username" value="gluster" />
+ <property name="password" value="gluster" />
+ </bean>
+
+ <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+ <property name="dataSource" ref="dataSource" />
+ <property name="jpaVendorAdapter">
+ <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
+ <property name="showSql" value="true" />
+ <property name="generateDdl" value="false" />
+ <property name="databasePlatform" value="org.hibernate.dialect.DerbyDialect" />
+ </bean>
+ </property>
+ </bean>
+
+ <bean
+ class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
+
+ <bean id="clusterDao" class="com.gluster.storage.management.server.data.PersistenceDao">
+ <constructor-arg type="java.lang.Class">
+ <value>com.gluster.storage.management.server.data.ClusterInfo</value>
+ </constructor-arg>
+ </bean>
+
+ <!-- bean id="dataSourceFactory" class="com.gluster.storage.management.server.data.GlusterDataSource" />
+ <bean id="dataSource" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
- <ref local="dataSourceFactory" />
+ <ref local="dataSourceFactory" />
</property>
<property name="targetMethod">
- <value>getDataSource</value>
+ <value>getDataSource</value>
</property>
- </bean>
+ </bean -->
- <!-- bean id="dataSource" class="com.gluster.storage.management.server.data.GlusterDataSource"
+ <!-- bean id="dataSource" class="com.gluster.storage.management.server.data.GlusterDataSource"
lazy-init="false" autowire="byType" / -->
- <bean class="com.gluster.storage.management.server.tasks.InitServerTask"
- init-method="initServer" depends-on="dataSource">
+ <bean class="com.gluster.storage.management.server.tasks.InitServerTask" init-method="initServer" depends-on="dataSource">
<property name="dataSource" ref="dataSource" />
</bean>
</beans> \ No newline at end of file