diff options
Diffstat (limited to 'src')
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 Binary files differnew file mode 100644 index 00000000..3702b645 --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/antlr-2.7.6.jar 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 Binary files differnew file mode 100644 index 00000000..41e230fe --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/commons-collections-3.1.jar 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 Binary files differnew file mode 100644 index 00000000..c8c4dbb9 --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/dom4j-1.6.1.jar 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 Binary files differnew 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 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 Binary files differnew file mode 100644 index 00000000..c1c81141 --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/hibernate3.jar 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 Binary files differnew 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 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 Binary files differnew file mode 100644 index 00000000..6d225b76 --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/jta-1.1.jar 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 Binary files differnew file mode 100644 index 00000000..3f9d8476 --- /dev/null +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/lib/log4j-1.2.16.jar 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 Binary files differnew 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 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 |
