diff options
| author | Dhandapani <dhandapani@gluster.com> | 2011-04-07 14:40:12 +0530 |
|---|---|---|
| committer | Dhandapani <dhandapani@gluster.com> | 2011-04-07 14:40:12 +0530 |
| commit | 9461e6090694b777b9ac9ceae77de5e9e4df1b7d (patch) | |
| tree | e5813fca531c76e3aee7425e5d75feecdf2961e8 /src | |
| parent | 94a933503b611a2d410654056d1a456dcd019e3f (diff) | |
| parent | e294a990a5a954933f9c6190f2c55cb4d198607d (diff) | |
Merge commit 'upstream/master'
Conflicts:
src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterUtil.java
src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java
Diffstat (limited to 'src')
13 files changed, 260 insertions, 223 deletions
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 2dd91620..0f932df0 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 @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Date; import java.util.List; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.Disk; @@ -40,11 +41,13 @@ import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; +import com.gluster.storage.management.core.response.RunningTaskListResponse; import com.gluster.storage.management.core.response.VolumeListResponse; import com.gluster.storage.management.client.VolumesClient; public class GlusterDataModelManager { - // private Server discoveredServer1, discoveredServer2, discoveredServer3, discoveredServer4, discoveredServer5; + // private Server discoveredServer1, discoveredServer2, discoveredServer3, + // discoveredServer4, discoveredServer5; private GlusterServer server1, server2, server3, server4, server5; private Volume volume1, volume2, volume3, volume4, volume5; private Disk s1da, s1db, s2da, s2db, s2dc, s2dd, s3da, s4da, s5da, s5db; @@ -54,7 +57,7 @@ public class GlusterDataModelManager { private String securityToken; private String serverName; private List<ClusterListener> listeners = new ArrayList<ClusterListener>(); - + private GlusterDataModelManager() { } @@ -80,7 +83,10 @@ public class GlusterDataModelManager { double memoryInUse) { GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse); - NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed preferredInterfaceName to interfaceName + NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed + // preferredInterfaceName + // to + // interfaceName // glusterServer.setPreferredNetworkInterface(networkInterface); servers.add(glusterServer); @@ -106,25 +112,25 @@ public class GlusterDataModelManager { public void initializeModel(String securityToken) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); - - Cluster cluster = new Cluster("Home",model); + + Cluster cluster = new Cluster("Home", model); VolumesClient volumeClient = new VolumesClient(securityToken); - + initializeGlusterServers(cluster); - + // initializeVolumes(cluster); VolumeListResponse response = volumeClient.getAllVolumes(); - cluster.setVolumes( response.getVolumes()); - + cluster.setVolumes(response.getVolumes()); + initializeAutoDiscoveredServers(cluster); initializeDisks(); // addDisksToVolumes(); // addVolumeOptions(); createDummyLogMessages(); - + initializeRunningTasks(cluster); - + initializeAlerts(cluster); model.addCluster(cluster); @@ -147,7 +153,7 @@ public class GlusterDataModelManager { return volume; } - + private void initializeVolumes(Cluster cluster) { List<Volume> volumes = new ArrayList<Volume>(); @@ -180,7 +186,13 @@ public class GlusterDataModelManager { s2dc = new Disk(server2, "sdc", 200d, -1d, DISK_STATUS.UNINITIALIZED); s2dd = new Disk(server2, "sdd", 200d, 124.89, DISK_STATUS.READY); - s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline + s3da = new Disk(server3, "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk + // name + // unavailable + // since + // server + // is + // offline s4da = new Disk(server4, "sda", 100d, 85.39, DISK_STATUS.READY); @@ -248,11 +260,15 @@ public class GlusterDataModelManager { addMessages(logMessages, disk, "DEBUG", 5); addMessages(logMessages, disk, "INFO", 5); } - + public void initializeRunningTasks(Cluster cluster) { - cluster.setRunningTasks(new RunningTaskClient(securityToken).getRunningTasks()); + RunningTaskListResponse runningTaskResponse = new RunningTaskClient(securityToken).getRunningTasks(); + if (!runningTaskResponse.getStatus().isSuccess()) { + throw new GlusterRuntimeException(runningTaskResponse.getStatus().getMessage()); + } + cluster.setRunningTasks(runningTaskResponse.getRunningTasks()); } - + public void initializeAlerts(Cluster cluster) { cluster.setAlerts(new AlertsClient(securityToken).getAllAlerts()); } @@ -273,11 +289,11 @@ 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) { + for (Disk disk : allDisks) { if (disk.getServerName() == brickInfo[0] && disk.getName() == brickInfo[1]) { return disk; } @@ -286,18 +302,15 @@ public class GlusterDataModelManager { } 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); - } - } - */ + /* + * TODO: review the logic + * + * List<Disk> disks = new ArrayList<Disk>(); for (Disk disk : + * volume.getDisks()) { if (disk.isReady()) { disks.add(disk); } } + */ Disk disk = null; List<Disk> volumeDisks = new ArrayList<Disk>(); - for (String volumeDisk : volume.getDisks() ) { + for (String volumeDisk : volume.getDisks()) { disk = getVolumeDisk(volumeDisk); if (disk != null && disk.isReady()) { volumeDisks.add(disk); @@ -334,7 +347,7 @@ public class GlusterDataModelManager { public void addClusterListener(ClusterListener listener) { listeners.add(listener); } - + public void removeClusterListener(ClusterListener listener) { listeners.remove(listener); } @@ -342,8 +355,8 @@ public class GlusterDataModelManager { public void addGlusterServer(GlusterServer server) { Cluster cluster = model.getCluster(); cluster.addServer(server); - - for(ClusterListener listener : listeners) { + + for (ClusterListener listener : listeners) { listener.serverAdded(server); } } @@ -351,24 +364,24 @@ public class GlusterDataModelManager { public void removeDiscoveredServer(Server server) { Cluster cluster = model.getCluster(); cluster.removeDiscoveredServer(server); - - for(ClusterListener listener : listeners) { + + for (ClusterListener listener : listeners) { listener.discoveredServerRemoved(server); } } - + public void updateVolumeStatus(Volume volume, VOLUME_STATUS newStatus) { volume.setStatus(newStatus); - for(ClusterListener listener : listeners) { + for (ClusterListener listener : listeners) { listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus)); } } - + public void addVolume(Volume volume) { Cluster cluster = model.getCluster(); cluster.addVolume(volume); - - for(ClusterListener listener : listeners) { + + for (ClusterListener listener : listeners) { listener.volumeCreated(volume); } } 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 eb5f1f3b..f9c26eb0 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,7 @@ import com.gluster.storage.management.core.model.RunningTask; import com.gluster.storage.management.core.response.RunningTaskListResponse; public class RunningTaskClient extends AbstractClient { - + public RunningTaskClient(String securityToken) { super(securityToken); } @@ -17,14 +17,8 @@ public class RunningTaskClient extends AbstractClient { public String getResourceName() { return RESTConstants.RESOURCE_PATH_RUNNING_TASKS; } - - @SuppressWarnings("rawtypes") - private Object fetchRunningTasks(Class responseClass) { - return fetchResource( responseClass ); - } - - public List<RunningTask> getRunningTasks() { - RunningTaskListResponse response = (RunningTaskListResponse) fetchRunningTasks( RunningTaskListResponse.class ); - return response.getRunningTasks(); + + public RunningTaskListResponse getRunningTasks() { + return (RunningTaskListResponse) fetchResource(RunningTaskListResponse.class); } } 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 index cfc710df..66107734 100644 --- 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 @@ -5,47 +5,51 @@ 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" }; + 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 Disk", "Offline Server" }; protected String id; protected ALERT_TYPES type; protected String reference; protected String message; - - public String getAlertType( ALERT_TYPES alertType) { + + 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 index 833ccff3..57885ac1 100644 --- 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 @@ -10,23 +10,23 @@ import javax.xml.bind.annotation.XmlRootElement; import com.gluster.storage.management.core.response.AbstractResponse; @XmlRootElement(name = "response") -public class AlertListResponse extends AbstractResponse { +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) + @XmlElement(name = "alert", type = Alert.class) public List<Alert> getAlerts() { return this.alerts; } 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 9787f1ee..24b342e2 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,59 +22,62 @@ 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"}; - + public enum TASK_TYPES { + DISK_FORMAT, DISK_MIGRATE, VOLUME_REBALANCE + }; + + public String[] TASK_TYPE_STR = { "Formatting Disk", "Disk Migration", "Volume Rebalance" }; + protected String id; - 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 TASK_TYPES type; + protected String reference; // Server name / Volume name / Disk name protected String taskInfo; protected RunningTaskStatus status; // TODO redefine - + public RunningTask() { - + } - + public String getTaskType(TASK_TYPES type) { - return TASK_TYPE_STR[type.ordinal()]; + return TASK_TYPE_STR[type.ordinal()]; } - + public String getId() { return id; } - + public void setId(String id) { this.id = id; } - + public TASK_TYPES getType() { return type; } - + public void setType(TASK_TYPES type) { this.type = type; } - + public String getReference() { return reference; } - + public void setReference(String reference) { this.reference = reference; } - + public String getTaskInfo() { return taskInfo; } - + public void setTaskInfo(String taskInfo) { this.taskInfo = taskInfo; } - + public RunningTaskStatus getStatus() { return status; } - + public void setStatus(RunningTaskStatus status) { this.status = status; } 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 2386bcee..968611ec 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 @@ -48,6 +48,7 @@ public class Volume extends Entity { public enum NAS_PROTOCOL { GLUSTERFS, NFS }; + private static final String OPTION_AUTH_ALLOW = "auth.allow:"; private static final String[] VOLUME_TYPE_STR = new String[] { "Plain Distribute", "Distributed Mirror", @@ -62,14 +63,14 @@ public class Volume extends Entity { private VOLUME_STATUS status; private int replicaCount; private int stripeCount; - private Map<String, String> options = new LinkedHashMap<String, String>(); + private Map<String, String> options = new LinkedHashMap<String, String>(); private double totalDiskSpace = 0; private List<String> disks = new ArrayList<String>(); public Volume() { } - + // GlusterFS export is always enabled private Set<NAS_PROTOCOL> nasProtocols = new LinkedHashSet<NAS_PROTOCOL>( Arrays.asList(new NAS_PROTOCOL[] { NAS_PROTOCOL.GLUSTERFS })); @@ -79,7 +80,7 @@ public class Volume extends Entity { public String getVolumeTypeStr() { return getVolumeTypeStr(getVolumeType()); } - + public static String getVolumeTypeStr(VOLUME_TYPE volumeType) { return VOLUME_TYPE_STR[volumeType.ordinal()]; } @@ -106,10 +107,10 @@ public class Volume extends Entity { if (volumeType == VOLUME_TYPE.DISTRIBUTED_STRIPE) { setReplicaCount(0); setStripeCount(3); - } else if(volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) { + } else if (volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) { setReplicaCount(2); setStripeCount(0); - } else{ + } else { setReplicaCount(0); setStripeCount(0); } @@ -188,7 +189,7 @@ public class Volume extends Entity { public void setOption(String key, String value) { options.put(key, value); } - + public void setOptions(Map<String, String> options) { this.options = options; } @@ -202,9 +203,9 @@ public class Volume extends Entity { } public void addDisk(String disk) { -// if (disks.add(disk) && disk.getStatus() != DISK_STATUS.OFFLINE) { -// totalDiskSpace += disk.getSpace(); -// } + // if (disks.add(disk) && disk.getStatus() != DISK_STATUS.OFFLINE) { + // totalDiskSpace += disk.getSpace(); + // } disks.add(disk); } @@ -215,9 +216,9 @@ public class Volume extends Entity { } public void removeDisk(String disk) { -// if (disks.remove(disk)) { -// totalDiskSpace -= disk.getSpace(); -// } + // if (disks.remove(disk)) { + // totalDiskSpace -= disk.getSpace(); + // } } public void removeAllDisks() { 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 e8e27d9b..300f79ef 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 @@ -34,7 +34,7 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; public class GlusterUtil { - + private static final String HOSTNAME_PFX = "Hostname:"; private static final String UUID_PFX = "Uuid:"; private static final String STATE_PFX = "State:"; @@ -44,15 +44,14 @@ public class GlusterUtil { 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_BRICKS_GROUP_PFX = "Bricks"; private static final String VOLUME_OPTIONS_RECONFIG_PFX = "Options Reconfigured"; private static final ProcessUtil processUtil = new ProcessUtil(); /** - * Extract value of given token from given line. It is assumed that the - * token, if present, will be of the following form: - * <code>token: value</code> + * Extract value of given token from given line. It is assumed that the token, if present, will be of the following + * form: <code>token: value</code> * * @param line * Line to be analyzed @@ -82,8 +81,7 @@ 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. @@ -134,8 +132,7 @@ 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; } @@ -144,22 +141,19 @@ public class GlusterUtil { } public ProcessResult addServer(String serverName) { - return processUtil.executeCommand("gluster", "peer", "probe", - serverName); + return processUtil.executeCommand("gluster", "peer", "probe", serverName); } public ProcessResult startVolume(String volumeName) { - return processUtil.executeCommand("gluster", "volume", "start", - volumeName); + return processUtil.executeCommand("gluster", "volume", "start", volumeName); } public ProcessResult stopVolume(String volumeName) { - return processUtil.executeCommand("gluster", "--mode=script", "volume", - "stop", volumeName); + return processUtil.executeCommand("gluster", "--mode=script", "volume", "stop", volumeName); } public ProcessResult createVolume(Volume volume, List<String> bricks) { - int count=1; // replica or stripe count + int count = 1; // replica or stripe count String volumeType = null; VOLUME_TYPE volType = volume.getVolumeType(); if (volType == VOLUME_TYPE.DISTRIBUTED_MIRROR) { @@ -172,8 +166,7 @@ public class GlusterUtil { 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"); @@ -187,7 +180,6 @@ public class GlusterUtil { command.add("transport"); command.add(transportTypeStr); command.addAll(bricks); - return processUtil.executeCommand(command); } @@ -214,15 +206,15 @@ public class GlusterUtil { } return result.getOutput(); } - + public List<Volume> getAllVolumes() { String volumeInfoText = getVolumeInfo(); - + List<Volume> volumes = new ArrayList<Volume>(); boolean isBricksGroupFound = false; boolean isOptionReconfigFound = false; Volume volume = null; - + for (String line : volumeInfoText.split(CoreConstants.NEWLINE)) { String volumeName = extractToken(line, VOLUME_NAME_PFX); if (volumeName != null) { @@ -230,7 +222,7 @@ public class GlusterUtil { // add the previously read volume to volume list volumes.add(volume); } - + // prepare next volume to be read volume = new Volume(); volume.setName(volumeName); @@ -244,41 +236,42 @@ public class GlusterUtil { : VOLUME_TYPE.DISTRIBUTED_MIRROR); // TODO: for Stripe continue; } - + String volumeStatus = extractToken(line, VOLUME_STATUS_PFX); if (volumeStatus != null) { volume.setStatus(volumeStatus.equals("Started") ? VOLUME_STATUS.ONLINE : VOLUME_STATUS.OFFLINE); continue; } - + String transportType = extractToken(line, VOLUME_TRANSPORT_TYPE_PFX); if (transportType != null) { volume.setTransportType(transportType.equals("tcp") ? TRANSPORT_TYPE.ETHERNET : TRANSPORT_TYPE.INFINIBAND); continue; } - + if (extractToken(line, VOLUME_BRICKS_GROUP_PFX) != null) { isBricksGroupFound = true; continue; } - + if (isBricksGroupFound) { if (line.matches("Brick[0-9]+:.*")) { - volume.addDisk(line.split(":")[2].trim().split("/")[2].trim()); // line: "Brick1: server1:/export/md0/volume-name" + // line: "Brick1: server1:/export/md0/volume-name" + volume.addDisk(line.split(":")[2].trim().split("/")[2].trim()); continue; } else { isBricksGroupFound = false; } } - + if (extractToken(line, VOLUME_OPTIONS_RECONFIG_PFX) != null) { isOptionReconfigFound = true; continue; } if (isOptionReconfigFound) { - if(line.matches("^[^:]*:[^:]*$")) { + if (line.matches("^[^:]*:[^:]*$")) { String[] parts = line.split(":"); volume.setOption(parts[0].trim(), parts[1].trim()); } else { @@ -286,15 +279,15 @@ public class GlusterUtil { } } } - - if (volume != null) {// Adding the last volume parsed + + if (volume != null) {// Adding the last volume parsed volumes.add(volume); } return volumes; } public static void main(String args[]) { -// List<String> names = new GlusterUtil().getGlusterServerNames(); -// System.out.println(names); + // List<String> names = new GlusterUtil().getGlusterServerNames(); + // System.out.println(names); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java index fd5972c5..fdcf7aac 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java @@ -42,18 +42,24 @@ public interface IImageKeys { public static final String WORK_IN_PROGRESS = "icons/progress-bar.png"; public static final String CHECKBOX_UNCHECKED = "icons/ui-check-box-uncheck.png"; public static final String CHECKBOX_CHECKED = "icons/ui-check-box.png"; + public static final String DISK = "icons/disk.png"; + public static final String DISKS = "icons/disks.png"; public static final String DISK_UNINITIALIZED = "icons/disk-uninitialized.png"; public static final String SEARCH = "icons/search.png"; public static final String ARROW_UP = "icons/arrow-up.png"; public static final String ARROW_DOWN = "icons/arrow-down.png"; - + public static final String VOLUME_REBALANCE = "icons/volume-rebalance.png"; + public static final String DISK_MIGRATE = "icons/disk-migrate.png"; + public static final String LOW_DISK_SPACE = "icons/disk.png"; + public static final String DISK_OFFLINE = "icons/status-offline.png"; + public static final String OVERLAY_OFFLINE = "icons/status-offline-small.png"; public static final String OVERLAY_ONLINE = "icons/status-online-small.png"; public static final String OVERLAY_STAR = "icons/star-small.png"; - + public static final String SPLASH_IMAGE = "splash.bmp"; public static final String DIALOG_SPLASH_IMAGE = "splash/splash-dialog.bmp"; - + public static final String PROGRESS_BAR_LEFT = "images/progress_image_left.png"; public static final String PROGRESS_BAR_RIGHT = "images/progress_image_right.png"; public static final String PROGRESS_BAR_FILLED = "images/progress_image_filled_safe.png"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java index 45b13a19..a1be243d 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java @@ -42,6 +42,7 @@ import org.eclipse.swt.widgets.Text; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.UsersClient; import com.gluster.storage.management.client.constants.ClientConstants; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.ConnectionDetails; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; @@ -51,7 +52,7 @@ import com.gluster.storage.management.gui.validators.StringRequiredValidator; * Login dialog, which prompts for the user's account info, and has Login and Cancel buttons. */ public class LoginDialog extends Dialog { - + public static final int RETURN_CODE_ERROR = 2; private Text userIdText = null; private Text passwordText = null; private Button okButton; @@ -64,7 +65,6 @@ public class LoginDialog extends Dialog { super(parentShell); } - @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); @@ -140,7 +140,9 @@ public class LoginDialog extends Dialog { @Override protected Control createDialogArea(Composite parent) { parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE)); - parent.setBackgroundMode(SWT.INHERIT_FORCE); // Makes sure that child composites inherit the same background + parent.setBackgroundMode(SWT.INHERIT_FORCE); // Makes sure that child + // composites inherit + // the same background composite = (Composite) super.createDialogArea(parent); configureDialogLayout(composite); @@ -171,7 +173,8 @@ public class LoginDialog extends Dialog { DataBindingContext dataBindingContext = new DataBindingContext(SWTObservables.getRealm(Display.getCurrent())); UpdateValueStrategy passwordBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); - // The Validator shows error decoration and disables OK button on validation failure + // The Validator shows error decoration and disables OK button on + // validation failure passwordBindingStrategy.setBeforeSetValidator(new StringRequiredValidator("Please enter password!", guiHelper .createErrorDecoration(passwordText), okButton)); @@ -191,8 +194,15 @@ public class LoginDialog extends Dialog { UsersClient usersClient = new UsersClient(); if (usersClient.authenticate(user, password)) { - GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken()); - super.okPressed(); + try { + GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken()); + super.okPressed(); + } catch (GlusterRuntimeException e) { + setReturnCode(RETURN_CODE_ERROR); + MessageDialog.openError(getShell(), "Initialization Error", e.getMessage()); + close(); + } + } else { MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password"); } 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 5950bd38..8c39fbeb 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 @@ -1,5 +1,5 @@ /** - * DiscoveredServerView.java + * VolumesSummaryView.java * * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. @@ -23,6 +23,7 @@ package com.gluster.storage.management.gui.views; import java.util.List; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; @@ -33,11 +34,11 @@ import org.eclipse.ui.part.ViewPart; 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.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.RunningTask; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite; @@ -50,17 +51,20 @@ 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) * - * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite) + * @see + * org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets + * .Composite) */ + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void createPartControl(Composite parent) { if (volumes == null) { @@ -84,41 +88,55 @@ public class VolumesSummaryView extends ViewPart { private void createAlertsSection() { Composite section = guiHelper.createSection(form, toolkit, ALERTS, null, 1, false); - // toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here."); + List<Alert> alerts = GlusterDataModelManager.getInstance().getModel().getCluster().getAlerts(); - 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()); - } + addAlertLabel(section, alert); + } + } + + private void addAlertLabel(Composite section, Alert alert) { + if (alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT + || alert.getType() == Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT) { + CLabel lblAlert = new CLabel(section, SWT.NONE); + lblAlert.setText(alert.getMessage()); + lblAlert.setImage((alert.getType() == Alert.ALERT_TYPES.DISK_USAGE_ALERT) ? guiHelper + .getImage(IImageKeys.LOW_DISK_SPACE) : guiHelper.getImage(IImageKeys.DISK_OFFLINE)); + lblAlert.redraw(); } } private void createRunningTasksSection() { Composite section = guiHelper.createSection(form, toolkit, RUNNING_TASKS, null, 1, false); - List<RunningTask> runningTasks = GlusterDataModelManager.getInstance().getModel().getCluster().getRunningTasks(); + 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()); + addRunningTaskLabel(section, task); + } + } + + private void addRunningTaskLabel(Composite section, RunningTask task) { + // Task related to Volumes context + if (task.getType() == RunningTask.TASK_TYPES.DISK_MIGRATE + || task.getType() == RunningTask.TASK_TYPES.VOLUME_REBALANCE) { + if (task.getStatus().isPercentageSupported()) { + // TODO Progress bar } + CLabel lblAlert = new CLabel(section, SWT.NONE); + lblAlert.setText(task.getTaskInfo()); + lblAlert.setImage((task.getType() == RunningTask.TASK_TYPES.DISK_MIGRATE) ? guiHelper + .getImage(IImageKeys.DISK_MIGRATE) : guiHelper.getImage(IImageKeys.VOLUME_REBALANCE)); + lblAlert.redraw(); } } private void createSummarySection() { Composite section = guiHelper.createSection(form, toolkit, AVAILABILITY, null, 2, false); - // Cluster cluster = GlusterDataModelManager.getInstance().getModel().getCluster(); - - GlusterDataModel model = GlusterDataModelManager.getInstance().getModel(); - Cluster cluster = (Cluster) model.getChildren().get(0); + // Cluster cluster = GlusterDataModelManager.getInstance().getModel() + // .getCluster(); Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)), Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.OFFLINE)) }; 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 index 266bd8d3..c4948596 100644 --- 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 @@ -29,57 +29,54 @@ public class AlertsResource { // Alert #1 Alert alert = new Alert(); alert.setId("0001"); - alert.setReference("Server1"); // Server + alert.setReference("Server1"); // Server alert.setType(Alert.ALERT_TYPES.CPU_USAGE_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " in server: " + alert.getReference()); + 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()); + 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.setReference("server1:sda1"); // Disk name alert.setType(Alert.ALERT_TYPES.DISK_USAGE_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference()); + alert.setMessage(alert.getAlertType(alert.getType()) + " in disk [" + alert.getReference() + "]"); alerts.add(alert); - + // Alert #4 alert = new Alert(); alert.setId("0004"); - alert.setReference("Volume2"); // Volume name + alert.setReference("Volume2:server2:sda1"); // volume:[Disk name] alert.setType(Alert.ALERT_TYPES.OFFLINE_VOLUME_DISKS_ALERT); - alert.setMessage("Server1:sda1, server2:sda2 are " + alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference()); + alert.setMessage(alert.getAlertType(alert.getType()) + " in volume [" + alert.getReference().split(":")[0] + + "] disk [" + alert.getReference().split(":")[1] + ":" + alert.getReference().split(":")[2] + "]"); alerts.add(alert); - + // Alert #5 alert = new Alert(); alert.setId("0005"); - alert.setReference("Volume2"); // Volume name + alert.setReference("Server2"); // Server name alert.setType(Alert.ALERT_TYPES.OFFLINE_SERVERS_ALERT); - alert.setMessage("server1, server2 are " + alert.getAlertType(alert.getType()) + " in volume: " + alert.getReference()); + alert.setMessage(alert.getAlertType(alert.getType()) + " [" + alert.getReference() + "]"); alerts.add(alert); - + return new AlertListResponse(alerts); } - - public static void main(String[] args) { + + 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()); - } - */ + * // 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 2177085e..ea2cdf5d 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 @@ -42,7 +42,7 @@ import com.gluster.storage.management.server.runningtasks.managers.RunningTaskMa @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"; @@ -50,55 +50,56 @@ public class RunningTaskResource { @Produces(MediaType.TEXT_XML) public RunningTaskListResponse getRunningTasks() { - RunningTaskStatus status = new RunningTaskStatus(); - List<RunningTask> runningTasks = new ArrayList<RunningTask>(); - - status.setCode(Status.STATUS_CODE_RUNNING); - status.setPercentageSupported(false); + RunningTaskStatus taskStatus = new RunningTaskStatus(); + List<RunningTask> runningTasks = new ArrayList<RunningTask>(); + + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + taskStatus.setPercentageSupported(false); // Volume rebalance RunningTask task = new RunningTask(); task.setId("0001"); task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE); task.setReference("Volume1"); - task.setTaskInfo( task.getTaskType(task.getType()) + "is running in volume " + task.getReference()); - task.setStatus(status); + task.setTaskInfo(task.getTaskType(task.getType()) + " on [" + task.getReference() + "]"); + task.setStatus(taskStatus); runningTasks.add(task); task = new RunningTask(); task.setId("0002"); task.setType(RunningTask.TASK_TYPES.VOLUME_REBALANCE); task.setReference("Volume2"); - task.setTaskInfo( task.getTaskType(task.getType()) + " is running in volume " + task.getReference()); - task.setStatus(status); + task.setTaskInfo(task.getTaskType(task.getType()) + " on [" + task.getReference() + "]"); + task.setStatus(taskStatus); runningTasks.add(task); // MigrateDisk task = new RunningTask(); task.setId("0003"); - 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); + task.setType(RunningTask.TASK_TYPES.DISK_MIGRATE); + task.setReference("Volume3:server1:sda1"); // Disk reference + task.setTaskInfo(task.getTaskType(task.getType()) + " for volume [" + task.getReference().split(":")[0] + + "] disk [" + task.getReference().split(":")[1] + ":" + task.getReference().split(":")[2] + "]"); + task.setStatus(taskStatus); runningTasks.add(task); // FormatDisk task = new RunningTask(); task.setId("0004"); - 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); + task.setType(RunningTask.TASK_TYPES.DISK_FORMAT); + task.setReference("server1:sdb1"); // Disk reference + task.setTaskInfo(task.getTaskType(task.getType()) + " [" + task.getReference() + "]"); + taskStatus.setPercentageSupported(true); + taskStatus.getPercentCompleted(45); + task.setStatus(taskStatus); runningTasks.add(task); - + return new RunningTaskListResponse(Status.STATUS_SUCCESS, runningTasks); } @SuppressWarnings("rawtypes") public Response startTask(@FormParam("taskType") RunningTask.TASK_TYPES taskType) { - String taskTypeStr = StringUtil.removeSpaces( new RunningTask().getTaskType(taskType) ); + String taskTypeStr = StringUtil.removeSpaces(new RunningTask().getTaskType(taskType)); String managerClassName = PKG + "." + taskTypeStr + MANAGER; Class managerClass; @@ -120,15 +121,14 @@ public class RunningTaskResource { manager.start(); return null; } - + // TODO Remove the test script for production public static void main(String[] args) { RunningTaskResource rt = new RunningTaskResource(); RunningTaskListResponse tasks = rt.getRunningTasks(); List<RunningTask> runningTasks = tasks.getRunningTasks(); - for( RunningTask x : runningTasks) { - System.out.println( x.getId() + " : " + x.getType() + " : " + x.getTaskInfo() ); + for (RunningTask x : runningTasks) { + 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 19310240..22ef2462 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 @@ -57,28 +57,26 @@ import com.sun.jersey.spi.resource.Singleton; @Singleton @Path(RESOURCE_PATH_VOLUMES) public class VolumesResource { - private static final String SCRIPT_NAME = "CreateVolumeExportDirectory.py"; @Autowired private static ServerUtil serverUtil; - private final GlusterUtil glusterUtil = new GlusterUtil(); - + @InjectParam private VolumeOptionsDefaults volumeOptionsDefaults; - @GET + @GET @Produces(MediaType.TEXT_XML) public VolumeListResponse getAllVolumes() { try { return new VolumeListResponse(Status.STATUS_SUCCESS, glusterUtil.getAllVolumes()); - } catch(Exception e) { + } catch (Exception e) { // TODO: log the error return new VolumeListResponse(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()), null); } } - + @POST @Consumes(MediaType.TEXT_XML) @Produces(MediaType.TEXT_XML) @@ -120,12 +118,13 @@ public class VolumesResource { } return new Status(Status.STATUS_CODE_FAILURE, "Invalid operation code [" + operation + "]"); } - + @GET @Path(SUBRESOURCE_DEFAULT_OPTIONS) @Produces(MediaType.TEXT_XML) public VolumeOptionInfoListResponse getDefaultOptions() { - // TODO: Fetch all volume options with their default values from GlusterFS + // TODO: Fetch all volume options with their default values from + // GlusterFS // whenever such a CLI command is made available in GlusterFS return new VolumeOptionInfoListResponse(Status.STATUS_SUCCESS, volumeOptionsDefaults.getDefaults()); } @@ -140,7 +139,6 @@ public class VolumesResource { return serverName + ":" + dirName; } else { return null; - // return result.getMessage(); } } |
