diff options
Diffstat (limited to 'src')
21 files changed, 484 insertions, 233 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 a9c966c3..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()); } @@ -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)); } 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 2866a8e1..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); 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/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 1e172d1c..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,12 +22,17 @@ public class Event { public enum EVENT_TYPE { BRICKS_ADDED, BRICKS_REMOVED, + BRICKS_CHANGED, BRICK_REPLACED, - NETWORK_INTERFACE_ADDED, - NETWORK_INTERFACE_REMOVED, 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..d6105f23 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/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/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/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/RemoveBrickAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java index 0f411a59..f7d1207c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveBrickAction.java @@ -47,10 +47,6 @@ public class RemoveBrickAction extends AbstractActionDelegate { 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); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.java index 961dca88..bd36ff7c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickPage.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; @@ -90,12 +92,11 @@ public class AddBrickPage 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/AddBrickWizard.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.java index bcb3ce3d..58255f8c 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/AddBrickWizard.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,10 +30,7 @@ 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; /** @@ -60,15 +58,12 @@ public class AddBrickWizard 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 AddBrickWizard 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/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(); } |
