diff options
| author | Tim <timothyasir@gluster.com> | 2011-07-05 15:38:35 +0530 |
|---|---|---|
| committer | Tim <timothyasir@gluster.com> | 2011-07-05 15:38:35 +0530 |
| commit | 72722169d06f0a930c58b1eb8ae892cfc14ec096 (patch) | |
| tree | 5c420ccf5490fde2024382d0cf10dabb825eb418 /src | |
| parent | 482457016156b7eb46f3f0f60ae9003ed267ea44 (diff) | |
| parent | 429d3149d5cf042f1aabc5836d7df451c7da06bd (diff) | |
Merge remote branch 'upstream/master'
Diffstat (limited to 'src')
71 files changed, 1035 insertions, 836 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index f3feb1cb..221651a3 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.client; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -29,7 +30,6 @@ import com.gluster.storage.management.core.model.Cluster; import com.gluster.storage.management.core.model.ClusterListener; import com.gluster.storage.management.core.model.Disk; import com.gluster.storage.management.core.model.Disk.DISK_STATUS; -import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.Event; import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.core.model.GlusterDataModel; @@ -111,44 +111,173 @@ public class GlusterDataModelManager { private void updateModel(GlusterDataModel model) { updateVolumes(model); - updateServers(model); - // TODO: Update other entities like discovered servers + updateGlusterServers(model); + updateDiscoveredServers(model); } - private void updateServers(GlusterDataModel newModel) { + private void updateDiscoveredServers(GlusterDataModel newModel) { + List<Server> oldServers = model.getCluster().getAutoDiscoveredServers(); + List<Server> newServers = newModel.getCluster().getAutoDiscoveredServers(); + + Set<Server> addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); + for (Server addedServer : addedServers) { + addDiscoveredServer(addedServer); + } + + Set<Server> removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); + for (Server removedServer : removedServers) { + removeDiscoveredServer(removedServer); + } + + Map<Server, Server> modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); + for(Entry<Server, Server> entry : modifiedServers.entrySet()) { + discoveredServerChanged(entry.getKey(), entry.getValue()); + } + } + + private void updateGlusterServers(GlusterDataModel newModel) { List<GlusterServer> oldServers = model.getCluster().getServers(); List<GlusterServer> newServers = newModel.getCluster().getServers(); - List<GlusterServer> addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); + Set<GlusterServer> addedServers = GlusterCoreUtil.getAddedEntities(oldServers, newServers, true); for (GlusterServer addedServer : addedServers) { addGlusterServer(addedServer); } - List<GlusterServer> removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); + Set<GlusterServer> removedServers = GlusterCoreUtil.getAddedEntities(newServers, oldServers, true); for (GlusterServer removedServer : removedServers) { removeGlusterServer(removedServer); } - // TODO: Refresh "modified" servers + Map<GlusterServer, GlusterServer> modifiedServers = GlusterCoreUtil.getModifiedEntities(oldServers, newServers); + for(Entry<GlusterServer, GlusterServer> entry : modifiedServers.entrySet()) { + glusterServerChanged(entry.getKey(), entry.getValue()); + } + } + + public void glusterServerChanged(GlusterServer oldServer, GlusterServer newServer) { + oldServer.copyFrom(newServer); + for (ClusterListener listener : listeners) { + listener.serverChanged(oldServer, new Event(EVENT_TYPE.GLUSTER_SERVER_CHANGED, newServer)); + } + + updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); + } + + private void updateDisks(Server server, List<Disk> oldDisks, List<Disk> newDisks) { + Set<Disk> addedDisks = GlusterCoreUtil.getAddedEntities(oldDisks, newDisks, false); + addDisks(server, addedDisks); + + Set<Disk> removedDisks = GlusterCoreUtil.getAddedEntities(newDisks, oldDisks, false); + removeDisks(server, removedDisks); + + Map<Disk, Disk> modifiedDisks = GlusterCoreUtil.getModifiedEntities(oldDisks, newDisks); + disksChanged(server, modifiedDisks); + } + + private void disksChanged(Server server, Map<Disk, Disk> modifiedDisks) { + if(modifiedDisks.size() == 0) { + return; + } + + for (Entry<Disk, Disk> entry : modifiedDisks.entrySet()) { + entry.getKey().copyFrom(entry.getValue()); + } + for (ClusterListener listener : listeners) { + if (server instanceof GlusterServer) { + listener.serverChanged((GlusterServer) server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_CHANGED, modifiedDisks)); + } + } + } + + public void addDisks(Server server, Set<Disk> disks) { + if(disks.size() == 0) { + return; + } + + server.addDisks(disks); + for (ClusterListener listener : listeners) { + if(server instanceof GlusterServer) { + listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_ADDED, disks)); + } + } + } + + public void removeDisks(Server server, Set<Disk> disks) { + if(disks.size() == 0) { + return; + } + + for(Disk disk : disks) { + server.removeDisk(disk); + } + + for (ClusterListener listener : listeners) { + if(server instanceof GlusterServer) { + listener.serverChanged((GlusterServer)server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); + } else { + listener.discoveredServerChanged(server, new Event(EVENT_TYPE.DISKS_REMOVED, disks)); + } + } } private void updateVolumes(GlusterDataModel newModel) { List<Volume> oldVolumes = model.getCluster().getVolumes(); List<Volume> newVolumes = newModel.getCluster().getVolumes(); - List<Volume> addedVolumes = GlusterCoreUtil.getAddedEntities(oldVolumes, newVolumes, false); + Set<Volume> addedVolumes = GlusterCoreUtil.getAddedEntities(oldVolumes, newVolumes, false); for (Volume addedVolume : addedVolumes) { addVolume(addedVolume); } - List<Volume> removedVolumes = GlusterCoreUtil.getAddedEntities(newVolumes, oldVolumes, false); + Set<Volume> removedVolumes = GlusterCoreUtil.getAddedEntities(newVolumes, oldVolumes, false); for (Volume removedVolume : removedVolumes) { deleteVolume(removedVolume); } - // TODO: Refresh "modified" volumes + Map<Volume, Volume> modifiedVolumes = GlusterCoreUtil.getModifiedEntities(oldVolumes, newVolumes); + for(Entry<Volume, Volume> entry : modifiedVolumes.entrySet()) { + volumeChanged(entry.getKey(), entry.getValue()); + } } + private void volumeChanged(Volume oldVolume, Volume newVolume) { + oldVolume.copyFrom(newVolume); + for (ClusterListener listener : listeners) { + listener.volumeChanged(oldVolume, new Event(EVENT_TYPE.VOLUME_CHANGED, newVolume)); + } + updateBricks(oldVolume, oldVolume.getBricks(), newVolume.getBricks()); + } + + private void updateBricks(Volume volume, List<Brick> oldBricks, List<Brick> newBricks) { + Set<Brick> addedBricks = GlusterCoreUtil.getAddedEntities(oldBricks, newBricks, false); + addBricks(volume, addedBricks); + + Set<Brick> removedBricks = GlusterCoreUtil.getAddedEntities(newBricks, oldBricks, false); + removeBricks(volume, removedBricks); + + Map<Brick, Brick> modifiedBricks = GlusterCoreUtil.getModifiedEntities(oldBricks, newBricks); + bricksChanged(volume, modifiedBricks); + } + + public void bricksChanged(Volume volume, Map<Brick, Brick> modifiedBricks) { + if(modifiedBricks.size() == 0) { + return; + } + + for(Entry<Brick, Brick> entry : modifiedBricks.entrySet()) { + entry.getKey().copyFrom(entry.getValue()); + } + + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_CHANGED, modifiedBricks)); + } + } + private void initializeGlusterServers(Cluster cluster) { cluster.setServers(new GlusterServersClient().getServers()); } @@ -167,8 +296,8 @@ public class GlusterDataModelManager { } public void initializeTasks(Cluster cluster) { - // List<TaskInfo> taskInfoList = new TasksClient(cluster.getName()).getAllTasks(); - List<TaskInfo> taskInfoList = getDummyTasks(); + List<TaskInfo> taskInfoList = new TasksClient(cluster.getName()).getAllTasks(); + // List<TaskInfo> taskInfoList = getDummyTasks(); cluster.setTaskInfoList(taskInfoList); } @@ -179,8 +308,8 @@ public class GlusterDataModelManager { TaskInfo taskInfo = new TaskInfo(); taskInfo.setType(TASK_TYPE.BRICK_MIGRATE); taskInfo.setName("Migrate Brick-music"); - taskInfo.setCanPause(true); - taskInfo.setCanStop(true); + taskInfo.setPauseSupported(true); + taskInfo.setStopSupported(true); taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, ""))); taskInfo.getStatus().setMessage("Migrating file xxxxx to yyyy"); @@ -190,8 +319,8 @@ public class GlusterDataModelManager { taskInfo = new TaskInfo(); taskInfo.setType(TASK_TYPE.DISK_FORMAT); taskInfo.setName("Format Disk-server1:sdc"); - taskInfo.setCanPause(false); - taskInfo.setCanStop(false); + taskInfo.setPauseSupported(false); + taskInfo.setStopSupported(false); taskInfo.setStatus( new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, ""))); taskInfo.getStatus().setMessage("Format completes 80% ..."); taskInfo.setDescription("Formatting disk server1:sdc."); @@ -341,6 +470,14 @@ public class GlusterDataModelManager { } } + public void discoveredServerChanged(Server oldServer, Server newServer) { + oldServer.copyFrom(newServer); + for (ClusterListener listener : listeners) { + listener.discoveredServerChanged(oldServer, new Event(EVENT_TYPE.DISCOVERED_SERVER_CHANGED, newServer)); + } + updateDisks(oldServer, oldServer.getDisks(), newServer.getDisks()); + } + public void removeDiscoveredServer(String serverName) { Cluster cluster = model.getCluster(); // TODO: Move auto-discovered servers outside the cluster @@ -398,13 +535,27 @@ public class GlusterDataModelManager { } } - public void addBricks(Volume volume, List<Brick> bricks) { + public void addBricks(Volume volume, Set<Brick> bricks) { + if(bricks.size() == 0) { + return; + } + + volume.addBricks(bricks); for (ClusterListener listener : listeners) { listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_ADDED, bricks)); } } public void removeBricks(Volume volume, Set<Brick> bricks) { + if(bricks.size() == 0) { + return; + } + + // Remove the bricks from the volume object + for (Brick brick : bricks) { + volume.removeBrick(brick); + } + for (ClusterListener listener : listeners) { listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICKS_REMOVED, bricks)); } @@ -425,6 +576,13 @@ public class GlusterDataModelManager { listener.volumeCreated(volume); } } + + public void updateVolumeBricks(Volume volume, List<Brick> bricks) { + model.getCluster().updateVolume( volume.getName(), bricks ); + for (ClusterListener listener : listeners) { + listener.volumeChanged(volume, new Event(EVENT_TYPE.BRICK_REPLACED , bricks)); + } + } public void addTask(TaskInfo taskInfo) { Cluster cluster = model.getCluster(); diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java index c839a15a..6dc251dc 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/UsersClient.java @@ -22,6 +22,8 @@ import java.net.ConnectException; import javax.ws.rs.core.Response; +import org.apache.log4j.Logger; + import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; import com.sun.jersey.api.client.UniformInterfaceException; @@ -32,6 +34,7 @@ public class UsersClient extends AbstractClient { private static final String RESOURCE_NAME = "users"; private static final String FORM_PARAM_OLD_PASSWORD = "oldpassword"; private static final String FORM_PARAM_NEW_PASSWORD = "newpassword"; + private static final Logger logger = Logger.getLogger(UsersClient.class); private String generateSecurityToken(String user, String password) { return new String(Base64.encode(user + ":" + password)); @@ -44,7 +47,7 @@ public class UsersClient extends AbstractClient { public void authenticate(String user, String password) { setSecurityToken(generateSecurityToken(user, password)); try { - fetchSubResource(user, String.class); + fetchSubResource(user, Status.class); } catch (RuntimeException e) { Throwable cause = e.getCause(); if(cause == null) { @@ -58,14 +61,16 @@ public class UsersClient extends AbstractClient { setSecurityToken(null); throw new GlusterRuntimeException("Invalid user id or password!"); } else { - // TODO: Log the exception - throw new GlusterRuntimeException("Exception during authentication: [" - + e1.getResponse().getStatus() + "]"); + String errMsg = "Exception during authentication: [" + e1.getResponse().getStatus() + "]"; + logger.error(errMsg); + throw new GlusterRuntimeException(errMsg); } } else if(cause instanceof ConnectException) { throw new GlusterRuntimeException("Couldn't connect to Gluster Management Gateway!"); } else { - throw new GlusterRuntimeException("Exception during authentication: [" + e.getMessage() + "]"); + String errMsg = "Exception during authentication: [" + e.getMessage() + "]"; + logger.error(errMsg); + throw new GlusterRuntimeException(errMsg); } } } @@ -80,20 +85,18 @@ public class UsersClient extends AbstractClient { } public static void main(String[] args) { -// UsersClient authClient = new UsersClient(); -// -// // authenticate user -// authClient.authenticate("gluster", "gluster"); -// -// // change password to gluster1 -// authClient.changePassword("gluster", "gluster", "gluster1"); -// -// // change it back to gluster -// authClient.changePassword("gluster", "gluster1", "gluster"); -// -// System.out.println("success"); - System.out.println(new String(Base64.encode("abcdefghijklmnopqrstuvwxyz"))); - System.out.println(new String(Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo="))); + UsersClient authClient = new UsersClient(); + + // authenticate user + authClient.authenticate("gluster", "gluster"); + + // change password to gluster1 + authClient.changePassword("gluster", "gluster", "gluster1"); + + // change it back to gluster + authClient.changePassword("gluster", "gluster1", "gluster"); + + System.out.println("success"); } /* diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java index b5d2711a..7beb8433 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/VolumesClient.java @@ -139,7 +139,7 @@ public class VolumesClient extends AbstractClient { VolumeOptionInfoListResponse.class)).getOptions(); } - public void addBricks(String volumeName, List<String> brickList) { + public void addBricks(String volumeName, Set<String> brickList) { String bricks = StringUtil.collectionToString(brickList, ","); Form form = new Form(); form.add(RESTConstants.FORM_PARAM_BRICKS, bricks); @@ -241,12 +241,6 @@ public class VolumesClient extends AbstractClient { putRequest(volumeName, form); } - public void rebalanceStatus(String volumeName) { - Form form = new Form(); - form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STATUS); - putRequest(volumeName, form); - } - public void rebalanceStop(String volumeName) { Form form = new Form(); form.add(RESTConstants.FORM_PARAM_OPERATION, RESTConstants.TASK_REBALANCE_STOP); 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 4726fc36..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 @@ -27,7 +27,7 @@ public class ClientConstants { public static final String SYS_PROP_SERVER_URL = "gluster.server.url"; 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 WEB_RESOURCE_BASE_PATH = "resources"; + public static final String REST_API_VERSION = "1.0"; // SSL related public static final String TRUSTED_KEYSTORE = "gmc-trusted.keystore"; diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java index 4f7ea64e..3f87fd27 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/utils/ClientUtil.java @@ -9,7 +9,7 @@ import com.gluster.storage.management.client.constants.ClientConstants; public class ClientUtil { public static URI getServerBaseURI() { - return UriBuilder.fromUri(getBaseURL()).path(ClientConstants.WEB_RESOURCE_BASE_PATH).build(); + return UriBuilder.fromUri(getBaseURL()).path(ClientConstants.REST_API_VERSION).build(); } private static String getBaseURL() { diff --git a/src/com.gluster.storage.management.core/.classpath b/src/com.gluster.storage.management.core/.classpath index b41cbcdb..221aeec4 100644 --- a/src/com.gluster.storage.management.core/.classpath +++ b/src/com.gluster.storage.management.core/.classpath @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> + <classpathentry exported="true" kind="lib" path="lib/log4j-1.2.16.jar"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> <classpathentry kind="src" path="junit"/> diff --git a/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF index a32970c8..fae660fb 100644 --- a/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF +++ b/src/com.gluster.storage.management.core/META-INF/MANIFEST.MF @@ -9,5 +9,8 @@ Export-Package: com.gluster.storage.management.core.constants, com.gluster.storage.management.core.exceptions, com.gluster.storage.management.core.model, com.gluster.storage.management.core.response, - com.gluster.storage.management.core.utils + com.gluster.storage.management.core.utils, + org.apache.log4j Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0" +Bundle-ClassPath: lib/log4j-1.2.16.jar, + . diff --git a/src/com.gluster.storage.management.core/build.properties b/src/com.gluster.storage.management.core/build.properties index 34d2e4d2..89d32a46 100644 --- a/src/com.gluster.storage.management.core/build.properties +++ b/src/com.gluster.storage.management.core/build.properties @@ -1,4 +1,7 @@ source.. = src/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + lib/ +src.includes = lib/,\ + src/ diff --git a/src/com.gluster.storage.management.core/lib/log4j-1.2.16.jar b/src/com.gluster.storage.management.core/lib/log4j-1.2.16.jar Binary files differnew file mode 100644 index 00000000..3f9d8476 --- /dev/null +++ b/src/com.gluster.storage.management.core/lib/log4j-1.2.16.jar diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java index 064037ec..f48f33cf 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/GlusterConstants.java @@ -31,5 +31,4 @@ public class GlusterConstants { }; public static final List<String> VOLUME_LOG_LEVELS_ARR = StringUtil.enumToArray(VOLUME_LOG_LEVELS.values()); - } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java index fef8f969..0b330514 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Brick.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; import com.gluster.storage.management.core.utils.StringUtil; @@ -35,6 +36,12 @@ public class Brick extends Entity { public Brick() { } + @Override + @XmlTransient + public String getName() { + return getQualifiedName(); + } + public BRICK_STATUS getStatus() { return status; } @@ -83,7 +90,7 @@ public class Brick extends Entity { } public boolean filter(String filterString, boolean caseSensitive) { - return StringUtil.filterString(getServerName() + getBrickDirectory() + getDiskName(), filterString, + return StringUtil.filterString(getServerName() + getBrickDirectory() + getDiskName() + getStatusStr(), filterString, caseSensitive); } @@ -91,4 +98,25 @@ public class Brick extends Entity { public String toString() { return getQualifiedName(); } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Brick)) { + return false; + } + + Brick brick = (Brick)obj; + if(getQualifiedName().equals(brick.getQualifiedName()) && getStatus() == brick.getStatus()) { + return true; + } + + return false; + } + + public void copyFrom(Brick newBrick) { + setServerName(newBrick.getServerName()); + setBrickDirectory(newBrick.getBrickDirectory()); + setDiskName(newBrick.getDiskName()); + setStatus(newBrick.getStatus()); + } } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java index d6757cba..4f6c317c 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Cluster.java @@ -55,7 +55,7 @@ public class Cluster extends Entity { } public void deleteVolume(Volume volume) { - volumes.remove(volume); + volumes.remove(volume); } public void setServers(List<GlusterServer> servers) { @@ -93,6 +93,11 @@ public class Cluster extends Entity { public void addVolume(Volume volume) { this.volumes.add(volume); } + + public void updateVolume(String volumeName, List<Brick> bricks) { + Volume volume = getVolume(volumeName); + volume.setBricks(bricks); + } public Cluster(String name, Entity parent) { super(name, parent); @@ -156,4 +161,13 @@ public class Cluster extends Entity { } return null; } -}
\ No newline at end of file + + public Volume getVolume(String volumeName) { + for (Volume volume : getVolumes() ) { + if (volume.getName().equals(volumeName)) { + return volume; + } + } + return null; + } +} diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java index 71de5e23..350c9102 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/ClusterListener.java @@ -27,6 +27,8 @@ public interface ClusterListener { public void discoveredServerRemoved(Server server); + public void discoveredServerChanged(Server server, Event event); + public void serverAdded(GlusterServer server); public void serverRemoved(GlusterServer server); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java index d3b0e42e..c530fde4 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/DefaultClusterListener.java @@ -26,79 +26,83 @@ public class DefaultClusterListener implements ClusterListener { @Override public void serverAdded(GlusterServer server) { - clusterChanged(); + modelChanged(); } @Override public void serverRemoved(GlusterServer server) { - clusterChanged(); + modelChanged(); } @Override public void serverChanged(GlusterServer server, Event event) { - clusterChanged(); + modelChanged(); } @Override public void volumeAdded(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeRemoved(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeChanged(Volume volume, Event event) { - clusterChanged(); + modelChanged(); } @Override public void discoveredServerAdded(Server server) { - clusterChanged(); + modelChanged(); } @Override public void discoveredServerRemoved(Server server) { - clusterChanged(); + modelChanged(); } @Override public void volumeCreated(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void volumeDeleted(Volume volume) { - clusterChanged(); + modelChanged(); } @Override public void taskAdded(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } @Override public void taskRemoved(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } @Override public void taskUpdated(TaskInfo taskInfo) { - clusterChanged(); + modelChanged(); } - + /** * This method is called by every other event method. Thus, if a view/listener is interested in performing the same - * task on any change happening in the cluster data model, it can simply override this method and implement the - * logic. e.g. A view may simply refresh its tree/table viewer whenever the cluster data model changes. + * task on any change happening in the data model, it can simply override this method and implement the + * logic. e.g. A view may simply refresh its tree/table viewer whenever the data model changes. */ - public void clusterChanged() { + public void modelChanged() { } - + + @Override + public void discoveredServerChanged(Server server, Event event) { + modelChanged(); + } } 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 a399a03a..ecc3a278 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 @@ -132,4 +132,31 @@ public class Disk extends Entity { public String getQualifiedBrickName(String volumeName) { return getServerName() + ":" + getMountPoint() + File.separator + volumeName; } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Disk)) { + return false; + } + Disk disk = (Disk)obj; + + if (getName().equals(disk.getName()) && getServerName().equals(disk.getServerName()) + && getMountPoint().equals(disk.getMountPoint()) && getDescription().equals(disk.getDescription()) + && getStatus() == disk.getStatus() && getSpace() == disk.getSpace() + && getSpaceInUse() == disk.getSpaceInUse()) { + return true; + } + + return false; + } + + public void copyFrom(Disk newDisk) { + setName(newDisk.getName()); + setDescription(newDisk.getDescription()); + setMountPoint(newDisk.getMountPoint()); + setServerName(newDisk.getServerName()); + setStatus(newDisk.getStatus()); + setSpace(newDisk.getSpace()); + setSpaceInUse(newDisk.getSpaceInUse()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java index 99594b5d..62f70040 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Event.java @@ -22,11 +22,17 @@ public class Event { public enum EVENT_TYPE { BRICKS_ADDED, BRICKS_REMOVED, - NETWORK_INTERFACE_ADDED, - NETWORK_INTERFACE_REMOVED, + BRICKS_CHANGED, + BRICK_REPLACED, VOLUME_STATUS_CHANGED, VOLUME_OPTIONS_RESET, - VOLUME_OPTION_SET + VOLUME_OPTION_SET, + VOLUME_CHANGED, + GLUSTER_SERVER_CHANGED, + DISKS_ADDED, + DISKS_REMOVED, + DISKS_CHANGED, + DISCOVERED_SERVER_CHANGED } private EVENT_TYPE eventType; diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java index 8324b22d..f2ccc5db 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterDummyModel.java @@ -88,7 +88,6 @@ public class GlusterDummyModel { initializeAutoDiscoveredServers(cluster); initializeDisks(); addDisksToServers(); - addDisksToVolumes(); addVolumeOptions(); createDummyLogMessages(); @@ -170,27 +169,6 @@ public class GlusterDummyModel { server5.addDisk(s5db); } - private void addDisksToVolumes() { - volume1.addDisk("server1:sda"); - - volume2.addDisk("server2:sda"); - volume2.addDisk("server1:sdb"); - volume2.addDisk("server3:sda"); - volume2.addDisk("server4:sda"); - - volume3.addDisk("server2:sdb"); - volume3.addDisk("server4:sda"); - volume3.addDisk("server5:sda"); - - volume4.addDisk("server1:sda"); - volume4.addDisk("server3:sda"); - volume4.addDisk("server4:sda"); - volume4.addDisk("server5:sdb"); - - volume5.addDisk("server2:sda"); - volume5.addDisk("server5:sdb"); - } - private void initializeGlusterServers(Cluster cluster) { List<GlusterServer> servers = new ArrayList<GlusterServer>(); server1 = addGlusterServer(servers, cluster, "Server1", SERVER_STATUS.ONLINE, "eth0", 4, 56.3, 16, 8.4); @@ -254,33 +232,6 @@ public class GlusterDummyModel { return null; } - public List<Disk> getReadyDisksOfVolume(Volume volume) { - // List<Disk> disks = new ArrayList<Disk>(); - // for (Disk disk : volume.getDisks()) { - // if (disk.isReady()) { - // disks.add(disk); - // } - // } - // return disks; - Disk disk = null; - List<Disk> volumeDisks = new ArrayList<Disk>(); - for (String volumeDisk : volume.getDisks()) { - disk = getVolumeDisk(volumeDisk); - if (disk != null && disk.isReady()) { - volumeDisks.add(disk); - } - } - return volumeDisks; - } - - public List<Disk> getReadyDisksOfAllVolumes() { - List<Disk> disks = new ArrayList<Disk>(); - for (Volume volume : ((Cluster) model.getChildren().get(0)).getVolumes()) { - disks.addAll(getReadyDisksOfVolume(volume)); - } - return disks; - } - public List<Disk> getReadyDisksOfAllServers() { return getReadyDisksOfAllServersExcluding(new ArrayList<Disk>()); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java index a9455f48..025db809 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/GlusterServer.java @@ -33,7 +33,6 @@ public class GlusterServer extends Server { private String uuid; private SERVER_STATUS status; - private Cluster cluster; public GlusterServer() { } @@ -48,12 +47,6 @@ public class GlusterServer extends Server { setStatus(status); } - public GlusterServer(String name, Entity parent, SERVER_STATUS status, int numOfCPUs, double cpuUsage, - double totalMemory, double memoryInUse, Cluster cluster) { - this(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse); - setCluster(cluster); - } - public Boolean isOnline() { return getStatus() == SERVER_STATUS.ONLINE; } @@ -78,32 +71,31 @@ public class GlusterServer extends Server { this.uuid = uuid; } - -// public NetworkInterface getPreferredNetworkInterface() { -// return preferredNetworkInterface; -// } -// -// public void setPreferredNetworkInterface(NetworkInterface preferredNetworkInterface) { -// this.preferredNetworkInterface = preferredNetworkInterface; -// preferredNetworkInterface.setPreferred(true); -// } - - - @XmlTransient - public Cluster getCluster() { - return cluster; - } - - public void setCluster(Cluster cluster) { - this.cluster = cluster; - } - /** - * Filter matches if any of the properties name, status and primary/secondary/third - * DNS contains the filter string + * Filter matches if any of the properties name and status contains the filter string */ @Override public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getStatusStr(), filterString, caseSensitive); } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof GlusterServer)) { + return false; + } + GlusterServer server = (GlusterServer)obj; + + if (super.equals(server) && getUuid().equals(server.getUuid()) && getStatus() == server.getStatus()) { + return true; + } + + return false; + } + + public void copyFrom(GlusterServer server) { + super.copyFrom(server); + setUuid(server.getUuid()); + setStatus(server.getStatus()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java index c0521ef3..181b8e66 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/NetworkInterface.java @@ -92,4 +92,21 @@ public class NetworkInterface extends Entity { this.speed = speed; } -} + @Override + public boolean equals(Object obj) { + if (!(obj instanceof NetworkInterface)) { + return false; + } + + NetworkInterface networkInterface = (NetworkInterface) obj; + if (getName().equals(networkInterface.getName()) && getHwAddr().equals(networkInterface.getHwAddr()) + && getIpAddress().equals(networkInterface.getIpAddress()) + && getDefaultGateway().equals(networkInterface.getDefaultGateway()) + && getNetMask().equals(networkInterface.getNetMask()) && getSpeed().equals(networkInterface.getSpeed()) + && getModel().equals(networkInterface.getModel())) { + return true; + } + + return false; + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java index 487733c3..9e9212dc 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Server.java @@ -19,17 +19,18 @@ package com.gluster.storage.management.core.model; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.StringUtil; @XmlRootElement(name = "server") public class Server extends Entity { - private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>(); private int numOfCPUs; private double cpuUsage; private double totalMemory; @@ -37,6 +38,7 @@ public class Server extends Entity { private double totalDiskSpace = 0; private double diskSpaceInUse = 0; private List<Disk> disks = new ArrayList<Disk>(); + private List<NetworkInterface> networkInterfaces = new ArrayList<NetworkInterface>(); public Server() { @@ -143,7 +145,7 @@ public class Server extends Entity { } } - public void addDisks(List<Disk> disks) { + public void addDisks(Collection<Disk> disks) { for (Disk disk : disks) { addDisk(disk); } @@ -184,19 +186,54 @@ public class Server extends Entity { public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getIpAddressesAsString(), filterString, caseSensitive); } - + + /** + * Note: this method doesn't copy the disks. Clients should write separate code to identify added/removed/modified + * disks and update the server disks appropriately. + * + * @param server + */ @SuppressWarnings("unchecked") public void copyFrom(Server server) { - this.setName(server.getName()); - this.setParent(server.getParent()); - this.setChildren(( List<Entity>) server.getChildren()); - this.setNetworkInterfaces(server.getNetworkInterfaces()); - this.setNumOfCPUs(server.getNumOfCPUs()); - this.setCpuUsage(server.getCpuUsage()); - this.setTotalMemory(server.getTotalMemory()); - this.setMemoryInUse(server.getMemoryInUse()); - this.setTotalDiskSpace(server.getTotalDiskSpace()); - this.setDiskSpaceInUse(server.getDiskSpaceInUse()); - this.setDisks(server.getDisks()); - } -} + setName(server.getName()); + setParent(server.getParent()); + setChildren((List<Entity>) server.getChildren()); + setNetworkInterfaces(server.getNetworkInterfaces()); + setNumOfCPUs(server.getNumOfCPUs()); + setCpuUsage(server.getCpuUsage()); + setTotalMemory(server.getTotalMemory()); + setMemoryInUse(server.getMemoryInUse()); + setTotalDiskSpace(server.getTotalDiskSpace()); + setDiskSpaceInUse(server.getDiskSpaceInUse()); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Server)) { + return false; + } + Server server = (Server)obj; + + if (!(getName().equals(server.getName()) && getNumOfCPUs() == server.getNumOfCPUs() + && getCpuUsage() == server.getCpuUsage() && getTotalMemory() == server.getTotalMemory() + && getMemoryInUse() == server.getMemoryInUse() && getDisks().size() == server.getDisks().size() && getNetworkInterfaces() + .size() == server.getNetworkInterfaces().size())) { + return false; + } + + for(Disk disk : getDisks()) { + if (!disk.equals(GlusterCoreUtil.getEntity(server.getDisks(), disk.getName(), false))) { + return false; + } + } + + for (NetworkInterface networkInterface : getNetworkInterfaces()) { + if (!networkInterface.equals(GlusterCoreUtil.getEntity(server.getNetworkInterfaces(), + networkInterface.getName(), false))) { + return false; + } + } + + return true; + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskInfo.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskInfo.java index 1ce2fa04..d3267ec4 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskInfo.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/TaskInfo.java @@ -78,28 +78,28 @@ public class TaskInfo extends Entity { public void setStatus(TaskStatus status) { this.status = status; } - - public Boolean canPause() { + + public Boolean getPauseSupported() { return pauseSupported; } - public void setCanPause(Boolean canPause) { + public void setPauseSupported(Boolean canPause) { this.pauseSupported = canPause; } - public Boolean canStop() { + public Boolean getStopSupported() { return stopSupported; } - - public void setCanStop(Boolean canStop) { + + public void setStopSupported(Boolean canStop) { this.stopSupported = canStop; } - public Boolean canCommit() { + public Boolean getCommitSupported() { return this.commitSupported; } - public void setCanCommit(Boolean canCommit) { + public void setCommitSupported(Boolean canCommit) { this.commitSupported = canCommit; } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java index da92ca14..ed5d12f7 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/User.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlTransient; @XmlRootElement public class User { @@ -31,6 +32,8 @@ public class User { public void setUserId(String userId) { this.userId = userId; } + + @XmlTransient public String getPassword() { return password; } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java index 1d5b2fec..006202fb 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/Volume.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.core.model; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; @@ -30,6 +31,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; +import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.StringUtil; @XmlRootElement @@ -62,16 +64,12 @@ public class Volume extends Entity { private static final String[] STATUS_STR = new String[] { "Online", "Offline" }; private static final String[] NAS_PROTOCOL_STR = new String[] { "Gluster", "NFS" }; - private Cluster cluster; private VOLUME_TYPE volumeType; private TRANSPORT_TYPE transportType; private VOLUME_STATUS status; private int replicaCount; private int stripeCount; private VolumeOptions options = new VolumeOptions(); - - private double totalDiskSpace = 0; - private List<String> disks = new ArrayList<String>(); private List<Brick> bricks = new ArrayList<Brick>(); public Volume() { @@ -105,10 +103,6 @@ public class Volume extends Entity { return STATUS_STR[getStatus().ordinal()]; } - public int getNumOfDisks() { - return disks.size(); - } - public int getNumOfBricks() { return bricks.size(); } @@ -164,15 +158,6 @@ public class Volume extends Entity { this.status = status; } - @XmlTransient - public Cluster getCluster() { - return cluster; - } - - public void setCluster(Cluster cluster) { - this.cluster = cluster; - } - @XmlElementWrapper(name = "nasProtocols") @XmlElement(name = "nasProtocol", type=NAS_PROTOCOL.class) public Set<NAS_PROTOCOL> getNASProtocols() { @@ -214,38 +199,11 @@ public class Volume extends Entity { this.options.setOptionsMap(options); } - public double getTotalDiskSpace() { - return totalDiskSpace; - } - - public List<String> getDisks() { - return disks; - } - - public void addDisk(String disk) { - disks.add(disk); - } - - public void addDisks(List<String> disks) { - for (String disk : disks) { - addDisk(disk); - } - } - - public void removeDisk(String disk) { - disks.remove(disk); - } - - public void removeAllDisks() { - disks.clear(); - totalDiskSpace = 0; - } - public void addBrick(Brick brick) { bricks.add(brick); } - public void addBricks(List<Brick> bricks) { + public void addBricks(Collection<Brick> bricks) { this.bricks.addAll(bricks); } @@ -264,11 +222,6 @@ public class Volume extends Entity { return bricks; } - public void setDisks(List<String> disks) { - removeAllDisks(); - addDisks(disks); - } - public void enableNFS() { nasProtocols.add(NAS_PROTOCOL.NFS); } @@ -284,13 +237,6 @@ public class Volume extends Entity { setStatus(status); } - public Volume(String name, Entity parent, Cluster cluster, VOLUME_TYPE volumeType, TRANSPORT_TYPE transportType, - VOLUME_STATUS status) { - this(name, parent, volumeType, transportType, status); - - setCluster(cluster); - } - /** * Filter matches if any of the properties name, volume type, transport type, status and number of disks contains * the filter string @@ -298,7 +244,7 @@ public class Volume extends Entity { @Override public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getVolumeTypeStr() + getTransportTypeStr() + getStatusStr() - + getNumOfDisks(), filterString, caseSensitive); + + getNumOfBricks(), filterString, caseSensitive); } public List<String> getBrickDirectories() { @@ -308,4 +254,51 @@ public class Volume extends Entity { } return brickDirectories; } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Volume)) { + return false; + } + + Volume volume = (Volume)obj; + + if (!(getName().equals(volume.getName()) && getVolumeType() == volume.getVolumeType() + && getTransportType() == volume.getTransportType() && getStatus() == volume.getStatus() + && getReplicaCount() == volume.getReplicaCount() && getStripeCount() == volume.getStripeCount()) + && getOptions().equals(volume.getOptions())) { + return false; + } + + for(NAS_PROTOCOL nasProtocol : getNASProtocols()) { + if(!(volume.getNASProtocols().contains(nasProtocol))) { + return false; + } + } + + for (Brick brick : getBricks()) { + if (!(brick.equals(GlusterCoreUtil.getEntity(volume.getBricks(), brick.getName(), false)))) { + return false; + } + } + + return true; + } + + /** + * Note: this method doesn't copy the bricks. Clients should write separate code to identify added/removed/modified + * bricks and update the volume bricks appropriately. + * + * @param newVolume + */ + public void copyFrom(Volume newVolume) { + setName(newVolume.getName()); + setVolumeType(newVolume.getVolumeType()); + setTransportType(newVolume.getTransportType()); + setStatus(newVolume.getStatus()); + setReplicaCount(newVolume.getReplicaCount()); + setStripeCount(newVolume.getStripeCount()); + setNASProtocols(newVolume.getNASProtocols()); + getOptions().copyFrom(newVolume.getOptions()); + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java index f16dd809..f928c241 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/model/VolumeOptions.java @@ -86,4 +86,30 @@ public class VolumeOptions { public boolean containsKey(String key) { return optionsMap.containsKey(key); } -} + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof VolumeOptions)) { + return false; + } + + VolumeOptions options = (VolumeOptions)obj; + if(getOptions().size() != options.size()) { + return false; + } + + for(VolumeOption option : getOptions()) { + if(!(option.getValue().equals(options.get(option.getKey())))) { + return false; + } + } + + return true; + } + + public void copyFrom(VolumeOptions options) { + for(Entry<String, String> entry : options.entrySet()) { + optionsMap.put(entry.getKey(), entry.getValue()); + } + } +}
\ No newline at end of file diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java index 0ab27c35..ba1c4f9f 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/response/TaskInfoListResponse.java @@ -20,6 +20,7 @@ */ package com.gluster.storage.management.core.response; +import java.util.ArrayList; import java.util.List; import javax.xml.bind.annotation.XmlElement; @@ -29,7 +30,7 @@ import com.gluster.storage.management.core.model.TaskInfo; @XmlRootElement(name = "tasks") public class TaskInfoListResponse { - private List<TaskInfo> taskInfoList; + private List<TaskInfo> taskInfoList = new ArrayList<TaskInfo>(); public TaskInfoListResponse() { diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java index 76a7fbfc..838612be 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/utils/GlusterCoreUtil.java @@ -21,7 +21,10 @@ package com.gluster.storage.management.core.utils; import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import com.gluster.storage.management.core.model.Brick; @@ -48,6 +51,25 @@ public class GlusterCoreUtil { } /** + * Compares the two entity lists and returns the list of entities from first list that have been modified in the second + * + * @param oldEntities + * @param newEntities + * @return List of entities that have been modified + */ + public static <T extends Entity> Map<T, T> getModifiedEntities(List<T> oldEntities, List<T> newEntities) { + Map<T, T> modifiedEntities = new HashMap<T, T>(); + for (T oldEntity : oldEntities) { + T newEntity = getEntity(newEntities, oldEntity.getName(), false); + if(newEntity != null && !oldEntity.equals(newEntity)) { + // old and new entities differ. mark it as modified. + modifiedEntities.put(oldEntity, newEntity); + } + } + return modifiedEntities; + } + + /** * Compares the two entity lists and returns the list of entities present only in the second argument * <code>newEntities</code> * @@ -56,10 +78,11 @@ public class GlusterCoreUtil { * @param caseInsensitive If true, the entity name comparison will be done in case insensitive manner * @return List of entities that are present only in the second argument <code>newEntities</code> */ - public static <T extends Entity> List<T> getAddedEntities(List<T> oldEntities, List<T> newEntities, boolean caseInsensitive) { - List<T> addedEntities = new ArrayList<T>(); - for(T newEntity : newEntities) { - if(!containsEntity(oldEntities, newEntity, caseInsensitive)) { + public static <T extends Entity> Set<T> getAddedEntities(List<T> oldEntities, List<T> newEntities, + boolean caseInsensitive) { + Set<T> addedEntities = new HashSet<T>(); + for (T newEntity : newEntities) { + if (!containsEntity(oldEntities, newEntity, caseInsensitive)) { // old entity list doesn't contain this entity. mark it as new. addedEntities.add(newEntity); } @@ -67,22 +90,26 @@ public class GlusterCoreUtil { return addedEntities; } - public static <T extends Entity> boolean containsEntity(List<T> entityList, Entity searchEntity, boolean caseInsensitive) { - String searchEntityName = searchEntity.getName(); - if(caseInsensitive) { + public static <T extends Entity> boolean containsEntity(List<T> entityList, Entity searchEntity, + boolean caseInsensitive) { + return getEntity(entityList, searchEntity.getName(), caseInsensitive) != null; + } + + public static <T extends Entity> T getEntity(List<T> entityList, String searchEntityName, boolean caseInsensitive) { + if (caseInsensitive) { searchEntityName = searchEntityName.toUpperCase(); } - - for(T entity : entityList) { + + for (T entity : entityList) { String nextEntityName = entity.getName(); - if(caseInsensitive) { + if (caseInsensitive) { nextEntityName = nextEntityName.toUpperCase(); } - if(nextEntityName.equals(searchEntityName)) { - return true; + if (nextEntityName.equals(searchEntityName)) { + return entity; } } - - return false; + + return null; } } diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml index 5b18421f..b0dfa9a9 100644 --- a/src/com.gluster.storage.management.gui/plugin.xml +++ b/src/com.gluster.storage.management.gui/plugin.xml @@ -476,7 +476,7 @@ visible="false"> <action allowLabelUpdate="false" - class="com.gluster.storage.management.gui.actions.MigrateDiskAction" + class="com.gluster.storage.management.gui.actions.MigrateBrickAction" definitionId="com.gluster.storage.management.gui.commands.MigrateDisk" icon="icons/disk-migrate.png" id="com.gluster.storage.management.gui.actions.MigrateDiskAction" @@ -593,7 +593,7 @@ </action> <action allowLabelUpdate="false" - class="com.gluster.storage.management.gui.actions.RemoveDiskAction" + class="com.gluster.storage.management.gui.actions.RemoveBrickAction" definitionId="com.gluster.storage.management.gui.commands.RemoveDisk" icon="icons/disk.png" id="com.gluster.storage.management.gui.actions.RemoveDiskAction" @@ -609,7 +609,7 @@ </action> <action allowLabelUpdate="false" - class="com.gluster.storage.management.gui.actions.AddDiskAction" + class="com.gluster.storage.management.gui.actions.AddBrickAction" definitionId="com.gluster.storage.management.gui.commands.AddDisk" icon="icons/disk.png" id="com.gluster.storage.management.gui.actions.AddDiskAction" @@ -659,7 +659,7 @@ definitionId="com.gluster.storage.management.gui.commands.Commit" icon="icons/stop.png" id="com.gluster.storage.management.gui.actions.Commit" - label="&Commit TaskTask" + label="&Commit Task" menubarPath="com.gluster.storage.management.gui.menu.cluster/cluster" mode="FORCE_TEXT" pulldown="false" @@ -1206,7 +1206,7 @@ objectClass="com.gluster.storage.management.core.model.Volume"> <action allowLabelUpdate="false" - class="com.gluster.storage.management.gui.actions.MigrateDiskAction" + class="com.gluster.storage.management.gui.actions.MigrateBrickAction" definitionId="com.gluster.storage.management.gui.commands.MigrateDisk" enablesFor="1" icon="icons/disk-migrate.png" diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/VolumeOptionsTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/VolumeOptionsTableLabelProvider.java index 007c7adb..cd85d22b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/VolumeOptionsTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/VolumeOptionsTableLabelProvider.java @@ -20,19 +20,16 @@ package com.gluster.storage.management.gui; import java.util.Map.Entry; -import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.pages.VolumeOptionsPage.OPTIONS_TABLE_COLUMN_INDICES; public class VolumeOptionsTableLabelProvider extends TableLabelProviderAdapter { - private GUIHelper guiHelper = GUIHelper.getInstance(); - @Override public String getColumnText(Object element, int columnIndex) { if (!(element instanceof Entry)) { return null; } - Entry<String, String> entry = (Entry) element; + Entry<String, String> entry = (Entry<String, String>) element; String key = entry.getKey(); String value = entry.getValue(); return (columnIndex == OPTIONS_TABLE_COLUMN_INDICES.OPTION_KEY.ordinal() ? key diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java index 859d76db..6498d902 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AbstractActionDelegate.java @@ -18,8 +18,6 @@ *******************************************************************************/ package com.gluster.storage.management.gui.actions; -import java.util.Set; - import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; @@ -31,13 +29,13 @@ import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.internal.UIPlugin; import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.gui.utils.GUIHelper; /** * All action delegates in the application should extend from this class. It provides common functionality of grabbing * the Window object on initialization and extracting the selected entity in case of selection change on the navigation * tree. */ +@SuppressWarnings("restriction") public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDelegate { protected IWorkbenchWindow window; @@ -56,7 +54,7 @@ public abstract class AbstractActionDelegate implements IWorkbenchWindowActionDe }); } - abstract protected void performAction(IAction action); + abstract protected void performAction(final IAction action); @Override public void selectionChanged(IAction action, ISelection selection) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java index cc57c541..e86164ec 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddDiskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddBrickAction.java @@ -1,5 +1,5 @@ /** - * AddDiskAction.java + * AddBrickAction.java * * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. @@ -24,53 +24,33 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardDialog; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.gui.dialogs.AddDiskWizard; +import com.gluster.storage.management.gui.dialogs.AddBrickWizard; -public class AddDiskAction extends AbstractActionDelegate { +public class AddBrickAction extends AbstractActionDelegate { private Volume volume; private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); - /* (non-Javadoc) - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() - */ @Override public void dispose() { window = null; } - /* (non-Javadoc) - * @see com.gluster.storage.management.gui.actions.AbstractActionDelegate#performAction(org.eclipse.jface.action.IAction) - */ @Override protected void performAction(IAction action) { - //TODO: open a dialog box - // MessageDialog.openInformation(getShell(), "Action captured", action.getDescription() + "\n" + volume.getName()); - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - AddDiskWizard wizard = new AddDiskWizard(volume); // Also add single page - - WizardDialog dialog = new WizardDialog(getShell(), wizard); - dialog.create(); - dialog.getShell().setSize(1024, 600); - dialog.open(); - } - }); + // TODO: open a dialog box + // MessageDialog.openInformation(getShell(), "Action captured", action.getDescription() + "\n" + + // volume.getName()); + AddBrickWizard wizard = new AddBrickWizard(volume); // Also add single page + + WizardDialog dialog = new WizardDialog(getShell(), wizard); + dialog.create(); + dialog.getShell().setSize(1024, 600); + dialog.open(); } - - /* - * (non-Javadoc) - * - * @see - * com.gluster.storage.management.gui.actions.AbstractActionDelegate#selectionChanged(org.eclipse.jface.action.IAction - * , org.eclipse.jface.viewers.ISelection) - */ @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java index 18731632..81661942 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java @@ -30,8 +30,6 @@ import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.response.GlusterServerResponse; import com.gluster.storage.management.gui.utils.GUIHelper; public class AddServerAction extends AbstractActionDelegate { @@ -52,36 +50,23 @@ public class AddServerAction extends AbstractActionDelegate { String partErrMsg = ""; for (Server server : selectedServers) { guiHelper.setStatusMessage("Adding server [" + server.getName() + "]..."); - + try { glusterServersClient.addServer(server); modelManager.addGlusterServer(glusterServersClient.getGlusterServer(server.getName())); successServers.add(server); - } catch(Exception e) { + } catch (Exception e) { // TODO: Handle error conditions } - -// Status status = response.getStatus(); -// if (status.isSuccess()) { -// modelManager.removeDiscoveredServer(server); -// modelManager.addGlusterServer(response.getGlusterServer()); -// successServers.add(server); -// } else if (status.isPartSuccess()) { -// modelManager.removeDiscoveredServer(server); -// modelManager.addGlusterServer(response.getGlusterServer()); -// partSuccessServers.add(server); -// partErrMsg += "[" + server.getName() + "] : " + status; -// } else { -// errMsg += "[" + server.getName() + "] : " + status; -// } } guiHelper.clearStatusMessage(); - showStatusMessage(action.getDescription(), selectedServers, successServers, partSuccessServers, errMsg, partErrMsg); + showStatusMessage(action.getDescription(), selectedServers, successServers, partSuccessServers, errMsg, + partErrMsg); } }; - - BusyIndicator.showWhile(Display.getDefault(), new Runnable() { + + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { @Override public void run() { Display.getDefault().asyncExec(addServerThread); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java index f1eb8a94..6fff4f44 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ClearTaskAction.java @@ -2,7 +2,6 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; @@ -15,23 +14,15 @@ public class ClearTaskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - - try { - new TasksClient().resumeTask(taskInfo.getName()); - // TODO Update taskInfo in the model - // modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - modelManager.removeTask(taskInfo); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Task [" + taskInfo.getName() + "] could not be cleared! Error: [" + e.getMessage() + "]"); - } - } - }); + final String actionDesc = action.getDescription(); + + try { + new TasksClient().resumeTask(taskInfo.getName()); + modelManager.removeTask(taskInfo); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getName() + "] could not be cleared! Error: [" + e.getMessage() + "]"); + } } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java index 9655b2b3..86e3032e 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CommitTaskAction.java @@ -2,13 +2,14 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; +import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.core.model.Volume; public class CommitTaskAction extends AbstractActionDelegate { private TaskInfo taskInfo; @@ -16,23 +17,20 @@ public class CommitTaskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - - try { - new TasksClient().commitTask(taskInfo.getName()); - taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, taskInfo.getName() - + " is commited"))); - modelManager.updateTask(taskInfo); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Task [" + taskInfo.getName() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); - } - } - }); + final String actionDesc = action.getDescription(); + try { + new TasksClient().commitTask(taskInfo.getName()); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, "Committed"))); + modelManager.removeTask(taskInfo); + Volume volume = (new VolumesClient()).getVolume(taskInfo.getReference()); + modelManager.updateVolumeBricks(modelManager.getModel().getCluster().getVolume(taskInfo.getReference()), + volume.getBricks()); + + showInfoDialog(actionDesc, "Commit successful"); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getName() + "] could not be Committed! Error: [" + e.getMessage() + "]"); + } } @Override @@ -41,7 +39,7 @@ public class CommitTaskAction extends AbstractActionDelegate { action.setEnabled(false); if (selectedEntity instanceof TaskInfo) { taskInfo = (TaskInfo) selectedEntity; - action.setEnabled(taskInfo.canCommit() + action.setEnabled(taskInfo.getCommitSupported() && taskInfo.getStatus().getCode() == Status.STATUS_CODE_COMMIT_PENDING); } } @@ -50,5 +48,4 @@ public class CommitTaskAction extends AbstractActionDelegate { public void dispose() { } - } 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 1b412617..2cfa0916 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 @@ -33,27 +33,21 @@ import com.gluster.storage.management.gui.dialogs.CreateVolumeWizard; public class CreateVolumeAction extends AbstractActionDelegate { @Override protected void performAction(IAction action) { - Display.getDefault().asyncExec(new Runnable() { - + CreateVolumeWizard wizard = new CreateVolumeWizard(); + + WizardDialog dialog = new WizardDialog(getShell(), wizard) { @Override - public void run() { - CreateVolumeWizard wizard = new CreateVolumeWizard(); - - WizardDialog dialog = new WizardDialog(getShell(), wizard) { - @Override - protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { - Button button = super.createButton(parent, id, label, defaultButton); - if(id == IDialogConstants.FINISH_ID) { - button.setText("&Create"); - } - return button; - } - }; - dialog.create(); - dialog.getShell().setSize(500, 550); - dialog.open(); + protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { + Button button = super.createButton(parent, id, label, defaultButton); + if (id == IDialogConstants.FINISH_ID) { + button.setText("&Create"); + } + return button; } - }); + }; + dialog.create(); + dialog.getShell().setSize(500, 550); + dialog.open(); } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java index eca8e789..0d61b21f 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DeleteVolumeAction.java @@ -21,11 +21,9 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; -import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.gui.IImageKeys; @@ -37,66 +35,57 @@ public class DeleteVolumeAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { + final String actionDesc = action.getDescription(); - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - - final String actionDesc = action.getDescription(); + String warningMessage; + if (volume.getStatus() == VOLUME_STATUS.OFFLINE) { + warningMessage = "Are you sure to delete the Volume[" + volume.getName() + "] ?"; + } else { + warningMessage = "Volume [" + volume.getName() + "] is online, \nAre you sure to continue?"; + } - String warningMessage; - if (volume.getStatus() == VOLUME_STATUS.OFFLINE) { - warningMessage = "Are you sure to delete the Volume[" + volume.getName() + "] ?"; - } else { - warningMessage = "Volume [" + volume.getName() + "] is online, \nAre you sure to continue?"; - } + Integer deleteOption = new MessageDialog(getShell(), "Delete Volume", GUIHelper.getInstance().getImage( + IImageKeys.VOLUME), warningMessage, MessageDialog.QUESTION, new String[] { "Cancel", + "Delete volume and data", "Delete volume, keep data" }, -1).open(); + if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) + return; + } - Integer deleteOption = new MessageDialog(getShell(), "Delete Volume", GUIHelper.getInstance().getImage( - IImageKeys.VOLUME), warningMessage, MessageDialog.QUESTION, new String[] { "Cancel", - "Delete volume and data", "Delete volume, keep data" }, -1).open(); - if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) - return; - } + VolumesClient client = new VolumesClient(); - VolumesClient client = new VolumesClient(); + if (volume.getStatus() == VOLUME_STATUS.ONLINE) { // To stop the volume service, if running + try { + client.stopVolume(volume.getName()); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Volume [" + volume.getName() + "] could not be stopped! Error: [" + e.getMessage() + "]"); + return; + } + } - Status status; - if (volume.getStatus() == VOLUME_STATUS.ONLINE) { // To stop the volume service, if running - try { - client.stopVolume(volume.getName()); - } catch(Exception e) { - showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] could not be stopped! Error: [" - + e.getMessage() + "]"); - return; - } - } + boolean confirmDelete = false; + if (deleteOption == 1) { + confirmDelete = true; + } - boolean confirmDelete = false; - if (deleteOption == 1) { - confirmDelete = true; - } + try { + client.deleteVolume(volume, confirmDelete); + showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] deleted successfully!"); + modelManager.deleteVolume(volume); + } catch (Exception e) { + showErrorDialog(actionDesc, e.getMessage()); - try { - client.deleteVolume(volume, confirmDelete); - showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] deleted successfully!"); - modelManager.deleteVolume(volume); - } catch(Exception e) { - showErrorDialog(actionDesc, e.getMessage()); - - // there is a possibility that the error was in post-delete operation, which means - // volume was deleted, but some other error happened. check if this is the case, - // and if so, update the model manager - if(client.volumeExists(volume.getName())) { - showErrorDialog(actionDesc, "Volume [" + volume.getName() + "] could not be deleted! Error: [" - + e.getMessage() + "]"); - } else { - modelManager.deleteVolume(volume); - showWarningDialog(actionDesc, "Volume deleted, but following error(s) occured: " + e.getMessage()); - } - } + // there is a possibility that the error was in post-delete operation, which means + // volume was deleted, but some other error happened. check if this is the case, + // and if so, update the model manager + if (client.volumeExists(volume.getName())) { + showErrorDialog(actionDesc, + "Volume [" + volume.getName() + "] could not be deleted! Error: [" + e.getMessage() + "]"); + } else { + modelManager.deleteVolume(volume); + showWarningDialog(actionDesc, "Volume deleted, but following error(s) occured: " + e.getMessage()); } - }); + } } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DownloadVolumeLogsAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DownloadVolumeLogsAction.java index d7f68646..226e4d00 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DownloadVolumeLogsAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/DownloadVolumeLogsAction.java @@ -34,20 +34,13 @@ import com.gluster.storage.management.gui.utils.GUIHelper; public class DownloadVolumeLogsAction extends AbstractActionDelegate { private GUIHelper guiHelper = GUIHelper.getInstance(); - /* (non-Javadoc) - * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() - */ @Override public void dispose() { } - /* (non-Javadoc) - * @see com.gluster.storage.management.gui.actions.AbstractActionDelegate#performAction(org.eclipse.jface.action.IAction) - */ @Override protected void performAction(IAction action) { final VolumesClient client = new VolumesClient(); - final Runnable downloadLogsThread = new Runnable() { @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateBrickAction.java index 56ea8179..41770d98 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateDiskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/MigrateBrickAction.java @@ -26,16 +26,16 @@ import org.eclipse.jface.wizard.WizardDialog; import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.gui.dialogs.MigrateDiskWizard; +import com.gluster.storage.management.gui.dialogs.MigrateBrickWizard; import com.gluster.storage.management.gui.utils.GUIHelper; -public class MigrateDiskAction extends AbstractActionDelegate { +public class MigrateBrickAction extends AbstractActionDelegate { private Volume volume; private Brick brick; @Override protected void performAction(IAction action) { - MigrateDiskWizard wizard = new MigrateDiskWizard(volume, brick); + MigrateBrickWizard wizard = new MigrateBrickWizard(volume, brick); WizardDialog dialog = new WizardDialog(window.getShell(), wizard); dialog.create(); @@ -61,7 +61,5 @@ public class MigrateDiskAction extends AbstractActionDelegate { @Override public void dispose() { - // TODO Auto-generated method stub - } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java index b36b7855..e3a4b835 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/PauseTaskAction.java @@ -22,7 +22,6 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; @@ -37,33 +36,25 @@ public class PauseTaskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); + final String actionDesc = action.getDescription(); - try { - new TasksClient().pauseTask(taskInfo.getName()); - taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_PAUSE, taskInfo.getName() - + " is Paused"))); - modelManager.updateTask(taskInfo); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Task [" + taskInfo.getName() + "] could not be Paused! Error: [" + e.getMessage() + "]"); - } - } - }); + try { + new TasksClient().pauseTask(taskInfo.getName()); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_PAUSE, "Paused"))); + modelManager.updateTask(taskInfo); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getDescription() + "] could not be Paused! Error: [" + e.getMessage() + "]"); + } } - - + @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); action.setEnabled(false); if (selectedEntity instanceof TaskInfo) { taskInfo = (TaskInfo) selectedEntity; - action.setEnabled(taskInfo.canPause() && taskInfo.getStatus().getCode() == Status.STATUS_CODE_RUNNING); + action.setEnabled(taskInfo.getPauseSupported() && taskInfo.getStatus().getCode() == Status.STATUS_CODE_RUNNING); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java index 33ca0e5b..a203dfb4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RebalanceVolumeAction.java @@ -20,7 +20,6 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Volume; @@ -30,22 +29,15 @@ public class RebalanceVolumeAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { + final String actionDesc = action.getDescription(); + try { + new VolumesClient().rebalanceStart(volume.getName(), false, false, false); + showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] rebalance started successfully!"); + } catch (Exception e) { + showErrorDialog(actionDesc, "Volume rebalance could not be started on [" + volume.getName() + "]! Error: [" + + e.getMessage() + "]"); + } - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - try { - new VolumesClient().rebalanceStart(volume.getName(), false, false, false); - showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] rebalance started successfully!"); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Volume rebalance could not be started on [" + volume.getName() + "]! Error: [" + e.getMessage() + "]"); - } - - } - }); } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java index b79a4ee4..f7d1207c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveDiskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java @@ -1,14 +1,12 @@ package com.gluster.storage.management.gui.actions; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IWorkbenchPart; @@ -16,15 +14,13 @@ import org.eclipse.ui.IWorkbenchPart; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; -import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.utils.StringUtil; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; import com.gluster.storage.management.gui.views.VolumeBricksView; -public class RemoveDiskAction extends AbstractActionDelegate { +public class RemoveBrickAction extends AbstractActionDelegate { private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); private GUIHelper guiHelper = GUIHelper.getInstance(); private Set<Brick> bricks; @@ -33,48 +29,34 @@ public class RemoveDiskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { + final String actionDesc = action.getDescription(); + List<String> brickList = getBrickList(bricks); + Integer deleteOption = new MessageDialog(getShell(), "Remove Bricks(s)", GUIHelper.getInstance().getImage( + IImageKeys.VOLUME), "Are you sure you want to remove following bricks from volume [" + volume.getName() + + "] ? \n" + StringUtil.collectionToString(brickList, ", "), MessageDialog.QUESTION, new String[] { + "Cancel", "Remove bricks, delete data", "Remove bricks, keep data" }, -1).open(); + if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) + return; + } - @Override + if (deleteOption == 1) { + confirmDelete = true; + } + BusyIndicator.showWhile(Display.getDefault(), new Runnable() { public void run() { + VolumesClient client = new VolumesClient(); + try { + client.removeBricks(volume.getName(), bricks, confirmDelete); + // Update model with removed bricks in the volume + modelManager.removeBricks(volume, bricks); - final String actionDesc = action.getDescription(); - List<String> brickList = getBrickList(bricks); - Integer deleteOption = new MessageDialog(getShell(), "Remove Bricks(s)", GUIHelper.getInstance() - .getImage(IImageKeys.VOLUME), "Are you sure you want to remove following bricks from volume [" - + volume.getName() + "] ? \n" + StringUtil.collectionToString(brickList, ", "), - MessageDialog.QUESTION, new String[] { "Cancel", "Remove bricks, delete data", - "Remove bricks, keep data" }, -1).open(); - if (deleteOption <= 0) { // By Cancel button(0) or Escape key(-1) - return; - } - - if (deleteOption == 1) { - confirmDelete = true; + showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] bricks(s) removed successfully!"); + } catch (Exception e) { + showErrorDialog(actionDesc, "Volume [" + volume.getName() + + "] bricks(s) could not be removed! Error: [" + e.getMessage() + "]"); } - BusyIndicator.showWhile(Display.getDefault(), new Runnable() { - public void run() { - VolumesClient client = new VolumesClient(); - try { - client.removeBricks(volume.getName(), bricks, confirmDelete); - // Remove the bricks from the volume object - for (Brick brick : bricks) { - volume.removeBrick(brick); - } - // Update model with removed bricks in the volume - modelManager.removeBricks(volume, bricks); - - showInfoDialog(actionDesc, "Volume [" + volume.getName() - + "] bricks(s) removed successfully!"); - } catch (Exception e) { - showErrorDialog(actionDesc, "Volume [" + volume.getName() - + "] bricks(s) could not be removed! Error: [" + e.getMessage() + "]"); - } - } - }); } }); - } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java index 911c57a8..4862b7b1 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java @@ -29,16 +29,12 @@ import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.PlatformUI; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.GlusterServersClient; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.NavigationView; public class RemoveServerAction extends AbstractActionDelegate { private GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java index fc80b04d..d8f1b955 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/ResumeTaskAction.java @@ -2,7 +2,6 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.TasksClient; @@ -16,23 +15,16 @@ public class ResumeTaskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - - try { - new TasksClient().resumeTask(taskInfo.getName()); - taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, taskInfo.getName() - + " is Resumed"))); - modelManager.updateTask(taskInfo); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Task [" + taskInfo.getName() + "] could not be Resumed! Error: [" + e.getMessage() + "]"); - } - } - }); + final String actionDesc = action.getDescription(); + + try { + new TasksClient().resumeTask(taskInfo.getName()); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, "Resumed"))); + modelManager.updateTask(taskInfo); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getDescription() + "] could not be Resumed! Error: [" + e.getMessage() + "]"); + } } @Override @@ -47,9 +39,7 @@ public class ResumeTaskAction extends AbstractActionDelegate { @Override public void dispose() { - } - } 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 c259c661..322a87f9 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 @@ -53,13 +53,6 @@ public class StartVolumeAction extends AbstractActionDelegate { } - /* - * (non-Javadoc) - * - * @see - * com.gluster.storage.management.gui.actions.AbstractActionDelegate#selectionChanged(org.eclipse.jface.action.IAction - * , org.eclipse.jface.viewers.ISelection) - */ @Override public void selectionChanged(IAction action, ISelection selection) { super.selectionChanged(action, selection); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java index abde4e57..12d14b43 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopTaskAction.java @@ -16,22 +16,16 @@ public class StopTaskAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - - try { - new TasksClient().resumeTask(taskInfo.getName()); - taskInfo.setStatus( new TaskStatus( new Status(Status.STATUS_CODE_SUCCESS, taskInfo.getName() + " is Stopped"))); - modelManager.updateTask(taskInfo); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Task [" + taskInfo.getName() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); - } - } - }); + final String actionDesc = action.getDescription(); + + try { + new TasksClient().resumeTask(taskInfo.getName()); + taskInfo.setStatus(new TaskStatus(new Status(Status.STATUS_CODE_SUCCESS, "Stopped"))); + modelManager.updateTask(taskInfo); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Task [" + taskInfo.getDescription() + "] could not be Stopped! Error: [" + e.getMessage() + "]"); + } } @Override @@ -40,7 +34,7 @@ public class StopTaskAction extends AbstractActionDelegate { action.setEnabled(false); if (selectedEntity instanceof TaskInfo) { taskInfo = (TaskInfo) selectedEntity; - action.setEnabled(taskInfo.canStop() + action.setEnabled(taskInfo.getStopSupported() && (taskInfo.getStatus().getCode() == Status.STATUS_CODE_PAUSE || taskInfo.getStatus().getCode() == Status.STATUS_CODE_RUNNING)); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java index d4e3d363..62c690e2 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/StopVolumeAction.java @@ -21,7 +21,6 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; -import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; @@ -36,34 +35,28 @@ public class StopVolumeAction extends AbstractActionDelegate { @Override protected void performAction(final IAction action) { - Display.getDefault().asyncExec(new Runnable() { - - @Override - public void run() { - final String actionDesc = action.getDescription(); - if (volume.getStatus() == VOLUME_STATUS.OFFLINE) { - showWarningDialog(actionDesc, "Volume [" + volume.getName() + "] is already offline!"); - return; // Volume already offline. Don't do anything. - } + final String actionDesc = action.getDescription(); + if (volume.getStatus() == VOLUME_STATUS.OFFLINE) { + showWarningDialog(actionDesc, "Volume [" + volume.getName() + "] is already offline!"); + return; // Volume already offline. Don't do anything. + } - Integer deleteOption = new MessageDialog(getShell(), "Stop Volume", GUIHelper.getInstance().getImage( - IImageKeys.VOLUME), "Are you sure you want to stop the volume [" + volume.getName() + "] ?", - MessageDialog.QUESTION, new String[] { "No", "Yes" }, -1).open(); + Integer deleteOption = new MessageDialog(getShell(), "Stop Volume", GUIHelper.getInstance().getImage( + IImageKeys.VOLUME), "Are you sure you want to stop the volume [" + volume.getName() + "] ?", + MessageDialog.QUESTION, new String[] { "No", "Yes" }, -1).open(); - if (deleteOption <= 0) { - return; - } + if (deleteOption <= 0) { + return; + } - try { - new VolumesClient().stopVolume(volume.getName()); - showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] stopped successfully!"); - modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); - } catch (Exception e) { - showErrorDialog(actionDesc, - "Volume [" + volume.getName() + "] could not be stopped! Error: [" + e.getMessage() + "]"); - } - } - }); + try { + new VolumesClient().stopVolume(volume.getName()); + showInfoDialog(actionDesc, "Volume [" + volume.getName() + "] stopped successfully!"); + modelManager.updateVolumeStatus(volume, VOLUME_STATUS.OFFLINE); + } catch (Exception e) { + showErrorDialog(actionDesc, + "Volume [" + volume.getName() + "] could not be stopped! Error: [" + e.getMessage() + "]"); + } } @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java index 48a46c84..bd36ff7c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java @@ -21,7 +21,9 @@ package com.gluster.storage.management.gui.dialogs; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; @@ -39,7 +41,7 @@ import com.richclientgui.toolbox.duallists.IRemovableContentProvider; * @author root * */ -public class AddDiskPage extends WizardPage { +public class AddBrickPage extends WizardPage { private List<Disk> availableDisks = new ArrayList<Disk>(); private List<Disk> selectedDisks = new ArrayList<Disk>(); private Volume volume = null; @@ -51,7 +53,7 @@ public class AddDiskPage extends WizardPage { /** * @param pageName */ - protected AddDiskPage(Volume volume) { + protected AddBrickPage(Volume volume) { super(PAGE_NAME); this.volume = volume; setTitle("Add Brick"); @@ -90,12 +92,11 @@ public class AddDiskPage extends WizardPage { return availableDisks; } - - public List<Disk> getChosenDisks( ) { - return page.getChosenDisks(); + public Set<Disk> getChosenDisks() { + return new HashSet<Disk>(page.getChosenDisks()); } - public List<Brick> getChosenBricks( String volumeName ) { + public Set<Brick> getChosenBricks( String volumeName ) { return page.getChosenBricks(volumeName); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java index bb55ece1..58255f8c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddDiskWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java @@ -20,8 +20,9 @@ */ package com.gluster.storage.management.gui.dialogs; -import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.wizard.Wizard; @@ -29,27 +30,24 @@ import org.eclipse.jface.wizard.Wizard; import com.gluster.storage.management.client.GlusterDataModelManager; import com.gluster.storage.management.client.VolumesClient; import com.gluster.storage.management.core.model.Brick; -import com.gluster.storage.management.core.model.Disk; -import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.StringUtil; /** * */ -public class AddDiskWizard extends Wizard { - private AddDiskPage page; +public class AddBrickWizard extends Wizard { + private AddBrickPage page; private Volume volume; - public AddDiskWizard(Volume volume) { + public AddBrickWizard(Volume volume) { setWindowTitle("Gluster Management Console - Add Brick"); setHelpAvailable(false); // TODO: Introduce wizard help this.volume = volume; } public void addPages() { - page = new AddDiskPage(volume); + page = new AddBrickPage(volume); addPage(page); } @@ -60,15 +58,12 @@ public class AddDiskWizard extends Wizard { */ @Override public boolean performFinish() { - List<Brick> bricks = page.getChosenBricks(volume.getName()); + Set<Brick> bricks = page.getChosenBricks(volume.getName()); VolumesClient volumeClient = new VolumesClient(); try { - List<String> brickList = getBrickList(bricks); + Set<String> brickList = getBrickList(bricks); volumeClient.addBricks(volume.getName(), brickList); - List<Disk> disks = page.getChosenDisks(); - volume.addDisks(GlusterCoreUtil.getQualifiedDiskNames(disks)); - volume.addBricks(bricks); // Update model with new bricks in the volume GlusterDataModelManager.getInstance().addBricks(volume, bricks); @@ -82,8 +77,8 @@ public class AddDiskWizard extends Wizard { } } - private List<String> getBrickList(List<Brick> bricks) { - List<String> brickList = new ArrayList<String>(); + private Set<String> getBrickList(Set<Brick> bricks) { + Set<String> brickList = new HashSet<String>(); for(Brick brick : bricks) { brickList.add(brick.getServerName() + ":" + brick.getBrickDirectory()); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java index fbfb52d1..db963b18 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/BricksSelectionPage.java @@ -19,7 +19,9 @@ package com.gluster.storage.management.gui.dialogs; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.swt.SWT; @@ -314,11 +316,11 @@ public class BricksSelectionPage extends Composite { return null; } - public List<Brick> getChosenBricks(String volumeName) { + public Set<Brick> getChosenBricks(String volumeName) { Object[] bricksArr = (Object[]) chosenBricksContentProvider.getElements(dualTableViewer); if (bricksArr != null) { - List<Brick> bricks = new ArrayList<Brick>(); + Set<Brick> bricks = new HashSet<Brick>(); for (Object disk : bricksArr) { bricks.add(new Brick(((Disk) disk).getServerName(), BRICK_STATUS.ONLINE, ((Disk) disk).getName(), ((Disk) disk).getMountPoint() + "/" + volumeName)); // Assumption mount point is not having diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java index 4533ca23..f7ce744f 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskPage1.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickPage1.java @@ -1,21 +1,24 @@ -/******************************************************************************* +/** + * MigrateBrickPage1.java + * * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> * This file is part of Gluster Management Console. * - * Gluster Management Console is free software; you can redistribute it and/or + * 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, + * + * 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 * <http://www.gnu.org/licenses/>. - *******************************************************************************/ + */ + package com.gluster.storage.management.gui.dialogs; import java.util.List; @@ -48,7 +51,7 @@ import com.gluster.storage.management.core.utils.NumberUtil; import com.gluster.storage.management.gui.TableLabelProviderAdapter; import com.gluster.storage.management.gui.utils.GUIHelper; -public class MigrateDiskPage1 extends WizardPage { +public class MigrateBrickPage1 extends WizardPage { private static final String PAGE_NAME = "migrate.disk.page.1"; private enum DISK_TABLE_COLUMN_INDICES { @@ -118,7 +121,7 @@ public class MigrateDiskPage1 extends WizardPage { /** * Create the wizard. */ - public MigrateDiskPage1(Volume volume, Brick brick) { + public MigrateBrickPage1(Volume volume, Brick brick) { super(PAGE_NAME); this.volume = volume; this.fromBrick = brick; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java index 2d65a869..4693726b 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateDiskWizard.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/MigrateBrickWizard.java @@ -30,12 +30,12 @@ import com.gluster.storage.management.core.model.Brick; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.Volume; -public class MigrateDiskWizard extends Wizard { +public class MigrateBrickWizard extends Wizard { private Volume volume; private Brick brick; - private MigrateDiskPage1 page; + private MigrateBrickPage1 page; - public MigrateDiskWizard(Volume volume, Brick brick) { + public MigrateBrickWizard(Volume volume, Brick brick) { setWindowTitle("Gluster Management Console - Migrate Brick [" + volume.getName() + "]"); this.volume = volume; this.brick = brick; @@ -44,7 +44,7 @@ public class MigrateDiskWizard extends Wizard { @Override public void addPages() { - page = new MigrateDiskPage1(volume, brick); + page = new MigrateBrickPage1(volume, brick); addPage(page); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java index a4152899..e010ed5c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/SelectDisksDialog.java @@ -18,8 +18,8 @@ *******************************************************************************/ package com.gluster.storage.management.gui.dialogs; -import java.util.ArrayList; import java.util.List; +import java.util.Set; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; @@ -112,7 +112,7 @@ public class SelectDisksDialog extends Dialog { return disksPage.getChosenDisks(); } - public List<Brick> getSelectedBricks(String volumeName) { + public Set<Brick> getSelectedBricks(String volumeName) { return disksPage.getChosenBricks(volumeName); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java index 458dcf61..8acb4a75 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java @@ -82,7 +82,7 @@ public class NavigationView extends ViewPart implements ISelectionListener { // Refresh the navigation tree whenever there is a change to the data model GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() { - public void clusterChanged() { + public void modelChanged() { treeViewer.refresh(); } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java index ce68e22f..8d48af76 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/TasksPage.java @@ -32,7 +32,10 @@ import org.eclipse.ui.IWorkbenchSite; 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.TaskInfo; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.core.model.Event.EVENT_TYPE; import com.gluster.storage.management.gui.TasksTableLabelProvider; public class TasksPage extends AbstractTableViewerPage<TaskInfo> { @@ -45,10 +48,9 @@ public class TasksPage extends AbstractTableViewerPage<TaskInfo> { private static final String[] TASK_TABLE_COLUMN_NAMES = new String[] { "Task", "Status"}; - @SuppressWarnings("unchecked") - public TasksPage(IWorkbenchSite site, Composite parent, int style, Object taskInfo) { + public TasksPage(IWorkbenchSite site, Composite parent, int style, List<TaskInfo> taskInfo) { super(site, parent, style, false, false, taskInfo); - this.taskInfoList = (List<TaskInfo>) taskInfo; + this.taskInfoList = taskInfo; } /* (non-Javadoc) @@ -67,10 +69,26 @@ public class TasksPage extends AbstractTableViewerPage<TaskInfo> { refreshViewer(); } + @Override + public void taskUpdated(TaskInfo taskInfo) { + refreshViewer(); + } + private void refreshViewer() { tableViewer.refresh(); parent.update(); } + + @Override + public void volumeChanged(Volume volume, Event event) { + super.volumeChanged(volume, event); + if (event.getEventType() == EVENT_TYPE.BRICK_REPLACED) { + if (!tableViewer.getControl().isDisposed()) { + tableViewer.refresh(); + } + } + } + }; } diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml b/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml index 4aaa3c9b..7c20d6c7 100644 --- a/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml @@ -30,12 +30,12 @@ <!-- Jersey REST servlet --> <servlet> - <servlet-name>gluster-resources</servlet-name> + <servlet-name>gluster-resources-1.0</servlet-name> <!-- servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class --> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> - <param-value>com.gluster.storage.management.server.resources</param-value> + <param-value>com.gluster.storage.management.server.resources.v1_0</param-value> </init-param> <init-param> <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name> @@ -44,8 +44,8 @@ <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> - <servlet-name>gluster-resources</servlet-name> - <url-pattern>/resources/*</url-pattern> + <servlet-name>gluster-resources-1.0</servlet-name> + <url-pattern>/1.0/*</url-pattern> </servlet-mapping> <!-- JNLP download servlet --> diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AbstractResource.java index feef8b3e..c28c0da0 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AbstractResource.java @@ -16,7 +16,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import java.net.URI; import java.util.ArrayList; @@ -158,17 +158,6 @@ public class AbstractResource { } /** - * Creates an OK response without any entity in the response body. - * - * @param mediaType - * Media type to be set on the response - * @return the {@link Response} object - */ - protected Response okResponse(String mediaType) { - return Response.ok().type(mediaType).build(); - } - - /** * Creates a streaming output response and sets the given streaming output in the response. Typically used for * "download" requests * diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AbstractServersResource.java index dd6e2804..8b4b6d99 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AbstractServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AbstractServersResource.java @@ -18,7 +18,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. */ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java index 3c70beec..91eeef1a 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/AlertsResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/AlertsResource.java @@ -1,4 +1,4 @@ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.*; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/ClustersResource.java index 4c834973..431de952 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/ClustersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/ClustersResource.java @@ -16,7 +16,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_CLUSTER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/DiscoveredServersResource.java index 283ab147..cb39746c 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/DiscoveredServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/DiscoveredServersResource.java @@ -16,7 +16,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_SERVER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.QUERY_PARAM_DETAILS; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java index a9ef7fbb..619e4f55 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/GlusterServersResource.java @@ -16,7 +16,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_SERVER_NAME; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; @@ -414,13 +414,14 @@ public class GlusterServersResource extends AbstractServersResource { return badRequestResponse("Disk name must not be empty!"); } - InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, diskName, serverName); + InitializeDiskTask initializeTask = new InitializeDiskTask(clusterService, clusterName, serverName, diskName); try { initializeTask.start(); taskResource.addTask(initializeTask); - return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS - + "/" + initializeTask.getId()); - } catch (ConnectionException e) { + + return acceptedResponse(RESTConstants.RESOURCE_PATH_CLUSTERS + "/" + clusterName + "/" + RESOURCE_TASKS + "/" + + initializeTask.getId()); + } catch (Exception e) { return errorResponse(e.getMessage()); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java index 53122f11..777565eb 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/TasksResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/TasksResource.java @@ -18,7 +18,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. */ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_OPERATION; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_CLUSTER_NAME; diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/UsersResource.java index 0ccb4263..1b5e8fad 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/UsersResource.java @@ -16,7 +16,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. *******************************************************************************/ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.PATH_PARAM_USER; import static com.gluster.storage.management.core.constants.RESTConstants.RESOURCE_PATH_USERS; @@ -30,12 +30,14 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.encoding.PasswordEncoder; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.provisioning.JdbcUserDetailsManager; import org.springframework.stereotype.Component; +import com.gluster.storage.management.core.model.Status; import com.sun.jersey.spi.resource.Singleton; @Singleton @@ -47,6 +49,8 @@ public class UsersResource extends AbstractResource { @Autowired private PasswordEncoder passwordEncoder; + + private static final Logger logger = Logger.getLogger(UsersResource.class); @Path("{" + PATH_PARAM_USER + "}") @GET @@ -67,8 +71,8 @@ public class UsersResource extends AbstractResource { } public Response getAuthenticationResponse(String user, String mediaType) { - return (SecurityContextHolder.getContext().getAuthentication().getName().equals(user) ? okResponse(mediaType) - : unauthorizedResponse()); + return (SecurityContextHolder.getContext().getAuthentication().getName().equals(user) ? okResponse( + Status.STATUS_SUCCESS, mediaType) : unauthorizedResponse()); } @Path("{" + PATH_PARAM_USER + "}") @@ -78,9 +82,9 @@ public class UsersResource extends AbstractResource { try { jdbcUserService.changePassword(oldPassword, passwordEncoder.encodePassword(newPassword, null)); } catch (Exception ex) { - // TODO: Log the exception - ex.printStackTrace(); - return errorResponse("Could not change password. Error: [" + ex.getMessage() + "]"); + String errMsg = "Could not change password. Error: [" + ex.getMessage() + "]"; + logger.error(errMsg, ex); + return errorResponse(errMsg); } return noContentResponse(); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/VolumesResource.java index d568d519..a09b7f08 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/VolumesResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/v1_0/VolumesResource.java @@ -18,7 +18,7 @@ * along with this program. If not, see * <http://www.gnu.org/licenses/>. */ -package com.gluster.storage.management.server.resources; +package com.gluster.storage.management.server.resources.v1_0; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_ACCESS_PROTOCOLS; import static com.gluster.storage.management.core.constants.RESTConstants.FORM_PARAM_AUTO_COMMIT; @@ -102,7 +102,7 @@ import com.gluster.storage.management.core.utils.ProcessUtil; import com.gluster.storage.management.server.constants.VolumeOptionsDefaults; import com.gluster.storage.management.server.data.ClusterInfo; import com.gluster.storage.management.server.services.ClusterService; -import com.gluster.storage.management.server.tasks.MigrateDiskTask; +import com.gluster.storage.management.server.tasks.MigrateBrickTask; import com.gluster.storage.management.server.tasks.RebalanceVolumeTask; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.ServerUtil; @@ -208,7 +208,7 @@ public class VolumesResource extends AbstractResource { } try { - createVolume(clusterName, volumeName, volumeType, transportType, replicaCount, stripeCount, bricks, accessProtocols, + performCreateVolume(clusterName, volumeName, volumeType, transportType, replicaCount, stripeCount, bricks, accessProtocols, options); return createdResponse(volumeName); } catch (Exception e) { @@ -956,7 +956,7 @@ public class VolumesResource extends AbstractResource { private String migrateBrickStart(String clusterName, String volumeName, String fromBrick, String toBrick, Boolean autoCommit) { - MigrateDiskTask migrateDiskTask = new MigrateDiskTask(clusterService, clusterName, volumeName, fromBrick, + MigrateBrickTask migrateDiskTask = new MigrateBrickTask(clusterService, clusterName, volumeName, fromBrick, toBrick); migrateDiskTask.setAutoCommit(autoCommit); migrateDiskTask.start(); @@ -978,7 +978,7 @@ public class VolumesResource extends AbstractResource { return rebalanceStart(clusterName, volumeName, layout); } - public String rebalanceStart(String clusterName, String volumeName, String layout) { + private String rebalanceStart(String clusterName, String volumeName, String layout) { RebalanceVolumeTask rebalanceTask = new RebalanceVolumeTask(clusterService, clusterName, volumeName); rebalanceTask.setLayout(layout); rebalanceTask.start(); diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java index 5f3f8e30..4592b759 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/InitializeDiskTask.java @@ -20,21 +20,26 @@ */ package com.gluster.storage.management.server.tasks; +import com.gluster.storage.management.core.exceptions.ConnectionException; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.model.TaskInfo; import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; +import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; +import com.sun.jersey.core.util.Base64; public class InitializeDiskTask extends Task { private static final String INITIALIZE_DISK_SCRIPT = "initialize_disk.py"; - private static final String INITIALIZE_DISK_STATUS_SCRIPT = "initialize_disk_status.py"; private String serverName; private String diskName; private SshUtil sshUtil = new SshUtil(); + private GlusterUtil glusterUtil; public InitializeDiskTask(ClusterService clusterService, String clusterName, String serverName, String diskName) { super(clusterService, clusterName, TASK_TYPE.DISK_FORMAT, diskName, "Initialize disk " + serverName + ":" @@ -50,22 +55,29 @@ public class InitializeDiskTask extends Task { @Override public String getId() { - return taskInfo.getType() + "-" + serverName + ":" + diskName; + return new String( + Base64.encode(getClusterName() + "-" + taskInfo.getType() + "-" + serverName + ":" + diskName)); } @Override public void resume() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not resume disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override public void stop() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not stop disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override public void pause() { - getTaskInfo().setStatus( new TaskStatus( new Status(Status.STATUS_CODE_FAILURE, "Can not suspend disk initialization"))); + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Stop/Pause/Resume is not supported in Disk Initialization"))); } @Override @@ -85,17 +97,37 @@ public class InitializeDiskTask extends Task { @Override public void start() { - getTaskInfo().setStatus( - new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_SCRIPT + " " - + getDiskName())))); + try { + startInitializeDisk(serverName); + } catch(ConnectionException e) { + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); + } + } + + private void startInitializeDisk(String serverName) { + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_SCRIPT + " " + getDiskName()); + if (processResult.isSuccess()) { + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; + } + + // if we reach here, it means Initialize disk start failed. + throw new GlusterRuntimeException(processResult.toString()); + } @Override public TaskStatus checkStatus() { - return new TaskStatus(new Status(sshUtil.executeRemote(getServerName(), INITIALIZE_DISK_STATUS_SCRIPT + " " - + getDiskName()))); + + try { + return glusterUtil.checkInitializeDiskStatus(serverName, getDiskName()); + } catch(ConnectionException e) { + // online server might have gone offline. update the failure status + return new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage())); + } } - + public void setDiskName(String diskName) { this.diskName = diskName; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java index 9bdc9c94..3961c427 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateDiskTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/MigrateBrickTask.java @@ -20,6 +20,10 @@ */ package com.gluster.storage.management.server.tasks; +import java.util.concurrent.ExecutionException; + +import org.apache.derby.iapi.sql.execute.ExecPreparedStatement; + import com.gluster.storage.management.core.exceptions.ConnectionException; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Status; @@ -28,14 +32,16 @@ import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; import com.sun.jersey.core.util.Base64; -public class MigrateDiskTask extends Task { +public class MigrateBrickTask extends Task { private String fromBrick; private String toBrick; private Boolean autoCommit; + private GlusterUtil glusterUtil = new GlusterUtil(); private SshUtil sshUtil = new SshUtil(); @@ -63,7 +69,8 @@ public class MigrateDiskTask extends Task { this.autoCommit = autoCommit; } - public MigrateDiskTask(ClusterService clusterService, String clusterName, String volumeName, String fromBrick, String toBrick) { + public MigrateBrickTask(ClusterService clusterService, String clusterName, String volumeName, String fromBrick, + String toBrick) { super(clusterService, clusterName, TASK_TYPE.BRICK_MIGRATE, volumeName, "Brick Migration on volume [" + volumeName + "] from [" + fromBrick + "] to [" + toBrick + "]", true, true, true); setFromBrick(fromBrick); @@ -71,80 +78,68 @@ public class MigrateDiskTask extends Task { taskInfo.setName(getId()); } - public MigrateDiskTask(ClusterService clusterService, String clusterName, TaskInfo info) { + public MigrateBrickTask(ClusterService clusterService, String clusterName, TaskInfo info) { super(clusterService, clusterName, info); } @Override public String getId() { - return new String( Base64.encode( taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + toBrick )); + return new String(Base64.encode(clusterName + "-" + taskInfo.getType() + "-" + taskInfo.getReference() + "-" + fromBrick + "-" + + toBrick)); } @Override public void start() { try { startMigration(getOnlineServer().getName()); - } catch(ConnectionException e) { + } catch (ConnectionException e) { // online server might have gone offline. try with a new one. startMigration(getNewOnlineServer().getName()); } } private void startMigration(String onlineServerName) { - String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " - + getToBrick() + " start"; - ProcessResult processResult = sshUtil.executeRemote(onlineServerName, command); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*started successfully$")) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput().trim()))); - return; - } + ProcessResult processResult = glusterUtil.executeBrickMigration(onlineServerName, getTaskInfo().getReference(), + getFromBrick(), getToBrick(), "start"); + if (processResult.getOutput().trim().matches(".*started successfully$")) { + getTaskInfo().setStatus( + new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput().trim()))); + return; } - - // if we come here, it means task couldn't be started successfully. - throw new GlusterRuntimeException(processResult.toString()); } @Override public void pause() { try { pauseMigration(getOnlineServer().getName()); - } catch(ConnectionException e) { + } catch (ConnectionException e) { // online server might have gone offline. try with a new one. pauseMigration(getNewOnlineServer().getName()); } } private void pauseMigration(String onlineServer) { - String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() - + " pause"; - - ProcessResult processResult = sshUtil.executeRemote(onlineServer, command); + ProcessResult processResult = glusterUtil.executeBrickMigration(onlineServer, taskInfo.getReference(), + getFromBrick(), getToBrick(), "pause"); TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().matches("*pause")) { //TODO replace correct pattern to identify the pause status - taskStatus.setCode(Status.STATUS_CODE_PAUSE); - taskStatus.setMessage(processResult.getOutput()); - getTaskInfo().setStatus(taskStatus); - return; - } - } - - // if we reach here, it means rebalance start failed. - throw new GlusterRuntimeException(processResult.toString()); + if (processResult.getOutput().trim().matches(".*paused successfully$")) { + taskStatus.setCode(Status.STATUS_CODE_PAUSE); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + return; + } } - - + @Override public void resume() { start(); } - + @Override public void commit() { try { commitMigration(getOnlineServer().getName()); - } catch(ConnectionException e) { + } catch (ConnectionException e) { // online server might have gone offline. try with a new one. commitMigration(getNewOnlineServer().getName()); } @@ -154,84 +149,74 @@ public class MigrateDiskTask extends Task { public void stop() { try { stopMigration(getOnlineServer().getName()); - } catch(ConnectionException e) { + } catch (ConnectionException e) { // online server might have gone offline. try with a new one. stopMigration(getNewOnlineServer().getName()); } } private void stopMigration(String serverName) { - String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " + getToBrick() - + " abort"; - - ProcessResult processResult = sshUtil.executeRemote(serverName, command); + ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, taskInfo.getReference(), getFromBrick(), + getToBrick(), "abort"); TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*aborted successfully$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - taskStatus.setMessage(processResult.getOutput()); - getTaskInfo().setStatus(taskStatus); - return; - } - } - - // if we reach here, it means rebalance start failed. - throw new GlusterRuntimeException(processResult.toString()); + if (processResult.getOutput().trim().matches(".*aborted successfully$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); + getTaskInfo().setStatus(taskStatus); + } } - @Override public TaskStatus checkStatus() { try { return checkMigrationStatus(getOnlineServer().getName()); - } catch(ConnectionException e) { + } catch (ConnectionException e) { // online server might have gone offline. try with a new one. return checkMigrationStatus(getNewOnlineServer().getName()); } } - - + public void commitMigration(String serverName) { - String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " - + getToBrick() + " commit"; - - ProcessResult processResult = sshUtil.executeRemote(serverName, command); + ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, getTaskInfo().getReference(), + getFromBrick(), getToBrick(), "commit"); TaskStatus taskStatus = new TaskStatus(); if (processResult.isSuccess()) { if (processResult.getOutput().trim().matches(".*commit successful$")) { taskStatus.setCode(Status.STATUS_CODE_SUCCESS); taskStatus.setMessage(processResult.getOutput()); // Common getTaskInfo().setStatus(taskStatus); - return; } } - - // if we reach here, it means rebalance start failed. - throw new GlusterRuntimeException(processResult.toString()); } - private TaskStatus checkMigrationStatus(String serverName) { - String command = "gluster volume replace-brick " + getTaskInfo().getReference() + " " + getFromBrick() + " " - + getToBrick() + " status"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); + if (getTaskInfo().getStatus().getCode() == Status.STATUS_CODE_PAUSE) { + return getTaskInfo().getStatus(); + } + TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { + try { + ProcessResult processResult = glusterUtil.executeBrickMigration(serverName, getTaskInfo().getReference(), + getFromBrick(), getToBrick(), "status"); if (processResult.getOutput().trim().matches("^Number of files migrated.*Migration complete$")) { taskStatus.setCode(Status.STATUS_CODE_COMMIT_PENDING); if (autoCommit) { commitMigration(serverName); + return getTaskInfo().getStatus(); // return the committed status + } else { + taskStatus.setMessage(processResult.getOutput().trim() + .replaceAll("Migration complete", "Commit pending")); } - } else if ( processResult.getOutput().trim().matches("^Number of files migrated.*Current file=.*")) { + } else if (processResult.getOutput().trim().matches("^Number of files migrated.*Current file=.*")) { taskStatus.setCode(Status.STATUS_CODE_RUNNING); } else { taskStatus.setCode(Status.STATUS_CODE_FAILURE); } - } else { + taskStatus.setMessage(processResult.getOutput()); + } catch (Exception e) { taskStatus.setCode(Status.STATUS_CODE_FAILURE); + taskStatus.setMessage(e.getMessage()); } - - taskStatus.setMessage(processResult.getOutput()); // common taskInfo.setStatus(taskStatus); // Update the task status return taskStatus; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java index 7f9fb6bf..f94613e0 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/RebalanceVolumeTask.java @@ -28,33 +28,40 @@ import com.gluster.storage.management.core.model.TaskInfo.TASK_TYPE; import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.services.ClusterService; +import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; +import com.sun.jersey.core.util.Base64; public class RebalanceVolumeTask extends Task { private String layout; + private String serverName; private SshUtil sshUtil = new SshUtil(); + private GlusterUtil glusterUtil = new GlusterUtil(); public RebalanceVolumeTask(ClusterService clusterService, String clusterName, TaskInfo taskInfo) { super(clusterService, clusterName, taskInfo); } public RebalanceVolumeTask(ClusterService clusterService, String clusterName, String volumeName) { - super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume rebalance running on " + volumeName, false, true, false); + super(clusterService, clusterName, TASK_TYPE.VOLUME_REBALANCE, volumeName, "Volume " + volumeName + + " Rebalance", false, true, false); } @Override public String getId() { - return taskInfo.getType() + "-" + taskInfo.getReference(); + return new String(Base64.encode(getClusterName() + "-" + taskInfo.getType() + "-" + taskInfo.getReference())); } @Override public void start() { try { - startRebalance(getOnlineServer().getName()); + serverName = getOnlineServer().getName(); + startRebalance(serverName); } catch(ConnectionException e) { // online server might have gone offline. try with a new one - startRebalance(getNewOnlineServer().getName()); + serverName = getNewOnlineServer().getName(); + startRebalance(serverName); } } @@ -62,11 +69,10 @@ public class RebalanceVolumeTask extends Task { String command = "gluster volume rebalance " + getTaskInfo().getReference() + " " + getLayout() + " start"; ProcessResult processResult = sshUtil.executeRemote(serverName, command); if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*has been successful$")) { - getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); - } + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_RUNNING, processResult.getOutput()))); + return; } - + // if we reach here, it means rebalance start failed. throw new GlusterRuntimeException(processResult.toString()); } @@ -74,70 +80,38 @@ public class RebalanceVolumeTask extends Task { @Override public void resume() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Pause/Resume is not supported in Volume Rebalance"))); } @Override public void stop() { try { - stopRebalance(getOnlineServer().getName()); - } catch(ConnectionException e) { - // online server might have gone offline. try with a new one - stopRebalance(getNewOnlineServer().getName()); + glusterUtil.stopRebalance(serverName, getTaskInfo().getReference()); + } catch (ConnectionException e) { + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); } } - private void stopRebalance(String serverName) { - String command = "gluster volume rebalance " + getTaskInfo().getReference() + " stop"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*has been successful$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); - } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); - } - taskStatus.setMessage(processResult.getOutput()); // Common - getTaskInfo().setStatus(taskStatus); - } - @Override public void pause() { getTaskInfo().setStatus( - new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, "Pause/Resume is not supported in Volume Rebalance"))); + new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, + "Pause/Resume is not supported in Volume Rebalance"))); } @Override public TaskStatus checkStatus() { try { - return checkRebalanceStatus(getOnlineServer().getName()); + return glusterUtil.checkRebalanceStatus(serverName, getTaskInfo().getReference()); } catch(ConnectionException e) { - // online server might have gone offline. try with a new one. - return checkRebalanceStatus(getNewOnlineServer().getName()); + // online server might have gone offline. update the failure status + getTaskInfo().setStatus(new TaskStatus(new Status(Status.STATUS_CODE_FAILURE, e.getMessage()))); + return getTaskInfo().getStatus(); } } - // TODO: This method should move to glusterUtil - private TaskStatus checkRebalanceStatus(String serverName) { - String command = "gluster volume rebalance " + getTaskInfo().getReference() + " status"; - ProcessResult processResult = sshUtil.executeRemote(serverName, command); - TaskStatus taskStatus = new TaskStatus(); - if (processResult.isSuccess()) { - if (processResult.getOutput().trim().matches(".*rebalance completed$")) { - taskStatus.setCode(Status.STATUS_CODE_SUCCESS); - } else { - taskStatus.setCode(Status.STATUS_CODE_RUNNING); - } - } else { - taskStatus.setCode(Status.STATUS_CODE_FAILURE); - } - taskStatus.setMessage(processResult.getOutput()); // Common - return taskStatus; - } - public void setLayout(String layout) { this.layout = layout; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java index b0959445..e5b8d726 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/ServerDiscoveryTask.java @@ -30,7 +30,7 @@ import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.server.data.ClusterInfo; import com.gluster.storage.management.server.data.PersistenceDao; -import com.gluster.storage.management.server.resources.DiscoveredServersResource; +import com.gluster.storage.management.server.resources.v1_0.DiscoveredServersResource; import com.gluster.storage.management.server.utils.ServerUtil; /** diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java index 49cd0b8b..119f6297 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/tasks/Task.java @@ -33,14 +33,15 @@ public abstract class Task { protected String clusterName; private ClusterService clusterService; - public Task(ClusterService clusterService, String clusterName, TASK_TYPE type, String reference, String desc, boolean canPause, boolean canStop, boolean canCommit) { + public Task(ClusterService clusterService, String clusterName, TASK_TYPE type, String reference, String desc, + boolean canPause, boolean canStop, boolean canCommit) { TaskInfo taskInfo = new TaskInfo(); taskInfo.setType(type); taskInfo.setReference(reference); taskInfo.setDescription(desc); - taskInfo.setCanPause(canPause); - taskInfo.setCanStop(canStop); - taskInfo.setCanCommit(canCommit); + taskInfo.setPauseSupported(canPause); + taskInfo.setStopSupported(canStop); + taskInfo.setCommitSupported(canCommit); init(clusterService, clusterName, taskInfo); 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 788e3eab..a24e147c 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 @@ -36,7 +36,7 @@ import com.gluster.storage.management.core.model.Brick.BRICK_STATUS; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.Status; -import com.gluster.storage.management.core.model.TaskInfo; +import com.gluster.storage.management.core.model.TaskStatus; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.TRANSPORT_TYPE; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; @@ -44,9 +44,7 @@ import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.utils.GlusterCoreUtil; import com.gluster.storage.management.core.utils.ProcessResult; import com.gluster.storage.management.core.utils.StringUtil; -import com.gluster.storage.management.server.resources.TasksResource; -import com.gluster.storage.management.server.tasks.MigrateDiskTask; -import com.gluster.storage.management.server.tasks.RebalanceVolumeTask; +import com.gluster.storage.management.server.resources.v1_0.TasksResource; import com.sun.jersey.api.core.InjectParam; @Component @@ -69,8 +67,11 @@ public class GlusterUtil { private static final String VOLUME_LOG_LOCATION_PFX = "log file location:"; private static final String VOLUME_TYPE_DISTRIBUTE = "Distribute"; private static final String VOLUME_TYPE_REPLICATE = "Replicate"; + private static final String GLUSTERD_INFO_FILE = "/etc/glusterd/glusterd.info"; private static final GlusterCoreUtil glusterCoreUtil = new GlusterCoreUtil(); + + private static final String INITIALIZE_DISK_STATUS_SCRIPT = "initialize_disk_status.py"; @Autowired private SshUtil sshUtil; @@ -112,6 +113,15 @@ public class GlusterUtil { } return null; } + + private String getUuid(String serverName) { + ProcessResult result = getSshUtil().executeRemote(serverName, "cat " + GLUSTERD_INFO_FILE); + if (!result.isSuccess()) { + throw new GlusterRuntimeException("Couldn't read file [" + GLUSTERD_INFO_FILE + "]. Error: " + + result.toString()); + } + return result.getOutput().split("=")[1]; + } public List<GlusterServer> getGlusterServers(GlusterServer knownServer) { String output = getPeerStatus(knownServer.getName()); @@ -119,9 +129,11 @@ public class GlusterUtil { return null; } + knownServer.setUuid(getUuid(knownServer.getName())); + List<GlusterServer> glusterServers = new ArrayList<GlusterServer>(); - // TODO: Append the known server. But where? Order matters in replication/striping glusterServers.add(knownServer); + GlusterServer server = null; boolean foundHost = false; boolean foundUuid = false; @@ -388,26 +400,7 @@ public class GlusterUtil { } private void addBrickToVolume(Volume volume, String serverName, String brickDir) { - // TODO: Brick status should be same as the server status (online/offline) - System.out.println(brickDir); volume.addBrick(new Brick(serverName, BRICK_STATUS.ONLINE, brickDir.split("/")[2].trim(), brickDir)); - - // volume.getBricks().get(0).getName(); - // - // try { - // volume.addDisk(serverName + ":" + brickDir.split("/")[2].trim()); - // } catch (ArrayIndexOutOfBoundsException e) { - // // brick directory of a different form, most probably created manually - // // connect to the server and get disk for the brick directory - // Status status = new ServerUtil().getDiskForDir(serverName, brickDir); - // if (status.isSuccess()) { - // volume.addDisk(serverName + ":" + status.getMessage()); - // } else { - // // Couldn't fetch disk for the brick directory. Log error and add "unknown" as disk name. - // System.out.println("Couldn't fetch disk name for brick [" + serverName + ":" + brickDir + "]"); - // volume.addDisk(serverName + ":unknown"); - // } - // } } private boolean readBrickGroup(String line) { @@ -550,6 +543,64 @@ public class GlusterUtil { throw new GlusterRuntimeException("Couldn't remove server [" + serverName + "]! Error: " + result); } } + + public TaskStatus checkRebalanceStatus(String serverName, String volumeName) { + String command = "gluster volume rebalance " + volumeName + " status"; + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + if (processResult.getOutput().trim().matches("^rebalance completed.*")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else if(processResult.getOutput().trim().matches(".*in progress:.*")) { + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); // Common + return taskStatus; + } + + public void stopRebalance(String serverName, String volumeName) { + String command = "gluster volume rebalance " + volumeName + " stop"; + ProcessResult processResult = sshUtil.executeRemote(serverName, command); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + taskStatus.setMessage(processResult.getOutput()); + } + } + + public TaskStatus checkInitializeDiskStatus(String serverName, String diskName) { + ProcessResult processResult = sshUtil.executeRemote(serverName, INITIALIZE_DISK_STATUS_SCRIPT + " " + diskName); + TaskStatus taskStatus = new TaskStatus(); + if (processResult.isSuccess()) { + // TODO: Message needs to change according to the script return + if (processResult.getOutput().trim().matches(".*Initailize completed$")) { + taskStatus.setCode(Status.STATUS_CODE_SUCCESS); + } else { + // TODO: Percentage completed needs to be set, according to the script output + taskStatus.setCode(Status.STATUS_CODE_RUNNING); + // taskStatus.setPercentCompleted(processResult.getOutput()); + } + } else { + taskStatus.setCode(Status.STATUS_CODE_FAILURE); + } + taskStatus.setMessage(processResult.getOutput()); + return taskStatus; + } + + public ProcessResult executeBrickMigration(String onlineServerName, String volumeName, String fromBrick, + String toBrick, String operation) { + String command = "gluster volume replace-brick " + volumeName + " " + fromBrick + " " + toBrick + " " + operation; + ProcessResult processResult = sshUtil.executeRemote(onlineServerName, command); + if (!processResult.isSuccess()) { + throw new GlusterRuntimeException(processResult.toString()); + } + return processResult; + } public static void main(String args[]) { // List<String> names = new GlusterUtil().getGlusterServerNames(); 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 ed77def3..2e78b57b 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 @@ -91,6 +91,7 @@ public class ServerUtil { throw new GlusterRuntimeException(((Status)response).getMessage()); } server.copyFrom((Server) response); // Update the details in <Server> object + server.setDisks(((Server) response).getDisks()); } /** diff --git a/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml b/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml index 59714c87..c8301c7b 100644 --- a/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml +++ b/src/com.gluster.storage.management.server/src/spring/gluster-server-security.xml @@ -16,7 +16,7 @@ <intercept-url pattern="/*" access="permitAll" /--> <!-- SSL Protection --> - <intercept-url pattern="/resources/*" access="hasRole('ROLE_ADMIN') + <intercept-url pattern="/1.0/*" access="hasRole('ROLE_ADMIN') and fullyAuthenticated" requires-channel="https" /> <intercept-url pattern="/*" access="permitAll" requires-channel="any" /> |
