From 3e997efcd1f569d38b1ac7623c4e10dd35da416a Mon Sep 17 00:00:00 2001 From: Selvam Date: Wed, 30 Mar 2011 18:02:08 +0530 Subject: Alerts section in volumes summary page Volumes update in navigation tree Review comments update for Alerts & Running tasks 1. RESOURCE_NAME removed and used RESTConstants 2. fetchAlerts renamed to fetchAllAlerts 3. System.out.println removed 4. ALERT_TYPE_STR made as static and final 5. getAlertDescription renamed as getMessage 6. getTaskDescription renamed as getTaskInfo 7. getCluster method is added in GlusterDataModel 8. getRunningTasksForVolumesContext will not implemented for Volumes summary view 9. Constants added for "Availability", "Running Tasks" etc. 10. CPU_USAGE_ALERT, MEMORY_USAGE_ALERT and DISK_USAGE_ALERT are modifies and OFFLINE_VOLUME_DISKS_ALERT, OFFLINE_SERVERS_ALERT are added. 11. Two more dummy alerts added 12. Reference format changed for Disk as "volumeName:serverName:diskName" 13. TaskInfo reflects the task type 14. Method removeSpaces added as static method 15. Local constants added for package and Manager --- .../storage/management/client/AlertsClient.java | 33 +++++ .../management/client/GlusterDataModelManager.java | 94 +++++++----- .../management/client/RunningTaskClient.java | 3 +- .../storage/management/client/VolumesClient.java | 6 +- .../management/core/constants/RESTConstants.java | 1 + .../storage/management/core/model/Alert.java | 51 +++++++ .../management/core/model/AlertListResponse.java | 36 +++++ .../storage/management/core/model/AlertStatus.java | 13 ++ .../storage/management/core/model/Cluster.java | 13 ++ .../management/core/model/GlusterDataModel.java | 4 + .../management/core/model/GlusterDummyModel.java | 60 +++++--- .../storage/management/core/model/RunningTask.java | 30 ++-- .../storage/management/core/model/Status.java | 2 + .../storage/management/core/model/Volume.java | 38 +++-- .../management/core/model/VolumeListResponse.java | 43 ++++++ .../storage/management/core/utils/GlusterUtil.java | 159 ++++++++++++++++----- .../storage/management/core/utils/StringUtil.java | 4 + .../gui/dialogs/CreateVolumeDisksPage.java | 17 ++- .../management/gui/dialogs/CreateVolumePage1.java | 13 +- .../management/gui/dialogs/MigrateDiskPage1.java | 2 +- .../management/gui/dialogs/SelectDisksDialog.java | 45 ++++-- .../management/gui/views/VolumeDisksView.java | 4 +- .../management/gui/views/VolumesSummaryView.java | 65 +++++---- .../details/tabcreators/VolumeTabCreator.java | 3 +- .../server/resources/AlertsResource.java | 85 +++++++++++ .../server/resources/RunningTaskResource.java | 39 ++--- .../server/resources/VolumesResource.java | 26 ++++ 27 files changed, 718 insertions(+), 171 deletions(-) create mode 100644 src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Alert.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java create mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeListResponse.java create mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java (limited to 'src') 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 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 createDummyLogMessages() { addMessagesForDisk(logMessages, s1da); @@ -264,20 +272,42 @@ public class GlusterDataModelManager { public static List getDummyLogMessages() { return logMessages; } + + public Disk getVolumeDisk(String volumeDisk) { + List 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 getReadyDisksOfVolume(Volume volume) { + /* TODO: review the logic + List disks = new ArrayList(); for (Disk disk : volume.getDisks()) { if (disk.isReady()) { disks.add(disk); } } - return disks; + */ + Disk disk = null; + List volumeDisks = new ArrayList(); + for (String volumeDisk : volume.getDisks() ) { + disk = getVolumeDisk(volumeDisk); + if (disk != null && disk.isReady()) { + volumeDisks.add(disk); + } + } + return volumeDisks; } public List getReadyDisksOfAllVolumes() { List disks = new ArrayList(); - 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 getReadyDisksOfAllServersExcluding(List excludeDisks) { List disks = new ArrayList(); - 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 alerts = new ArrayList(); + + public AlertListResponse() { + + } + + public AlertListResponse(List alerts) { + setAlerts(alerts); + } + + public void setAlerts(List alerts) { + this.alerts = alerts; + } + + @XmlElementWrapper(name = "alerts") + @XmlElement(name = "alert", type=Alert.class) + public List 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 discoveredServers = new ArrayList(); List volumes = new ArrayList(); List runningTasks = new ArrayList(); + List alerts = new ArrayList(); public Cluster() { } @@ -97,4 +98,16 @@ public class Cluster extends Entity { public void setRunningTasks(List runningTasks) { this.runningTasks = runningTasks; } + + public List getAlerts() { + return alerts; + } + + public void setAlerts(List 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 getDummyLogMessages() { return logMessages; } - + + public Disk getVolumeDisk(String volumeDisk) { + List 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 getReadyDisksOfVolume(Volume volume) { - List disks = new ArrayList(); - for (Disk disk : volume.getDisks()) { - if (disk.isReady()) { - disks.add(disk); +// List disks = new ArrayList(); +// for (Disk disk : volume.getDisks()) { +// if (disk.isReady()) { +// disks.add(disk); +// } +// } +// return disks; + Disk disk = null; + List volumeDisks = new ArrayList(); + for (String volumeDisk : volume.getDisks() ) { + disk = getVolumeDisk(volumeDisk); + if (disk != null && disk.isReady()) { + volumeDisks.add(disk); } } - return disks; + return volumeDisks; } public List 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 options = new LinkedHashMap(); private double totalDiskSpace = 0; - private List disks = new ArrayList(); + private List disks = new ArrayList(); 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 getDisks() { + public List 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 disks) { - for (Disk disk : disks) { + public void addDisks(List 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 disks) { + public void setDisks(List 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 volumes = new ArrayList(); + + public VolumeListResponse() { + + } + + public VolumeListResponse(Status status, List volumes) { + setStatus(status); + setVolumes(volumes); + } + + @XmlElementWrapper(name = "volumes") + @XmlElement(name = "volume", type = Volume.class) + public List getVolumes() { + return this.volumes; + } + + /** + * @param volumes + * volumes to set + */ + public void setVolumes(List 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: token: value + * Extract value of given token from given line. It is assumed that the + * token, if present, will be of the following form: + * token: value * * @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 getGlusterServerNames() { - String output = getPeerStatus(); - if(output == null) { + String output = getPeerStatus(); + if (output == null) { return null; } - + List glusterServerNames = new ArrayList(); 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 command = new ArrayList(); 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 command) { return processUtil.executeCommand(command); } - + public ProcessResult setVolumeAccessControl(Volume volume) { List command = new ArrayList(); 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 getAllVolumes(String volumeInfoText) { + List volumes = new ArrayList(); + boolean isBricksGroupFound = false; + boolean isOptionReconfigFound = false; + List bricks = new ArrayList(); + 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 names = new GlusterUtil().getGlusterServerNames(); - System.out.println(names); +// List 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 getChosenDisks() { Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer); if (disksArr != null) { List disks = new ArrayList(); for (Object disk : disksArr) { - disks.add((Disk) disk); + disks.add( (Disk)disk ); + } + return disks; + } + return null; + } + + public List getChosenBricks() { + Object[] disksArr = (Object[]) chosenDisksContentProvider.getElements(dualTableViewer); + if (disksArr != null) { + List disks = new ArrayList(); + 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 getBricks(List allDisks) { + List disks = new ArrayList(); + 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) (customize)"); } } 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 fromDisks = glusterDummyModel.getReadyDisksOfVolume(volume); - List toDisks = glusterDummyModel.getReadyDisksOfAllServersExcluding(volume.getDisks()); + List 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 allDisks, List selectedDisks) { + public SelectDisksDialog(Shell parentShell, List allDisks, List selectedDisks) { super(parentShell); setShellStyle(getShellStyle() | SWT.RESIZE); this.allDisks = allDisks; - this.selectedDisks = selectedDisks; + this.selectedDisks = getSelectedDisks(allDisks, selectedDisks); + } + + private List getSelectedDisks(List allDisks, List selectedDisks) { + List disks = new ArrayList(); + 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 getSelectedDisks() { - return disksPage.getChosenDisks(); + return disksPage.getChosenDisks(); + } + + public List 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 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)selectedObj; + volumes = (EntityGroup) 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 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 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 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 volumes, VOLUME_STATUS status) { int count = 0; for (Volume volume : (List) 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 alerts = new ArrayList(); + + // 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 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 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()); + } + } + @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 -- cgit