diff options
| author | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-07-24 09:00:24 -0700 |
|---|---|---|
| committer | Shireesh Anjal <anjalshireesh@gmail.com> | 2011-07-24 09:00:24 -0700 |
| commit | 069be5f7df55052c6b1e00ea7580d94aa97e142b (patch) | |
| tree | 1fc6dea47b6a8c0b568af4f445fb792bd4debf29 | |
| parent | 0075542d9b5a27b3f7eb401dd833e1b24ad666cb (diff) | |
| parent | e4be833158e0e311b7c9fc271357b8a43d67ec20 (diff) | |
Merge pull request #147 from Selvasundaram/master
Brick status updates and brick status icon changes in bricks view
10 files changed, 70 insertions, 37 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 Binary files differnew file mode 100644 index 00000000..48812db8 --- /dev/null +++ b/src/com.gluster.storage.management.gui/icons/tango/16x16/offline-brick.png 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 Binary files differnew file mode 100644 index 00000000..da895838 --- /dev/null +++ b/src/com.gluster.storage.management.gui/icons/tango/16x16/online-brick.png 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 aba7dde2..8c5c540c 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 @@ -38,6 +38,7 @@ 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; @@ -339,9 +340,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)); @@ -638,8 +637,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/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. |
