From c3f598a9a5dc66428c98e026f621caf647ae09fd Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Sat, 23 Jul 2011 19:12:02 +0530 Subject: Story #38 - CPU Usage graph --- src/com.gluster.storage.management.gui/plugin.xml | 7 ++ .../management/gui/GlusterDataModelManager.java | 55 +++++++++++++- .../gui/dialogs/ChangePasswordDialog.java | 1 + .../gui/dialogs/ClusterSelectionDialog.java | 2 + .../management/gui/dialogs/LoginDialog.java | 7 +- .../gui/preferences/ChartsPreferencePage.java | 61 ++++++++++++++++ .../gui/preferences/ClusterPreferencePage.java | 83 ---------------------- .../gui/preferences/ConsolePreferencePage.java | 83 ---------------------- .../gui/preferences/PreferenceConstants.java | 9 +-- .../gui/preferences/PreferenceInitializer.java | 5 ++ .../management/gui/utils/ChartViewerComposite.java | 2 +- .../management/gui/views/ClusterSummaryView.java | 82 ++++++++++----------- .../gui/views/GlusterServerSummaryView.java | 73 +++++++++++++------ 13 files changed, 227 insertions(+), 243 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ClusterPreferencePage.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ConsolePreferencePage.java (limited to 'src/com.gluster.storage.management.gui') diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index 250fa2e2..3955ed91 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -1389,10 +1389,17 @@ name="Gluster"> + + 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 index aba7dde2..d63886c6 100644 --- 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 @@ -26,6 +26,7 @@ import java.util.Set; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.preference.IPreferenceStore; import com.gluster.storage.management.client.DiscoveredServersClient; import com.gluster.storage.management.client.GlusterServersClient; @@ -33,11 +34,11 @@ 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.Alert.ALERT_TYPES; 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.Alert.ALERT_TYPES; 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; @@ -56,6 +57,7 @@ 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; +import com.gluster.storage.management.gui.preferences.PreferenceConstants; public class GlusterDataModelManager { private static GlusterDataModelManager instance = new GlusterDataModelManager(); @@ -116,6 +118,16 @@ public class GlusterDataModelManager { volumeChanged(oldVolume, newVolume); } } + + private boolean isCancelled(IProgressMonitor monitor) { + if(monitor.isCanceled()) { + monitor.setTaskName("Data sync cancelled!"); + monitor.done(); + return true; + } else { + return false; + } + } public GlusterDataModel fetchModel(IProgressMonitor monitor) { synchronized (syncInProgress) { @@ -132,23 +144,46 @@ public class GlusterDataModelManager { Cluster cluster = new Cluster(clusterName, model); model.addCluster(cluster); - monitor.beginTask("Data Sync", 4); + monitor.beginTask("Data Sync", 6); monitor.setTaskName("Syncing servers..."); initializeGlusterServers(cluster); monitor.worked(1); + if(isCancelled(monitor)) { + return model; + } monitor.setTaskName("Syncing volumes..."); initializeVolumes(cluster); monitor.worked(1); + if(isCancelled(monitor)) { + return model; + } monitor.setTaskName("Syncing discovered servers..."); initializeAutoDiscoveredServers(cluster); monitor.worked(1); + if(isCancelled(monitor)) { + return model; + } monitor.setTaskName("Syncing tasks..."); initializeTasks(cluster); monitor.worked(1); + if(isCancelled(monitor)) { + return model; + } + + monitor.setTaskName("Syncing aggregated CPU stats..."); + initializeAggregatedCpuStats(cluster); + monitor.worked(1); + if(isCancelled(monitor)) { + return model; + } + + monitor.setTaskName("Syncing aggregated Network stats..."); + initializeAggregatedNetworkStats(cluster); + monitor.worked(1); monitor.done(); return model; @@ -391,12 +426,26 @@ public class GlusterDataModelManager { this.volumeOptionsDefaults = new VolumesClient(clusterName).getVolumeOptionsDefaults(); } - public void initializeTasks(Cluster cluster) { + private void initializeTasks(Cluster cluster) { List taskInfoList = new TasksClient(cluster.getName()).getAllTasks(); //List taskInfoList = getDummyTasks(); cluster.setTaskInfoList(taskInfoList); } + private void initializeAggregatedCpuStats(Cluster cluster) { + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + String cpuStatsPeriod = preferenceStore.getString(PreferenceConstants.P_CPU_CHART_PERIOD); + + cluster.setAggregatedCpuStats(new GlusterServersClient().getAggregatedCpuStats(cpuStatsPeriod)); + } + + private void initializeAggregatedNetworkStats(Cluster cluster) { + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + String networkStatsPeriod = preferenceStore.getString(PreferenceConstants.P_NETWORK_CHART_PERIOD); + + cluster.setAggregatedNetworkStats(new GlusterServersClient().getAggregatedNetworkStats(networkStatsPeriod)); + } + private List getDummyTasks() { List taskInfoList = new ArrayList(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ChangePasswordDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ChangePasswordDialog.java index d62c5dcb..00f2aab0 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ChangePasswordDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ChangePasswordDialog.java @@ -193,6 +193,7 @@ public class ChangePasswordDialog extends Dialog { @Override protected void createButtonsForButtonBar(Composite parent) { okButton = createButton(parent, IDialogConstants.OK_ID, "&Change", true); + okButton.setEnabled(false); createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); setupDataBinding(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java index 37381172..f5d2f6dd 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java @@ -200,6 +200,7 @@ public class ClusterSelectionDialog extends Dialog { private void createClusterRegisterComposite(Composite composite) { clusterRegisterComposite = new Composite(composite, SWT.NONE); GridLayout layout = new GridLayout(2, false); + layout.horizontalSpacing = 15; clusterRegisterComposite.setLayout(layout); createClusterNameLabel(clusterRegisterComposite); @@ -224,6 +225,7 @@ public class ClusterSelectionDialog extends Dialog { private void createClusterCreationComposite(Composite subComposite) { clusterCreationComposite = new Composite(subComposite, SWT.NONE); GridLayout layout = new GridLayout(2, false); + layout.horizontalSpacing = 15; clusterCreationComposite.setLayout(layout); createClusterNameLabel(clusterCreationComposite); 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 9c7988e3..401bdce0 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 @@ -222,11 +222,10 @@ public class LoginDialog extends Dialog { if (password.equalsIgnoreCase(CoreConstants.DEFAULT_PASSWORD)) { String oldSecurityTokeString = GlusterDataModelManager.getInstance().getSecurityToken(); ChangePasswordDialog dialog = new ChangePasswordDialog(getShell()); - dialog.open(); - if (GlusterDataModelManager.getInstance().getSecurityToken().equals(oldSecurityTokeString)) { - MessageDialog.openInformation(getShell(), "Change password Cancelled", - "Gateway could not be accessed with default password !" + "\n\n" + "Application will close."); + if (dialog.open() == Dialog.CANCEL) { + MessageDialog.openError(getShell(), "Change password Cancelled", + "Password must be changed on first login!" + "\n" + "Application will close."); cancelPressed(); return; } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java new file mode 100644 index 00000000..112a2a91 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * 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.preferences; + +import org.eclipse.jface.preference.ComboFieldEditor; +import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.ui.IWorkbench; +import org.eclipse.ui.IWorkbenchPreferencePage; + +import com.gluster.storage.management.gui.Activator; + +/** + * + */ +public class ChartsPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { + + public ChartsPreferencePage() { + super(GRID); + setPreferenceStore(Activator.getDefault().getPreferenceStore()); + setDescription("Gluster Management Console - Charts Preferences"); + } + + /* (non-Javadoc) + * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) + */ + @Override + public void init(IWorkbench workbench) { + } + + /* (non-Javadoc) + * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors() + */ + @Override + protected void createFieldEditors() { + String[][] entryNamesAndValues = new String[][] { { "1 day", "1d" }, { "1 week", "1w" }, { "1 month", "1m" }, + { "1 year", "1y" } }; + addField(new ComboFieldEditor(PreferenceConstants.P_CPU_CHART_PERIOD, "CPU Usage chart period", + entryNamesAndValues, getFieldEditorParent())); + addField(new ComboFieldEditor(PreferenceConstants.P_MEM_CHART_PERIOD, "Memory Usage chart period", entryNamesAndValues, + getFieldEditorParent())); + addField(new ComboFieldEditor(PreferenceConstants.P_NETWORK_CHART_PERIOD, "Network Usage chart period", entryNamesAndValues, + getFieldEditorParent())); + } + +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ClusterPreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ClusterPreferencePage.java deleted file mode 100644 index 14dbeba9..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ClusterPreferencePage.java +++ /dev/null @@ -1,83 +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.gui.preferences; - -import org.eclipse.jface.preference.*; -import org.eclipse.ui.IWorkbenchPreferencePage; -import org.eclipse.ui.IWorkbench; - -import com.gluster.storage.management.gui.Activator; - -/** - * This class represents a preference page that - * is contributed to the Preferences dialog. By - * subclassing FieldEditorPreferencePage, we - * can use the field support built into JFace that allows - * us to create a page that is small and knows how to - * save, restore and apply itself. - *

- * This page is used to modify preferences only. They - * are stored in the preference store that belongs to - * the main plug-in class. That way, preferences can - * be accessed directly via the preference store. - */ - -public class ClusterPreferencePage - extends FieldEditorPreferencePage - implements IWorkbenchPreferencePage { - - public ClusterPreferencePage() { - super(GRID); - setPreferenceStore(Activator.getDefault().getPreferenceStore()); - setDescription("A demonstration of a preference page implementation"); - } - - /** - * Creates the field editors. Field editors are abstractions of - * the common GUI blocks needed to manipulate various types - * of preferences. Each field editor knows how to save and - * restore itself. - */ - public void createFieldEditors() { - addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH, - "&Directory preference:", getFieldEditorParent())); - addField( - new BooleanFieldEditor( - PreferenceConstants.P_BOOLEAN, - "&An example of a boolean preference", - getFieldEditorParent())); - - addField(new RadioGroupFieldEditor( - PreferenceConstants.P_CHOICE, - "An example of a multiple-choice preference", - 1, - new String[][] { { "&Choice 1", "choice1" }, { - "C&hoice 2", "choice2" } - }, getFieldEditorParent())); - addField( - new StringFieldEditor(PreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent())); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) - */ - public void init(IWorkbench workbench) { - } - -} \ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ConsolePreferencePage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ConsolePreferencePage.java deleted file mode 100644 index 2d49af9b..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ConsolePreferencePage.java +++ /dev/null @@ -1,83 +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.gui.preferences; - -import org.eclipse.jface.preference.*; -import org.eclipse.ui.IWorkbenchPreferencePage; -import org.eclipse.ui.IWorkbench; - -import com.gluster.storage.management.gui.Activator; - -/** - * This class represents a preference page that - * is contributed to the Preferences dialog. By - * subclassing FieldEditorPreferencePage, we - * can use the field support built into JFace that allows - * us to create a page that is small and knows how to - * save, restore and apply itself. - *

- * This page is used to modify preferences only. They - * are stored in the preference store that belongs to - * the main plug-in class. That way, preferences can - * be accessed directly via the preference store. - */ - -public class ConsolePreferencePage - extends FieldEditorPreferencePage - implements IWorkbenchPreferencePage { - - public ConsolePreferencePage() { - super(GRID); - setPreferenceStore(Activator.getDefault().getPreferenceStore()); - setDescription("A demonstration of a preference page implementation"); - } - - /** - * Creates the field editors. Field editors are abstractions of - * the common GUI blocks needed to manipulate various types - * of preferences. Each field editor knows how to save and - * restore itself. - */ - public void createFieldEditors() { - addField(new DirectoryFieldEditor(PreferenceConstants.P_PATH, - "&Directory preference:", getFieldEditorParent())); - addField( - new BooleanFieldEditor( - PreferenceConstants.P_BOOLEAN, - "&An example of a boolean preference", - getFieldEditorParent())); - - addField(new RadioGroupFieldEditor( - PreferenceConstants.P_CHOICE, - "An example of a multiple-choice preference", - 1, - new String[][] { { "&Choice 1", "choice1" }, { - "C&hoice 2", "choice2" } - }, getFieldEditorParent())); - addField( - new StringFieldEditor(PreferenceConstants.P_STRING, "A &text preference:", getFieldEditorParent())); - } - - /* (non-Javadoc) - * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) - */ - public void init(IWorkbench workbench) { - } - -} \ No newline at end of file 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 b44ca37b..46af10d3 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 @@ -31,10 +31,7 @@ public class PreferenceConstants { 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"; + public static final String P_CPU_CHART_PERIOD = "cpu.chart.period"; + public static final String P_MEM_CHART_PERIOD = "memory.chart.period"; + public static final String P_NETWORK_CHART_PERIOD = "network.chart.period"; } 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 ae04034b..f889a259 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 @@ -46,5 +46,10 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer { // Default disk free space threshold store.setDefault(PreferenceConstants.P_DISK_SPACE_USAGE_THRESHOLD, 90); + + // Default period for server statistics charts + store.setDefault(PreferenceConstants.P_CPU_CHART_PERIOD, "1d"); + store.setDefault(PreferenceConstants.P_MEM_CHART_PERIOD, "1d"); + store.setDefault(PreferenceConstants.P_NETWORK_CHART_PERIOD, "1d"); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/ChartViewerComposite.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/ChartViewerComposite.java index f7ebd0ec..f2735380 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/ChartViewerComposite.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/ChartViewerComposite.java @@ -213,7 +213,7 @@ public final class ChartViewerComposite extends Composite implements PaintListen DateTimeDataElement dtde1 = DateTimeDataElementImpl.create(timestamps[0]); xAxisPrimary.getScale().setMax(dtde); xAxisPrimary.getScale().setStep((dtde.getValue() - dtde1.getValue())/ 10); - xAxisPrimary.getScale().setMajorGridsStepNumber(timestamps.length / 10); + xAxisPrimary.getScale().setMajorGridsStepNumber(timestamps.length > 10 ? timestamps.length / 10 : 1); //xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.ABOVE_LITERAL); xAxisPrimary.getMajorGrid().getTickAttributes().setVisible(false); xAxisPrimary.getMajorGrid().setLineAttributes(LineAttributesImpl.create(ColorDefinitionImpl.GREY(), LineStyle.SOLID_LITERAL, 1)); 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 b9a9e5ae..90307c8b 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 @@ -20,6 +20,7 @@ */ package com.gluster.storage.management.gui.views; +import java.util.ArrayList; import java.util.List; import org.eclipse.birt.chart.util.CDateTime; @@ -40,6 +41,7 @@ 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.GlusterServersClient; import com.gluster.storage.management.core.model.Alert; import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.EntityGroup; @@ -47,6 +49,8 @@ import com.gluster.storage.management.core.model.GlusterDataModel; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Server.SERVER_STATUS; +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; @@ -235,7 +239,6 @@ public class ClusterSummaryView extends ViewPart { createDiskSpaceSection(); createCPUUsageSection(); createNetworkUsageSection(); - //createMemoryUsageSection(); createActionsSection(); createAlertsSection(); createRunningTasksSection(); @@ -244,56 +247,53 @@ public class ClusterSummaryView extends ViewPart { } private void createCPUUsageSection() { - Composite section = guiHelper.createSection(form, toolkit, "CPU Usage (aggregated)", null, 1, false); + // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. + createAreaChartSection(cluster.getAggregatedCpuStats(), "CPU Usage (Aggregated)", 2, "%"); + } + + private void createAreaChartSection(ServerStats stats, String sectionTitle, int dataColumnIndex, String unit) { + List timestamps = new ArrayList(); + List data = new ArrayList(); + extractChartData(stats, timestamps, data, dataColumnIndex); + + if(timestamps.size() == 0) { + // Log a message saying no CPU stats available + return; + } + + Composite section = guiHelper.createSection(form, toolkit, sectionTitle, null, 1, false); if (cluster.getServers().size() == 0) { toolkit.createLabel(section, "This section will be populated after at least\none server is added to the storage cloud."); return; } -// ServerStats stats = new GlusterServersClient().getAggregatedCPUStats(); -// List timestamps = new ArrayList(); -// List data = new ArrayList(); -// for(ServerStatsRow row : stats.getRows()) { -// // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. -// Double cpuUsage = row.getUsageData().get(2); -// if(!cpuUsage.isNaN()) { -// timestamps.add(new CDateTime(row.getTimestamp() * 1000)); -// data.add(cpuUsage); -// } -// } -// createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0])); + createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]), unit); - Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), - new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), - new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100), - new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300), - new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500), - new CDateTime(1000l*1310473800) }; - - Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d }; - createLineChart(section, timestamps, values, "%"); +// Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), +// new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), +// new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100), +// new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300), +// new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500), +// new CDateTime(1000l*1310473800) }; +// +// Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d }; +// createLineChart(section, timestamps, values, "%"); createChartLinks(section, 4); } + private void extractChartData(ServerStats stats, List timestamps, List data, int dataColumnIndex) { + for(ServerStatsRow row : stats.getRows()) { + Double cpuUsage = row.getUsageData().get(dataColumnIndex); + if(!cpuUsage.isNaN()) { + timestamps.add(new CDateTime(row.getTimestamp() * 1000)); + data.add(cpuUsage); + } + } + } + private void createNetworkUsageSection() { - Composite section = guiHelper.createSection(form, toolkit, "Network Usage (Aggregated)", null, 1, false); - //toolkit.createLabel(section, "Historical Network Usage graph will be displayed here."); - - Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), - new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), - new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100), - new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300), - new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500), - new CDateTime(1000l*1310473800) }; -// Date[] timestamps = new Date[] { new Date(1310468100), new Date(1310468400), new Date(1310468700), -// new Date(1310469000), new Date(1310469300), new Date(1310469600), new Date(1310469900), -// new Date(1310470200), new Date(1310470500), new Date(1310470800), new Date(1310471100), -// new Date(1310471400), new Date(1310471700), new Date(1310472000), new Date(1310472300), -// new Date(1310472600), new Date(1310472900), new Date(1310473200), new Date(1310473500), -// new Date(1310473800) }; - Double[] values = new Double[] { 32d, 31.23d, 27.92d, 48.69d, 58.62d, 49.11d, 72.43d, 69.31d, 87.39d, 78.46d, 60.44d, 56.28d, 33.51d, 27.53d, 12.21, 10d, 21.43d, 36.45d, 34.86d, 35.27d }; - createLineChart(section, timestamps, values, "KiB/s"); - createChartLinks(section, 4); + // in case of network usage, there are three elements in usage data: received, transmitted and total. we use total. + createAreaChartSection(cluster.getAggregatedNetworkStats(), "Network Usage (Aggregated)", 2, "KiB/s"); } private void createRunningTasksSection() { 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 498c9fe0..dfbafa70 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 @@ -23,8 +23,10 @@ package com.gluster.storage.management.gui.views; import java.util.ArrayList; import java.util.List; +import org.apache.log4j.Logger; import org.eclipse.birt.chart.util.CDateTime; import org.eclipse.jface.layout.TableColumnLayout; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; @@ -46,15 +48,20 @@ 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.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.Server.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.Activator; 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.preferences.PreferenceConstants; import com.gluster.storage.management.gui.toolbar.GlusterToolbarManager; import com.gluster.storage.management.gui.utils.ChartViewerComposite; import com.gluster.storage.management.gui.utils.GUIHelper; @@ -69,6 +76,7 @@ public class GlusterServerSummaryView extends ViewPart { private GlusterServer server; private ClusterListener serverChangedListener; private static final int CHART_WIDTH = 350; + private static final Logger logger = Logger.getLogger(GlusterServerSummaryView.class); public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY @@ -154,34 +162,55 @@ public class GlusterServerSummaryView extends ViewPart { interfaceCombo.select(0); } - - private void createCPUUsageSection() { - Composite section = guiHelper.createSection(form, toolkit, "CPU Usage", null, 1, false); - //toolkit.createLabel(section, "Historical CPU Usage graph aggregated across\nall servers will be displayed here."); + private void extractChartData(ServerStats stats, List timestamps, List data, int dataColumnIndex) { + for(ServerStatsRow row : stats.getRows()) { + Double cpuUsage = row.getUsageData().get(dataColumnIndex); + if(!cpuUsage.isNaN()) { + timestamps.add(new CDateTime(row.getTimestamp() * 1000)); + data.add(cpuUsage); + } + } + } - Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), - new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), - new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100), - new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300), - new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500), - new CDateTime(1000l*1310473800) }; - //Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 20.31d, 19.63d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 40d, 10d, 90d, 40d }; - Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d }; - createLineChart(section, timestamps, values, "%"); + private void createAreaChartSection(ServerStats stats, String sectionTitle, int dataColumnIndex, String unit) { + List timestamps = new ArrayList(); + List data = new ArrayList(); + extractChartData(stats, timestamps, data, dataColumnIndex); -// ServerStats stats = new GlusterServersClient().getAggregatedCPUStats(); -// List timestamps = new ArrayList(); -// List data = new ArrayList(); -// for(ServerStatsRow row : stats.getRows()) { -// timestamps.add(new CDateTime(row.getTimestamp() * 1000)); -// // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. -// data.add(row.getUsageData().get(2)); -// } + if(timestamps.size() == 0) { + // Log a message saying no CPU stats available + return; + } + + Composite section = guiHelper.createSection(form, toolkit, sectionTitle, null, 1, false); + createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]), unit); + +// Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), +// new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), +// new CDateTime(1000l*1310470200), new CDateTime(1000l*1310470500), new CDateTime(1000l*1310470800), new CDateTime(1000l*1310471100), +// new CDateTime(1000l*1310471400), new CDateTime(1000l*1310471700), new CDateTime(1000l*1310472000), new CDateTime(1000l*1310472300), +// new CDateTime(1000l*1310472600), new CDateTime(1000l*1310472900), new CDateTime(1000l*1310473200), new CDateTime(1000l*1310473500), +// new CDateTime(1000l*1310473800) }; // -// createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0])); +// Double[] values = new Double[] { 10d, 11.23d, 17.92d, 18.69d, 78.62d, 89.11d, 92.43d, 89.31d, 57.39d, 18.46d, 10.44d, 16.28d, 13.51d, 17.53d, 12.21, 20d, 21.43d, 16.45d, 14.86d, 15.27d }; +// createLineChart(section, timestamps, values, "%"); createChartLinks(section, 4); } + private void createCPUUsageSection() { + IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + String cpuStatsPeriod = preferenceStore.getString(PreferenceConstants.P_CPU_CHART_PERIOD); + + try { + ServerStats stats = new GlusterServersClient().getCpuStats(server.getName(), cpuStatsPeriod); + // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. + createAreaChartSection(stats, "CPU Usage", 2, "%"); + } catch(Exception e) { + logger.error("Couldn't fetch CPU usage statistics for server [" + server.getName() + "]", e); + return; + } + } + private Composite createChartLinks(Composite section, int columnCount) { GridLayout layout = new org.eclipse.swt.layout.GridLayout(columnCount, false); layout.marginBottom = 0; -- cgit From a2a52d53ee2e0dd32b993c112200cfd1c927aafa Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Mon, 25 Jul 2011 12:48:03 +0530 Subject: Story #38 - CPU Usage graph --- .../management/gui/views/ClusterSummaryView.java | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) (limited to 'src/com.gluster.storage.management.gui') 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 3a9ff740..51b8f4da 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 @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.List; import org.eclipse.birt.chart.util.CDateTime; +import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.graphics.Image; @@ -53,9 +54,11 @@ 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.Activator; 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.preferences.PreferenceConstants; import com.gluster.storage.management.gui.utils.ChartViewerComposite; import com.gluster.storage.management.gui.utils.GUIHelper; import com.ibm.icu.util.Calendar; @@ -246,31 +249,24 @@ public class ClusterSummaryView extends ViewPart { parent.layout(); // IMP: lays out the form properly } - private void createCPUUsageSection() { - ServerStats stats; - try { - stats = new GlusterServersClient().getAggregatedCPUStats(); - } catch(Exception e) { + private void createAreaChartSection(ServerStats stats, String sectionTitle, int dataColumnIndex, String unit) { + Composite section = guiHelper.createSection(form, toolkit, sectionTitle, null, 1, false); + + List timestamps = new ArrayList(); + List data = new ArrayList(); + extractChartData(stats, timestamps, data, dataColumnIndex); + + if(timestamps.size() == 0) { + toolkit.createLabel(section, "Server statistics not available!\n Please check if all services are running properly on the cluster servers."); return; } - - Composite section = guiHelper.createSection(form, toolkit, "CPU Usage (aggregated)", null, 1, false); + if (cluster.getServers().size() == 0) { toolkit.createLabel(section, "This section will be populated after at least\none server is added to the storage cloud."); return; } - List timestamps = new ArrayList(); - List data = new ArrayList(); - for(ServerStatsRow row : stats.getRows()) { - // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. - Double cpuUsage = row.getUsageData().get(2); - if(!cpuUsage.isNaN()) { - timestamps.add(new CDateTime(row.getTimestamp() * 1000)); - data.add(cpuUsage); - } - } - createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]), "%"); + createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]), unit); // Calendar[] timestamps = new Calendar[] { new CDateTime(1000l*1310468100), new CDateTime(1000l*1310468400), new CDateTime(1000l*1310468700), // new CDateTime(1000l*1310469000), new CDateTime(1000l*1310469300), new CDateTime(1000l*1310469600), new CDateTime(1000l*1310469900), @@ -284,6 +280,11 @@ public class ClusterSummaryView extends ViewPart { createChartLinks(section, 4); } + private void createCPUUsageSection() { + // in case of CPU usage, there are three elements in usage data: user, system and total. we use total. + createAreaChartSection(cluster.getAggregatedCpuStats(), "CPU Usage (Aggregated)", 2, "%"); + } + private void extractChartData(ServerStats stats, List timestamps, List data, int dataColumnIndex) { for(ServerStatsRow row : stats.getRows()) { Double cpuUsage = row.getUsageData().get(dataColumnIndex); -- cgit