diff options
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 |
