From 8ff7990ee8d9dc044f5ab5a41f72f755d3864bcf Mon Sep 17 00:00:00 2001 From: Selvasundaram Date: Wed, 20 Jul 2011 20:52:47 +0530 Subject: Alerts build on UI side REST services removed for Alerts --- .../META-INF/MANIFEST.MF | 1 + .../storage/management/client/AbstractClient.java | 13 +- .../storage/management/client/AlertsClient.java | 33 - .../management/client/GlusterDataModelManager.java | 718 -------------------- .../storage/management/client/UsersClient.java | 5 +- .../storage/management/core/model/Alert.java | 21 +- .../management/core/model/AlertListResponse.java | 38 -- .../storage/management/core/model/AlertStatus.java | 13 - src/com.gluster.storage.management.gui/plugin.xml | 5 + .../storage/management/gui/AlertsManager.java | 178 +++++ .../management/gui/BrickTableLabelProvider.java | 1 - .../management/gui/DeviceTableLabelProvider.java | 1 - .../management/gui/GlusterDataModelManager.java | 725 +++++++++++++++++++++ .../gui/ServerDiskTableLabelProvider.java | 1 - .../management/gui/actions/AddBrickAction.java | 2 +- .../management/gui/actions/AddServerAction.java | 2 +- .../management/gui/actions/ClearTaskAction.java | 2 +- .../management/gui/actions/CommitTaskAction.java | 2 +- .../management/gui/actions/DeleteVolumeAction.java | 2 +- .../management/gui/actions/PauseTaskAction.java | 2 +- .../gui/actions/RebalanceVolumeAction.java | 2 +- .../management/gui/actions/RemoveBrickAction.java | 2 +- .../management/gui/actions/RemoveServerAction.java | 2 +- .../gui/actions/ResetVolumeOptionsAction.java | 2 +- .../management/gui/actions/ResumeTaskAction.java | 2 +- .../management/gui/actions/StartVolumeAction.java | 2 +- .../management/gui/actions/StopTaskAction.java | 2 +- .../management/gui/actions/StopVolumeAction.java | 2 +- .../management/gui/dialogs/AddBrickPage.java | 2 +- .../management/gui/dialogs/AddBrickWizard.java | 2 +- .../management/gui/dialogs/CreateVolumePage1.java | 2 +- .../management/gui/dialogs/CreateVolumeWizard.java | 2 +- .../management/gui/dialogs/LoginDialog.java | 2 +- .../management/gui/dialogs/MigrateBrickPage1.java | 2 +- .../management/gui/dialogs/MigrateBrickWizard.java | 2 +- .../storage/management/gui/jobs/DataSyncJob.java | 2 +- .../gui/preferences/AlertsPreferencePage.java | 38 ++ .../gui/preferences/GlusterPreferencePage.java | 2 + .../gui/preferences/PreferenceConstants.java | 5 + .../gui/preferences/PreferenceInitializer.java | 6 + .../management/gui/views/ClusterSummaryView.java | 3 +- .../gui/views/GlusterServerSummaryView.java | 4 +- .../management/gui/views/NavigationView.java | 2 +- .../storage/management/gui/views/TasksView.java | 2 +- .../management/gui/views/VolumeBricksView.java | 2 +- .../management/gui/views/VolumeSummaryView.java | 2 +- .../management/gui/views/VolumesSummaryView.java | 2 +- .../gui/views/pages/AbstractDisksPage.java | 2 +- .../gui/views/pages/AbstractTableViewerPage.java | 2 +- .../gui/views/pages/OptionKeyEditingSupport.java | 2 +- .../gui/views/pages/OptionValueEditingSupport.java | 2 +- .../gui/views/pages/VolumeOptionsPage.java | 2 +- .../server/resources/v1_0/AlertsResource.java | 82 --- .../management/server/tasks/MigrateBrickTask.java | 3 +- 54 files changed, 1023 insertions(+), 937 deletions(-) delete mode 100644 src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java delete mode 100644 src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java delete mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java delete mode 100644 src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/AlertsPreferencePage.java delete mode 100644 src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java (limited to 'src') diff --git a/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF index dcd16136..7958d8cd 100644 --- a/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF +++ b/src/com.gluster.storage.management.client/META-INF/MANIFEST.MF @@ -14,3 +14,4 @@ Bundle-ClassPath: ., lib/jersey-1.5/jersey-core-1.5.jar, lib/jersey-1.5/jersey-multipart-1.5.jar, keystore/ +Import-Package: org.eclipse.jface.preference diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java index 45d75bba..20582835 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AbstractClient.java @@ -41,9 +41,9 @@ public abstract class AbstractClient { private static final String HTTP_HEADER_AUTH = "Authorization"; protected static final MultivaluedMap NO_PARAMS = new MultivaluedMapImpl(); private static final Logger logger = Logger.getLogger(AbstractClient.class); - protected String clusterName; + protected static String clusterName; + protected static String securityToken; protected WebResource resource; - private String securityToken; private String authHeader; private Client client; @@ -51,19 +51,18 @@ public abstract class AbstractClient { * This constructor will work only after the data model manager has been initialized. */ public AbstractClient() { - this(GlusterDataModelManager.getInstance().getSecurityToken(), GlusterDataModelManager.getInstance() - .getClusterName()); + this(securityToken, clusterName); } /** * This constructor will work only after the data model manager has been initialized. */ public AbstractClient(String clusterName) { - this(GlusterDataModelManager.getInstance().getSecurityToken(), clusterName); + this(securityToken, clusterName); } public AbstractClient(String securityToken, String clusterName) { - this.clusterName = clusterName; + AbstractClient.clusterName = clusterName; setSecurityToken(securityToken); createClient(); @@ -403,7 +402,7 @@ public abstract class AbstractClient { * the securityToken to set */ protected void setSecurityToken(String securityToken) { - this.securityToken = securityToken; + AbstractClient.securityToken = securityToken; authHeader = "Basic " + securityToken; } 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 deleted file mode 100644 index 37aca4cd..00000000 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/AlertsClient.java +++ /dev/null @@ -1,33 +0,0 @@ -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 clusterName) { - super(clusterName); - } - - public AlertsClient(String securityToken,String clusterName) { - super(securityToken, clusterName); - } - - @Override - public String getResourcePath() { - return RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESTConstants.RESOURCE_ALERTS; - } - - @SuppressWarnings("rawtypes") - private Object fetchAllAlerts(Class responseClass) { - return fetchResource( responseClass ); - } - - public List getAllAlerts() { - AlertListResponse response = (AlertListResponse) fetchAllAlerts(AlertListResponse.class); - return response.getAlerts(); - } -} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java deleted file mode 100644 index 0473d51b..00000000 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ /dev/null @@ -1,718 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.client; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.apache.log4j.Logger; -import org.eclipse.core.runtime.IProgressMonitor; - -import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; -import com.gluster.storage.management.core.model.Brick; -import com.gluster.storage.management.core.model.Cluster; -import com.gluster.storage.management.core.model.ClusterListener; -import com.gluster.storage.management.core.model.Device; -import com.gluster.storage.management.core.model.Device.DEVICE_STATUS; -import com.gluster.storage.management.core.model.Disk; -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.Partition; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.TaskInfo; -import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; -import com.gluster.storage.management.core.model.TaskStatus; -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.VolumeOptionInfo; -import com.gluster.storage.management.core.utils.GlusterCoreUtil; - -public class GlusterDataModelManager { - private static GlusterDataModelManager instance = new GlusterDataModelManager(); - private GlusterDataModel model; - private String securityToken; - private List listeners = new ArrayList(); - private List volumeOptionsDefaults; - private String clusterName; - private static Boolean syncInProgress = false; - private static final Logger logger = Logger.getLogger(GlusterDataModelManager.class); - - private GlusterDataModelManager() { - } - - public String getSecurityToken() { - return securityToken; - } - - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - } - - public void setClusterName(String clusterName) { - this.clusterName = clusterName; - } - - public String getClusterName() { - return clusterName; - } - - public GlusterDataModel getModel() { - return model; - } - - public static GlusterDataModelManager getInstance() { - return instance; - } - - public void initializeModel(String clusterName) { - setClusterName(clusterName); - - model = fetchData(clusterName); - } - - private GlusterDataModel fetchData(String clusterName) { - GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); - Cluster cluster = new Cluster(clusterName, model); - - initializeGlusterServers(cluster); - initializeVolumes(cluster); - - initializeAutoDiscoveredServers(cluster); - initializeTasks(cluster); - initializeAlerts(cluster); - initializeVolumeOptionsDefaults(); - - model.addCluster(cluster); - return model; - } - - public void refreshVolumeData(Volume oldVolume) { - VolumesClient volumeClient = new VolumesClient(); - Volume newVolume = volumeClient.getVolume(oldVolume.getName()); - if(!oldVolume.equals(newVolume)) { - volumeChanged(oldVolume, newVolume); - } - } - - public GlusterDataModel fetchModel(IProgressMonitor monitor) { - synchronized (syncInProgress) { - if(syncInProgress) { - logger.info("Previous data sync is still running. Skipping this one."); - return null; - } - syncInProgress = true; - } - - try { - logger.info("Starting data sync"); - GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); - Cluster cluster = new Cluster(clusterName, model); - model.addCluster(cluster); - - monitor.beginTask("Data Sync", 4); - - monitor.setTaskName("Syncing servers..."); - initializeGlusterServers(cluster); - monitor.worked(1); - - monitor.setTaskName("Syncing volumes..."); - initializeVolumes(cluster); - monitor.worked(1); - - monitor.setTaskName("Syncing discovered servers..."); - initializeAutoDiscoveredServers(cluster); - monitor.worked(1); - - monitor.setTaskName("Syncing tasks..."); - initializeTasks(cluster); - monitor.worked(1); - - monitor.done(); - return model; - } catch(RuntimeException e) { - logger.error("Error in data sync!", e); - return null; - } finally { - syncInProgress = false; - } - } - - public void updateModel(GlusterDataModel model) { - updateVolumes(model); - updateGlusterServers(model); - updateDiscoveredServers(model); - updateTasks(model); - } - - private void updateTasks(GlusterDataModel newModel) { - List oldTasks = model.getCluster().getTaskInfoList(); - List newTasks = newModel.getCluster().getTaskInfoList(); - - Set addedTasks = GlusterCoreUtil.getAddedEntities(oldTasks, newTasks, true); - for(TaskInfo task : addedTasks) { - addTask(task); - } - - Set removedTasks = GlusterCoreUtil.getAddedEntities(newTasks, oldTasks, true); - for(TaskInfo task : removedTasks) { - removeTask(task); - } - - Map modifiedTasks = GlusterCoreUtil.getModifiedEntities(oldTasks, newTasks); - for(Entry entry : modifiedTasks.entrySet()) { - TaskInfo modifiedTask = entry.getKey(); - modifiedTask.copyFrom(entry.getValue()); - updateTask(modifiedTask); - } - } - - private void updateDiscoveredServers(GlusterDataModel newModel) { - List oldServers = model.getCluster().getAutoDiscoveredServers(); - List newServers = newModel.getCluster().getAutoDiscoveredServers(); - - Set addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); - for (Server addedServer : addedServers) { - addDiscoveredServer(addedServer); - } - - Set removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); - for (Server removedServer : removedServers) { - removeDiscoveredServer(removedServer); - } - - Map modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); - for(Entry entry : modifiedServers.entrySet()) { - discoveredServerChanged(entry.getKey(), entry.getValue()); - } - } - - private void updateGlusterServers(GlusterDataModel newModel) { - List oldServers = model.getCluster().getServers(); - List newServers = newModel.getCluster().getServers(); - - Set addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); - for (GlusterServer addedServer : addedServers) { - addGlusterServer(addedServer); - } - - Set removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); - for (GlusterServer removedServer : removedServers) { - removeGlusterServer(removedServer); - } - - Map modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); - for(Entry entry : modifiedServers.entrySet()) { - glusterServerChanged(entry.getKey(), entry.getValue()); - } - } - - public void glusterServerChanged(GlusterServer oldServer, GlusterServer newServer) { - oldServer.copyFrom(newServer); - for (ClusterListener listener : listeners) { - listener.serverChanged(oldServer, new Event(EVENT_TYPE.GLUSTER_SERVER_CHANGED, newServer)); - } - - updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); - } - - private void updateDisks(Server server, List oldDisks, List newDisks) { - Set addedDisks = GlusterCoreUtil.getAddedEntities(oldDisks, newDisks, false); - addDisks(server, addedDisks); - - Set removedDisks = GlusterCoreUtil.getAddedEntities(newDisks, oldDisks, false); - removeDisks(server, removedDisks); - - Map modifiedDisks = GlusterCoreUtil.getModifiedEntities(oldDisks, newDisks); - disksChanged(server, modifiedDisks); - } - - private void disksChanged(Server server, Map modifiedDisks) { - if(modifiedDisks.size() == 0) { - return; - } - - for (Entry entry : modifiedDisks.entrySet()) { - entry.getKey().copyFrom(entry.getValue()); - } - for (ClusterListener listener : listeners) { - if (server instanceof GlusterServer) { - listener.serverChanged((GlusterServer) server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); - } else { - listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); - } - } - } - - public void addDisks(Server server, Set disks) { - if(disks.size() == 0) { - return; - } - - server.addDisks(disks); - for (ClusterListener listener : listeners) { - if(server instanceof GlusterServer) { - listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); - } else { - listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); - } - } - } - - public void removeDisks(Server server, Set disks) { - if(disks.size() == 0) { - return; - } - - for(Disk disk : disks) { - server.removeDisk(disk); - } - - for (ClusterListener listener : listeners) { - if(server instanceof GlusterServer) { - listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); - } else { - listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); - } - } - } - - private void updateVolumes(GlusterDataModel newModel) { - List oldVolumes = model.getCluster().getVolumes(); - List newVolumes = newModel.getCluster().getVolumes(); - - Set addedVolumes = GlusterCoreUtil.getAddedEntities(oldVolumes, newVolumes, false); - for (Volume addedVolume : addedVolumes) { - addVolume(addedVolume); - } - - Set removedVolumes = GlusterCoreUtil.getAddedEntities(newVolumes, oldVolumes, false); - for (Volume removedVolume : removedVolumes) { - deleteVolume(removedVolume); - } - - Map modifiedVolumes = GlusterCoreUtil.getModifiedEntities(oldVolumes, newVolumes); - for(Entry entry : modifiedVolumes.entrySet()) { - volumeChanged(entry.getKey(), entry.getValue()); - } - } - - - - private void volumeChanged(Volume oldVolume, Volume newVolume) { - oldVolume.copyFrom(newVolume); - for (ClusterListener listener : listeners) { - listener.volumeChanged(oldVolume, new Event(EVENT_TYPE.VOLUME_CHANGED, newVolume)); - } - updateBricks(oldVolume, oldVolume.getBricks(), newVolume.getBricks()); - } - - private void updateBricks(Volume volume, List oldBricks, List newBricks) { - Set addedBricks = GlusterCoreUtil.getAddedEntities(oldBricks, newBricks, false); - addBricks(volume, addedBricks); - - Set removedBricks = GlusterCoreUtil.getAddedEntities(newBricks, oldBricks, false); - removeBricks(volume, removedBricks); - - Map modifiedBricks = GlusterCoreUtil.getModifiedEntities(oldBricks, newBricks); - bricksChanged(volume, modifiedBricks); - } - - public void bricksChanged(Volume volume, Map modifiedBricks) { - if(modifiedBricks.size() == 0) { - return; - } - - for(Entry entry : modifiedBricks.entrySet()) { - entry.getKey().copyFrom(entry.getValue()); - } - - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_CHANGED, modifiedBricks)); - } - } - - private void initializeGlusterServers(Cluster cluster) { - cluster.setServers(new GlusterServersClient().getServers()); - } - - private void initializeAutoDiscoveredServers(Cluster cluster) { - cluster.setAutoDiscoveredServers(new DiscoveredServersClient(securityToken).getDiscoveredServerDetails()); - } - - private void initializeVolumes(Cluster cluster) { - VolumesClient volumeClient = new VolumesClient(); - cluster.setVolumes(volumeClient.getAllVolumes()); - } - - private void initializeVolumeOptionsDefaults() { - this.volumeOptionsDefaults = new VolumesClient().getVolumeOptionsDefaults(); - } - - public void initializeTasks(Cluster cluster) { - List taskInfoList = new TasksClient(cluster.getName()).getAllTasks(); - // List taskInfoList = getDummyTasks(); - cluster.setTaskInfoList(taskInfoList); - } - - private List getDummyTasks() { - List taskInfoList = new ArrayList(); - - // Task #1 - TaskInfo taskInfo = new TaskInfo(); - taskInfo.setType(TASK_TYPE.BRICK_MIGRATE); - taskInfo.setName("Migrate Brick-music"); - taskInfo.setPauseSupported(true); - taskInfo.setStopSupported(true); - taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, ""))); - - taskInfo.getStatus().setMessage("Migrating file xxxxx to yyyy"); - taskInfo.setDescription("Migrate Brick on volume [music] from /export/adb/music to /export/sdc/music."); - taskInfoList.add(taskInfo); - // Task #2 - taskInfo = new TaskInfo(); - taskInfo.setType(TASK_TYPE.DISK_FORMAT); - taskInfo.setName("Format Disk-server1:sdc"); - taskInfo.setPauseSupported(false); - taskInfo.setStopSupported(false); - taskInfo.setStatus( new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, ""))); - taskInfo.getStatus().setMessage("Format completes 80% ..."); - taskInfo.setDescription("Formatting disk server1:sdc."); - taskInfoList.add(taskInfo); - - - return taskInfoList; - } - - public void initializeAlerts(Cluster cluster) { - cluster.setAlerts(new AlertsClient(cluster.getName()).getAllAlerts()); - } - - public Volume addVolume(List volumes, String name, Cluster cluster, VOLUME_TYPE volumeType, - TRANSPORT_TYPE transportType, VOLUME_STATUS status) { - Volume volume = new Volume(name, cluster, volumeType, transportType, status); - volumes.add(volume); - - return volume; - } - - private Device getDevice(String serverName, String deviceName) { - List allDevices = getReadyDevicesOfAllServers(); - for (Device device : allDevices) { - if (device.getServerName().equals(serverName) && device.getName().equals(deviceName)) { - return device; - } - } - return null; - } - - /* - * @param diskName (sda) - * - * @return The device object for given device name - */ - public Device getDeviceDetails(String deviceName) { - List allDevices = getReadyDevicesOfAllServers(); - for (Device device : allDevices) { - if (device.getName().equals(deviceName)) { - return device; - } - } - return null; - } - - - public List getReadyDevicesOfVolume(Volume volume) { - Device device = null; - List volumeDevices = new ArrayList(); - for (Brick brick : volume.getBricks()) { - device = getDevice(brick.getServerName(), brick.getDeviceName()); - if (device != null && device.isReady()) { - volumeDevices.add(device); - } - } - return volumeDevices; - } - - public List getReadyDevicesOfAllServers() { - return getReadyDevicesOfAllServersExcluding(new ArrayList()); - } - - public List getReadyDevicesOfAllServersExcluding(List excludeDevices) { - List devices = new ArrayList(); - - for (Server server : model.getCluster().getServers()) { - for (Disk disk : server.getDisks()) { - if(disk.hasPartitions()) { - for(Partition partition : disk.getPartitions()) { - if(partition.isReady() && !excludeDevices.contains(partition)) { - devices.add(partition); - } - } - } else if (disk.isReady() && !excludeDevices.contains(disk)) { - devices.add(disk); - } - } - } - return devices; - } - - public void addClusterListener(ClusterListener listener) { - listeners.add(listener); - } - - public void removeClusterListener(ClusterListener listener) { - listeners.remove(listener); - } - - public void addGlusterServer(GlusterServer server) { - Cluster cluster = model.getCluster(); - cluster.addServer(server); - - for (ClusterListener listener : listeners) { - listener.serverAdded(server); - } - - removeDiscoveredServer(server.getName()); - } - - public void addDiscoveredServer(Server server) { - Cluster cluster = model.getCluster(); - cluster.addDiscoveredServer(server); - - for (ClusterListener listener : listeners) { - listener.discoveredServerAdded(server);; - } - } - - public void discoveredServerChanged(Server oldServer, Server newServer) { - oldServer.copyFrom(newServer); - for (ClusterListener listener : listeners) { - listener.discoveredServerChanged(oldServer, new Event(EVENT_TYPE.DISCOVERED_SERVER_CHANGED, newServer)); - } - updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); - } - - public void removeDiscoveredServer(String serverName) { - Cluster cluster = model.getCluster(); - // TODO: Move auto-discovered servers outside the cluster - for(Server server : cluster.getAutoDiscoveredServers()) { - if(server.getName().toUpperCase().equals(serverName.toUpperCase())) { - removeDiscoveredServer(server); - return; - } - } - } - - public void removeDiscoveredServer(Server server) { - Cluster cluster = model.getCluster(); - cluster.removeDiscoveredServer(server); - - for (ClusterListener listener : listeners) { - listener.discoveredServerRemoved(server); - } - } - - public void removeGlusterServer(GlusterServer server) { - Cluster cluster = model.getCluster(); - cluster.removeServer(server); - - // can't use an iterator here. The method AbstractList.Itr#next checks for concurrent modification. - // Since listeners can end up creating new views, which add themselves as listeners, the listeners - // list can be concurrently modified which can result in an exception while using iterator. - // Hence we use List#get instead of the iterator - for(int i = 0; i < listeners.size(); i++) { - ClusterListener listener = listeners.get(i); - listener.serverRemoved(server); - } - - // add it to discovered servers list - Server removedServer = new Server(); - removedServer.copyFrom(server); - addDiscoveredServer(removedServer); - } - - public void deleteVolume(Volume volume) { - Cluster cluster = model.getCluster(); - cluster.deleteVolume(volume); - - // can't use an iterator here. The method AbstractList.Itr#next checks for concurrent modification. - // Since listeners can end up creating new views, which add themselves as listeners, the listeners - // list can be concurrently modified which can result in an exception while using iterator. - // Hence we use List#get instead of the iterator - for(int i = 0; i < listeners.size(); i++) { - ClusterListener listener = listeners.get(i); - listener.volumeDeleted(volume); - } - } - - public void updateVolumeStatus(Volume volume, VOLUME_STATUS newStatus) { - volume.setStatus(newStatus); - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus)); - } - } - - public void resetVolumeOptions(Volume volume) { - volume.getOptions().clear(); - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_OPTIONS_RESET, null)); - } - } - - public void addBricks(Volume volume, Set bricks) { - if(bricks.size() == 0) { - return; - } - - volume.addBricks(bricks); - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_ADDED, bricks)); - } - } - - public void removeBricks(Volume volume, Set bricks) { - if(bricks.size() == 0) { - return; - } - - // Remove the bricks from the volume object - for (Brick brick : bricks) { - volume.removeBrick(brick); - } - - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_REMOVED, bricks)); - } - } - - public void setVolumeOption(Volume volume, String optionKey, String optionValue) { - volume.setOption(optionKey, optionValue); - for (ClusterListener listener : listeners) { - listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_OPTION_SET, optionKey)); - } - } - - public void addVolume(Volume volume) { - Cluster cluster = model.getCluster(); - cluster.addVolume(volume); - - for (ClusterListener listener : listeners) { - listener.volumeCreated(volume); - } - } - - public void addTask(TaskInfo taskInfo) { - Cluster cluster = model.getCluster(); - cluster.addTaskInfo(taskInfo); - for (ClusterListener listener : listeners) { - listener.taskAdded(taskInfo); - } - } - - // Updating the Task - public void updateTask(TaskInfo taskInfo) { - for (ClusterListener listener : listeners) { - listener.taskUpdated(taskInfo); - } - } - - public void removeTask(TaskInfo taskInfo) { - model.getCluster().removeTaskInfo(taskInfo); - for (ClusterListener listener : listeners) { - listener.taskRemoved(taskInfo); - } - } - - public List getVolumeOptionsDefaults() { - return volumeOptionsDefaults; - } - - public VolumeOptionInfo getVolumeOptionInfo(String optionKey) { - for (VolumeOptionInfo info : volumeOptionsDefaults) { - if (info.getName().equals(optionKey)) { - return info; - } - } - throw new GlusterRuntimeException("Invalid option key [" + optionKey - + "] passed to GlusterDataModelManager#getVolumeOptionInfo"); - } - - public String getVolumeOptionDefaultValue(String optionKey) { - return getVolumeOptionInfo(optionKey).getDefaultValue(); - } - - public String getVolumeOptionDesc(String optionKey) { - return getVolumeOptionInfo(optionKey).getDescription(); - } - - public void setAccessControlList(Volume volume, String accessControlList) { - setVolumeOption(volume, Volume.OPTION_AUTH_ALLOW, accessControlList); - } - - public Server getGlusterServer(String serverName) { - for (Server server : model.getCluster().getServers()) { - if (server.getName().equals(serverName)) { - return server; - } - } - return null; - } - - private Boolean isDeviceUsed(Volume volume, Device device) { - for (Brick brick : volume.getBricks()) { - if (device.getName().equals(brick.getDeviceName()) && device.getServerName().equals(brick.getServerName())) { - return true; - } - } - return false; - } - - public String getDeviceStatus(Device device) { - if (device.getStatus() == DEVICE_STATUS.INITIALIZED) { - for (Volume volume : model.getCluster().getVolumes()) { - if (isDeviceUsed(volume, device)) { - return "In use"; - } - } - } - return device.getStatusStr(); - } - - public List getVolumesOfServer(String serverName) { - List volumeNames = new ArrayList(); - Cluster cluster = model.getCluster(); - for (Volume volume : cluster.getVolumes()) { - for (Brick brick : volume.getBricks()) { - if (serverName.equals(brick.getServerName())) { - volumeNames.add(volume.getName()); - break; - } - } - } - return volumeNames; - } -} diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java index c0590d5f..5144b6ba 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -42,8 +42,6 @@ public class UsersClient extends AbstractClient { public void authenticate(String user, String password) { setSecurityToken(generateSecurityToken(user, password)); fetchSubResource(user, Status.class); - // authentication successful. update security token in the data model manager - GlusterDataModelManager.getInstance().setSecurityToken(getSecurityToken()); } public void changePassword(String user, String oldPassword, String newPassword) { @@ -55,7 +53,8 @@ public class UsersClient extends AbstractClient { putRequest(user, form); // password changed. set the new security token - authenticate(user, newPassword); + setSecurityToken(generateSecurityToken(user, newPassword)); + //authenticate(user, newPassword); } public static void main(String[] args) { 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 db8a9018..2cfae3cb 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 @@ -2,6 +2,9 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import org.eclipse.osgi.internal.signedcontent.Base64; + +@SuppressWarnings("restriction") @XmlRootElement(name = "alert") public class Alert { @@ -17,8 +20,22 @@ public class Alert { protected String reference; // [for server- "Server", for Disk- "Server:disk", for volume- "Volume:Server:disk"] protected String message; - public String getAlertType(ALERT_TYPES alertType) { - return ALERT_TYPE_STR[alertType.ordinal()]; + public String getAlertType() { + return ALERT_TYPE_STR[type.ordinal()]; + } + + public Alert() { + } + + public Alert(ALERT_TYPES type, String reference, String Message) { + setType(type); + setReference(reference); + setMessage(Message); + setId(buildAlertId()); + } + + public String buildAlertId() { + return Base64.encode((getAlertType() + "-" + getReference()).getBytes()).toString(); } public String getId() { 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 deleted file mode 100644 index 57885ac1..00000000 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertListResponse.java +++ /dev/null @@ -1,38 +0,0 @@ -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 com.gluster.storage.management.core.response.AbstractResponse; - -@XmlRootElement(name = "response") -public class AlertListResponse extends AbstractResponse { - private List alerts = new ArrayList(); - - public AlertListResponse() { - - } - - public AlertListResponse(List alerts) { - setAlerts(alerts); - } - - public void setAlerts(List alerts) { - this.alerts = alerts; - } - - @XmlElementWrapper(name = "alerts") - @XmlElement(name = "alert", type = Alert.class) - public List getAlerts() { - return this.alerts; - } - - @Override - public Object getData() { - return getAlerts(); - } -} diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java deleted file mode 100644 index 8c563f49..00000000 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/AlertStatus.java +++ /dev/null @@ -1,13 +0,0 @@ -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.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index 3c87ffe1..147693a6 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -1389,6 +1389,11 @@ id="com.gluster.storage.management.gui.preferences.GlusterPreferencePage" name="Gluster"> + + diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java new file mode 100644 index 00000000..9f9fdd5d --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/AlertsManager.java @@ -0,0 +1,178 @@ +/** + * AlertsManager.java + * + * Copyright (c) 2011 Gluster, Inc. + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + */ +package com.gluster.storage.management.gui; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.jface.preference.IPreferenceStore; + +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.Alert.ALERT_TYPES; +import com.gluster.storage.management.core.model.Brick; +import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; +import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.Disk; +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.Partition; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.preferences.PreferenceConstants; + + +public class AlertsManager { + private List alerts = new ArrayList(); + private Cluster cluster; + + private Double CPU_USAGE_THRESHOLD; + private Double MEMORY_USAGE_THRESHOLD; + private Double DISK_SPACE_USAGE_THRESHOLD; + + public AlertsManager(Cluster cluster) { + this.cluster = cluster; + + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + CPU_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD); + MEMORY_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_SERVER_MEMORY_USAGE_THRESHOLD); + DISK_SPACE_USAGE_THRESHOLD = preferenceStore.getDouble(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD); + } + + public List getAlerts() { + return alerts; + } + + public Alert getAlert(String id) { + for (Alert alert : getAlerts()) { + if (alert.getId().equals(id)) { + return alert; + } + } + return null; + } + + public void addAlert(Alert alert) { + alerts.add(alert); + } + + public void addAlerts(List alerts) { + this.alerts.addAll(alerts); + } + + public void setAlerts(List alerts) { + this.alerts = alerts; + } + + public Boolean removeAlert(String id) { + for (int i = 0; i < alerts.size(); i++) { + if (alerts.get(i).getId().equals(id)) { + return (alerts.remove(i) != null); + } + } + return false; + } + + public void clearAll() { + this.alerts.clear(); + } + + public void buildAlerts() { + clearAll(); + addAlerts(getServerAlerts()); + addAlerts(getVolumeAlerts()); + } + + private List getServerAlerts() { + List serverAlerts = new ArrayList(); + for (GlusterServer server : cluster.getServers()) { + // To check off line servers + if (server.getStatus() == SERVER_STATUS.OFFLINE) { + serverAlerts.add(new Alert(ALERT_TYPES.OFFLINE_SERVERS_ALERT, server.getName(), "Server [" + + server.getName() + "] is Offline")); + continue; // If the server is Offline skip other Alert builds + } + + // To check High CPU usage + if (server.getCpuUsage() >= CPU_USAGE_THRESHOLD) { + serverAlerts + .add(new Alert(ALERT_TYPES.CPU_USAGE_ALERT, server.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.CPU_USAGE_ALERT.ordinal()] + "[" + + server.getCpuUsage() + "]")); + } + + // To check High Memory usage + Double memoryUtilized = server.getMemoryInUse() / server.getTotalMemory() * 100; + if (memoryUtilized >= MEMORY_USAGE_THRESHOLD) { + serverAlerts.add(new Alert(ALERT_TYPES.MEMORY_USAGE_ALERT, server.getName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.MEMORY_USAGE_ALERT.ordinal()] + "[" + server.getCpuUsage() + + "]")); + } + + // To Check low disk space + serverAlerts.addAll(getLowDiskAlerts(server)); + } + return serverAlerts; + } + + private List getLowDiskAlerts(GlusterServer server) { + List diskAlerts = new ArrayList(); + boolean hasPartition; + Double deviceSpaceUsed; + for (Disk disk : server.getDisks()) { + hasPartition = false; + for (Partition partition : disk.getPartitions()) { + hasPartition = true; + deviceSpaceUsed = partition.getSpaceInUse() / partition.getSpace() * 100; + if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { + diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, partition.getQualifiedName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + deviceSpaceUsed + + "% used]")); + } + } + if (hasPartition) { + continue; // Do not check disk usage + } + + // If it is disk + deviceSpaceUsed = disk.getSpaceInUse() / disk.getSpace() * 100; + if (deviceSpaceUsed >= DISK_SPACE_USAGE_THRESHOLD) { + diskAlerts.add(new Alert(ALERT_TYPES.DISK_USAGE_ALERT, disk.getQualifiedName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.DISK_USAGE_ALERT.ordinal()] + " [" + deviceSpaceUsed + + "% used]")); + } + + } + return diskAlerts; + } + + private List getVolumeAlerts() { + List volumeAlerts = new ArrayList(); + for (Volume volume : cluster.getVolumes()) { + // To check off line bricks + for (Brick brick : volume.getBricks()) { + if (brick.getStatus() == BRICK_STATUS.OFFLINE) { + volumeAlerts.add(new Alert(ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT, brick.getQualifiedName(), + Alert.ALERT_TYPE_STR[ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT.ordinal()])); + } + } + } + return volumeAlerts; + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java index 4ac1db41..c01148b9 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java @@ -20,7 +20,6 @@ package com.gluster.storage.management.gui; import org.eclipse.swt.graphics.Image; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Device; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DeviceTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DeviceTableLabelProvider.java index c2e77030..50e842b4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DeviceTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DeviceTableLabelProvider.java @@ -23,7 +23,6 @@ import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.swt.graphics.Image; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Device; import com.gluster.storage.management.core.model.Device.DEVICE_STATUS; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java new file mode 100644 index 00000000..61008a00 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java @@ -0,0 +1,725 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + *******************************************************************************/ +package com.gluster.storage.management.gui; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.apache.log4j.Logger; +import org.eclipse.core.runtime.IProgressMonitor; + +import com.gluster.storage.management.client.DiscoveredServersClient; +import com.gluster.storage.management.client.GlusterServersClient; +import com.gluster.storage.management.client.TasksClient; +import com.gluster.storage.management.client.VolumesClient; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.Alert; +import com.gluster.storage.management.core.model.Brick; +import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.ClusterListener; +import com.gluster.storage.management.core.model.Device; +import com.gluster.storage.management.core.model.Device.DEVICE_STATUS; +import com.gluster.storage.management.core.model.Disk; +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.Partition; +import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; +import com.gluster.storage.management.core.model.TaskStatus; +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.VolumeOptionInfo; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; + +public class GlusterDataModelManager { + private static GlusterDataModelManager instance = new GlusterDataModelManager(); + private GlusterDataModel model; + private String securityToken; + private List listeners = new ArrayList(); + private List volumeOptionsDefaults; + private String clusterName; + private static Boolean syncInProgress = false; + private static final Logger logger = Logger.getLogger(GlusterDataModelManager.class); + + private GlusterDataModelManager() { + } + + public String getSecurityToken() { + return securityToken; + } + + public void setSecurityToken(String securityToken) { + this.securityToken = securityToken; + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public String getClusterName() { + return clusterName; + } + + public GlusterDataModel getModel() { + return model; + } + + public static GlusterDataModelManager getInstance() { + return instance; + } + + public void initializeModel(String clusterName) { + setClusterName(clusterName); + + model = fetchData(clusterName); + } + + private GlusterDataModel fetchData(String clusterName) { + GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); + Cluster cluster = new Cluster(clusterName, model); + + initializeGlusterServers(cluster); + initializeVolumes(cluster); + + initializeAutoDiscoveredServers(cluster); + initializeTasks(cluster); + initializeAlerts(cluster); + initializeVolumeOptionsDefaults(); + + model.addCluster(cluster); + return model; + } + + public void refreshVolumeData(Volume oldVolume) { + VolumesClient volumeClient = new VolumesClient(); + Volume newVolume = volumeClient.getVolume(oldVolume.getName()); + if(!oldVolume.equals(newVolume)) { + volumeChanged(oldVolume, newVolume); + } + } + + public GlusterDataModel fetchModel(IProgressMonitor monitor) { + synchronized (syncInProgress) { + if(syncInProgress) { + logger.info("Previous data sync is still running. Skipping this one."); + return null; + } + syncInProgress = true; + } + + try { + logger.info("Starting data sync"); + GlusterDataModel model = new GlusterDataModel("Gluster Data Model"); + Cluster cluster = new Cluster(clusterName, model); + model.addCluster(cluster); + + monitor.beginTask("Data Sync", 4); + + monitor.setTaskName("Syncing servers..."); + initializeGlusterServers(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing volumes..."); + initializeVolumes(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing discovered servers..."); + initializeAutoDiscoveredServers(cluster); + monitor.worked(1); + + monitor.setTaskName("Syncing tasks..."); + initializeTasks(cluster); + monitor.worked(1); + + monitor.done(); + return model; + } catch(RuntimeException e) { + logger.error("Error in data sync!", e); + return null; + } finally { + syncInProgress = false; + } + } + + public void updateModel(GlusterDataModel model) { + updateVolumes(model); + updateGlusterServers(model); + updateDiscoveredServers(model); + updateTasks(model); + } + + private void updateTasks(GlusterDataModel newModel) { + List oldTasks = model.getCluster().getTaskInfoList(); + List newTasks = newModel.getCluster().getTaskInfoList(); + + Set addedTasks = GlusterCoreUtil.getAddedEntities(oldTasks, newTasks, true); + for(TaskInfo task : addedTasks) { + addTask(task); + } + + Set removedTasks = GlusterCoreUtil.getAddedEntities(newTasks, oldTasks, true); + for(TaskInfo task : removedTasks) { + removeTask(task); + } + + Map modifiedTasks = GlusterCoreUtil.getModifiedEntities(oldTasks, newTasks); + for(Entry entry : modifiedTasks.entrySet()) { + TaskInfo modifiedTask = entry.getKey(); + modifiedTask.copyFrom(entry.getValue()); + updateTask(modifiedTask); + } + } + + private void updateDiscoveredServers(GlusterDataModel newModel) { + List oldServers = model.getCluster().getAutoDiscoveredServers(); + List newServers = newModel.getCluster().getAutoDiscoveredServers(); + + Set addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); + for (Server addedServer : addedServers) { + addDiscoveredServer(addedServer); + } + + Set removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); + for (Server removedServer : removedServers) { + removeDiscoveredServer(removedServer); + } + + Map modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); + for(Entry entry : modifiedServers.entrySet()) { + discoveredServerChanged(entry.getKey(), entry.getValue()); + } + } + + private void updateGlusterServers(GlusterDataModel newModel) { + List oldServers = model.getCluster().getServers(); + List newServers = newModel.getCluster().getServers(); + + Set addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); + for (GlusterServer addedServer : addedServers) { + addGlusterServer(addedServer); + } + + Set removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); + for (GlusterServer removedServer : removedServers) { + removeGlusterServer(removedServer); + } + + Map modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); + for(Entry entry : modifiedServers.entrySet()) { + glusterServerChanged(entry.getKey(), entry.getValue()); + } + } + + public void glusterServerChanged(GlusterServer oldServer, GlusterServer newServer) { + oldServer.copyFrom(newServer); + for (ClusterListener listener : listeners) { + listener.serverChanged(oldServer, new Event(EVENT_TYPE.GLUSTER_SERVER_CHANGED, newServer)); + } + + updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); + } + + private void updateDisks(Server server, List oldDisks, List newDisks) { + Set addedDisks = GlusterCoreUtil.getAddedEntities(oldDisks, newDisks, false); + addDisks(server, addedDisks); + + Set removedDisks = GlusterCoreUtil.getAddedEntities(newDisks, oldDisks, false); + removeDisks(server, removedDisks); + + Map modifiedDisks = GlusterCoreUtil.getModifiedEntities(oldDisks, newDisks); + disksChanged(server, modifiedDisks); + } + + private void disksChanged(Server server, Map modifiedDisks) { + if(modifiedDisks.size() == 0) { + return; + } + + for (Entry entry : modifiedDisks.entrySet()) { + entry.getKey().copyFrom(entry.getValue()); + } + for (ClusterListener listener : listeners) { + if (server instanceof GlusterServer) { + listener.serverChanged((GlusterServer) server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); + } + } + } + + public void addDisks(Server server, Set disks) { + if(disks.size() == 0) { + return; + } + + server.addDisks(disks); + for (ClusterListener listener : listeners) { + if(server instanceof GlusterServer) { + listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); + } + } + } + + public void removeDisks(Server server, Set disks) { + if(disks.size() == 0) { + return; + } + + for(Disk disk : disks) { + server.removeDisk(disk); + } + + for (ClusterListener listener : listeners) { + if(server instanceof GlusterServer) { + listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); + } + } + } + + private void updateVolumes(GlusterDataModel newModel) { + List oldVolumes = model.getCluster().getVolumes(); + List newVolumes = newModel.getCluster().getVolumes(); + + Set addedVolumes = GlusterCoreUtil.getAddedEntities(oldVolumes, newVolumes, false); + for (Volume addedVolume : addedVolumes) { + addVolume(addedVolume); + } + + Set removedVolumes = GlusterCoreUtil.getAddedEntities(newVolumes, oldVolumes, false); + for (Volume removedVolume : removedVolumes) { + deleteVolume(removedVolume); + } + + Map modifiedVolumes = GlusterCoreUtil.getModifiedEntities(oldVolumes, newVolumes); + for(Entry entry : modifiedVolumes.entrySet()) { + volumeChanged(entry.getKey(), entry.getValue()); + } + } + + + + private void volumeChanged(Volume oldVolume, Volume newVolume) { + oldVolume.copyFrom(newVolume); + for (ClusterListener listener : listeners) { + listener.volumeChanged(oldVolume, new Event(EVENT_TYPE.VOLUME_CHANGED, newVolume)); + } + updateBricks(oldVolume, oldVolume.getBricks(), newVolume.getBricks()); + } + + private void updateBricks(Volume volume, List oldBricks, List newBricks) { + Set addedBricks = GlusterCoreUtil.getAddedEntities(oldBricks, newBricks, false); + addBricks(volume, addedBricks); + + Set removedBricks = GlusterCoreUtil.getAddedEntities(newBricks, oldBricks, false); + removeBricks(volume, removedBricks); + + Map modifiedBricks = GlusterCoreUtil.getModifiedEntities(oldBricks, newBricks); + bricksChanged(volume, modifiedBricks); + } + + public void bricksChanged(Volume volume, Map modifiedBricks) { + if(modifiedBricks.size() == 0) { + return; + } + + for(Entry entry : modifiedBricks.entrySet()) { + entry.getKey().copyFrom(entry.getValue()); + } + + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_CHANGED, modifiedBricks)); + } + } + + private void initializeGlusterServers(Cluster cluster) { + cluster.setServers(new GlusterServersClient(cluster.getName()).getServers()); + } + + private void initializeAutoDiscoveredServers(Cluster cluster) { + cluster.setAutoDiscoveredServers(new DiscoveredServersClient(securityToken).getDiscoveredServerDetails()); + } + + private void initializeVolumes(Cluster cluster) { + VolumesClient volumeClient = new VolumesClient(cluster.getName()); + cluster.setVolumes(volumeClient.getAllVolumes()); + } + + private void initializeVolumeOptionsDefaults() { + this.volumeOptionsDefaults = new VolumesClient(clusterName).getVolumeOptionsDefaults(); + } + + public void initializeTasks(Cluster cluster) { + List taskInfoList = new TasksClient(cluster.getName()).getAllTasks(); + // List taskInfoList = getDummyTasks(); + cluster.setTaskInfoList(taskInfoList); + } + + private List getDummyTasks() { + List taskInfoList = new ArrayList(); + + // Task #1 + TaskInfo taskInfo = new TaskInfo(); + taskInfo.setType(TASK_TYPE.BRICK_MIGRATE); + taskInfo.setName("Migrate Brick-music"); + taskInfo.setPauseSupported(true); + taskInfo.setStopSupported(true); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, ""))); + + taskInfo.getStatus().setMessage("Migrating file xxxxx to yyyy"); + taskInfo.setDescription("Migrate Brick on volume [music] from /export/adb/music to /export/sdc/music."); + taskInfoList.add(taskInfo); + // Task #2 + taskInfo = new TaskInfo(); + taskInfo.setType(TASK_TYPE.DISK_FORMAT); + taskInfo.setName("Format Disk-server1:sdc"); + taskInfo.setPauseSupported(false); + taskInfo.setStopSupported(false); + taskInfo.setStatus( new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, ""))); + taskInfo.getStatus().setMessage("Format completes 80% ..."); + taskInfo.setDescription("Formatting disk server1:sdc."); + taskInfoList.add(taskInfo); + + return taskInfoList; + } + + public void initializeAlerts(Cluster cluster) { + AlertsManager alertsManager = new AlertsManager(cluster); + alertsManager.buildAlerts(); + cluster.setAlerts( alertsManager.getAlerts() ); + } + + + public Volume addVolume(List volumes, String name, Cluster cluster, VOLUME_TYPE volumeType, + TRANSPORT_TYPE transportType, VOLUME_STATUS status) { + Volume volume = new Volume(name, cluster, volumeType, transportType, status); + volumes.add(volume); + + return volume; + } + + private Device getDevice(String serverName, String deviceName) { + List allDevices = getReadyDevicesOfAllServers(); + for (Device device : allDevices) { + if (device.getServerName().equals(serverName) && device.getName().equals(deviceName)) { + return device; + } + } + return null; + } + + /* + * @param diskName (sda) + * + * @return The device object for given device name + */ + public Device getDeviceDetails(String deviceName) { + List allDevices = getReadyDevicesOfAllServers(); + for (Device device : allDevices) { + if (device.getName().equals(deviceName)) { + return device; + } + } + return null; + } + + + public List getReadyDevicesOfVolume(Volume volume) { + Device device = null; + List volumeDevices = new ArrayList(); + for (Brick brick : volume.getBricks()) { + device = getDevice(brick.getServerName(), brick.getDeviceName()); + if (device != null && device.isReady()) { + volumeDevices.add(device); + } + } + return volumeDevices; + } + + public List getReadyDevicesOfAllServers() { + return getReadyDevicesOfAllServersExcluding(new ArrayList()); + } + + public List getReadyDevicesOfAllServersExcluding(List excludeDevices) { + List devices = new ArrayList(); + + for (Server server : model.getCluster().getServers()) { + for (Disk disk : server.getDisks()) { + if(disk.hasPartitions()) { + for(Partition partition : disk.getPartitions()) { + if(partition.isReady() && !excludeDevices.contains(partition)) { + devices.add(partition); + } + } + } else if (disk.isReady() && !excludeDevices.contains(disk)) { + devices.add(disk); + } + } + } + return devices; + } + + public void addClusterListener(ClusterListener listener) { + listeners.add(listener); + } + + public void removeClusterListener(ClusterListener listener) { + listeners.remove(listener); + } + + public void addGlusterServer(GlusterServer server) { + Cluster cluster = model.getCluster(); + cluster.addServer(server); + + for (ClusterListener listener : listeners) { + listener.serverAdded(server); + } + + removeDiscoveredServer(server.getName()); + } + + public void addDiscoveredServer(Server server) { + Cluster cluster = model.getCluster(); + cluster.addDiscoveredServer(server); + + for (ClusterListener listener : listeners) { + listener.discoveredServerAdded(server);; + } + } + + public void discoveredServerChanged(Server oldServer, Server newServer) { + oldServer.copyFrom(newServer); + for (ClusterListener listener : listeners) { + listener.discoveredServerChanged(oldServer, new Event(EVENT_TYPE.DISCOVERED_SERVER_CHANGED, newServer)); + } + updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); + } + + public void removeDiscoveredServer(String serverName) { + Cluster cluster = model.getCluster(); + // TODO: Move auto-discovered servers outside the cluster + for(Server server : cluster.getAutoDiscoveredServers()) { + if(server.getName().toUpperCase().equals(serverName.toUpperCase())) { + removeDiscoveredServer(server); + return; + } + } + } + + public void removeDiscoveredServer(Server server) { + Cluster cluster = model.getCluster(); + cluster.removeDiscoveredServer(server); + + for (ClusterListener listener : listeners) { + listener.discoveredServerRemoved(server); + } + } + + public void removeGlusterServer(GlusterServer server) { + Cluster cluster = model.getCluster(); + cluster.removeServer(server); + + // can't use an iterator here. The method AbstractList.Itr#next checks for concurrent modification. + // Since listeners can end up creating new views, which add themselves as listeners, the listeners + // list can be concurrently modified which can result in an exception while using iterator. + // Hence we use List#get instead of the iterator + for(int i = 0; i < listeners.size(); i++) { + ClusterListener listener = listeners.get(i); + listener.serverRemoved(server); + } + + // add it to discovered servers list + Server removedServer = new Server(); + removedServer.copyFrom(server); + addDiscoveredServer(removedServer); + } + + public void deleteVolume(Volume volume) { + Cluster cluster = model.getCluster(); + cluster.deleteVolume(volume); + + // can't use an iterator here. The method AbstractList.Itr#next checks for concurrent modification. + // Since listeners can end up creating new views, which add themselves as listeners, the listeners + // list can be concurrently modified which can result in an exception while using iterator. + // Hence we use List#get instead of the iterator + for(int i = 0; i < listeners.size(); i++) { + ClusterListener listener = listeners.get(i); + listener.volumeDeleted(volume); + } + } + + public void updateVolumeStatus(Volume volume, VOLUME_STATUS newStatus) { + volume.setStatus(newStatus); + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus)); + } + } + + public void resetVolumeOptions(Volume volume) { + volume.getOptions().clear(); + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_OPTIONS_RESET, null)); + } + } + + public void addBricks(Volume volume, Set bricks) { + if(bricks.size() == 0) { + return; + } + + volume.addBricks(bricks); + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_ADDED, bricks)); + } + } + + public void removeBricks(Volume volume, Set bricks) { + if(bricks.size() == 0) { + return; + } + + // Remove the bricks from the volume object + for (Brick brick : bricks) { + volume.removeBrick(brick); + } + + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_REMOVED, bricks)); + } + } + + public void setVolumeOption(Volume volume, String optionKey, String optionValue) { + volume.setOption(optionKey, optionValue); + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_OPTION_SET, optionKey)); + } + } + + public void addVolume(Volume volume) { + Cluster cluster = model.getCluster(); + cluster.addVolume(volume); + + for (ClusterListener listener : listeners) { + listener.volumeCreated(volume); + } + } + + public void addTask(TaskInfo taskInfo) { + Cluster cluster = model.getCluster(); + cluster.addTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskAdded(taskInfo); + } + } + + // Updating the Task + public void updateTask(TaskInfo taskInfo) { + for (ClusterListener listener : listeners) { + listener.taskUpdated(taskInfo); + } + } + + public void removeTask(TaskInfo taskInfo) { + model.getCluster().removeTaskInfo(taskInfo); + for (ClusterListener listener : listeners) { + listener.taskRemoved(taskInfo); + } + } + + public List getVolumeOptionsDefaults() { + return volumeOptionsDefaults; + } + + public VolumeOptionInfo getVolumeOptionInfo(String optionKey) { + for (VolumeOptionInfo info : volumeOptionsDefaults) { + if (info.getName().equals(optionKey)) { + return info; + } + } + throw new GlusterRuntimeException("Invalid option key [" + optionKey + + "] passed to GlusterDataModelManager#getVolumeOptionInfo"); + } + + public String getVolumeOptionDefaultValue(String optionKey) { + return getVolumeOptionInfo(optionKey).getDefaultValue(); + } + + public String getVolumeOptionDesc(String optionKey) { + return getVolumeOptionInfo(optionKey).getDescription(); + } + + public void setAccessControlList(Volume volume, String accessControlList) { + setVolumeOption(volume, Volume.OPTION_AUTH_ALLOW, accessControlList); + } + + public Server getGlusterServer(String serverName) { + for (Server server : model.getCluster().getServers()) { + if (server.getName().equals(serverName)) { + return server; + } + } + return null; + } + + private Boolean isDeviceUsed(Volume volume, Device device) { + for (Brick brick : volume.getBricks()) { + if (device.getName().equals(brick.getDeviceName()) && device.getServerName().equals(brick.getServerName())) { + return true; + } + } + return false; + } + + public String getDeviceStatus(Device device) { + if (device.getStatus() == DEVICE_STATUS.INITIALIZED) { + for (Volume volume : model.getCluster().getVolumes()) { + if (isDeviceUsed(volume, device)) { + return "In use"; + } + } + } + return device.getStatusStr(); + } + + public List getVolumesOfServer(String serverName) { + List volumeNames = new ArrayList(); + Cluster cluster = model.getCluster(); + for (Volume volume : cluster.getVolumes()) { + for (Brick brick : volume.getBricks()) { + if (serverName.equals(brick.getServerName())) { + volumeNames.add(volume.getName()); + break; + } + } + } + return volumeNames; + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java index 96372dc3..15c222fc 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java @@ -20,7 +20,6 @@ package com.gluster.storage.management.gui; import org.eclipse.swt.graphics.Image; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Device.DEVICE_STATUS; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java index e86164ec..a14d6869 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java @@ -25,8 +25,8 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardDialog; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.dialogs.AddBrickWizard; public class AddBrickAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java index 6d21e537..a97e537a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java @@ -26,10 +26,10 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Display; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; public class AddServerAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java index c22eca43..2c9baf59 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java @@ -3,10 +3,10 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class ClearTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java index 86a71882..6a13fc8e 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java @@ -3,11 +3,11 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class CommitTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java index c3607463..44ce02ad 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java @@ -23,10 +23,10 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java index 872df738..a9dceaa3 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java @@ -23,11 +23,11 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java index 9441de45..41b74082 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java @@ -23,11 +23,11 @@ import java.net.URI; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; public class RebalanceVolumeAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java index f7d1207c..70e7df21 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java @@ -11,11 +11,11 @@ import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.StringUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.VolumeBricksView; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java index 4862b7b1..b0156b87 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java @@ -30,10 +30,10 @@ import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Display; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; public class RemoveServerAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResetVolumeOptionsAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResetVolumeOptionsAction.java index b11a0f9a..e68436b0 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResetVolumeOptionsAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResetVolumeOptionsAction.java @@ -4,9 +4,9 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.widgets.Display; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; public class ResetVolumeOptionsAction extends AbstractActionDelegate { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java index d8f1b955..d5cfe2c5 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java @@ -3,11 +3,11 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class ResumeTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java index 322a87f9..8b3fee68 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java @@ -21,10 +21,10 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class StartVolumeAction extends AbstractActionDelegate { private Volume volume; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java index 306edbf3..19030712 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java @@ -3,10 +3,10 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class StopTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java index 62c690e2..ccde24a4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java @@ -22,10 +22,10 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java index 2856ea02..14e36852 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java @@ -29,12 +29,12 @@ import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Device; import com.gluster.storage.management.core.model.Disk; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.richclientgui.toolbox.duallists.DualListComposite.ListContentChangedListener; import com.richclientgui.toolbox.duallists.IRemovableContentProvider; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java index 58255f8c..0270eddb 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java @@ -27,11 +27,11 @@ import java.util.Set; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.StringUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; /** * 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 cd2de837..b4672095 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 @@ -47,7 +47,6 @@ import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Device; import com.gluster.storage.management.core.model.Disk; @@ -57,6 +56,7 @@ import com.gluster.storage.management.core.model.Volume.NAS_PROTOCOL; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.utils.ValidationUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class CreateVolumePage1 extends WizardPage { public static final String PAGE_NAME = "create.volume.page.1"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java index ff4bdd98..c5cbcc16 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/CreateVolumeWizard.java @@ -21,10 +21,10 @@ package com.gluster.storage.management.gui.dialogs; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class CreateVolumeWizard extends Wizard { private static final String title = "Gluster Management Console - Create Volume"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java index 6cb15d6a..cb129a32 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java @@ -42,11 +42,11 @@ import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.gluster.storage.management.client.ClustersClient; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.UsersClient; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.ConnectionDetails; import com.gluster.storage.management.gui.Activator; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.dialogs.ClusterSelectionDialog.CLUSTER_MODE; import com.gluster.storage.management.gui.preferences.PreferenceConstants; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java index f8fce5e4..cb59c310 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java @@ -43,12 +43,12 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Device; import com.gluster.storage.management.core.model.Disk; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.NumberUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.TableLabelProviderAdapter; import com.gluster.storage.management.gui.utils.GUIHelper; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java index d8f0f165..c125a3c8 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java @@ -23,13 +23,13 @@ import java.net.URI; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; public class MigrateBrickWizard extends Wizard { private Volume volume; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java index aff62a92..e38ac1cf 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/jobs/DataSyncJob.java @@ -25,8 +25,8 @@ import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.swt.widgets.Display; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.GlusterDataModel; +import com.gluster.storage.management.gui.GlusterDataModelManager; /** * diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/AlertsPreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/AlertsPreferencePage.java new file mode 100644 index 00000000..9a3e68b5 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/AlertsPreferencePage.java @@ -0,0 +1,38 @@ +package com.gluster.storage.management.gui.preferences; + +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.IntegerFieldEditor; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +import com.gluster.storage.management.gui.Activator; + +public class AlertsPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { + + public AlertsPreferencePage() { + super(GRID); + setPreferenceStore(Activator.getDefault().getPreferenceStore()); + setDescription("Gluster Management Console - Alerts"); + } + + /* (non-Javadoc) + * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() + */ + @Override + protected void createFieldEditors() { + addField(new IntegerFieldEditor(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD, + "&Server CPU usage threshold:", getFieldEditorParent())); + + addField(new IntegerFieldEditor(PreferenceConstants.P_SERVER_MEMORY_USAGE_THRESHOLD, + "&Server memory usage threshold (%):", getFieldEditorParent())); + + addField(new IntegerFieldEditor(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD, + "&Disk space usage threshold (%):", getFieldEditorParent())); + } + + @Override + public void init(IWorkbench workbench) { + // TODO Auto-generated method stub + + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java index d8eee3e4..d7aa4162 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/GlusterPreferencePage.java @@ -18,12 +18,14 @@ *******************************************************************************/ package com.gluster.storage.management.gui.preferences; +import java.awt.TextField; import java.util.List; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.ComboFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IntegerFieldEditor; +import org.eclipse.jface.preference.StringFieldEditor; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java index 039cf488..b44ca37b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceConstants.java @@ -26,10 +26,15 @@ public class PreferenceConstants { public static final String P_SHOW_CLUSTER_SELECTION_DIALOG = "show.cluster.selection.dialog"; public static final String P_DEFAULT_CLUSTER_NAME = "default.cluster.name"; public static final String P_DATA_SYNC_INTERVAL = "data.sync.interval"; + + public static final String P_SERVER_CPU_CRITICAL_THRESHOLD = "server.cpu.threshold"; + public static final String P_SERVER_MEMORY_USAGE_THRESHOLD = "server.memory.threshold"; + public static final String P_DISK_SPACE_USAGE_THRESHOLD = "disk.space.threshold"; // in percentage // TODO: Remove after proper preferences are added public static final String P_PATH = "pathPreference"; public static final String P_BOOLEAN = "booleanPreference"; public static final String P_CHOICE = "choicePreference"; public static final String P_STRING = "stringPreference"; + // public static final String P_CPU_THRESHOLD = "stringPreference"; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java index 909b957a..ae04034b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java @@ -40,5 +40,11 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { // default data sync interval = 5 minutes store.setDefault(PreferenceConstants.P_DATA_SYNC_INTERVAL, 300); + + // Default CPU utilisation threshold + store.setDefault(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD, 95); + + // Default disk free space threshold + store.setDefault(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD, 90); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java index 54e289bc..5709807a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java @@ -21,7 +21,6 @@ package com.gluster.storage.management.gui.views; import java.util.ArrayList; -import java.util.Date; import java.util.List; import org.eclipse.birt.chart.util.CDateTime; @@ -40,7 +39,6 @@ import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.handlers.IHandlerService; import org.eclipse.ui.part.ViewPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.Alert; import com.gluster.storage.management.core.model.Cluster; @@ -53,6 +51,7 @@ import com.gluster.storage.management.core.model.ServerStats; import com.gluster.storage.management.core.model.ServerStatsRow; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.utils.NumberUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.actions.IActionConstants; import com.gluster.storage.management.gui.utils.ChartViewerComposite; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java index 1a89ae7e..784fddfc 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java @@ -42,16 +42,16 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.ServerStatsRow; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.ServerStats; +import com.gluster.storage.management.core.model.ServerStatsRow; import com.gluster.storage.management.core.utils.NumberUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.NetworkInterfaceTableLabelProvider; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java index b60bc37b..708726c0 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java @@ -34,13 +34,13 @@ import org.eclipse.ui.model.BaseWorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.part.ViewPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.GlusterDataModel; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; public class NavigationView extends ViewPart implements ISelectionListener { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/TasksView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/TasksView.java index fb772d46..06342bf8 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/TasksView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/TasksView.java @@ -6,8 +6,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.TaskInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.views.pages.TasksPage; public class TasksView extends ViewPart { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java index 712882ee..bb008f09 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeBricksView.java @@ -4,8 +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.Volume; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.pages.BricksPage; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java index 8c4d2572..37d1ef3e 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java @@ -32,7 +32,6 @@ import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Alert; import com.gluster.storage.management.core.model.Brick; @@ -50,6 +49,7 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.utils.NumberUtil; import com.gluster.storage.management.core.utils.StringUtil; import com.gluster.storage.management.core.utils.ValidationUtil; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; import com.gluster.storage.management.gui.utils.GUIHelper; 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 daeecb83..72d4e944 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,7 +31,6 @@ import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Alert; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.EntityGroup; @@ -39,6 +38,7 @@ import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.ChartViewerComposite.CHART_TYPE; import com.gluster.storage.management.gui.utils.GUIHelper; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java index 1c63e1c3..a28fd90f 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractDisksPage.java @@ -39,7 +39,6 @@ import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.events.HyperlinkEvent; import org.eclipse.ui.forms.widgets.ImageHyperlink; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.client.TasksClient; import com.gluster.storage.management.core.model.ClusterListener; @@ -52,6 +51,7 @@ import com.gluster.storage.management.core.model.Partition; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.gui.Application; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.IEntityListener; import com.gluster.storage.management.gui.dialogs.InitializeDiskTypeSelection; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java index 1e2c888d..a56350b9 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/AbstractTableViewerPage.java @@ -47,9 +47,9 @@ import org.eclipse.ui.forms.events.HyperlinkAdapter; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Hyperlink; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; public abstract class AbstractTableViewerPage extends Composite implements ISelectionListener { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionKeyEditingSupport.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionKeyEditingSupport.java index a139a106..6d76b2d2 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionKeyEditingSupport.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionKeyEditingSupport.java @@ -13,11 +13,11 @@ import org.eclipse.jface.viewers.EditingSupport; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.VolumeOption; import com.gluster.storage.management.core.model.VolumeOptionInfo; import com.gluster.storage.management.core.model.VolumeOptions; +import com.gluster.storage.management.gui.GlusterDataModelManager; /** * Editing support for the "value" column in volume options table viewer. diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionValueEditingSupport.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionValueEditingSupport.java index 78da6935..9a3f32ad 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionValueEditingSupport.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/OptionValueEditingSupport.java @@ -14,11 +14,11 @@ import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.VolumeOption; import com.gluster.storage.management.core.model.VolumeOptionInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.utils.GUIHelper; /** diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java index 34829fef..1331a81f 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/VolumeOptionsPage.java @@ -50,7 +50,6 @@ import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.forms.widgets.FormToolkit; -import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.DefaultClusterListener; import com.gluster.storage.management.core.model.Event; @@ -58,6 +57,7 @@ import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.VolumeOption; import com.gluster.storage.management.core.model.VolumeOptionInfo; +import com.gluster.storage.management.gui.GlusterDataModelManager; import com.gluster.storage.management.gui.VolumeOptionsContentProvider; import com.gluster.storage.management.gui.VolumeOptionsTableLabelProvider; import com.gluster.storage.management.gui.utils.GUIHelper; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java deleted file mode 100644 index 91eeef1a..00000000 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.gluster.storage.management.server.resources.v1_0; - -import static com.gluster.storage.management.core.constants.RESTConstants.*; - -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_CLUSTERS + "/{" + PATH_PARAM_CLUSTER_NAME + "}/" + RESOURCE_ALERTS) -public class AlertsResource { - - @GET - @Produces(MediaType.APPLICATION_XML) - public AlertListResponse getAlerts() { - - List alerts = new ArrayList(); - - // TODO To implement the following dummy alerts - // Alert #1 - Alert alert = new Alert(); - alert.setId("0001"); - alert.setReference("Server1"); // Server - alert.setType(Alert.ALERT_TYPES.CPU_USAGE_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " in server [" + alert.getReference() + "]"); - alerts.add(alert); - - // Alert #2 - alert = new Alert(); - alert.setId("0002"); - alert.setReference("Server2"); // server:Disk - brick - alert.setType(Alert.ALERT_TYPES.MEMORY_USAGE_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " in server [" + alert.getReference() + "]"); - alerts.add(alert); - - // Alert #3 - alert = new Alert(); - alert.setId("0003"); - alert.setReference("server1:sda1"); // Disk name - alert.setType(Alert.ALERT_TYPES.DISK_USAGE_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " in disk [" + alert.getReference() + "]"); - alerts.add(alert); - - // Alert #4 - alert = new Alert(); - alert.setId("0004"); - alert.setReference("Volume3:server2:sda1"); // volume:[Disk name] - alert.setType(Alert.ALERT_TYPES.OFFLINE_VOLUME_BRICKS_ALERT); - 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("Server2"); // Server name - alert.setType(Alert.ALERT_TYPES.OFFLINE_SERVERS_ALERT); - alert.setMessage(alert.getAlertType(alert.getType()) + " [" + alert.getReference() + "]"); - alerts.add(alert); - - return new AlertListResponse(alerts); - - } - - public static void main(String[] args) { - /* - * // Unit test code AlertsResource alertResource = new AlertsResource(); AlertsListResponse alertResponse = - * alertResource.getAlerts(); List alerts = alertResponse.getAlerts(); for (Alert alert: alerts) { - * System.out.println(alert.getMessage()); } - */ - } - -} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java index 1715807f..8ca15fc9 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java @@ -89,13 +89,12 @@ public class MigrateBrickTask extends Task { try { startMigration(getOnlineServer().getName()); } catch (ConnectionException e) { - // online server might have gone offline. try with a new one. + // online server might have gone Offline. try with a new one. startMigration(getNewOnlineServer().getName()); } } private void startMigration(String onlineServerName) { - ProcessResult processResult = glusterUtil.executeBrickMigration(onlineServerName, getTaskInfo().getReference(), getFromBrick(), getToBrick(), "start"); if (processResult.getOutput().trim().matches(".*started successfully$")) { -- cgit