summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java33
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java94
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java3
-rw-r--r--src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java6
-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.java36
-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.java38
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeListResponse.java43
-rw-r--r--src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java159
-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/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.java65
-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/resources/AlertsResource.java85
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java39
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java26
27 files changed, 718 insertions, 171 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..ad258797
--- /dev/null
+++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java
@@ -0,0 +1,33 @@
+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/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java
index de0112db..ee3d418d 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.model.VolumeListResponse;
+import com.gluster.storage.management.client.VolumesClient;
public class GlusterDataModelManager {
// private Server discoveredServer1, discoveredServer2, discoveredServer3, discoveredServer4, discoveredServer5;
@@ -107,20 +106,25 @@ public class GlusterDataModelManager {
public void initializeModel(String securityToken) {
setSecurityToken(securityToken);
- // Create the dummy data model for demo
- model = new GlusterDataModel("Clusters");
- Cluster cluster = new Cluster("Home", model);
-
+ Cluster cluster = model.getCluster();
+ 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 +205,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 +251,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 +272,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 +320,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 +339,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 +348,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 +364,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/RunningTaskClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/RunningTaskClient.java
index 9309cdc8..ff728be0 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
@@ -8,7 +8,6 @@ import com.gluster.storage.management.core.model.RunningTask;
import com.gluster.storage.management.core.model.RunningTaskListResponse;
public class RunningTaskClient extends AbstractClient {
- private static final String RESOURCE_NAME = RESTConstants.RESOURCE_PATH_RUNNING_TASKS;
public RunningTaskClient(String securityToken) {
super(securityToken);
@@ -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..28f23c1b 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
@@ -29,6 +29,7 @@ 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.VolumeListResponse;
import com.sun.jersey.api.representation.Form;
public class VolumesClient extends AbstractClient {
@@ -66,7 +67,10 @@ 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 static void main(String[] args) {
UsersClient usersClient = new UsersClient();
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..947867c9
--- /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..bb3c754e
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java
@@ -0,0 +1,36 @@
+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;
+
+@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..2322fa84 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
@@ -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() {
@@ -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/VolumeListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeListResponse.java
new file mode 100644
index 00000000..7ff98d22
--- /dev/null
+++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeListResponse.java
@@ -0,0 +1,43 @@
+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 javax.xml.bind.annotation.XmlTransient;
+
+@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/utils/GlusterUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
index ad5b4c2b..0e2b0b8d 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
@@ -30,6 +30,7 @@ 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;
/**
@@ -40,11 +41,21 @@ public class GlusterUtil {
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 String VOLUME_OPTIONS_AUTH_ALLOW = "auth.allow:";
+
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 +85,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 +120,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 +137,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,55 +147,59 @@ 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) {
- int count=1; // replica or stripe count
+ 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);
- for(Disk disk : volume.getDisks()) {
- command.add(getBrickNotation(volume, disk));
+ //TODO fix needed modified for error free code
+ for (String disk : volume.getDisks()) {
+ command.add(disk);
}
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");
@@ -192,27 +210,104 @@ public class GlusterUtil {
command.add(volume.getAccessControlList());
return setOption(command);
}
-
+
/**
* @param disk
* @return
*/
private String getBrickNotation(Volume vol, Disk disk) {
- // TODO: Figure out an appropriate directory INSIDE the DISK having given NAME (e.g. sda, sdb, etc)
+ // TODO: Figure out an appropriate directory INSIDE the DISK having
+ // given NAME (e.g. sda, sdb, etc)
// String dirName = "/export/" + vol.getName() + "/" + disk.getName();
-
+
// if /export directory is not exist then create the directory
boolean exists = (new File("/export")).exists();
-
+
if (!exists) {
processUtil.executeCommand("mkdir", "/export");
}
- String dirName = "/export/" + vol.getName() ;
+ String dirName = "/export/" + vol.getName();
return disk.getServerName() + ":" + dirName;
}
+
+ public ProcessResult getVolumeInfo() {
+ return new ProcessUtil().executeCommand("gluster", "volume", "info");
+ }
+ public List<Volume> getAllVolumes(String volumeInfoText) {
+ List<Volume> volumes = new ArrayList<Volume>();
+ boolean isBricksGroupFound = false;
+ boolean isOptionReconfigFound = false;
+ List<String> bricks = new ArrayList<String>();
+ Volume volume = null;
+
+ for (String line : volumeInfoText.split(CoreConstants.NEWLINE)) {
+ if (extractToken(line, VOLUME_NAME_PFX) != null) {
+ if (volume != null) {
+ volume.setDisks(bricks);
+ bricks.clear();
+ volumes.add(volume);
+ }
+ volume = new Volume();
+ volume.setName(extractToken(line, VOLUME_NAME_PFX));
+ isBricksGroupFound = isOptionReconfigFound = false;
+ continue;
+ }
+
+ if (extractToken(line, VOLUME_TYPE_PFX) != null) {
+ String volumeType = extractToken(line, VOLUME_TYPE_PFX);
+ volume.setVolumeType((volumeType == "Distribute") ? VOLUME_TYPE.PLAIN_DISTRIBUTE
+ : VOLUME_TYPE.DISTRIBUTED_MIRROR); // TODO: for Stripe
+ continue;
+ }
+
+ if (extractToken(line, VOLUME_STATUS_PFX) != null) {
+ volume.setStatus(extractToken(line, VOLUME_STATUS_PFX).equals("Started") ? VOLUME_STATUS.ONLINE : VOLUME_STATUS.OFFLINE);
+ continue;
+ }
+
+ if (extractToken(line, VOLUME_TRANSPORT_TYPE_PFX) != null) {
+ volume.setTransportType((extractToken(line,
+ VOLUME_TRANSPORT_TYPE_PFX) == "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]+:.*")) {
+ bricks.add( 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 (extractToken(line, VOLUME_OPTIONS_AUTH_ALLOW) != null) {
+ volume.setAccessControlList( extractToken(line, VOLUME_OPTIONS_AUTH_ALLOW) );
+ isOptionReconfigFound = false;
+ }
+ }
+ }
+ if (volume != null) {// Adding the last volume parsed
+ volume.setDisks(bricks);
+ 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/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..72987d0a 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
@@ -31,9 +31,11 @@ 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;
+import com.gluster.storage.management.core.model.RunningTaskStatus;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.core.model.RunningTask;
import com.gluster.storage.management.core.model.Volume;
@@ -50,7 +52,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 +68,63 @@ 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();
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 +145,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/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..8ea9c0a9
--- /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("sda1, sd2 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/RunningTaskResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/RunningTaskResource.java
index 2cec4c36..c8046e73 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
@@ -36,11 +36,15 @@ 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.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,49 @@ 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 rinning 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 rinning 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.stripSpaces( new RunningTask().getTaskType(taskType) );
+ String managerClassName = PKG + "." + taskTypeStr + MANAGER;
+
Class managerClass;
RunningTaskManager manager = null;
try {
@@ -121,7 +128,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/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
index dfa5a5cc..d2677ce7 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
@@ -27,6 +27,8 @@ import static com.gluster.storage.management.core.constants.RESTConstants.PATH_P
import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_VOLUMES;
import static com.gluster.storage.management.core.constants.RESTConstants.SUBRESOURCE_DEFAULT_OPTIONS;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
@@ -39,11 +41,14 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
+import com.gluster.storage.management.core.constants.RESTConstants;
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.VolumeListResponse;
import com.gluster.storage.management.core.utils.GlusterUtil;
import com.gluster.storage.management.core.utils.ProcessResult;
+import com.gluster.storage.management.core.utils.ProcessUtil;
import com.gluster.storage.management.server.constants.VolumeOptionsDefaults;
import com.sun.jersey.spi.resource.Singleton;
@@ -52,6 +57,18 @@ import com.sun.jersey.spi.resource.Singleton;
public class VolumesResource {
private final GlusterUtil glusterUtil = new GlusterUtil();
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public VolumeListResponse getAllVolumes() {
+ ProcessResult response = glusterUtil.getVolumeInfo();
+ if (response.isSuccess()) {
+ return new VolumeListResponse( Status.STATUS_SUCCESS, glusterUtil.getAllVolumes(response.getOutput()) );
+ } else {
+ //TODO: log the error
+ return new VolumeListResponse(Status.STATUS_FAILURE, new ArrayList<Volume>());
+ }
+ }
+
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
@@ -90,4 +107,13 @@ public class VolumesResource {
// whenever such a CLI command is made available in GlusterFS
return new VolumeOptionsDefaults().getDefaults();
}
+
+
+ public static void main(String[] args) {
+ VolumesResource vr = new VolumesResource();
+ VolumeListResponse response = vr.getAllVolumes();
+ for(Volume volume : response.getVolumes() ) {
+ System.out.println( "\nName:" + volume.getName() + "\nType: " + volume.getVolumeTypeStr() + "\nStatus: " + volume.getStatusStr());
+ }
+ }
} \ No newline at end of file