summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDhandapani <dhandapani@gluster.com>2011-04-07 11:23:29 +0530
committerDhandapani <dhandapani@gluster.com>2011-04-07 14:10:10 +0530
commit94a933503b611a2d410654056d1a456dcd019e3f (patch)
treec3cb2467dad682f16a0ba96b0e3f13f527e22bfc
parent9cc77baa3c96fa74afbb3807dd01525e28638934 (diff)
parent8607a637093bda070f78289c34c529a990967ff4 (diff)
Merge commit 'upstream/master'
Conflicts: src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java29
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java6
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java95
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java6
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java5
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java48
-rw-r--r--src/com.gluster.storage.management.core/META-INF/MANIFEST.MF1
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java1
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java51
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java38
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java13
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java13
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java4
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java60
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java30
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java2
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java42
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/AbstractResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java)5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GenericResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java)4
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerListResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java)5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java)5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/RunningTaskListResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java)5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/ServerListResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java)5
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java (renamed from src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java)2
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeListResponse.java46
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeOptionInfoListResponse.java68
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java156
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java43
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java15
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/EditVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PreferencesAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java5
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java28
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java61
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java17
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java13
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java45
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java68
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java3
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/constants/VolumeOptionsDefaults.java20
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java85
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java4
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java6
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java40
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ServerResource.java21
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java34
54 files changed, 969 insertions, 308 deletions
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
new file mode 100644
index 00000000..6adf198b
--- /dev/null
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java
@@ -0,0 +1,29 @@
+package com.gluster.storage.management.client;
+
+import java.util.List;
+
+import com.gluster.storage.management.core.constants.RESTConstants;
+import com.gluster.storage.management.core.model.Alert;
+import com.gluster.storage.management.core.model.AlertListResponse;
+
+public class AlertsClient extends AbstractClient {
+
+ public AlertsClient(String securityToken) {
+ super(securityToken);
+ }
+
+ @Override
+ public String getResourceName() {
+ return RESTConstants.RESOURCE_PATH_ALERTS;
+ }
+
+ @SuppressWarnings("rawtypes")
+ private Object fetchAllAlerts(Class responseClass) {
+ return fetchResource( responseClass );
+ }
+
+ public List<Alert> getAllAlerts() {
+ AlertListResponse response = (AlertListResponse) fetchAllAlerts(AlertListResponse.class);
+ return response.getAlerts();
+ }
+}
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 0cc18037..84074115 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
@@ -22,11 +22,11 @@ import java.util.List;
import javax.ws.rs.core.MultivaluedMap;
-import com.gluster.storage.management.core.model.GenericResponse;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.core.model.ServerListResponse;
-import com.gluster.storage.management.core.model.StringListResponse;
+import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.response.ServerListResponse;
+import com.gluster.storage.management.core.response.StringListResponse;
import com.sun.jersey.core.util.MultivaluedMapImpl;
public class DiscoveredServersClient extends AbstractClient {
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 de0112db..2dd91620 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
@@ -24,25 +24,24 @@ import java.util.Date;
import java.util.List;
import com.gluster.storage.management.core.model.Cluster;
+import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.Disk;
import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
-import com.gluster.storage.management.core.model.Event.EVENT_TYPE;
import com.gluster.storage.management.core.model.Entity;
import com.gluster.storage.management.core.model.Event;
+import com.gluster.storage.management.core.model.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.GlusterServer.SERVER_STATUS;
-import com.gluster.storage.management.core.model.ClusterListener;
import com.gluster.storage.management.core.model.LogMessage;
import com.gluster.storage.management.core.model.NetworkInterface;
-import com.gluster.storage.management.core.model.RunningTask;
import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.core.model.Status;
-import com.gluster.storage.management.core.model.RunningTaskStatus;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE;
import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
+import com.gluster.storage.management.core.response.VolumeListResponse;
+import com.gluster.storage.management.client.VolumesClient;
public class GlusterDataModelManager {
// private Server discoveredServer1, discoveredServer2, discoveredServer3, discoveredServer4, discoveredServer5;
@@ -105,22 +104,28 @@ public class GlusterDataModelManager {
}
public void initializeModel(String securityToken) {
+ model = new GlusterDataModel("Gluster Data Model");
setSecurityToken(securityToken);
- // Create the dummy data model for demo
- model = new GlusterDataModel("Clusters");
- Cluster cluster = new Cluster("Home", model);
-
+ Cluster cluster = new Cluster("Home",model);
+ VolumesClient volumeClient = new VolumesClient(securityToken);
+
initializeGlusterServers(cluster);
- initializeVolumes(cluster);
+
+ // initializeVolumes(cluster);
+ VolumeListResponse response = volumeClient.getAllVolumes();
+ cluster.setVolumes( response.getVolumes());
+
initializeAutoDiscoveredServers(cluster);
initializeDisks();
- addDisksToVolumes();
- addVolumeOptions();
+ // addDisksToVolumes();
+ // addVolumeOptions();
createDummyLogMessages();
initializeRunningTasks(cluster);
+
+ initializeAlerts(cluster);
model.addCluster(cluster);
}
@@ -201,24 +206,24 @@ public class GlusterDataModelManager {
}
private void addDisksToVolumes() {
- volume1.addDisk(s1da);
+ volume1.addDisk("server1:sda");
- volume2.addDisk(s2da);
- volume2.addDisk(s1db);
- volume2.addDisk(s3da);
- volume2.addDisk(s4da);
+ volume2.addDisk("server2:sda");
+ volume2.addDisk("server1:sdb");
+ volume2.addDisk("server3:sda");
+ volume2.addDisk("server4:sda");
- volume3.addDisk(s2db);
- volume3.addDisk(s4da);
- volume3.addDisk(s5da);
+ volume3.addDisk("server2:sdb");
+ volume3.addDisk("server4:sda");
+ volume3.addDisk("server5:sda");
- volume4.addDisk(s1da);
- volume4.addDisk(s3da);
- volume4.addDisk(s4da);
- volume4.addDisk(s5db);
+ volume4.addDisk("server1:sda");
+ volume4.addDisk("server3:sda");
+ volume4.addDisk("server4:sda");
+ volume4.addDisk("server5:sdb");
- volume5.addDisk(s2da);
- volume5.addDisk(s5db);
+ volume5.addDisk("server2:sda");
+ volume5.addDisk("server5:sdb");
}
private void initializeGlusterServers(Cluster cluster) {
@@ -247,6 +252,10 @@ public class GlusterDataModelManager {
public void initializeRunningTasks(Cluster cluster) {
cluster.setRunningTasks(new RunningTaskClient(securityToken).getRunningTasks());
}
+
+ public void initializeAlerts(Cluster cluster) {
+ cluster.setAlerts(new AlertsClient(securityToken).getAllAlerts());
+ }
public List<LogMessage> createDummyLogMessages() {
addMessagesForDisk(logMessages, s1da);
@@ -264,20 +273,42 @@ public class GlusterDataModelManager {
public static List<LogMessage> getDummyLogMessages() {
return logMessages;
}
+
+ public Disk getVolumeDisk(String volumeDisk) {
+ List<Disk> allDisks = getReadyDisksOfAllServers();
+ String brickInfo[] = volumeDisk.split(":");
+ for( Disk disk: allDisks) {
+ if (disk.getServerName() == brickInfo[0] && disk.getName() == brickInfo[1]) {
+ return disk;
+ }
+ }
+ return null;
+ }
public List<Disk> getReadyDisksOfVolume(Volume volume) {
+ /* TODO: review the logic
+
List<Disk> disks = new ArrayList<Disk>();
for (Disk disk : volume.getDisks()) {
if (disk.isReady()) {
disks.add(disk);
}
}
- return disks;
+ */
+ Disk disk = null;
+ List<Disk> volumeDisks = new ArrayList<Disk>();
+ for (String volumeDisk : volume.getDisks() ) {
+ disk = getVolumeDisk(volumeDisk);
+ if (disk != null && disk.isReady()) {
+ volumeDisks.add(disk);
+ }
+ }
+ return volumeDisks;
}
public List<Disk> getReadyDisksOfAllVolumes() {
List<Disk> disks = new ArrayList<Disk>();
- for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) {
+ for (Volume volume : model.getCluster().getVolumes()) {
disks.addAll(getReadyDisksOfVolume(volume));
}
return disks;
@@ -290,7 +321,7 @@ public class GlusterDataModelManager {
public List<Disk> getReadyDisksOfAllServersExcluding(List<Disk> excludeDisks) {
List<Disk> disks = new ArrayList<Disk>();
- for (Server server : ((Cluster) model.getChildren().get(0)).getServers()) {
+ for (Server server : model.getCluster().getServers()) {
for (Disk disk : server.getDisks()) {
if (disk.isReady() && !excludeDisks.contains(disk)) {
disks.add(disk);
@@ -309,7 +340,7 @@ public class GlusterDataModelManager {
}
public void addGlusterServer(GlusterServer server) {
- Cluster cluster = (Cluster)model.getChildren().get(0);
+ Cluster cluster = model.getCluster();
cluster.addServer(server);
for(ClusterListener listener : listeners) {
@@ -318,7 +349,7 @@ public class GlusterDataModelManager {
}
public void removeDiscoveredServer(Server server) {
- Cluster cluster = (Cluster)model.getChildren().get(0);
+ Cluster cluster = model.getCluster();
cluster.removeDiscoveredServer(server);
for(ClusterListener listener : listeners) {
@@ -334,7 +365,7 @@ public class GlusterDataModelManager {
}
public void addVolume(Volume volume) {
- Cluster cluster = (Cluster)model.getChildren().get(0);
+ Cluster cluster = model.getCluster();
cluster.addVolume(volume);
for(ClusterListener listener : listeners) {
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 25fe3bbc..dfee988c 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
@@ -20,12 +20,12 @@ package com.gluster.storage.management.client;
import java.util.List;
-import com.gluster.storage.management.core.model.GenericResponse;
import com.gluster.storage.management.core.model.GlusterServer;
-import com.gluster.storage.management.core.model.GlusterServerListResponse;
-import com.gluster.storage.management.core.model.GlusterServerResponse;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.Server;
+import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.response.GlusterServerListResponse;
+import com.gluster.storage.management.core.response.GlusterServerResponse;
import com.sun.jersey.api.representation.Form;
public class GlusterServersClient extends AbstractClient {
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 9309cdc8..eb5f1f3b 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
@@ -5,10 +5,9 @@ import java.util.List;
import com.gluster.storage.management.core.constants.RESTConstants;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.RunningTask;
-import com.gluster.storage.management.core.model.RunningTaskListResponse;
+import com.gluster.storage.management.core.response.RunningTaskListResponse;
public class RunningTaskClient extends AbstractClient {
- private static final String RESOURCE_NAME = RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
public RunningTaskClient(String securityToken) {
super(securityToken);
@@ -16,7 +15,7 @@ public class RunningTaskClient extends AbstractClient {
@Override
public String getResourceName() {
- return RESOURCE_NAME;
+ return RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
}
@SuppressWarnings("rawtypes")
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 03e83a31..ab462abc 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
@@ -20,15 +20,15 @@
*/
package com.gluster.storage.management.client;
-import java.util.ArrayList;
import java.util.List;
import com.gluster.storage.management.core.constants.RESTConstants;
-import com.gluster.storage.management.core.model.Disk;
-import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
-import com.gluster.storage.management.core.model.GenericResponse;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.model.VolumeOptionInfo;
+import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.response.VolumeListResponse;
+import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse;
import com.sun.jersey.api.representation.Form;
public class VolumesClient extends AbstractClient {
@@ -66,25 +66,37 @@ public class VolumesClient extends AbstractClient {
public Status stopVolume(String volumeName) {
return performOperation(volumeName, RESTConstants.FORM_PARAM_VALUE_STOP);
}
+
+ public VolumeListResponse getAllVolumes() {
+ return (VolumeListResponse) fetchResource(VolumeListResponse.class);
+ }
+ public List<VolumeOptionInfo> getVolumeOptionsDefaults() {
+ VolumeOptionInfoListResponse response = (VolumeOptionInfoListResponse) fetchSubResource(
+ RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS, VolumeOptionInfoListResponse.class);
+ return response.getOptions();
+ }
public static void main(String[] args) {
UsersClient usersClient = new UsersClient();
if (usersClient.authenticate("gluster", "gluster")) {
- VolumesClient VC = new VolumesClient(usersClient.getSecurityToken());
- List<Disk> disks = new ArrayList<Disk>();
- Disk diskElement = new Disk();
- diskElement.setName("sda1");
- diskElement.setStatus(DISK_STATUS.READY);
- disks.add(diskElement);
- diskElement.setName("sda2");
- diskElement.setStatus(DISK_STATUS.READY);
- disks.add(diskElement);
-
- Volume vol = new Volume("vol1", null, Volume.VOLUME_TYPE.PLAIN_DISTRIBUTE, Volume.TRANSPORT_TYPE.ETHERNET,
- Volume.VOLUME_STATUS.ONLINE);
- // vol.setDisks(disks);
- System.out.println(VC.createVolume(vol));
+ VolumesClient client = new VolumesClient(usersClient.getSecurityToken());
+// List<Disk> disks = new ArrayList<Disk>();
+// Disk diskElement = new Disk();
+// diskElement.setName("sda1");
+// diskElement.setStatus(DISK_STATUS.READY);
+// disks.add(diskElement);
+// diskElement.setName("sda2");
+// diskElement.setStatus(DISK_STATUS.READY);
+// disks.add(diskElement);
+//
+// Volume vol = new Volume("vol1", null, Volume.VOLUME_TYPE.PLAIN_DISTRIBUTE, Volume.TRANSPORT_TYPE.ETHERNET,
+// Volume.VOLUME_STATUS.ONLINE);
+// // vol.setDisks(disks);
+// System.out.println(client.createVolume(vol));
+ for (VolumeOptionInfo option : client.getVolumeOptionsDefaults()) {
+ System.out.println(option.getName() + "-" + option.getDescription() + "-" + option.getDefaultValue());
+ }
}
}
}
diff --git a/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF
index b5a2a830..a32970c8 100644
--- a/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF
+++ b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF
@@ -8,5 +8,6 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: com.gluster.storage.management.core.constants,
com.gluster.storage.management.core.exceptions,
com.gluster.storage.management.core.model,
+ com.gluster.storage.management.core.response,
com.gluster.storage.management.core.utils
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
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 fb40be8a..47697eb9 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
@@ -34,4 +34,5 @@ public class RESTConstants {
// 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/model/Alert.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java
new file mode 100644
index 00000000..cfc710df
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java
@@ -0,0 +1,51 @@
+package com.gluster.storage.management.core.model;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "alert")
+public class Alert {
+
+ public enum ALERT_TYPES { CPU_USAGE_ALERT, MEMORY_USAGE_ALERT, DISK_USAGE_ALERT, OFFLINE_VOLUME_DISKS_ALERT, OFFLINE_SERVERS_ALERT };
+ public static final String[] ALERT_TYPE_STR = {"High CPU Usage", "High Memory Usage", "Low Disk Space", "Offline Disks", "Offline Servers" };
+
+ protected String id;
+ protected ALERT_TYPES type;
+ protected String reference;
+ protected String message;
+
+ public String getAlertType( ALERT_TYPES alertType) {
+ return ALERT_TYPE_STR[alertType.ordinal()];
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public ALERT_TYPES getType() {
+ return type;
+ }
+
+ public void setType(ALERT_TYPES type) {
+ this.type = type;
+ }
+
+ public String getReference() {
+ return reference;
+ }
+
+ public void setReference(String reference) {
+ this.reference = reference;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java
new file mode 100644
index 00000000..833ccff3
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java
@@ -0,0 +1,38 @@
+package com.gluster.storage.management.core.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import com.gluster.storage.management.core.response.AbstractResponse;
+
+@XmlRootElement(name = "response")
+public class AlertListResponse extends AbstractResponse {
+ private List<Alert> alerts = new ArrayList<Alert>();
+
+ public AlertListResponse() {
+
+ }
+
+ public AlertListResponse(List<Alert> alerts) {
+ setAlerts(alerts);
+ }
+
+ public void setAlerts(List<Alert> alerts) {
+ this.alerts = alerts;
+ }
+
+ @XmlElementWrapper(name = "alerts")
+ @XmlElement(name = "alert", type=Alert.class)
+ public List<Alert> getAlerts() {
+ return this.alerts;
+ }
+
+ @Override
+ public Object getData() {
+ return getAlerts();
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java
new file mode 100644
index 00000000..8c563f49
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java
@@ -0,0 +1,13 @@
+package com.gluster.storage.management.core.model;
+
+public class AlertStatus {
+ protected String description;
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
index 65d5ebea..1af57266 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java
@@ -29,6 +29,7 @@ public class Cluster extends Entity {
List<Server> discoveredServers = new ArrayList<Server>();
List<Volume> volumes = new ArrayList<Volume>();
List<RunningTask> runningTasks = new ArrayList<RunningTask>();
+ List<Alert> alerts = new ArrayList<Alert>();
public Cluster() {
}
@@ -97,4 +98,16 @@ public class Cluster extends Entity {
public void setRunningTasks(List<RunningTask> runningTasks) {
this.runningTasks = runningTasks;
}
+
+ public List<Alert> getAlerts() {
+ return alerts;
+ }
+
+ public void setAlerts(List<Alert> alerts) {
+ this.alerts = alerts;
+ }
+
+ public void addAlert(Alert alert) {
+ this.alerts.add(alert);
+ }
} \ No newline at end of file
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java
index 612cae31..733527c3 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDataModel.java
@@ -39,4 +39,8 @@ public class GlusterDataModel extends Entity {
public void addCluster(Cluster cluster) {
children.add(cluster);
}
+
+ public Cluster getCluster() {
+ return (Cluster) children.get(0);
+ }
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
index 11d31553..f25999f0 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java
@@ -174,24 +174,24 @@ public class GlusterDummyModel {
}
private void addDisksToVolumes() {
- volume1.addDisk(s1da);
+ volume1.addDisk("server1:sda");
- volume2.addDisk(s2da);
- volume2.addDisk(s1db);
- volume2.addDisk(s3da);
- volume2.addDisk(s4da);
+ volume2.addDisk("server2:sda");
+ volume2.addDisk("server1:sdb");
+ volume2.addDisk("server3:sda");
+ volume2.addDisk("server4:sda");
- volume3.addDisk(s2db);
- volume3.addDisk(s4da);
- volume3.addDisk(s5da);
+ volume3.addDisk("server2:sdb");
+ volume3.addDisk("server4:sda");
+ volume3.addDisk("server5:sda");
- volume4.addDisk(s1da);
- volume4.addDisk(s3da);
- volume4.addDisk(s4da);
- volume4.addDisk(s5db);
+ volume4.addDisk("server1:sda");
+ volume4.addDisk("server3:sda");
+ volume4.addDisk("server4:sda");
+ volume4.addDisk("server5:sdb");
- volume5.addDisk(s2da);
- volume5.addDisk(s5db);
+ volume5.addDisk("server2:sda");
+ volume5.addDisk("server5:sdb");
}
private void initializeGlusterServers(Cluster cluster) {
@@ -245,15 +245,35 @@ public class GlusterDummyModel {
public static List<LogMessage> getDummyLogMessages() {
return logMessages;
}
-
+
+ public Disk getVolumeDisk(String volumeDisk) {
+ List<Disk> allDisks = getReadyDisksOfAllServers();
+ String brickInfo[] = volumeDisk.split(":");
+ for( Disk disk: allDisks) {
+ if (disk.getServerName() == brickInfo[0] && disk.getName() == brickInfo[1]) {
+ return disk;
+ }
+ }
+ return null;
+ }
+
public List<Disk> getReadyDisksOfVolume(Volume volume) {
- List<Disk> disks = new ArrayList<Disk>();
- for (Disk disk : volume.getDisks()) {
- if (disk.isReady()) {
- disks.add(disk);
+// List<Disk> disks = new ArrayList<Disk>();
+// for (Disk disk : volume.getDisks()) {
+// if (disk.isReady()) {
+// disks.add(disk);
+// }
+// }
+// return disks;
+ Disk disk = null;
+ List<Disk> volumeDisks = new ArrayList<Disk>();
+ for (String volumeDisk : volume.getDisks() ) {
+ disk = getVolumeDisk(volumeDisk);
+ if (disk != null && disk.isReady()) {
+ volumeDisks.add(disk);
}
}
- return disks;
+ return volumeDisks;
}
public List<Disk> getReadyDisksOfAllVolumes() {
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java
index 1a9d63f6..9787f1ee 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTask.java
@@ -22,17 +22,23 @@ import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class RunningTask {
-
+ public enum TASK_TYPES { FORMAT_DISK, MIGRATE_DISK, VOLUME_REBALANCE };
+ public String[] TASK_TYPE_STR = {"Formating Disk", "Migrating Disk", "Volume Rebalance"};
+
protected String id;
- protected String type; // FormatDisk, MigrateDisk, VolumeRebalance
- protected Object reference;
- protected String description;
+ protected TASK_TYPES type; // FormatDisk, MigrateDisk, VolumeRebalance
+ protected String reference; // Server: Server name, Volume: Volume name, Disk: disk name referred as "VolumeName:ServerName:DiskName"
+ protected String taskInfo;
protected RunningTaskStatus status; // TODO redefine
public RunningTask() {
}
+ public String getTaskType(TASK_TYPES type) {
+ return TASK_TYPE_STR[type.ordinal()];
+ }
+
public String getId() {
return id;
}
@@ -41,28 +47,28 @@ public class RunningTask {
this.id = id;
}
- public String getType() {
+ public TASK_TYPES getType() {
return type;
}
- public void setType(String type) {
+ public void setType(TASK_TYPES type) {
this.type = type;
}
- public Object getReference() {
+ public String getReference() {
return reference;
}
- public void setReference(Object reference) {
+ public void setReference(String reference) {
this.reference = reference;
}
- public String getDescription() {
- return description;
+ public String getTaskInfo() {
+ return taskInfo;
}
- public void setDescription(String description) {
- this.description = description;
+ public void setTaskInfo(String taskInfo) {
+ this.taskInfo = taskInfo;
}
public RunningTaskStatus getStatus() {
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
index 06d6efe1..c5fdb246 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Status.java
@@ -27,6 +27,8 @@ public class Status {
public static final int STATUS_CODE_SUCCESS = 0;
public static final int STATUS_CODE_FAILURE = 1;
public static final int STATUS_CODE_RUNNING = 2;
+ public static final int STATUS_CODE_PAUSE = 3;
+ public static final int STATUS_CODE_WARNING = 4;
public static final Status STATUS_SUCCESS = new Status(STATUS_CODE_SUCCESS, "Success");
public static final Status STATUS_FAILURE = new Status(STATUS_CODE_FAILURE, "Failure");
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
index a7e498c4..2386bcee 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java
@@ -29,7 +29,6 @@ import java.util.Set;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
-import com.gluster.storage.management.core.model.Disk.DISK_STATUS;
import com.gluster.storage.management.core.utils.StringUtil;
@XmlRootElement
@@ -49,6 +48,7 @@ public class Volume extends Entity {
public enum NAS_PROTOCOL {
GLUSTERFS, NFS
};
+ private static final String OPTION_AUTH_ALLOW = "auth.allow:";
private static final String[] VOLUME_TYPE_STR = new String[] { "Plain Distribute", "Distributed Mirror",
"Distributed Stripe" };
@@ -65,7 +65,7 @@ public class Volume extends Entity {
private Map<String, String> options = new LinkedHashMap<String, String>();
private double totalDiskSpace = 0;
- private List<Disk> disks = new ArrayList<Disk>();
+ private List<String> disks = new ArrayList<String>();
public Volume() {
}
@@ -102,6 +102,17 @@ public class Volume extends Entity {
public void setVolumeType(VOLUME_TYPE volumeType) {
this.volumeType = volumeType;
+ // TODO find a way to get the replica / strip count
+ if (volumeType == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
+ setReplicaCount(0);
+ setStripeCount(3);
+ } else if(volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
+ setReplicaCount(2);
+ setStripeCount(0);
+ } else{
+ setReplicaCount(0);
+ setStripeCount(0);
+ }
}
public TRANSPORT_TYPE getTransportType() {
@@ -163,7 +174,7 @@ public class Volume extends Entity {
}
public String getAccessControlList() {
- return accessControlList;
+ return options.get(OPTION_AUTH_ALLOW);
}
public void setAccessControlList(String accessControlList) {
@@ -186,26 +197,27 @@ public class Volume extends Entity {
return totalDiskSpace;
}
- public List<Disk> getDisks() {
+ public List<String> getDisks() {
return disks;
}
- public void addDisk(Disk disk) {
- if (disks.add(disk) && disk.getStatus() != DISK_STATUS.OFFLINE) {
- totalDiskSpace += disk.getSpace();
- }
+ public void addDisk(String disk) {
+// if (disks.add(disk) && disk.getStatus() != DISK_STATUS.OFFLINE) {
+// totalDiskSpace += disk.getSpace();
+// }
+ disks.add(disk);
}
- public void addDisks(List<Disk> disks) {
- for (Disk disk : disks) {
+ public void addDisks(List<String> disks) {
+ for (String disk : disks) {
addDisk(disk);
}
}
- public void removeDisk(Disk disk) {
- if (disks.remove(disk)) {
- totalDiskSpace -= disk.getSpace();
- }
+ public void removeDisk(String disk) {
+// if (disks.remove(disk)) {
+// totalDiskSpace -= disk.getSpace();
+// }
}
public void removeAllDisks() {
@@ -213,7 +225,7 @@ public class Volume extends Entity {
totalDiskSpace = 0;
}
- public void setDisks(List<Disk> disks) {
+ public void setDisks(List<String> disks) {
removeAllDisks();
addDisks(disks);
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/AbstractResponse.java
index be552bdc..9a6a48f5 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AbstractResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/AbstractResponse.java
@@ -16,7 +16,10 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
+
+import com.gluster.storage.management.core.model.Response;
+import com.gluster.storage.management.core.model.Status;
public abstract class AbstractResponse implements Response {
private Status status;
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GenericResponse.java
index efeed34b..6c8e87b5 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GenericResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GenericResponse.java
@@ -18,10 +18,12 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*/
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import javax.xml.bind.annotation.XmlRootElement;
+import com.gluster.storage.management.core.model.Status;
+
@XmlRootElement(name = "response")
public class GenericResponse<T> extends AbstractResponse {
private T data;
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerListResponse.java
index 479dcc09..4c291a33 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerListResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerListResponse.java
@@ -18,7 +18,7 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*/
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import java.util.ArrayList;
import java.util.List;
@@ -28,6 +28,9 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
+import com.gluster.storage.management.core.model.GlusterServer;
+import com.gluster.storage.management.core.model.Status;
+
/**
*
*/
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerResponse.java
index e00b8288..7af9b240 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServerResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/GlusterServerResponse.java
@@ -1,8 +1,11 @@
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
+import com.gluster.storage.management.core.model.GlusterServer;
+import com.gluster.storage.management.core.model.Status;
+
@XmlRootElement(name = "response")
public class GlusterServerResponse extends AbstractResponse {
private GlusterServer glusterServer;
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/RunningTaskListResponse.java
index 79949c90..73dc074a 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/RunningTaskListResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/RunningTaskListResponse.java
@@ -1,4 +1,4 @@
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import java.util.ArrayList;
import java.util.List;
@@ -7,6 +7,9 @@ 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.RunningTask;
+import com.gluster.storage.management.core.model.Status;
+
@XmlRootElement(name = "response")
public class RunningTaskListResponse extends AbstractResponse {
private List<RunningTask> runningTasks = new ArrayList<RunningTask>();
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/ServerListResponse.java
index 56f33992..16059b15 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ServerListResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/ServerListResponse.java
@@ -16,7 +16,7 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import java.util.ArrayList;
import java.util.List;
@@ -26,6 +26,9 @@ import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
+import com.gluster.storage.management.core.model.Server;
+import com.gluster.storage.management.core.model.Status;
+
@XmlRootElement(name = "response")
public class ServerListResponse extends AbstractResponse {
private List<Server> servers = new ArrayList<Server>();
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java
index 3304692d..f94884b9 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/StringListResponse.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/StringListResponse.java
@@ -16,7 +16,7 @@
* along with this program. If not, see
* <http://www.gnu.org/licenses/>.
*******************************************************************************/
-package com.gluster.storage.management.core.model;
+package com.gluster.storage.management.core.response;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeListResponse.java
new file mode 100644
index 00000000..fc1c9a6c
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeListResponse.java
@@ -0,0 +1,46 @@
+package com.gluster.storage.management.core.response;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.model.Volume;
+
+@XmlRootElement(name = "response")
+public class VolumeListResponse extends AbstractResponse {
+ private List<Volume> volumes = new ArrayList<Volume>();
+
+ public VolumeListResponse() {
+
+ }
+
+ public VolumeListResponse(Status status, List<Volume> volumes) {
+ setStatus(status);
+ setVolumes(volumes);
+ }
+
+ @XmlElementWrapper(name = "volumes")
+ @XmlElement(name = "volume", type = Volume.class)
+ public List<Volume> getVolumes() {
+ return this.volumes;
+ }
+
+ /**
+ * @param volumes
+ * volumes to set
+ */
+ public void setVolumes(List<Volume> volumes) {
+ this.volumes = volumes;
+ }
+
+ @Override
+ @XmlTransient
+ public Object getData() {
+ return this.volumes;
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeOptionInfoListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeOptionInfoListResponse.java
new file mode 100644
index 00000000..629ccbee
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/VolumeOptionInfoListResponse.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * 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.response;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.model.VolumeOptionInfo;
+
+@XmlRootElement(name = "response")
+public class VolumeOptionInfoListResponse extends AbstractResponse {
+ private List<VolumeOptionInfo> options = new ArrayList<VolumeOptionInfo>();
+
+ public VolumeOptionInfoListResponse() {
+ }
+
+ public VolumeOptionInfoListResponse(Status status, List<VolumeOptionInfo> options) {
+ setStatus(status);
+ setOptions(options);
+ }
+
+ @XmlElementWrapper(name = "volumeOptionDefaults")
+ @XmlElement(name = "volumeOption", type=VolumeOptionInfo.class)
+ public List<VolumeOptionInfo> getOptions() {
+ return options;
+ }
+
+ /**
+ * @param options
+ * the options to set
+ */
+ public void setOptions(List<VolumeOptionInfo> options) {
+ this.options = options;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.gluster.storage.management.core.model.Response#getData()
+ */
+ @Override
+ @XmlTransient
+ public List<VolumeOptionInfo> getData() {
+ return getOptions();
+ }
+}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
index d8de2e20..e8e27d9b 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
@@ -24,27 +24,35 @@ import java.util.ArrayList;
import java.util.List;
import com.gluster.storage.management.core.constants.CoreConstants;
+import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Disk;
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.TRANSPORT_TYPE;
+import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE;
-/**
- *
- */
public class GlusterUtil {
private static final String HOSTNAME_PFX = "Hostname:";
private static final String UUID_PFX = "Uuid:";
private static final String STATE_PFX = "State:";
private static final String GLUSTER_SERVER_STATUS_ONLINE = "Connected";
+
+ private static final String VOLUME_NAME_PFX = "Volume Name:";
+ private static final String VOLUME_TYPE_PFX = "Type:";
+ private static final String VOLUME_STATUS_PFX = "Status:";
+ private static final String VOLUME_TRANSPORT_TYPE_PFX = "Transport-type:";
+ private static final String VOLUME_BRICKS_GROUP_PFX = "Bricks"; // Colon not used
+ private static final String VOLUME_OPTIONS_RECONFIG_PFX = "Options Reconfigured";
+
private static final ProcessUtil processUtil = new ProcessUtil();
/**
- * Extract value of given token from given line. It is assumed that the token, if present, will be of the following
- * form: <code>token: value</code>
+ * Extract value of given token from given line. It is assumed that the
+ * token, if present, will be of the following form:
+ * <code>token: value</code>
*
* @param line
* Line to be analyzed
@@ -74,11 +82,13 @@ public class GlusterUtil {
// Host and UUID is found, we should look for state
String state = extractToken(line, STATE_PFX);
if (state != null) {
- server.setStatus(state.contains(GLUSTER_SERVER_STATUS_ONLINE) ? SERVER_STATUS.ONLINE
+ server.setStatus(state
+ .contains(GLUSTER_SERVER_STATUS_ONLINE) ? SERVER_STATUS.ONLINE
: SERVER_STATUS.OFFLINE);
- // Completed populating current server. Add it to the list and reset all related variables.
+ // Completed populating current server. Add it to the list
+ // and reset all related variables.
glusterServers.add(server);
-
+
foundHost = false;
foundUuid = false;
server = null;
@@ -107,11 +117,11 @@ public class GlusterUtil {
}
public List<String> getGlusterServerNames() {
- String output = getPeerStatus();
- if(output == null) {
+ String output = getPeerStatus();
+ if (output == null) {
return null;
}
-
+
List<String> glusterServerNames = new ArrayList<String>();
for (String line : output.split(CoreConstants.NEWLINE)) {
String hostName = extractToken(line, HOSTNAME_PFX);
@@ -124,7 +134,8 @@ public class GlusterUtil {
private String getPeerStatus() {
String output;
- ProcessResult result = processUtil.executeCommand("gluster", "peer", "status");
+ ProcessResult result = processUtil.executeCommand("gluster", "peer",
+ "status");
if (!result.isSuccess()) {
output = null;
}
@@ -133,53 +144,57 @@ public class GlusterUtil {
}
public ProcessResult addServer(String serverName) {
- return processUtil.executeCommand("gluster", "peer", "probe", serverName);
+ return processUtil.executeCommand("gluster", "peer", "probe",
+ serverName);
}
-
public ProcessResult startVolume(String volumeName) {
- return processUtil.executeCommand("gluster", "volume", "start", volumeName);
+ return processUtil.executeCommand("gluster", "volume", "start",
+ volumeName);
}
public ProcessResult stopVolume(String volumeName) {
- return processUtil.executeCommand("gluster", "--mode=script", "volume", "stop", volumeName);
+ return processUtil.executeCommand("gluster", "--mode=script", "volume",
+ "stop", volumeName);
}
public ProcessResult createVolume(Volume volume, List<String> bricks) {
int count=1; // replica or stripe count
String volumeType = null;
- VOLUME_TYPE volType = volume.getVolumeType();
- if(volType == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
+ VOLUME_TYPE volType = volume.getVolumeType();
+ if (volType == VOLUME_TYPE.DISTRIBUTED_MIRROR) {
volumeType = "replica";
count = 2;
- } else if(volType == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
+ } else if (volType == VOLUME_TYPE.DISTRIBUTED_STRIPE) {
volumeType = "stripe";
count = 4;
}
-
+
String transportTypeStr = null;
TRANSPORT_TYPE transportType = volume.getTransportType();
- transportTypeStr = (transportType == TRANSPORT_TYPE.ETHERNET) ? "tcp" : "rdma";
-
+ transportTypeStr = (transportType == TRANSPORT_TYPE.ETHERNET) ? "tcp"
+ : "rdma";
+
List<String> command = new ArrayList<String>();
command.add("gluster");
command.add("volume");
command.add("create");
command.add(volume.getName());
- if(volumeType != null) {
+ if (volumeType != null) {
command.add(volumeType);
command.add("" + count);
}
command.add("transport");
command.add(transportTypeStr);
command.addAll(bricks);
+
return processUtil.executeCommand(command);
}
-
+
public ProcessResult setOption(List<String> command) {
return processUtil.executeCommand(command);
}
-
+
public ProcessResult setVolumeAccessControl(Volume volume) {
List<String> command = new ArrayList<String>();
command.add("gluster");
@@ -190,9 +205,96 @@ public class GlusterUtil {
command.add(volume.getAccessControlList());
return setOption(command);
}
+
+ private String getVolumeInfo() {
+ ProcessResult result = new ProcessUtil().executeCommand("gluster", "volume", "info");
+ if (!result.isSuccess()) {
+ throw new GlusterRuntimeException("Command [gluster volume info] failed with error: ["
+ + result.getExitValue() + "][" + result.getOutput() + "]");
+ }
+ return result.getOutput();
+ }
+ public List<Volume> getAllVolumes() {
+ String volumeInfoText = getVolumeInfo();
+
+ List<Volume> volumes = new ArrayList<Volume>();
+ boolean isBricksGroupFound = false;
+ boolean isOptionReconfigFound = false;
+ Volume volume = null;
+
+ for (String line : volumeInfoText.split(CoreConstants.NEWLINE)) {
+ String volumeName = extractToken(line, VOLUME_NAME_PFX);
+ if (volumeName != null) {
+ if (volume != null) {
+ // add the previously read volume to volume list
+ volumes.add(volume);
+ }
+
+ // prepare next volume to be read
+ volume = new Volume();
+ volume.setName(volumeName);
+ isBricksGroupFound = isOptionReconfigFound = false;
+ continue;
+ }
+
+ String volumeType = extractToken(line, VOLUME_TYPE_PFX);
+ if (volumeType != null) {
+ volume.setVolumeType((volumeType == "Distribute") ? VOLUME_TYPE.PLAIN_DISTRIBUTE
+ : VOLUME_TYPE.DISTRIBUTED_MIRROR); // TODO: for Stripe
+ continue;
+ }
+
+ String volumeStatus = extractToken(line, VOLUME_STATUS_PFX);
+ if (volumeStatus != null) {
+ volume.setStatus(volumeStatus.equals("Started") ? VOLUME_STATUS.ONLINE : VOLUME_STATUS.OFFLINE);
+ continue;
+ }
+
+ String transportType = extractToken(line, VOLUME_TRANSPORT_TYPE_PFX);
+ if (transportType != null) {
+ volume.setTransportType(transportType.equals("tcp") ? TRANSPORT_TYPE.ETHERNET
+ : TRANSPORT_TYPE.INFINIBAND);
+ continue;
+ }
+
+ if (extractToken(line, VOLUME_BRICKS_GROUP_PFX) != null) {
+ isBricksGroupFound = true;
+ continue;
+ }
+
+ if (isBricksGroupFound) {
+ if (line.matches("Brick[0-9]+:.*")) {
+ volume.addDisk(line.split(":")[2].trim().split("/")[2].trim()); // line: "Brick1: server1:/export/md0/volume-name"
+ continue;
+ } else {
+ isBricksGroupFound = false;
+ }
+ }
+
+ if (extractToken(line, VOLUME_OPTIONS_RECONFIG_PFX) != null) {
+ isOptionReconfigFound = true;
+ continue;
+ }
+
+ if (isOptionReconfigFound) {
+ if(line.matches("^[^:]*:[^:]*$")) {
+ String[] parts = line.split(":");
+ volume.setOption(parts[0].trim(), parts[1].trim());
+ } else {
+ isOptionReconfigFound = false;
+ }
+ }
+ }
+
+ if (volume != null) {// Adding the last volume parsed
+ volumes.add(volume);
+ }
+ return volumes;
+ }
+
public static void main(String args[]) {
- List<String> names = new GlusterUtil().getGlusterServerNames();
- System.out.println(names);
+// List<String> names = new GlusterUtil().getGlusterServerNames();
+// System.out.println(names);
}
}
diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java
index 1c4e6893..45f4c436 100644
--- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/StringUtil.java
@@ -25,4 +25,8 @@ public class StringUtil {
: sourceString.toLowerCase().contains(
filterString.toLowerCase());
}
+
+ public static String removeSpaces(String str) {
+ return str.replaceAll("\\s+", "");
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
index 4aa387bc..adc98f98 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java
@@ -19,9 +19,11 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeSelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
@@ -37,6 +39,20 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe
protected Entity selectedEntity;
@Override
+ public void run(final IAction action) {
+ // Real action code must be executed using Display#asyncExec. Otherwise the system can hang when opening new
+ // dialog boxes on linux platform
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ performAction(action);
+ }
+ });
+ }
+
+ abstract protected void performAction(IAction action);
+
+ @Override
public void selectionChanged(IAction action, ISelection selection) {
if (selection instanceof StructuredSelection) {
Entity selectedEntity = (Entity) ((StructuredSelection) selection).getFirstElement();
@@ -46,7 +62,7 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe
return;
}
- if(selectedEntity != null) {
+ if (selectedEntity != null) {
this.selectedEntity = selectedEntity;
}
}
@@ -56,4 +72,27 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe
public void init(IWorkbenchWindow window) {
this.window = window;
}
+
+ private Shell getShell() {
+ if(window == null) {
+ return Display.getDefault().getActiveShell();
+ }
+ return window.getShell();
+ }
+
+ protected void showInfoDialog(final String title, final String message) {
+ MessageDialog.openInformation(getShell(), title, message);
+ }
+
+ protected void showWarningDialog(final String title, final String message) {
+ MessageDialog.openWarning(getShell(), title, message);
+ }
+
+ protected void showErrorDialog(final String title, final String message) {
+ MessageDialog.openError(getShell(), title, message);
+ }
+
+ protected synchronized boolean showConfirmDialog(final String title, final String message) {
+ return MessageDialog.openQuestion(getShell(), title, message);
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
index 7957b6f0..7d76d0ec 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
@@ -19,21 +19,20 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.GlusterServersClient;
import com.gluster.storage.management.core.model.Entity;
import com.gluster.storage.management.core.model.EntityGroup;
-import com.gluster.storage.management.core.model.GlusterServerResponse;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.response.GlusterServerResponse;
public class AddServerAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
+ final String actionDesc = action.getDescription();
GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
GlusterServersClient glusterServersClient = new GlusterServersClient(modelManager.getSecurityToken());
Server server = (Server) selectedEntity;
@@ -41,12 +40,10 @@ public class AddServerAction extends AbstractActionDelegate {
if (response.getStatus().isSuccess()) {
modelManager.removeDiscoveredServer(server);
modelManager.addGlusterServer(response.getGlusterServer());
- new MessageDialog(Display.getDefault().getActiveShell(), "Add Server", null, "Server [" + server.getName()
- + "] added successfully!", MessageDialog.INFORMATION, new String[] { "OK" }, 0).open();
+ showInfoDialog(actionDesc, "Server [" + server.getName() + "] added successfully!");
} else {
- new MessageDialog(Display.getDefault().getActiveShell(), "Add Server", null, "Server [" + server.getName()
- + " could not be added to cluster! Error: [" + response.getStatus().getMessage() + "]",
- MessageDialog.ERROR, new String[] { "OK" }, 0).open();
+ showErrorDialog(actionDesc, "Server [" + server.getName() + " could not be added to cluster! Error: ["
+ + response.getStatus().getMessage() + "]");
}
}
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 266db0af..9ec500bc 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
@@ -29,7 +29,7 @@ import com.gluster.storage.management.gui.dialogs.CreateVolumeWizard;
public class CreateVolumeAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
Display.getDefault().asyncExec(new Runnable() {
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
index b4b92c31..82ac1663 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java
@@ -22,7 +22,7 @@ import org.eclipse.jface.action.IAction;
public class DeleteVolumeAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
System.out.println("Running [" + this.getClass().getSimpleName() + "]");
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/EditVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/EditVolumeAction.java
index 6f3fdf24..0f7f14b7 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/EditVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/EditVolumeAction.java
@@ -22,7 +22,7 @@ import org.eclipse.jface.action.IAction;
public class EditVolumeAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
System.out.println("Running [" + this.getClass().getSimpleName() + "]");
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
index 75be4e6b..04ee39fb 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java
@@ -32,7 +32,7 @@ public class MigrateDiskAction extends AbstractActionDelegate {
private Disk disk;
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
// MigrateDiskDialog dialog = new MigrateDiskDialog(window.getShell(), volume, disk);
// dialog.create();
// dialog.open();
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateVolumeAction.java
index 97f1c79b..aea7ea66 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateVolumeAction.java
@@ -22,7 +22,7 @@ import org.eclipse.jface.action.IAction;
public class MigrateVolumeAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
System.out.println("Running [" + this.getClass().getSimpleName() + "]");
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PreferencesAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PreferencesAction.java
index f6fd88e4..9da1cbf1 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PreferencesAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PreferencesAction.java
@@ -29,7 +29,7 @@ public class PreferencesAction extends AbstractActionDelegate {
}
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
ActionFactory.PREFERENCES.create(window).run();
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
index 65227b0b..5339beb0 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java
@@ -22,7 +22,7 @@ import org.eclipse.jface.action.IAction;
public class RebalanceVolumeAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
System.out.println("Running [" + this.getClass().getSimpleName() + "]");
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
index d5d42363..b7ed0548 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
@@ -19,13 +19,10 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
public class RemoveServerAction extends AbstractActionDelegate {
@Override
- public void run(IAction action) {
+ protected void performAction(IAction action) {
System.out.println("Running [" + this.getClass().getSimpleName() + "]");
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java
index cc0fbe94..34080f76 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java
@@ -19,9 +19,7 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.VolumesClient;
@@ -34,7 +32,7 @@ public class StartVolumeAction extends AbstractActionDelegate {
private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
@Override
- public void run(final IAction action) {
+ protected void performAction(IAction action) {
if (volume.getStatus() == VOLUME_STATUS.ONLINE) {
return; // Volume already online. Don't do anything.
}
@@ -42,23 +40,13 @@ public class StartVolumeAction extends AbstractActionDelegate {
VolumesClient client = new VolumesClient(modelManager.getSecurityToken());
final Status status = client.startVolume(volume.getName());
final String actionDesc = action.getDescription();
- final Display display = Display.getDefault();
- display.asyncExec(new Runnable() {
-
- @Override
- public void run() {
- if (status.isSuccess()) {
- new MessageDialog(display.getActiveShell(), actionDesc, null, "Volume ["
- + volume.getName() + "] started successfully!", MessageDialog.INFORMATION,
- new String[] { "OK" }, 0).open();
- modelManager.updateVolumeStatus(volume, VOLUME_STATUS.ONLINE);
- } else {
- new MessageDialog(display.getActiveShell(), actionDesc, null, "Volume ["
- + volume.getName() + "] could not be started! Error: [" + status + "]",
- MessageDialog.ERROR, new String[] { "OK" }, 0).open();
- }
- }
- });
+ if (status.isSuccess()) {
+ showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] started successfully!");
+ modelManager.updateVolumeStatus(volume, VOLUME_STATUS.ONLINE);
+ } else {
+ showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] could not be started! Error: ["
+ + status + "]");
+ }
}
@Override
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java
index a89782f9..21ea4339 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java
@@ -19,9 +19,7 @@
package com.gluster.storage.management.gui.actions;
import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.VolumesClient;
@@ -32,42 +30,45 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS;
public class StopVolumeAction extends AbstractActionDelegate {
private Volume volume;
private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
-
+
@Override
- public void run(IAction action) {
- if(volume.getStatus() == VOLUME_STATUS.OFFLINE) {
+ protected void performAction(IAction action) {
+ final String actionDesc = action.getDescription();
+ if (volume.getStatus() == VOLUME_STATUS.OFFLINE) {
+ showWarningDialog(actionDesc, "Volume [" + volume.getName() + "] is already offline!");
return; // Volume already offline. Don't do anything.
}
-
- VolumesClient client = new VolumesClient(modelManager.getSecurityToken());
- final Status status = client.stopVolume(volume.getName());
- final String actionDesc = action.getDescription();
- final Display display = Display.getDefault();
-
- display.asyncExec(new Runnable() {
-
- @Override
- public void run() {
- if (status.isSuccess()) {
- new MessageDialog(Display.getCurrent().getActiveShell(), actionDesc, null, "Volume ["
- + volume.getName() + "] stopped successfully!", MessageDialog.INFORMATION, new String[] { "OK" }, 0)
- .open();
- modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE);
- } else {
- new MessageDialog(Display.getCurrent().getActiveShell(), actionDesc, null, "Volume ["
- + volume.getName() + "] could not be stopped! Error: [" + status + "]", MessageDialog.ERROR,
- new String[] { "OK" }, 0).open();
- }
- }
- });
+
+ boolean confirmed = showConfirmDialog(actionDesc,
+ "Are you sure you want to stop the volume [" + volume.getName() + "] ?");
+ if (!confirmed) {
+ return;
+ }
+
+ final Status status = stopVolume();
+ if (status.isSuccess()) {
+ showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] stopped successfully!");
+ modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE);
+ } else {
+ showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] could not be stopped! Error: [" + status
+ + "]");
+ }
+ }
+
+ private Status stopVolume() {
+ return new VolumesClient(modelManager.getSecurityToken()).stopVolume(volume.getName());
}
@Override
public void dispose() {
}
-
- /* (non-Javadoc)
- * @see com.gluster.storage.management.gui.actions.AbstractActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * com.gluster.storage.management.gui.actions.AbstractActionDelegate#selectionChanged(org.eclipse.jface.action.IAction
+ * , org.eclipse.jface.viewers.ISelection)
*/
@Override
public void selectionChanged(IAction action, ISelection selection) {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java
index 80811226..c78601d9 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeDisksPage.java
@@ -291,13 +291,26 @@ public class CreateVolumeDisksPage extends Composite {
setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
}
-
+
+
public List<Disk> getChosenDisks() {
Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer);
if (disksArr != null) {
List<Disk> disks = new ArrayList<Disk>();
for (Object disk : disksArr) {
- disks.add((Disk) disk);
+ disks.add( (Disk)disk );
+ }
+ return disks;
+ }
+ return null;
+ }
+
+ public List<String> getChosenBricks() {
+ Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer);
+ if (disksArr != null) {
+ List<String> disks = new ArrayList<String>();
+ for (Object disk : disksArr) {
+ disks.add( ((Disk)disk).getServerName() + ":" + ((Disk)disk).getName() ); // Format: Server:disk
}
return disks;
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
index d919fd84..b09bbb44 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumePage1.java
@@ -18,6 +18,7 @@
*******************************************************************************/
package com.gluster.storage.management.gui.dialogs;
+import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -73,7 +74,15 @@ public class CreateVolumePage1 extends WizardPage {
// by default, we create volume with all available disks
allDisks = GlusterDataModelManager.getInstance().getReadyDisksOfAllServers();
- volume.setDisks(allDisks);
+ volume.setDisks(getBricks(allDisks)); // volume.setDisks(allDisks);
+ }
+
+ private List<String> getBricks(List<Disk> allDisks) {
+ List<String> disks = new ArrayList<String>();
+ for(Disk disk: allDisks) {
+ disks.add(disk.getServerName() + ":" + disk.getName());
+ }
+ return disks;
}
private class ValidationListener implements ModifyListener {
@@ -206,7 +215,7 @@ public class CreateVolumePage1 extends WizardPage {
dialog.create();
if(dialog.open() == Window.OK) {
// user has customized disks. get them from the dialog box.
- volume.setDisks(dialog.getSelectedDisks());
+ volume.setDisks(dialog.getSelectedBricks());
linkCustomize.setText("" + volume.getDisks().size() + " Disk(s) (<a>customize</a>)");
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
index 7dc0b03d..f484a346 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java
@@ -166,7 +166,7 @@ public class MigrateDiskPage1 extends WizardPage {
GlusterDummyModel glusterDummyModel = GlusterDummyModel.getInstance();
List<Disk> fromDisks = glusterDummyModel.getReadyDisksOfVolume(volume);
- List<Disk> toDisks = glusterDummyModel.getReadyDisksOfAllServersExcluding(volume.getDisks());
+ List<Disk> toDisks = glusterDummyModel.getReadyDisksOfAllServersExcluding( glusterDummyModel.getReadyDisksOfVolume(volume));
TableViewer tableViewerFrom = createTableViewer(container, diskLabelProvider, fromDisks, txtFilterFrom);
if(fromDisk != null) {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
index 10a36fb0..0ec19d5b 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java
@@ -18,6 +18,7 @@
*******************************************************************************/
package com.gluster.storage.management.gui.dialogs;
+import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.Dialog;
@@ -47,11 +48,24 @@ public class SelectDisksDialog extends Dialog {
*
* @param parentShell
*/
- public SelectDisksDialog(Shell parentShell, List<Disk> allDisks, List<Disk> selectedDisks) {
+ public SelectDisksDialog(Shell parentShell, List<Disk> allDisks, List<String> selectedDisks) {
super(parentShell);
setShellStyle(getShellStyle() | SWT.RESIZE);
this.allDisks = allDisks;
- this.selectedDisks = selectedDisks;
+ this.selectedDisks = getSelectedDisks(allDisks, selectedDisks);
+ }
+
+ private List<Disk> getSelectedDisks(List<Disk> allDisks, List<String> selectedDisks) {
+ List<Disk> disks = new ArrayList<Disk>();
+ for (String selectedDisk : selectedDisks) {
+ for (Disk disk : disks) {
+ String brick[] = selectedDisk.split(":");
+ if (disk.getServerName() == brick[0] && disk.getName() == brick[1]) {
+ disks.add(disk);
+ }
+ }
+ }
+ return disks;
}
/**
@@ -64,12 +78,14 @@ public class SelectDisksDialog extends Dialog {
Composite container = new Composite(parent, SWT.NONE);
GridLayout containerLayout = new GridLayout(2, false);
container.setLayout(containerLayout);
- GridData containerLayoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+ GridData containerLayoutData = new GridData(SWT.FILL, SWT.FILL, true,
+ true);
container.setLayoutData(containerLayoutData);
getShell().setText("Create Volume - Select Disks");
-
- disksPage = new CreateVolumeDisksPage(container, SWT.NONE, allDisks, selectedDisks);
+
+ disksPage = new CreateVolumeDisksPage(container, SWT.NONE, allDisks,
+ selectedDisks);
return container;
}
@@ -81,8 +97,10 @@ public class SelectDisksDialog extends Dialog {
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
- createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true);
- createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
+ true);
+ createButton(parent, IDialogConstants.CANCEL_ID,
+ IDialogConstants.CANCEL_LABEL, false);
}
/**
@@ -100,14 +118,19 @@ public class SelectDisksDialog extends Dialog {
@Override
protected void okPressed() {
- if (this.getSelectedDisks().size() == 0 ) {
- MessageDialog.openError(getShell(), "Select Disk(s)", "Please select atlease one disk");
+ if (this.getSelectedDisks().size() == 0) {
+ MessageDialog.openError(getShell(), "Select Disk(s)",
+ "Please select atlease one disk");
} else {
super.okPressed();
}
}
-
+
public List<Disk> getSelectedDisks() {
- return disksPage.getChosenDisks();
+ return disksPage.getChosenDisks();
+ }
+
+ public List<String> getSelectedBricks() {
+ return disksPage.getChosenBricks();
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java
index cbf6736b..57065928 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java
@@ -4,6 +4,8 @@ import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
+import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.model.GlusterDataModel;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.gui.utils.GUIHelper;
import com.gluster.storage.management.gui.views.details.DisksPage;
@@ -27,7 +29,7 @@ public class VolumeDisksView extends ViewPart {
* @param parent
*/
private void createPage(Composite parent) {
- page = new DisksPage(parent, SWT.NONE, getSite(), volume.getDisks());
+ page = new DisksPage(parent, SWT.NONE, getSite(), GlusterDataModelManager.getInstance().getReadyDisksOfVolume(volume));
parent.layout(); // IMP: lays out the form properly
}
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 9477e170..5950bd38 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
@@ -30,7 +30,7 @@ import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.part.ViewPart;
-import com.gluster.storage.management.core.constants.CoreConstants;
+import com.gluster.storage.management.core.model.Alert;
import com.gluster.storage.management.core.model.EntityGroup;
import com.gluster.storage.management.core.model.Cluster;
import com.gluster.storage.management.core.model.GlusterDataModel;
@@ -50,7 +50,12 @@ public class VolumesSummaryView extends ViewPart {
private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
private ScrolledForm form;
private EntityGroup<Volume> volumes;
-
+
+ private static final String ALERTS = "Alerts";
+ private static final String RUNNING_TASKS = "Running Tasks";
+ private static final String VOLUMES_SUMMARY = "Volumes - Summary";
+ private static final String AVAILABILITY = "Availability";
+
/*
* (non-Javadoc)
*
@@ -61,55 +66,66 @@ public class VolumesSummaryView extends ViewPart {
if (volumes == null) {
Object selectedObj = guiHelper.getSelectedEntity(getSite(), EntityGroup.class);
if (selectedObj != null && ((EntityGroup) selectedObj).getEntityType() == Volume.class) {
- volumes = (EntityGroup<Volume>)selectedObj;
+ volumes = (EntityGroup<Volume>) selectedObj;
}
}
-
+
createSections(parent);
}
private void createSections(Composite parent) {
- form = guiHelper.setupForm(parent, toolkit, "Volumes - Summary");
+ form = guiHelper.setupForm(parent, toolkit, VOLUMES_SUMMARY);
createSummarySection();
createRunningTasksSection();
createAlertsSection();
-
+
parent.layout(); // IMP: lays out the form properly
}
-
+
private void createAlertsSection() {
- Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false);
+ Composite section = guiHelper.createSection(form, toolkit, ALERTS, null, 1, false);
+ // toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here.");
- toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here.");
+ Cluster cluster = GlusterDataModelManager.getInstance().getModel().getCluster();
+ List<Alert> alerts = cluster.getAlerts();
+ for (Alert alert : alerts) {
+ if (alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT ||
+ alert.getType() == Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT) {
+ toolkit.createLabel(section, alert.getMessage());
+ }
+ }
}
private void createRunningTasksSection() {
- Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false);
-
- GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
- GlusterDataModel model = modelManager.getModel();
- Cluster cluster = (Cluster) model.getChildren().get(0); // Assume the first/root node of the model is cluster (invisible)
-
- List<RunningTask> runningTasks = cluster.getRunningTasks();
- String taskMessage = "";
- for(RunningTask task : runningTasks) {
- if (task.getStatus().isPercentageSupported()) {
- //TODO Progress bar
+ Composite section = guiHelper.createSection(form, toolkit, RUNNING_TASKS, null, 1, false);
+
+ List<RunningTask> runningTasks = GlusterDataModelManager.getInstance().getModel().getCluster().getRunningTasks();
+
+ for (RunningTask task : runningTasks) {
+ if (task.getType() == RunningTask.TASK_TYPES.MIGRATE_DISK
+ || task.getType() == RunningTask.TASK_TYPES.VOLUME_REBALANCE) {
+ if (task.getStatus().isPercentageSupported()) {
+ // TODO Progress bar
+ }
+ toolkit.createLabel(section, task.getTaskInfo());
}
- //TODO show different labels for each task
- taskMessage = taskMessage + CoreConstants.NEWLINE + task.getDescription();
}
- toolkit.createLabel(section, taskMessage);
}
private void createSummarySection() {
- Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false);
+ Composite section = guiHelper.createSection(form, toolkit, AVAILABILITY, null, 2, false);
+
+ // Cluster cluster = GlusterDataModelManager.getInstance().getModel().getCluster();
+
+ GlusterDataModel model = GlusterDataModelManager.getInstance().getModel();
+ Cluster cluster = (Cluster) model.getChildren().get(0);
Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)),
Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.OFFLINE)) };
createStatusChart(toolkit, section, values);
}
-
+
+ @SuppressWarnings("unchecked")
private int getVolumeCountByStatus(EntityGroup<Volume> volumes, VOLUME_STATUS status) {
int count = 0;
for (Volume volume : (List<Volume>) volumes.getEntities()) {
@@ -130,7 +146,7 @@ public class VolumesSummaryView extends ViewPart {
data.heightHint = 250;
chartViewerComposite.setLayoutData(data);
}
-
+
/*
* (non-Javadoc)
*
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
index 3e5382cc..7f78829e 100644
--- 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
@@ -34,6 +34,7 @@ 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;
@@ -247,7 +248,7 @@ public class VolumeTabCreator implements TabCreator {
private void createVolumeDisksTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) {
Composite volumeDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.VOLUME);
- DisksPage page = new DisksPage(volumeDisksTab, SWT.NONE, site, volume.getDisks());
+ DisksPage page = new DisksPage(volumeDisksTab, SWT.NONE, site, GlusterDataModelManager.getInstance().getReadyDisksOfVolume(volume));
volumeDisksTab.layout(); // IMP: lays out the form properly
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/constants/VolumeOptionsDefaults.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/constants/VolumeOptionsDefaults.java
index 384038f4..4093a4ee 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/constants/VolumeOptionsDefaults.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/constants/VolumeOptionsDefaults.java
@@ -23,25 +23,23 @@ package com.gluster.storage.management.server.constants;
import java.util.ArrayList;
import java.util.List;
-import javax.xml.bind.annotation.XmlElement;
-import javax.xml.bind.annotation.XmlElementWrapper;
-import javax.xml.bind.annotation.XmlRootElement;
+import org.springframework.stereotype.Component;
import com.gluster.storage.management.core.constants.CoreConstants;
import com.gluster.storage.management.core.model.VolumeOptionInfo;
-@XmlRootElement
+@Component
public class VolumeOptionsDefaults {
- @XmlElementWrapper(name = "volumeOptions")
- @XmlElement(name = "volumeOption", type = VolumeOptionInfo.class)
public List<VolumeOptionInfo> options;
-
+
public VolumeOptionsDefaults() {
}
-
- public VolumeOptionsDefaults getDefaults() {
- options = getVolumeOptionsInfo();
- return this;
+
+ /**
+ * @return list of volume option information objects
+ */
+ public List<VolumeOptionInfo> getDefaults() {
+ return getVolumeOptionsInfo();
}
/**
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
new file mode 100644
index 00000000..266bd8d3
--- /dev/null
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java
@@ -0,0 +1,85 @@
+package com.gluster.storage.management.server.resources;
+
+import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_ALERTS;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.springframework.stereotype.Component;
+
+import com.gluster.storage.management.core.model.AlertListResponse;
+import com.gluster.storage.management.core.model.Alert;
+
+@Component
+@Path(RESOURCE_PATH_ALERTS)
+public class AlertsResource {
+
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public AlertListResponse getAlerts() {
+
+ List<Alert> alerts = new ArrayList<Alert>();
+
+ // TODO To implement the following dummy alerts
+ // Alert #1
+ Alert alert = new Alert();
+ alert.setId("0001");
+ alert.setReference("Server1"); // Server
+ alert.setType(Alert.ALERT_TYPES.CPU_USAGE_ALERT);
+ alert.setMessage(alert.getAlertType(alert.getType()) + " in server: " + alert.getReference());
+ alerts.add(alert);
+
+ // Alert #2
+ alert = new Alert();
+ alert.setId("0002");
+ alert.setReference("Server2"); // server:Disk - brick
+ alert.setType(Alert.ALERT_TYPES.MEMORY_USAGE_ALERT);
+ alert.setMessage(alert.getAlertType(alert.getType()) + " in server: " + alert.getReference());
+ alerts.add(alert);
+
+ // Alert #3
+ alert = new Alert();
+ alert.setId("0003");
+ alert.setReference("Volume1"); // Volume name
+ alert.setType(Alert.ALERT_TYPES.DISK_USAGE_ALERT);
+ alert.setMessage(alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference());
+ alerts.add(alert);
+
+ // Alert #4
+ alert = new Alert();
+ alert.setId("0004");
+ alert.setReference("Volume2"); // Volume name
+ alert.setType(Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT);
+ alert.setMessage("Server1:sda1, server2:sda2 are " + alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference());
+ alerts.add(alert);
+
+ // Alert #5
+ alert = new Alert();
+ alert.setId("0005");
+ alert.setReference("Volume2"); // Volume name
+ alert.setType(Alert.ALERT_TYPES.OFFLINE_SERVERS_ALERT);
+ alert.setMessage("server1, server2 are " + alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference());
+ alerts.add(alert);
+
+ return new AlertListResponse(alerts);
+
+ }
+
+ public static void main(String[] args) {
+ /*
+ // Unit test code
+ AlertsResource alertResource = new AlertsResource();
+ AlertsListResponse alertResponse = alertResource.getAlerts();
+ List<Alert> alerts = alertResponse.getAlerts();
+ for (Alert alert: alerts) {
+ System.out.println(alert.getMessage());
+ }
+ */
+ }
+
+}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
index 5987857a..c1ddffd1 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java
@@ -32,9 +32,9 @@ import org.springframework.stereotype.Component;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.Server;
-import com.gluster.storage.management.core.model.ServerListResponse;
import com.gluster.storage.management.core.model.Status;
-import com.gluster.storage.management.core.model.StringListResponse;
+import com.gluster.storage.management.core.response.ServerListResponse;
+import com.gluster.storage.management.core.response.StringListResponse;
import com.sun.jersey.spi.resource.Singleton;
@Component
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 6204bf9b..e8adceb7 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
@@ -30,13 +30,13 @@ import javax.ws.rs.core.MediaType;
import org.springframework.stereotype.Component;
-import com.gluster.storage.management.core.model.GenericResponse;
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.GlusterServerListResponse;
-import com.gluster.storage.management.core.model.GlusterServerResponse;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.response.GlusterServerListResponse;
+import com.gluster.storage.management.core.response.GlusterServerResponse;
import com.gluster.storage.management.core.utils.GlusterUtil;
import com.gluster.storage.management.core.utils.ProcessResult;
import com.sun.jersey.spi.resource.Singleton;
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 2cec4c36..2177085e 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
@@ -33,14 +33,18 @@ import org.springframework.stereotype.Component;
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
import com.gluster.storage.management.core.model.Response;
import com.gluster.storage.management.core.model.RunningTask;
-import com.gluster.storage.management.core.model.RunningTaskListResponse;
import com.gluster.storage.management.core.model.RunningTaskStatus;
import com.gluster.storage.management.core.model.Status;
+import com.gluster.storage.management.core.response.RunningTaskListResponse;
+import com.gluster.storage.management.core.utils.StringUtil;
import com.gluster.storage.management.server.runningtasks.managers.RunningTaskManager;
@Component
@Path(RESOURCE_PATH_RUNNING_TASKS)
public class RunningTaskResource {
+
+ private static final String PKG = "com.gluster.storage.management.server.runningtasks.managers";
+ private static final String MANAGER = "Manager";
@GET
@Produces(MediaType.TEXT_XML)
@@ -55,46 +59,48 @@ public class RunningTaskResource {
// Volume rebalance
RunningTask task = new RunningTask();
task.setId("0001");
- task.setType("VolumeRebalance");
- task.setReference("");
- task.setDescription("Volume [Volume1] rebalance is running");
+ task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE);
+ task.setReference("Volume1");
+ task.setTaskInfo( task.getTaskType(task.getType()) + "is running in volume " + task.getReference());
task.setStatus(status);
runningTasks.add(task);
task = new RunningTask();
task.setId("0002");
- task.setType("VolumeRebalance");
- task.setReference("");
- task.setDescription("Volume [Volume2] rebalance is running");
- //task.setDescription("Error: volume rebalance operation failed at fd 0000 [/export/test-song-volume/mydirectory/test-video.avi");
+ task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE);
+ task.setReference("Volume2");
+ task.setTaskInfo( task.getTaskType(task.getType()) + " is running in volume " + task.getReference());
task.setStatus(status);
runningTasks.add(task);
// MigrateDisk
task = new RunningTask();
task.setId("0003");
- task.setType("MigrateDisk");
- task.setReference("");
- task.setDescription("Disk migration [Volume3/sda] is running");
+ task.setType(RunningTask.TASK_TYPES.MIGRATE_DISK);
+ task.setReference("Volume3:server1:sda1"); // Disk reference
+ task.setTaskInfo( task.getTaskType(task.getType()) + " is running in disk " + task.getReference() + "");
task.setStatus(status);
runningTasks.add(task);
// FormatDisk
task = new RunningTask();
task.setId("0004");
- task.setType("FormatDisk");
- task.setReference("");
- task.setDescription("Volume [vol1] rebalance is running");
+ task.setType(RunningTask.TASK_TYPES.FORMAT_DISK);
+ task.setReference("Volume1:server1:sdb1"); // Disk reference
+ task.setTaskInfo( task.getTaskType(task.getType()) + " " + task.getReference() );
status.setPercentageSupported(true);
status.getPercentCompleted(45);
task.setStatus(status);
runningTasks.add(task);
+
return new RunningTaskListResponse(Status.STATUS_SUCCESS, runningTasks);
}
@SuppressWarnings("rawtypes")
- public Response startTask(@FormParam("taskType") String taskType) {
- String managerClassName = "com.gluster.storage.management.server.runningtasks.managers." + taskType + "Manager";
+ public Response startTask(@FormParam("taskType") RunningTask.TASK_TYPES taskType) {
+ String taskTypeStr = StringUtil.removeSpaces( new RunningTask().getTaskType(taskType) );
+ String managerClassName = PKG + "." + taskTypeStr + MANAGER;
+
Class managerClass;
RunningTaskManager manager = null;
try {
@@ -121,7 +127,7 @@ public class RunningTaskResource {
RunningTaskListResponse tasks = rt.getRunningTasks();
List<RunningTask> runningTasks = tasks.getRunningTasks();
for( RunningTask x : runningTasks) {
- System.out.println( x.getId() + " : " + x.getType() + " : " + x.getDescription() );
+ System.out.println( x.getId() + " : " + x.getType() + " : " + x.getTaskInfo() );
}
}
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ServerResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ServerResource.java
index 97b874e2..08e8c9a6 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ServerResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ServerResource.java
@@ -18,17 +18,16 @@
*******************************************************************************/
package com.gluster.storage.management.server.resources;
-import java.io.File;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-
-import com.gluster.storage.management.core.utils.FileUtil;
-import com.gluster.storage.management.core.utils.MD5Crypt;
-import com.gluster.storage.management.core.utils.ProcessResult;
-import com.gluster.storage.management.core.utils.ProcessUtil;
+import java.io.File;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import com.gluster.storage.management.core.utils.FileUtil;
+import com.gluster.storage.management.core.utils.ProcessResult;
+import com.gluster.storage.management.core.utils.ProcessUtil;
@Path("/server")
public class ServerResource {
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 9ac1f9d6..19310240 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
@@ -42,14 +42,16 @@ import javax.ws.rs.core.MediaType;
import org.springframework.beans.factory.annotation.Autowired;
-import com.gluster.storage.management.core.model.Disk;
-import com.gluster.storage.management.core.model.GenericResponse;
import com.gluster.storage.management.core.model.Status;
import com.gluster.storage.management.core.model.Volume;
+import com.gluster.storage.management.core.response.GenericResponse;
+import com.gluster.storage.management.core.response.VolumeListResponse;
+import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse;
import com.gluster.storage.management.core.utils.GlusterUtil;
import com.gluster.storage.management.core.utils.ProcessResult;
import com.gluster.storage.management.server.constants.VolumeOptionsDefaults;
import com.gluster.storage.management.server.utils.ServerUtil;
+import com.sun.jersey.api.core.InjectParam;
import com.sun.jersey.spi.resource.Singleton;
@Singleton
@@ -62,14 +64,28 @@ public class VolumesResource {
private static ServerUtil serverUtil;
private final GlusterUtil glusterUtil = new GlusterUtil();
+
+ @InjectParam
+ private VolumeOptionsDefaults volumeOptionsDefaults;
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public VolumeListResponse getAllVolumes() {
+ try {
+ return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes());
+ } catch(Exception e) {
+ // TODO: log the error
+ return new VolumeListResponse(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()), null);
+ }
+ }
+
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
public GenericResponse<String> createVolume(Volume volume) {
//Create the directories for the volume
List<String> bricks = new ArrayList<String>();
- for(Disk disk : volume.getDisks()) {
+ for(String disk : volume.getDisks()) {
String brickNotation = getBrickNotation(volume, disk);
if (brickNotation != null) {
@@ -108,18 +124,20 @@ public class VolumesResource {
@GET
@Path(SUBRESOURCE_DEFAULT_OPTIONS)
@Produces(MediaType.TEXT_XML)
- public VolumeOptionsDefaults getDefaultOptions() {
+ public VolumeOptionInfoListResponse getDefaultOptions() {
// TODO: Fetch all volume options with their default values from GlusterFS
// whenever such a CLI command is made available in GlusterFS
- return new VolumeOptionsDefaults().getDefaults();
+ return new VolumeOptionInfoListResponse(Status.STATUS_SUCCESS, volumeOptionsDefaults.getDefaults());
}
- private String getBrickNotation(Volume vol, Disk disk) {
- Status result = serverUtil.executeOnServer(true, disk.getServerName(), "python CreateVolumeExportDirectory.py " + disk + " " + vol.getName());
+ private String getBrickNotation(Volume vol, String disk) {
+ String serverName = disk.split(":")[0];
+ String exportDirectory = disk.split(":")[1];
+ Status result = serverUtil.executeOnServer(true, serverName, "python " + SCRIPT_NAME +" " + exportDirectory + " " + vol.getName());
if(result.getCode() == 0) {
String dirName = "/export/" + disk + "/" + vol.getName() ;
- return disk.getServerName() + ":" + dirName;
+ return serverName + ":" + dirName;
} else {
return null;
// return result.getMessage();