diff options
| author | Selvam <selvam@gluster.com> | 2011-03-30 18:02:08 +0530 |
|---|---|---|
| committer | Selvam <selvam@gluster.com> | 2011-04-05 15:10:37 +0530 |
| commit | 3e997efcd1f569d38b1ac7623c4e10dd35da416a (patch) | |
| tree | 78104bc99f8bef571490a7d39ae88a080d173585 | |
| parent | 5c39a47fdd3987bb5eee35f7f7397ce127c8919e (diff) | |
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
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 |
