From 99dfb86d11034f3452899c8fe1c5e5023712cd87 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Tue, 19 Jul 2011 22:04:46 +0530 Subject: Story #38 - CPU Usage graph --- .../client/constants/ClientConstants.java | 2 +- .../storage/management/core/model/Device.java | 4 + .../storage/management/core/model/Disk.java | 4 +- .../icons/tango/32x32/remove-server.png | Bin 0 -> 2010 bytes .../icons/tango/48x48/remove-server.svg | 141 +++++++++++++++++++++ .../icons/tango/scalable/remove-server.svg | 141 +++++++++++++++++++++ src/com.gluster.storage.management.gui/plugin.xml | 4 +- .../management/gui/DeviceTableLabelProvider.java | 15 ++- .../management/gui/GlusterDataModelManager.java | 19 +-- .../gui/ServerDiskTableLabelProvider.java | 15 ++- .../management/gui/dialogs/LoginDialog.java | 16 ++- .../management/gui/utils/ChartViewerComposite.java | 87 +++++++++---- .../storage/management/gui/utils/GUIHelper.java | 6 +- .../management/gui/views/ClusterSummaryView.java | 45 +++---- .../gui/views/GlusterServerSummaryView.java | 105 ++++++++++++--- .../management/gui/views/GlusterViewsManager.java | 2 +- .../management/server/utils/ServerUtil.java | 7 +- 17 files changed, 517 insertions(+), 96 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/icons/tango/32x32/remove-server.png create mode 100644 src/com.gluster.storage.management.gui/icons/tango/48x48/remove-server.svg create mode 100644 src/com.gluster.storage.management.gui/icons/tango/scalable/remove-server.svg (limited to 'src') diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java index 7c268630..765735fb 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/constants/ClientConstants.java @@ -25,7 +25,7 @@ package com.gluster.storage.management.client.constants; */ public class ClientConstants { public static final String SYS_PROP_SERVER_URL = "gluster.server.url"; - public static final String DEFAULT_SERVER_URL = "https://10.1.12.186:8443/glustermg/linux.gtk.x86_64"; + public static final String DEFAULT_SERVER_URL = "https://localhost:8443/glustermg/linux.gtk.x86_64"; public static final String CONTEXT_ROOT = "glustermg"; public static final String REST_API_VERSION = "1.0"; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Device.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Device.java index 7c1d3d54..4a00ac5a 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Device.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Device.java @@ -88,6 +88,10 @@ public class Device extends Entity { return getStatus() == DEVICE_STATUS.IO_ERROR; } + public boolean isInitialized() { + return getStatus() == DEVICE_STATUS.INITIALIZED; + } + public boolean isReady() { return (getStatus() == DEVICE_STATUS.INITIALIZED && getType() == DEVICE_TYPE.DATA); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java index d464ee9e..f06ca258 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Disk.java @@ -166,7 +166,7 @@ public class Disk extends Device { Double space = 0d; if (hasPartitions()) { for (Partition partition : getPartitions()) { - if (partition.isReady()) { + if (partition.isInitialized()) { space += partition.getSpace(); } } @@ -181,7 +181,7 @@ public class Disk extends Device { Double spaceInUse = 0d; if (hasPartitions()) { for (Partition partition : getPartitions()) { - if (partition.isReady()) { + if (partition.isInitialized()) { spaceInUse += partition.getSpaceInUse(); } } diff --git a/src/com.gluster.storage.management.gui/icons/tango/32x32/remove-server.png b/src/com.gluster.storage.management.gui/icons/tango/32x32/remove-server.png new file mode 100644 index 00000000..4026b48f Binary files /dev/null and b/src/com.gluster.storage.management.gui/icons/tango/32x32/remove-server.png differ diff --git a/src/com.gluster.storage.management.gui/icons/tango/48x48/remove-server.svg b/src/com.gluster.storage.management.gui/icons/tango/48x48/remove-server.svg new file mode 100644 index 00000000..4280df60 --- /dev/null +++ b/src/com.gluster.storage.management.gui/icons/tango/48x48/remove-server.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + 2005-03-08 + + + Jakub Steiner + + + + + workstation + computer + node + client + + + + http://jimmac.musichall.cz/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/icons/tango/scalable/remove-server.svg b/src/com.gluster.storage.management.gui/icons/tango/scalable/remove-server.svg new file mode 100644 index 00000000..4280df60 --- /dev/null +++ b/src/com.gluster.storage.management.gui/icons/tango/scalable/remove-server.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + 2005-03-08 + + + Jakub Steiner + + + + + workstation + computer + node + client + + + + http://jimmac.musichall.cz/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index 3f7943ce..db5605f3 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -677,7 +677,7 @@ allowLabelUpdate="false" class="com.gluster.storage.management.gui.actions.RemoveServerAction" definitionId="com.gluster.storage.management.gui.commands.RemoveServer" - icon="icons/server-remove.png" + icon="icons/tango/32x32/remove-server.png" id="com.gluster.storage.management.gui.actions.RemoveServerAction" label="&Remove Server(s)" menubarPath="com.gluster.storage.management.gui.menu.servers/servers" @@ -735,7 +735,7 @@ allowLabelUpdate="false" class="com.gluster.storage.management.gui.actions.RemoveServerAction" definitionId="com.gluster.storage.management.gui.commands.RemoveServer" - icon="icons/server-remove.png" + icon="icons/tango/32x32/remove-server.png" id="com.gluster.storage.management.gui.actions.RemoveServerAction" label="&Remove Server(s)" menubarPath="com.gluster.storage.management.gui.menu.glusterserver/glusterserver" 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 50e842b4..26795ebd 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 @@ -65,6 +65,11 @@ public class DeviceTableLabelProvider extends LabelProvider implements ITableLab if (status == null) { return null; } + + if(element instanceof Disk && ((Disk)element).hasPartitions()) { + // disk has partitions. so don't show status image at disk level. + return null; + } // TODO: Use different images for all four statuses switch (status) { @@ -113,12 +118,20 @@ public class DeviceTableLabelProvider extends LabelProvider implements ITableLab Device device = (Device) element; if (columnIndex == DEVICE_COLUMN_INDICES.DISK.ordinal()) { + // show value in "disk" column only if it's a disk if (device instanceof Disk) { return device.getQualifiedName(); } else { return ""; } - } else if (columnIndex == DEVICE_COLUMN_INDICES.FREE_SPACE.ordinal()) { + } + + if(element instanceof Disk && ((Disk)element).hasPartitions()) { + // disk has partitions. so don't show any other details + return ""; + } + + if (columnIndex == DEVICE_COLUMN_INDICES.FREE_SPACE.ordinal()) { return "" + getDeviceFreeSpace(device); } else if (columnIndex == DEVICE_COLUMN_INDICES.SPACE_IN_USE.ordinal()) { return "" + getTotalDeviceSpace(device); 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 56681a40..5ec3aedf 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 @@ -94,25 +94,18 @@ public class GlusterDataModelManager { return instance; } - public void initializeModel(String clusterName) { + public void initializeModel(String clusterName, IProgressMonitor monitor) { setClusterName(clusterName); - model = fetchData(clusterName); + model = fetchData(clusterName, monitor); } - 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); + private GlusterDataModel fetchData(String clusterName, IProgressMonitor monitor) { + GlusterDataModel model = fetchModel(monitor); + + initializeAlerts(model.getCluster()); initializeVolumeOptionsDefaults(); - model.addCluster(cluster); return model; } 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 15c222fc..96d3dc8a 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 @@ -49,6 +49,11 @@ public class ServerDiskTableLabelProvider extends TableLabelProviderAdapter { if (status == null) { return null; } + + if(element instanceof Disk && ((Disk)element).hasPartitions()) { + // disk has partitions. so don't show status image at disk level. + return null; + } // TODO: Use different images for all four statuses switch (status) { @@ -87,12 +92,20 @@ public class ServerDiskTableLabelProvider extends TableLabelProviderAdapter { public String getColumnText(Object element, int columnIndex) { Device device = (Device) element; if (columnIndex == DEVICE_COLUMN_INDICES.DISK.ordinal()) { + // show value in "disk" column only if it's a disk if (device instanceof Disk) { return device.getName(); } else { return ""; } - } else if (columnIndex == DEVICE_COLUMN_INDICES.FREE_SPACE.ordinal()) { + } + + if(element instanceof Disk && ((Disk)element).hasPartitions()) { + // disk has partitions. so don't show any other details + return ""; + } + + if (columnIndex == DEVICE_COLUMN_INDICES.FREE_SPACE.ordinal()) { return "" + getDeviceFreeSpace(device); } else if (columnIndex == DEVICE_COLUMN_INDICES.SPACE_IN_USE.ordinal()) { return "" + getTotalDeviceSpace(device); 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 cb129a32..f041495e 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 @@ -18,14 +18,19 @@ *******************************************************************************/ package com.gluster.storage.management.gui.dialogs; +import java.lang.reflect.InvocationTargetException; + import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.UpdateValueStrategy; import org.eclipse.core.databinding.beans.PojoProperties; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.databinding.swt.SWTObservables; import org.eclipse.jface.databinding.swt.WidgetProperties; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; @@ -40,6 +45,7 @@ import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; import com.gluster.storage.management.client.ClustersClient; import com.gluster.storage.management.client.UsersClient; @@ -261,7 +267,15 @@ public class LoginDialog extends Dialog { try { createOrRegisterCluster(clustersClient, clusterName, serverName, mode); - GlusterDataModelManager.getInstance().initializeModel(clusterName); + + final String clusterName1 = clusterName; + new ProgressMonitorDialog(getShell()).run(true, false, new IRunnableWithProgress() { + + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + GlusterDataModelManager.getInstance().initializeModel(clusterName1, monitor); + } + }); super.okPressed(); } catch (Exception e) { setReturnCode(RETURN_CODE_ERROR); 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 edf18011..f7ebd0ec 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 @@ -18,7 +18,8 @@ *******************************************************************************/ package com.gluster.storage.management.gui.utils; -import java.util.Date; +import java.lang.reflect.InvocationTargetException; +import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; @@ -38,22 +39,26 @@ import org.eclipse.birt.chart.model.attribute.ChartDimension; import org.eclipse.birt.chart.model.attribute.FontDefinition; import org.eclipse.birt.chart.model.attribute.LineAttributes; import org.eclipse.birt.chart.model.attribute.LineStyle; -import org.eclipse.birt.chart.model.attribute.Marker; +import org.eclipse.birt.chart.model.attribute.NumberFormatSpecifier; import org.eclipse.birt.chart.model.attribute.TickStyle; import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl; import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl; import org.eclipse.birt.chart.model.attribute.impl.FontDefinitionImpl; import org.eclipse.birt.chart.model.attribute.impl.JavaDateFormatSpecifierImpl; import org.eclipse.birt.chart.model.attribute.impl.LineAttributesImpl; +import org.eclipse.birt.chart.model.attribute.impl.NumberFormatSpecifierImpl; import org.eclipse.birt.chart.model.attribute.impl.TextAlignmentImpl; import org.eclipse.birt.chart.model.component.Axis; import org.eclipse.birt.chart.model.component.Series; import org.eclipse.birt.chart.model.component.impl.SeriesImpl; +import org.eclipse.birt.chart.model.data.DateTimeDataElement; import org.eclipse.birt.chart.model.data.DateTimeDataSet; import org.eclipse.birt.chart.model.data.NumberDataSet; import org.eclipse.birt.chart.model.data.SeriesDefinition; import org.eclipse.birt.chart.model.data.TextDataSet; +import org.eclipse.birt.chart.model.data.impl.DateTimeDataElementImpl; import org.eclipse.birt.chart.model.data.impl.DateTimeDataSetImpl; +import org.eclipse.birt.chart.model.data.impl.NumberDataElementImpl; import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl; import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl; import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl; @@ -62,13 +67,21 @@ import org.eclipse.birt.chart.model.impl.ChartWithoutAxesImpl; import org.eclipse.birt.chart.model.layout.Legend; import org.eclipse.birt.chart.model.layout.Plot; import org.eclipse.birt.chart.model.type.AreaSeries; -import org.eclipse.birt.chart.model.type.LineSeries; import org.eclipse.birt.chart.model.type.PieSeries; import org.eclipse.birt.chart.model.type.impl.AreaSeriesImpl; -import org.eclipse.birt.chart.model.type.impl.LineSeriesImpl; import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl; import org.eclipse.birt.core.framework.PlatformConfig; import org.eclipse.core.runtime.Platform; +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.TreeIterator; +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EOperation; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.PaintEvent; @@ -79,6 +92,7 @@ import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import com.ibm.icu.util.Calendar; +import com.ibm.icu.util.ULocale; /** * @@ -126,11 +140,11 @@ public final class ChartViewerComposite extends Composite implements PaintListen * Values of each category in the pie chart Constructs a pie * chart viewer composite for given categories and values */ - public ChartViewerComposite(Composite parent, int style, Calendar[] categories, Double[] values) { + public ChartViewerComposite(Composite parent, int style, Calendar[] categories, Double[] values, String unit) { super(parent, style); init(); - chart = createLineChart(categories, values); + chart = createLineChart(categories, values, unit); addPaintListener(this); } @@ -156,8 +170,8 @@ public final class ChartViewerComposite extends Composite implements PaintListen }); } - private Chart createLineChart(Calendar[] timestamps, Double[] values) { - return createAreaChart(timestamps, new Double[][] {values}); + private Chart createLineChart(Calendar[] timestamps, Double[] values, String unit) { + return createAreaChart(timestamps, new Double[][] {values}, unit); } /** @@ -166,47 +180,66 @@ public final class ChartViewerComposite extends Composite implements PaintListen * @return An instance of the simulated runtime chart model (containing * filled datasets) */ - public static final Chart createAreaChart(Calendar[] timestamps, Double[][] values) { + public static final Chart createAreaChart(Calendar[] timestamps, Double[][] values, final String unit) { ChartWithAxes cwaLine = ChartWithAxesImpl.create(); - // Plot - cwaLine.getBlock().setBackground(ColorDefinitionImpl.TRANSPARENT()); + cwaLine.getBlock().setBackground(ColorDefinitionImpl.WHITE()); Plot p = cwaLine.getPlot(); - p.getClientArea().setBackground(ColorDefinitionImpl.TRANSPARENT()); - //p.getClientArea().setBackground(ColorDefinitionImpl.TRANSPARENT()); - + p.getClientArea().setBackground(ColorDefinitionImpl.WHITE()); + p.setBackground(ColorDefinitionImpl.WHITE()); // Title - //cwaLine.getTitle().getLabel().getCaption().setValue("Line Chart");//$NON-NLS-1$ + cwaLine.getTitle().getLabel().getCaption().setValue("Line Chart");//$NON-NLS-1$ cwaLine.getTitle().setVisible(false); + cwaLine.getTitle().getLabel().setVisible(true); + cwaLine.getTitle().getInsets().set(0, 10, 0, 0); + cwaLine.getTitle().setAnchor(Anchor.SOUTH_LITERAL); // Legend - cwaLine.getLegend().setVisible(false); Legend lg = cwaLine.getLegend(); + lg.setVisible(false); LineAttributes lia = lg.getOutline( ); - lg.getText( ).getFont( ).setSize( 16 ); lia.setStyle( LineStyle.SOLID_LITERAL ); - lg.getInsets( ).set( 10, 5, 0, 0 ); + lg.getText( ).getFont( ).setSize( 10 ); + //lg.getInsets( ).set( 10, 5, 0, 0 ); + lg.getInsets( ).set( 0, 0, 0, 0 ); lg.getOutline( ).setVisible( false ); lg.setAnchor( Anchor.NORTH_LITERAL ); // X-Axis Axis xAxisPrimary = cwaLine.getPrimaryBaseAxes()[0]; xAxisPrimary.setType(AxisType.TEXT_LITERAL); - xAxisPrimary.getMajorGrid().setTickStyle(TickStyle.BELOW_LITERAL); - xAxisPrimary.getMajorGrid().setLineAttributes(LineAttributesImpl.create(ColorDefinitionImpl.GREY(), LineStyle.DOTTED_LITERAL, 1)); + DateTimeDataElement dtde = DateTimeDataElementImpl.create(timestamps[timestamps.length-1]); + 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.getMajorGrid().setTickStyle(TickStyle.ABOVE_LITERAL); + xAxisPrimary.getMajorGrid().getTickAttributes().setVisible(false); + xAxisPrimary.getMajorGrid().setLineAttributes(LineAttributesImpl.create(ColorDefinitionImpl.GREY(), LineStyle.SOLID_LITERAL, 1)); xAxisPrimary.getTitle().setVisible(false); - xAxisPrimary.setInterval(4); + xAxisPrimary.getTitle().getInsets().set(1, 1, 1, 1); + xAxisPrimary.getLabel().getInsets().set(1, 1, 1, 1); xAxisPrimary.getLabel().getCaption().setFont(createChartFont()); xAxisPrimary.setFormatSpecifier( JavaDateFormatSpecifierImpl.create( "HH:mm" ) ); // Y-Axis Axis yAxisPrimary = cwaLine.getPrimaryOrthogonalAxis(xAxisPrimary); + yAxisPrimary.getScale().setMax(NumberDataElementImpl.create(100)); + yAxisPrimary.getScale().setMin(NumberDataElementImpl.create(0)); + yAxisPrimary.setGapWidth(0); + yAxisPrimary.getScale().setStep(20); + yAxisPrimary.getScale().setMajorGridsStepNumber(1); yAxisPrimary.getMajorGrid().setTickStyle(TickStyle.LEFT_LITERAL); yAxisPrimary.getMajorGrid().setLineAttributes(LineAttributesImpl.create(ColorDefinitionImpl.GREY(), LineStyle.SOLID_LITERAL, 1)); - yAxisPrimary.setInterval(2); yAxisPrimary.getLabel().setVisible(true); yAxisPrimary.getLabel().getCaption().setFont(createChartFont()); + yAxisPrimary.setFormatSpecifier(new NumberFormatSpecifierImpl() { + @Override + public String getSuffix() { + return " " + unit; + } + }); // Data Set DateTimeDataSet categoryValues = DateTimeDataSetImpl.create(timestamps); @@ -231,10 +264,10 @@ public final class ChartViewerComposite extends Composite implements PaintListen NumberDataSet orthoValues = NumberDataSetImpl.create(values[i]); ls.setDataSet(orthoValues); ls.getLineAttributes().setColor(ColorDefinitionImpl.create(50, 50, 255)); - for (int j = 0; j < ls.getMarkers().size(); j++) { - // ( (Marker) ls.getMarkers( ).get( j ) ).setType( MarkerType.CIRCLE_LITERAL); - ((Marker) ls.getMarkers().get(j)).setVisible(false); - } +// for (int j = 0; j < ls.getMarkers().size(); j++) { +// ( (Marker) ls.getMarkers( ).get( j ) ).setType( MarkerType.CIRCLE_LITERAL); +// ((Marker) ls.getMarkers().get(j)).setVisible(true); +// } ls.setTranslucent(true); // don't show values on each point on the line chart ls.getLabel().setVisible(false); @@ -325,7 +358,7 @@ public final class ChartViewerComposite extends Composite implements PaintListen deviceReader.setProperty(IDeviceRenderer.UPDATE_NOTIFIER, this); Bounds bo = BoundsImpl.create(0, 0, d.width, d.height); - bo.scale(58d / deviceReader.getDisplayServer().getDpiResolution()); + bo.scale(71d / deviceReader.getDisplayServer().getDpiResolution()); Generator gr = Generator.instance(); if (needsGeneration) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java index c4ddc31b..59006431 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java @@ -141,9 +141,9 @@ public class GUIHelper { GridLayout layout = new GridLayout(); layout.marginWidth = layout.marginHeight = 0; layout.numColumns = numColumns; - layout.verticalSpacing = 15; - layout.marginBottom = 20; - layout.marginTop = 5; + layout.verticalSpacing = 10; + layout.marginBottom = 15; + layout.marginTop = 10; client.setLayout(layout); section.setClient(client); 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 bff21548..3f344d8b 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 @@ -59,7 +59,6 @@ import com.gluster.storage.management.gui.utils.GUIHelper; import com.ibm.icu.util.Calendar; /** - * @author root * */ public class ClusterSummaryView extends ViewPart { @@ -134,8 +133,8 @@ public class ClusterSummaryView extends ViewPart { chartViewerComposite.setLayoutData(data); } - private void createLineChart(Composite section, Calendar timestamps[], Double values[]) { - ChartViewerComposite chartViewerComposite = new ChartViewerComposite(section, SWT.NONE, timestamps, values); + private void createLineChart(Composite section, Calendar timestamps[], Double values[], String unit) { + ChartViewerComposite chartViewerComposite = new ChartViewerComposite(section, SWT.NONE, timestamps, values, unit); GridData data = new GridData(SWT.FILL, SWT.FILL, false, false); data.widthHint = 400; data.heightHint = 300; @@ -233,25 +232,28 @@ public class ClusterSummaryView extends ViewPart { return; } - 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)); - } +// 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])); -// 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) }; + 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) }; - //String[] timestampsarr = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"}; - //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.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, "%"); } private void createNetworkUsageSection() { @@ -270,9 +272,8 @@ public class ClusterSummaryView extends ViewPart { // 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) }; - String[] timestampsarr = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"}; 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); + createLineChart(section, timestamps, values, "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 784fddfc..bae6b9e3 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 @@ -29,16 +29,20 @@ import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.CCombo; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.ProgressBar; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.forms.widgets.FormToolkit; +import org.eclipse.ui.forms.widgets.Hyperlink; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.part.ViewPart; @@ -67,6 +71,7 @@ public class GlusterServerSummaryView extends ViewPart { private ScrolledForm form; private GlusterServer server; private ClusterListener serverChangedListener; + private static final int CHART_WIDTH = 350; public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY @@ -105,36 +110,97 @@ public class GlusterServerSummaryView extends ViewPart { GlusterDataModelManager.getInstance().removeClusterListener(serverChangedListener); } - private void createLineChart(Composite section, Calendar timestamps[], Double values[]) { - ChartViewerComposite chartViewerComposite = new ChartViewerComposite(section, SWT.NONE, timestamps, values); + private void createLineChart(Composite section, Calendar timestamps[], Double values[], String unit) { + ChartViewerComposite chartViewerComposite = new ChartViewerComposite(section, SWT.NONE, timestamps, values, unit); GridData data = new GridData(SWT.FILL, SWT.FILL, false, false); - data.widthHint = 450; - data.heightHint = 300; - data.verticalAlignment = SWT.CENTER; +// data.widthHint = CHART_WIDTH; + data.heightHint = 250; +// data.verticalAlignment = SWT.CENTER; +// data.grabExcessVerticalSpace = false; +// data.horizontalSpan = 5; +// data.verticalIndent = 0; +// data.verticalSpan = 1; chartViewerComposite.setLayoutData(data); } private void createMemoryUsageSection() { - Composite section = guiHelper.createSection(form, toolkit, "Memory Usage (aggregated)", null, 1, false); - toolkit.createLabel(section, "Historical Memory Usage graph aggregated across all servers will be displayed here."); + Composite section = guiHelper.createSection(form, toolkit, "Memory Usage", null, 1, false); + 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[] { 35d, 34.23d, 37.92d, 28.69d, 38.62d, 39.11d, 38.46d, 30.44d, 36.28d, 72.43d, 79.31d, 77.39d, 33.51d, 37.53d, 32.21, 30d, 31.43d, 36.45d, 34.86d, 35.27d }; + createLineChart(section, timestamps, values, "%"); + Composite graphComposite = createChartLinks(section, 4); } + private void createNetworkUsageSection() { + Composite section = guiHelper.createSection(form, toolkit, "Network Usage", null, 1, false); + + 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[] { 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"); + + Composite graphComposite = createChartLinks(section, 5); + CCombo interfaceCombo = new CCombo(graphComposite, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER | SWT.FLAT); + interfaceCombo.setItems(new String[] {"eth0"}); + interfaceCombo.select(0); + } + + private void createCPUUsageSection() { - Composite section = guiHelper.createSection(form, toolkit, "CPU Usage (aggregated)", null, 1, false); + 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."); -// String[] timestamps = new String[] {"t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "t9", "t10", "t11", "t12", "t13", "t14", "t15", "t16", "t17", "t18", "t19", "t20"}; -// 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 }; - 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)); - } + 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, "%"); + +// 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)); +// } +// +// createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0])); + Composite graphComposite = createChartLinks(section, 4); + } + + private Composite createChartLinks(Composite section, int columnCount) { + GridLayout layout = new org.eclipse.swt.layout.GridLayout(columnCount, false); + layout.marginBottom = 0; + layout.marginTop = 0; + layout.marginLeft = (CHART_WIDTH - (50*columnCount)) / 2; + Composite graphComposite = toolkit.createComposite(section, SWT.NONE); + graphComposite.setLayout(layout); + GridData data = new GridData(SWT.FILL, SWT.FILL, false, false); + data.widthHint = CHART_WIDTH; + graphComposite.setLayoutData(data); + + Label label1 = toolkit.createLabel(graphComposite, "1 day"); + Hyperlink link1 = toolkit.createHyperlink(graphComposite, "1 week", SWT.NONE); + Hyperlink link2 = toolkit.createHyperlink(graphComposite, "1 month", SWT.NONE); + Hyperlink link3 = toolkit.createHyperlink(graphComposite, "1 year", SWT.NONE); - createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0])); + return graphComposite; } private void createSections(Composite parent) { @@ -144,6 +210,7 @@ public class GlusterServerSummaryView extends ViewPart { if (server.getStatus() == SERVER_STATUS.ONLINE) { createMemoryUsageSection(); + createNetworkUsageSection(); createCPUUsageSection(); createNetworkInterfacesSection(server, toolkit, form); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java index a13d41d7..ca8788e5 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterViewsManager.java @@ -94,7 +94,7 @@ public class GlusterViewsManager implements ViewsManager { page.showView(GlusterServerSummaryView.ID); if (server.getStatus() == GlusterServer.SERVER_STATUS.ONLINE) { page.showView(GlusterServerDisksView.ID, null, IWorkbenchPage.VIEW_CREATE); - page.showView(GlusterServerLogsView.ID, null, IWorkbenchPage.VIEW_CREATE); + //page.showView(GlusterServerLogsView.ID, null, IWorkbenchPage.VIEW_CREATE); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java index 775ca221..31342329 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java @@ -208,8 +208,8 @@ public class ServerUtil { if (tryGenericResponseOnFailure) { // unmarshalling failed. try to unmarshal a GenericResponse object return unmarshal(GenericResponse.class, input, false); - } + } return new Status(Status.STATUS_CODE_FAILURE, "Error during unmarshalling string [" + input + "] for class [" + expectedClass.getName() + ": [" + e.getMessage() + "]"); } @@ -227,8 +227,9 @@ public class ServerUtil { } public ServerStats fetchCPUUsageData(String serverName) { - String cpuUsageData = " 1310468100 300 1310471700 13 3 user system total 13104681002.23802952e-14.3747778209e-016.6128073384e-01 13104684002.3387347338e-014.4642717442e-016.8030064780e-01 13104687005.5043873220e+006.2462376636e+001.1750624986e+01 13104690002.4350593653e+012.6214585217e+015.0565178869e+01 13104693004.0786489953e+014.6784713828e+018.7571203781e+01 13104696004.1459955508e+015.2546309044e+019.4006264551e+01 13104699004.2312286165e+015.2390588332e+019.4702874497e+01 13104702004.2603794982e+015.1598861493e+019.4202656475e+01 13104705003.8238751290e+014.5312089966e+018.3550841256e+01 13104708001.7949961224e+012.1282058418e+013.9232019642e+01 13104711001.2330371421e-014.6347832868e-015.8678204289e-01 13104714001.6313260492e-015.4088119561e-017.0401380052e-01 1310471700NaNNaNNaN "; - Object output = unmarshal(ServerStats.class, cpuUsageData, false); + Object output = executeOnServer(true, serverName, "get_rrd_cpu_details.py 1d", ServerStats.class); + //String cpuUsageData = " 1310468100 300 1310471700 13 3 user system total 13104681002.23802952e-14.3747778209e-016.6128073384e-01 13104684002.3387347338e-014.4642717442e-016.8030064780e-01 13104687005.5043873220e+006.2462376636e+001.1750624986e+01 13104690002.4350593653e+012.6214585217e+015.0565178869e+01 13104693004.0786489953e+014.6784713828e+018.7571203781e+01 13104696004.1459955508e+015.2546309044e+019.4006264551e+01 13104699004.2312286165e+015.2390588332e+019.4702874497e+01 13104702004.2603794982e+015.1598861493e+019.4202656475e+01 13104705003.8238751290e+014.5312089966e+018.3550841256e+01 13104708001.7949961224e+012.1282058418e+013.9232019642e+01 13104711001.2330371421e-014.6347832868e-015.8678204289e-01 13104714001.6313260492e-015.4088119561e-017.0401380052e-01 1310471700NaNNaNNaN "; + //Object output = unmarshal(ServerStats.class, cpuUsageData, false); if(output instanceof Status) { throw new GlusterRuntimeException(((Status)output).toString()); } -- cgit