summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-07-24 22:21:43 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-07-24 22:21:43 +0530
commit1e8135f9e270e7c6557e66532160fbea40ea8bba (patch)
tree4beb7246ca0d64c8c676e119804f4c68bf2f18d5
parentc3f598a9a5dc66428c98e026f621caf647ae09fd (diff)
parent069be5f7df55052c6b1e00ea7580d94aa97e142b (diff)
Merge branch 'master' of github.com:gluster/console
Conflicts: src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java
-rw-r--r--src/com.gluster.storage.management.gui/icons/tango/16x16/offline-brick.pngbin0 -> 621 bytes
-rw-r--r--src/com.gluster.storage.management.gui/icons/tango/16x16/online-brick.pngbin0 -> 532 bytes
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/BrickTableLabelProvider.java35
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/GlusterDataModelManager.java15
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java4
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StartVolumeAction.java3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ChangePasswordDialog.java3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/ChartsPreferencePage.java26
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/preferences/PreferenceInitializer.java3
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java31
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java11
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/KeysResource.java29
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java9
-rw-r--r--src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/ServerUtil.java42
15 files changed, 151 insertions, 62 deletions
diff --git a/src/com.gluster.storage.management.gui/icons/tango/16x16/offline-brick.png b/src/com.gluster.storage.management.gui/icons/tango/16x16/offline-brick.png
new file mode 100644
index 00000000..48812db8
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/icons/tango/16x16/offline-brick.png
Binary files differ
diff --git a/src/com.gluster.storage.management.gui/icons/tango/16x16/online-brick.png b/src/com.gluster.storage.management.gui/icons/tango/16x16/online-brick.png
new file mode 100644
index 00000000..da895838
--- /dev/null
+++ b/src/com.gluster.storage.management.gui/icons/tango/16x16/online-brick.png
Binary files differ
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 7e1319c4..3e5907ef 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,10 +20,9 @@ package com.gluster.storage.management.gui;
import org.eclipse.swt.graphics.Image;
-import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
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.Device;
-import com.gluster.storage.management.core.model.Device.DEVICE_STATUS;
import com.gluster.storage.management.core.utils.NumberUtil;
import com.gluster.storage.management.gui.utils.GUIHelper;
import com.gluster.storage.management.gui.views.pages.BricksPage.BRICK_TABLE_COLUMN_INDICES;
@@ -40,25 +39,16 @@ public class BrickTableLabelProvider extends TableLabelProviderAdapter {
}
Brick brick = (Brick) element;
- Device device = GlusterDataModelManager.getInstance().getDeviceDetails(brick.getDeviceName());
-
if (columnIndex == DISK_TABLE_COLUMN_INDICES.STATUS.ordinal()) {
- DEVICE_STATUS status = device.getStatus();
- // TODO: Use different images for all four statuses
- switch (status) {
- case INITIALIZED:
- return guiHelper.getImage(IImageKeys.STATUS_ONLINE_16x16);
- case IO_ERROR:
- return guiHelper.getImage(IImageKeys.STATUS_OFFLINE_16x16);
- case UNINITIALIZED:
- return guiHelper.getImage(IImageKeys.STATUS_OFFLINE_16x16);
- case INITIALIZING:
- return guiHelper.getImage(IImageKeys.STATUS_OFFLINE_16x16);
- default:
- throw new GlusterRuntimeException("Invalid brick status [" + status + "]");
+ BRICK_STATUS status = brick.getStatus();
+
+ switch(status) {
+ case ONLINE:
+ return guiHelper.getImage(IImageKeys.BRICK_ONLINE_16x16);
+ case OFFLINE:
+ return guiHelper.getImage(IImageKeys.BRICK_OFFLINE_16x16);
}
}
-
return null;
}
@@ -71,7 +61,7 @@ public class BrickTableLabelProvider extends TableLabelProviderAdapter {
}
private String getDeviceCapacity(Device device) {
- if (device.isReady() && device.getSpace() != null && device.getSpace() != 0.0) {
+ if (device != null && device.isReady() && device.getSpace() != null && device.getSpace() != 0.0) {
return NumberUtil.formatNumber((device.getSpace() / 1024));
} else {
return "NA";
@@ -88,9 +78,8 @@ public class BrickTableLabelProvider extends TableLabelProviderAdapter {
Device device = GlusterDataModelManager.getInstance().getDeviceDetails(brick.getDeviceName());
return (columnIndex == BRICK_TABLE_COLUMN_INDICES.SERVER.ordinal() ? brick.getServerName()
: columnIndex == BRICK_TABLE_COLUMN_INDICES.BRICK.ordinal() ? brick.getBrickDirectory()
- : columnIndex == BRICK_TABLE_COLUMN_INDICES.FREE_SPACE.ordinal() ? getDeviceFreeSpace(device)
- : columnIndex == BRICK_TABLE_COLUMN_INDICES.TOTAL_SPACE.ordinal() ? getDeviceCapacity(device)
- : columnIndex == BRICK_TABLE_COLUMN_INDICES.STATUS.ordinal() ? brick
- .getStatusStr() : "Invalid");
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.FREE_SPACE.ordinal() ? getDeviceFreeSpace(device)
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.TOTAL_SPACE.ordinal() ? getDeviceCapacity(device)
+ : columnIndex == BRICK_TABLE_COLUMN_INDICES.STATUS.ordinal() ? brick.getStatusStr() : "Invalid");
}
}
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 d63886c6..14086260 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
@@ -39,6 +39,8 @@ 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.Brick.BRICK_STATUS;
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;
@@ -374,9 +376,7 @@ public class GlusterDataModelManager {
}
}
-
-
- private void volumeChanged(Volume oldVolume, Volume newVolume) {
+ public void volumeChanged(Volume oldVolume, Volume newVolume) {
oldVolume.copyFrom(newVolume);
for (ClusterListener listener : listeners) {
listener.volumeChanged(oldVolume, new Event(EVENT_TYPE.VOLUME_CHANGED, newVolume));
@@ -687,8 +687,17 @@ public class GlusterDataModelManager {
public void updateVolumeStatus(Volume volume, VOLUME_STATUS newStatus) {
volume.setStatus(newStatus);
+
+ if(newStatus == VOLUME_STATUS.OFFLINE) {
+ // mark as bricks also as offline
+ for(Brick brick : volume.getBricks()) {
+ brick.setStatus(BRICK_STATUS.OFFLINE);
+ }
+ }
+
for (ClusterListener listener : listeners) {
listener.volumeChanged(volume, new Event(EVENT_TYPE.VOLUME_STATUS_CHANGED, newStatus));
+ listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_CHANGED, volume.getBricks()));
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java
index 0ddf5c5e..d0534210 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/IImageKeys.java
@@ -40,7 +40,9 @@ public interface IImageKeys {
public static final String REMOVE_BRICK_32x32 = "icons/tango/32x32/remove-brick.png";
public static final String BRICK_OFFLINE_22x22 = "icons/tango/22x22/offline-brick.png";
public static final String BRICKS_16x16 = "icons/tango/16x16/bricks.png";
-
+ public static final String BRICK_ONLINE_16x16 = "icons/tango/16x16/online-brick.png";
+ public static final String BRICK_OFFLINE_16x16 = "icons/tango/16x16/offline-brick.png";
+
public static final String SERVERS_16x16 = "icons/tango/16x16/servers.png";
public static final String SERVER_16x16 = "icons/tango/16x16/server.png";
public static final String SERVER_WARNING_22x22 = "icons/tango/22x22/server-warning.png";
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
index 9bafd2b0..70cb4757 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java
@@ -46,7 +46,7 @@ public class CreateVolumeAction extends AbstractActionDelegate {
}
};
dialog.create();
- dialog.getShell().setSize(500, 550);
+ dialog.getShell().setSize(500, 585);
dialog.open();
}
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 8b3fee68..a6151824 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
@@ -42,6 +42,9 @@ public class StartVolumeAction extends AbstractActionDelegate {
client.startVolume(volume.getName());
showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] started successfully!");
modelManager.updateVolumeStatus(volume, VOLUME_STATUS.ONLINE);
+
+ Volume updatedVolume = client.getVolume(volume.getName());
+ modelManager.volumeChanged(volume, updatedVolume);
} catch (Exception e) {
showErrorDialog(actionDesc,
"Volume [" + volume.getName() + "] could not be started! Error: [" + e.getMessage() + "]");
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 00f2aab0..b1367e00 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
@@ -268,10 +268,9 @@ public class ChangePasswordDialog extends Dialog {
try {
usersClient.changePassword(user, oldPassword, newPassword);
MessageDialog.openInformation(getShell(), "Change password", "Password changed successfully!");
+ this.close();
} catch (Exception e) {
MessageDialog.openError(getShell(), "Change password Failed", e.getMessage());
- setReturnCode(RETURN_CODE_ERROR);
}
- this.close();
}
}
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
index 112a2a91..3dd636f1 100644
--- 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
@@ -20,20 +20,28 @@ package com.gluster.storage.management.gui.preferences;
import org.eclipse.jface.preference.ComboFieldEditor;
import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.resource.ImageDescriptor;
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");
+ }
+
+ public ChartsPreferencePage(int style) {
+ super(style);
+ }
+
+ public ChartsPreferencePage(String title, int style) {
+ super(title, style);
+ }
+
+ public ChartsPreferencePage(String title, ImageDescriptor image, int style) {
+ super(title, image, style);
}
/* (non-Javadoc)
@@ -48,10 +56,10 @@ public class ChartsPreferencePage extends FieldEditorPreferencePage implements I
*/
@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()));
+ String[][] entryNamesAndValues = new String[][] {
+ { "1d", "1 day" }, { "1w", "1 week" }, { "1m", "1 month" }, { "1y", "1 year" } };
+ 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,
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 f889a259..726e62b4 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
@@ -44,6 +44,9 @@ public class PreferenceInitializer extends AbstractPreferenceInitializer {
// Default CPU utilisation threshold
store.setDefault(PreferenceConstants.P_SERVER_CPU_CRITICAL_THRESHOLD, 95);
+ // Default Memory threshold
+ store.setDefault(PreferenceConstants.P_SERVER_MEMORY_USAGE_THRESHOLD, 90);
+
// 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 90307c8b..3a9ff740 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
@@ -247,27 +247,30 @@ public class ClusterSummaryView extends ViewPart {
}
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 createAreaChartSection(ServerStats stats, String sectionTitle, int dataColumnIndex, String unit) {
- List<Calendar> timestamps = new ArrayList<Calendar>();
- List<Double> data = new ArrayList<Double>();
- extractChartData(stats, timestamps, data, dataColumnIndex);
-
- if(timestamps.size() == 0) {
- // Log a message saying no CPU stats available
+ ServerStats stats;
+ try {
+ stats = new GlusterServersClient().getAggregatedCPUStats();
+ } catch(Exception e) {
return;
}
-
- Composite section = guiHelper.createSection(form, toolkit, sectionTitle, null, 1, false);
+
+ 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;
}
- createLineChart(section, timestamps.toArray(new Calendar[0]), data.toArray(new Double[0]), unit);
+ List<Calendar> timestamps = new ArrayList<Calendar>();
+ List<Double> data = new ArrayList<Double>();
+ 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),
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
index c9e63889..4aec5436 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/BricksPage.java
@@ -20,6 +20,7 @@ package com.gluster.storage.management.gui.views.pages;
import java.util.Collection;
import java.util.List;
+import java.util.Map;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IContentProvider;
@@ -33,7 +34,6 @@ import com.gluster.storage.management.core.model.Brick;
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.Event.EVENT_TYPE;
import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.gui.BrickTableLabelProvider;
@@ -70,7 +70,14 @@ public class BricksPage extends AbstractTableViewerPage<Brick> {
break;
case BRICKS_CHANGED:
- tableViewer.update(((Collection<Brick>) event.getEventData()).toArray(), null);
+ Object eventData = event.getEventData();
+ Brick[] updatedBricks;
+ if(eventData instanceof Map) {
+ updatedBricks = ((Map<Brick, Brick>) eventData).keySet().toArray(new Brick[0]);
+ } else {
+ updatedBricks = ((Collection<Brick>)eventData).toArray(new Brick[0]);
+ }
+ tableViewer.update(updatedBricks, null);
parent.update();
default:
break;
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/KeysResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/KeysResource.java
index 5ac37bd1..af64af47 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/KeysResource.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/KeysResource.java
@@ -82,16 +82,33 @@ public class KeysResource extends AbstractResource {
String targetPemFile = targetDir + File.separator + SshUtil.PEM_FILE.getName();
String targetPubKeyFile = targetDir + File.separator + SshUtil.PUBLIC_KEY_FILE.getName();
+ if (!SshUtil.PEM_FILE.isFile()) {
+ throw new GlusterRuntimeException("No private key file [" + SshUtil.PEM_FILE.getName() + "] found!" );
+ }
+
+ if (!SshUtil.PUBLIC_KEY_FILE.isFile()) {
+ throw new GlusterRuntimeException("No public key file [" + SshUtil.PUBLIC_KEY_FILE.getName() + "] found!" );
+ }
+
// Copy keys to temp folder
- processUtil.executeCommand("cp", sourcePemFile, targetPemFile);
- processUtil.executeCommand("cp", sourcePubKeyFile, targetPubKeyFile);
-
- // To zip the key files
- processUtil.executeCommand("tar", "cvf", zipFile, "-C", "/tmp", SshUtil.PEM_FILE.getName(),
+ ProcessResult result = processUtil.executeCommand("cp", sourcePemFile, targetPemFile);
+ if (!result.isSuccess()) {
+ throw new GlusterRuntimeException("Failed to copy key files! [" + result.getOutput() + "]");
+ }
+ result = processUtil.executeCommand("cp", sourcePubKeyFile, targetPubKeyFile);
+ if (!result.isSuccess()) {
+ throw new GlusterRuntimeException("Failed to copy key files! [" + result.getOutput() + "]");
+ }
+
+ // To compress the key files
+ result = processUtil.executeCommand("tar", "cvf", zipFile, "-C", "/tmp", SshUtil.PEM_FILE.getName(),
SshUtil.PUBLIC_KEY_FILE.getName());
+ if (!result.isSuccess()) {
+ throw new GlusterRuntimeException("Failed to compress key files! [" + result.getOutput() + "]");
+ }
// To remove the copied key files
- processUtil.executeCommand("rm", "-f", targetPubKeyFile, targetPubKeyFile);
+ processUtil.executeCommand("rm", "-f", targetPubKeyFile, targetPubKeyFile); // Ignore the errors if any
return zipFile;
}
diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
index 304da012..22da9ca3 100644
--- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
+++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.regex.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -410,7 +411,13 @@ public class GlusterUtil {
}
private void addBrickToVolume(Volume volume, String serverName, String brickDir, BRICK_STATUS status) {
- volume.addBrick(new Brick(serverName, status, brickDir.split("/")[2].trim(), brickDir));
+ //If brick directory has standard path, find and assign device name otherwise null
+ String stdBrickDirPattern = "^/export/.*/.*"; // e.g: /export/sdb/test
+ String deviceName = null;
+ if (Pattern.matches(stdBrickDirPattern, brickDir) ) {
+ deviceName = brickDir.split("/")[2].trim();
+ }
+ volume.addBrick(new Brick(serverName, status, deviceName, brickDir));
}
// Do not throw exception, Gracefully handle as Offline brick.
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 8048615e..609b4f65 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
@@ -224,6 +224,48 @@ public class ServerUtil {
return (Status) executeOnServer(true, serverName, REMOTE_SCRIPT_GET_DISK_FOR_DIR + " " + brickDir, Status.class);
}
+ public ServerStats fetchCPUUsageData(String serverName) {
+ Object output = executeOnServer(true, serverName, "get_rrd_cpu_details.py 1d", ServerStats.class);
+ //String cpuUsageData = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?> <xport> <meta> <start>1310468100</start> <step>300</step> <end>1310471700</end> <rows>13</rows> <columns>3</columns> <legend> <entry>user</entry> <entry>system</entry> <entry>total</entry> </legend> </meta> <data> <row><t>1310468100</t><v>2.23802952e-1</v><v>4.3747778209e-01</v><v>6.6128073384e-01</v></row> <row><t>1310468400</t><v>2.3387347338e-01</v><v>4.4642717442e-01</v><v>6.8030064780e-01</v></row> <row><t>1310468700</t><v>5.5043873220e+00</v><v>6.2462376636e+00</v><v>1.1750624986e+01</v></row> <row><t>1310469000</t><v>2.4350593653e+01</v><v>2.6214585217e+01</v><v>5.0565178869e+01</v></row> <row><t>1310469300</t><v>4.0786489953e+01</v><v>4.6784713828e+01</v><v>8.7571203781e+01</v></row> <row><t>1310469600</t><v>4.1459955508e+01</v><v>5.2546309044e+01</v><v>9.4006264551e+01</v></row> <row><t>1310469900</t><v>4.2312286165e+01</v><v>5.2390588332e+01</v><v>9.4702874497e+01</v></row> <row><t>1310470200</t><v>4.2603794982e+01</v><v>5.1598861493e+01</v><v>9.4202656475e+01</v></row> <row><t>1310470500</t><v>3.8238751290e+01</v><v>4.5312089966e+01</v><v>8.3550841256e+01</v></row> <row><t>1310470800</t><v>1.7949961224e+01</v><v>2.1282058418e+01</v><v>3.9232019642e+01</v></row> <row><t>1310471100</t><v>1.2330371421e-01</v><v>4.6347832868e-01</v><v>5.8678204289e-01</v></row> <row><t>1310471400</t><v>1.6313260492e-01</v><v>5.4088119561e-01</v><v>7.0401380052e-01</v></row> <row><t>1310471700</t><v>NaN</v><v>NaN</v><v>NaN</v></row> </data> </xport>";
+ //Object output = unmarshal(ServerStats.class, cpuUsageData, false);
+ if(output instanceof Status) {
+ throw new GlusterRuntimeException(((Status)output).toString());
+ }
+ return (ServerStats) output;
+ }
+
+ private ServerStats getFirstOnlineServerCPUStats(List<String> serverNames, boolean removeServerOnError, boolean removeOnlineServer) {
+ for(int i = serverNames.size() - 1; i >= 0; i--) {
+ String serverName = serverNames.get(i);
+ try {
+ ServerStats stats = fetchCPUUsageData(serverName);
+ if(removeOnlineServer) {
+ serverNames.remove(serverName);
+ }
+ return stats;
+ } catch(Exception e) {
+ // server might be offline - continue with next one
+ logger.warn("Couldn't fetch CPU stats from server [" + serverName + "]!", e);
+ if(removeServerOnError) {
+ serverNames.remove(serverName);
+ }
+ continue;
+ }
+ }
+ throw new GlusterRuntimeException("All servers offline!");
+ }
+
+ public ServerStats fetchAggregatedCPUStats(List<String> serverNames) {
+ if(serverNames == null || serverNames.size() == 0) {
+ throw new GlusterRuntimeException("No server names passed to fetchAggregaredCPUUsageData!");
+ }
+
+ ServerStats firstServerStats = getFirstOnlineServerCPUStats(serverNames, true, true);
+
+ ServerStats aggregatedStats = new ServerStats(firstServerStats);
+ aggregateCPUStats(serverNames, aggregatedStats);
+ return aggregatedStats;
+ }
public static void main(String[] args) {
// ServerStats stats = new ServerUtil().fetchCPUUsageData("s1", "1d");