diff options
22 files changed, 422 insertions, 310 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java index c7ea7507..a1dad796 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/DiscoveredServersClient.java @@ -18,11 +18,8 @@ *******************************************************************************/ package com.gluster.storage.management.client; -import java.util.List; - import javax.ws.rs.core.MultivaluedMap; -import com.gluster.storage.management.core.model.Response; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.ServerListResponse; @@ -32,7 +29,7 @@ import com.sun.jersey.core.util.MultivaluedMapImpl; public class DiscoveredServersClient extends AbstractClient { private static final String RESOURCE_NAME = "discoveredservers"; - public DiscoveredServersClient(String serverName, String securityToken) { + public DiscoveredServersClient(String securityToken) { super(securityToken); } @@ -45,19 +42,16 @@ public class DiscoveredServersClient extends AbstractClient { private Object getDiscoveredServers(Boolean getDetails, Class responseClass) { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.putSingle("details", getDetails.toString()); - - //System.out.println((String) fetchResource(queryParams, String.class)); - return ((Response) fetchResource(queryParams, responseClass)).getData(); + return fetchResource(queryParams, responseClass); } - @SuppressWarnings("unchecked") - public List<String> getDiscoveredServerNames() { - return (List<String>) getDiscoveredServers(Boolean.FALSE, StringListResponse.class); + public StringListResponse getDiscoveredServerNames() { + + return (StringListResponse) getDiscoveredServers(Boolean.FALSE, StringListResponse.class); } - @SuppressWarnings("unchecked") - public List<Server> getDiscoveredServerDetails() { - return (List<Server>) getDiscoveredServers(Boolean.TRUE, ServerListResponse.class); + public ServerListResponse getDiscoveredServerDetails() { + return (ServerListResponse) getDiscoveredServers(Boolean.TRUE, ServerListResponse.class); } @SuppressWarnings("unchecked") @@ -69,12 +63,11 @@ public class DiscoveredServersClient extends AbstractClient { public static void main(String[] args) { UsersClient usersClient = new UsersClient(); if (usersClient.authenticate("gluster", "gluster").isSuccess()) { - DiscoveredServersClient serverResource = new DiscoveredServersClient("localhost", - usersClient.getSecurityToken()); - List<String> discoveredServerNames = serverResource.getDiscoveredServerNames(); - System.out.println(discoveredServerNames); - List<Server> discoveredServers = serverResource.getDiscoveredServerDetails(); - System.out.println(discoveredServers); + DiscoveredServersClient serverResource = new DiscoveredServersClient(usersClient.getSecurityToken()); + StringListResponse discoveredServerNames = serverResource.getDiscoveredServerNames(); + System.out.println(discoveredServerNames.getData()); + ServerListResponse discoveredServers = serverResource.getDiscoveredServerDetails(); + System.out.println(discoveredServers.getData()); // Server serverDetails = ServerResource.getServer("localhost"); // System.out.println(serverDetails.getName()); 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 f98509f4..75b6affc 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 @@ -19,7 +19,6 @@ package com.gluster.storage.management.client; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Map.Entry; @@ -30,21 +29,20 @@ 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; 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.LogMessage; -import com.gluster.storage.management.core.model.NetworkInterface; import com.gluster.storage.management.core.model.Server; 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; import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; import com.gluster.storage.management.core.model.VolumeOptionInfo; +import com.gluster.storage.management.core.response.GlusterServerListResponse; import com.gluster.storage.management.core.response.RunningTaskListResponse; +import com.gluster.storage.management.core.response.ServerListResponse; import com.gluster.storage.management.core.response.VolumeListResponse; import com.gluster.storage.management.core.response.VolumeOptionInfoListResponse; @@ -58,7 +56,6 @@ public class GlusterDataModelManager { private static GlusterDataModelManager instance = new GlusterDataModelManager(); private GlusterDataModel model; private String securityToken; - private String serverName; private List<ClusterListener> listeners = new ArrayList<ClusterListener>(); private List<VolumeOptionInfo> volumeOptionsDefaults; @@ -80,43 +77,9 @@ public class GlusterDataModelManager { public static GlusterDataModelManager getInstance() { return instance; } - - // Renamed preferredInterfaceName to interfaceName - private GlusterServer addGlusterServer(List<GlusterServer> servers, Entity parent, String name, - SERVER_STATUS status, String interfaceName, int numOfCPUs, double cpuUsage, double totalMemory, - double memoryInUse) { - GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory, - memoryInUse); - NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed - // preferredInterfaceName - // to - // interfaceName - // glusterServer.setPreferredNetworkInterface(networkInterface); - - servers.add(glusterServer); - return glusterServer; - } - - private NetworkInterface addNetworkInterface(Server server, String interfaceName) { - NetworkInterface networkInterface = new NetworkInterface(interfaceName, server, "192.168.1." - + Math.round(Math.random() * 255), "255.255.255.0", "192.168.1.1"); - server.setNetworkInterfaces(Arrays.asList(new NetworkInterface[] { networkInterface })); - return networkInterface; - } - - private void addDiscoveredServer(List<Server> servers, Entity parent, String name, int numOfCPUs, double cpuUsage, - double totalMemory, double memoryInUse, double totalDiskSpace, double diskSpaceInUse) { - Server server = new Server(name, parent, numOfCPUs, cpuUsage, totalMemory, memoryInUse); - server.addDisk(new Disk(server, "sda", "/export/md1", totalDiskSpace, diskSpaceInUse, DISK_STATUS.READY)); - addNetworkInterface(server, "eth0"); - - servers.add(server); - } - public void initializeModel(String securityToken, String knownServer) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); - Cluster cluster = new Cluster("Home", model); initializeGlusterServers(cluster, knownServer); @@ -124,8 +87,6 @@ public class GlusterDataModelManager { initializeAutoDiscoveredServers(cluster); initializeDisks(); - // addDisksToVolumes(); - // addVolumeOptions(); createDummyLogMessages(); @@ -136,6 +97,31 @@ public class GlusterDataModelManager { model.addCluster(cluster); } + private void initializeGlusterServers(Cluster cluster, String knownServer) { + GlusterServerListResponse glusterServerListResponse = new GlusterServersClient(securityToken).getServers(knownServer); + if (!glusterServerListResponse.getStatus().isSuccess()) { + throw new GlusterRuntimeException(glusterServerListResponse.getStatus().getMessage()); + } + cluster.setServers(glusterServerListResponse.getServers()); + } + + private void initializeAutoDiscoveredServers(Cluster cluster) { + ServerListResponse discoveredServerListResponse = new DiscoveredServersClient(securityToken).getDiscoveredServerDetails(); + if (!discoveredServerListResponse.getStatus().isSuccess()) { + throw new GlusterRuntimeException(discoveredServerListResponse.getStatus().getMessage()); + } + cluster.setAutoDiscoveredServers(discoveredServerListResponse.getData()); + } + + private void initializeVolumes(Cluster cluster) { + VolumesClient volumeClient = new VolumesClient(securityToken); + VolumeListResponse response = volumeClient.getAllVolumes(); + if (!response.getStatus().isSuccess()) { + throw new GlusterRuntimeException("Error fetching volume list: [" + response.getStatus() + "]"); + } + cluster.setVolumes(response.getVolumes()); + } + private void initializeVolumeOptionsDefaults() { VolumeOptionInfoListResponse response = new VolumesClient(getSecurityToken()).getVolumeOptionsDefaults(); if (!response.getStatus().isSuccess()) { @@ -144,6 +130,19 @@ public class GlusterDataModelManager { } this.volumeOptionsDefaults = response.getOptions(); } + + public void initializeRunningTasks(Cluster cluster) { + RunningTaskListResponse runningTaskResponse = new RunningTaskClient(securityToken).getRunningTasks(); + if (!runningTaskResponse.getStatus().isSuccess()) { + throw new GlusterRuntimeException(runningTaskResponse.getStatus().getMessage()); + } + cluster.setRunningTasks(runningTaskResponse.getRunningTasks()); + } + + public void initializeAlerts(Cluster cluster) { + cluster.setAlerts(new AlertsClient(securityToken).getAllAlerts()); + } + private void addVolumeOptions() { for (Volume vol : new Volume[] { volume1, volume2, volume3, volume4, volume5 }) { @@ -163,14 +162,6 @@ public class GlusterDataModelManager { return volume; } - private void initializeVolumes(Cluster cluster) { - VolumesClient volumeClient = new VolumesClient(securityToken); - VolumeListResponse response = volumeClient.getAllVolumes(); - if (!response.getStatus().isSuccess()) { - throw new GlusterRuntimeException("Error fetching volume list: [" + response.getStatus() + "]"); - } - cluster.setVolumes(response.getVolumes()); - } private void initializeDisks() { s1da = new Disk(server1, "sda", "/export/md0", 100d, 80d, DISK_STATUS.READY); @@ -182,7 +173,8 @@ public class GlusterDataModelManager { s2dd = new Disk(server2, "sdd", "/export/md1", 200d, 124.89, DISK_STATUS.READY); // disk name unavailable since server is offline - s3da = new Disk(server3, "NA", "NA", -1d, -1d, DISK_STATUS.OFFLINE); + + s3da = new Disk(server3, "NA", "/export/md0", -1d, -1d, DISK_STATUS.IO_ERROR); s4da = new Disk(server4, "sda", "/export/md0", 100d, 85.39, DISK_STATUS.READY); @@ -228,14 +220,6 @@ public class GlusterDataModelManager { volume5.addDisk("server5:sdb"); } - private void initializeGlusterServers(Cluster cluster, String knownServer) { - cluster.setServers(new GlusterServersClient(securityToken).getServers(knownServer)); - } - - private void initializeAutoDiscoveredServers(Cluster cluster) { - cluster.setAutoDiscoveredServers(new DiscoveredServersClient(serverName, securityToken) - .getDiscoveredServerDetails()); - } private void addMessages(List<LogMessage> messages, Disk disk, String severity, int count) { for (int i = 1; i <= count; i++) { @@ -251,17 +235,6 @@ public class GlusterDataModelManager { addMessages(logMessages, disk, "INFO", 5); } - public void initializeRunningTasks(Cluster cluster) { - RunningTaskListResponse runningTaskResponse = new RunningTaskClient(securityToken).getRunningTasks(); - if (!runningTaskResponse.getStatus().isSuccess()) { - throw new GlusterRuntimeException(runningTaskResponse.getStatus().getMessage()); - } - cluster.setRunningTasks(runningTaskResponse.getRunningTasks()); - } - - public void initializeAlerts(Cluster cluster) { - cluster.setAlerts(new AlertsClient(securityToken).getAllAlerts()); - } public List<LogMessage> createDummyLogMessages() { addMessagesForDisk(logMessages, s1da); diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java index 98b8878c..8368ceea 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -44,11 +44,11 @@ public class GlusterServersClient extends AbstractClient { return RESOURCE_NAME; } - public List<GlusterServer> getServers(String knownServer) { + public GlusterServerListResponse getServers(String knownServer) { MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); queryParams.add(RESTConstants.QUERY_PARAM_KNOWN_SERVER, knownServer); GlusterServerListResponse response = (GlusterServerListResponse) fetchResource(queryParams, GlusterServerListResponse.class); - return response.getServers(); + return response; //.getServers(); } @SuppressWarnings("unchecked") @@ -77,8 +77,8 @@ public class GlusterServersClient extends AbstractClient { UsersClient usersClient = new UsersClient(); if (usersClient.authenticate("gluster", "gluster").isSuccess()) { - GlusterServersClient serverResource = new GlusterServersClient(usersClient.getSecurityToken()); - List<GlusterServer> glusterServers = serverResource.getServers("127.0.0.1"); + GlusterServersClient glusterServersClient = new GlusterServersClient(usersClient.getSecurityToken()); + List<GlusterServer> glusterServers = glusterServersClient.getServers("127.0.0.1").getData(); for (GlusterServer server : glusterServers) { System.out.println(server.getName()); } @@ -86,7 +86,7 @@ public class GlusterServersClient extends AbstractClient { // Add server Server srv = new Server(); srv.setName("server3"); - GlusterServerResponse response = serverResource.addServer(srv); + GlusterServerResponse response = glusterServersClient.addServer(srv); System.out.println(response.getGlusterServer().getName()); System.out.println(response.getStatus().isSuccess()); diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java index b5e25ce7..85a84c4a 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/CoreConstants.java @@ -31,4 +31,5 @@ public class CoreConstants { public static final String DATE_WITH_TIME_FORMAT = "MM/dd/yyyy HH:mm:ss"; public static final String PURE_DATE_FORMAT = "MM/dd/yyyy"; public static final String PURE_TIME_FORMAT = "HH:mm:ss.SSS"; + public static final String NA = "NA"; } 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 dfb4e57e..7b6ee0fd 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 @@ -25,10 +25,10 @@ import com.gluster.storage.management.core.utils.StringUtil; @XmlRootElement(name="Disk") public class Disk extends Entity { public enum DISK_STATUS { - READY, UNINITIALIZED, INITIALIZING, OFFLINE + READY, UNINITIALIZED, INITIALIZING, IO_ERROR }; - private String[] DISK_STATUS_STR = { "Ready", "Uninitialized", "Initializing", "Offline" }; + private String[] DISK_STATUS_STR = { "Ready", "Uninitialized", "Initializing", "I/O Error" }; private String serverName; private String mountPoint; @@ -52,8 +52,8 @@ public class Disk extends Entity { return getStatus() == DISK_STATUS.UNINITIALIZED; } - public boolean isOffline() { - return getStatus() == DISK_STATUS.OFFLINE; + public boolean hasErrors() { + return getStatus() == DISK_STATUS.IO_ERROR; } public boolean isReady() { 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 979fe260..eed67904 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 @@ -56,16 +56,15 @@ public class GlusterDummyModel { double memoryInUse) { GlusterServer glusterServer = new GlusterServer(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse); - NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); // Renamed preferredInterfaceName to interfaceName - // glusterServer.setPreferredNetworkInterface(networkInterface); + NetworkInterface networkInterface = addNetworkInterface(glusterServer, interfaceName); servers.add(glusterServer); return glusterServer; } private NetworkInterface addNetworkInterface(Server server, String interfaceName) { - NetworkInterface networkInterface = new NetworkInterface(interfaceName, server, "192.168.1." - + Math.round(Math.random() * 255), "255.255.255.0", "192.168.1.1"); + NetworkInterface networkInterface = new NetworkInterface(interfaceName, server, "00:00:00:00", "IPV6-IN-IPV4", + "1000MB/S", "192.168.1." + Math.round(Math.random() * 255), "255.255.255.0", "192.168.1.1"); server.setNetworkInterfaces(Arrays.asList(new NetworkInterface[] { networkInterface })); return networkInterface; } @@ -148,9 +147,6 @@ public class GlusterDummyModel { s2dc = new Disk(server2, "sdc", "/export/md0", 200d, -1d, DISK_STATUS.UNINITIALIZED); s2dd = new Disk(server2, "sdd", "/export/md1", 200d, 124.89, DISK_STATUS.READY); - // disk name unavailable since server is offline - s3da = new Disk(server3, "NA", "NA", -1d, -1d, DISK_STATUS.OFFLINE); // disk name unavailable since server is offline - s4da = new Disk(server4, "sda", "/export/md0", 100d, 85.39, DISK_STATUS.READY); s5da = new Disk(server5, "sda", "/export/md1", 100d, 92.83, DISK_STATUS.READY); @@ -246,29 +242,29 @@ public class GlusterDummyModel { public static List<LogMessage> getDummyLogMessages() { return logMessages; } - + public Disk getVolumeDisk(String volumeDisk) { List<Disk> allDisks = getReadyDisksOfAllServers(); String brickInfo[] = volumeDisk.split(":"); - for( Disk disk: allDisks) { + for (Disk disk : allDisks) { if (disk.getServerName() == brickInfo[0] && disk.getName() == brickInfo[1]) { return disk; } } 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; + // 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() ) { + for (String volumeDisk : volume.getDisks()) { disk = getVolumeDisk(volumeDisk); if (disk != null && disk.isReady()) { volumeDisks.add(disk); @@ -291,7 +287,7 @@ public class GlusterDummyModel { public List<Disk> getReadyDisksOfAllServersExcluding(List<Disk> excludeDisks) { List<Disk> disks = new ArrayList<Disk>(); - + for (Server server : ((Cluster) model.getChildren().get(0)).getServers()) { for (Disk disk : server.getDisks()) { if (disk.isReady() && !excludeDisks.contains(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 fd4e58c9..a9455f48 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 NetworkInterface preferredNetworkInterface; private Cluster cluster; public GlusterServer() { @@ -54,6 +53,10 @@ public class GlusterServer extends Server { this(name, parent, status, numOfCPUs, cpuUsage, totalMemory, memoryInUse); setCluster(cluster); } + + public Boolean isOnline() { + return getStatus() == SERVER_STATUS.ONLINE; + } public String getStatusStr() { return STATUS_STR[getStatus().ordinal()]; 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 882dfe09..c0521ef3 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 @@ -20,24 +20,29 @@ package com.gluster.storage.management.core.model; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement(name="networkInterface") +@XmlRootElement(name = "networkInterface") public class NetworkInterface extends Entity { + private String hwAddr; + private String model; + private String speed; private String ipAddress; private String netMask; private String defaultGateway; -// private boolean isPreferred; - + public NetworkInterface() { - + } -// public boolean isPreferred() { -// return isPreferred; -// } -// -// public void setPreferred(boolean isPreferred) { -// this.isPreferred = isPreferred; -// } + public NetworkInterface(String name, Entity parent, String hwAddr, String model, String speed, String ipAddress, + String netMask, String defaultGateway) { + super(name, parent); + setHwAddr(hwAddr); + setModel(model); + setSpeed(speed); + setIpAddress(ipAddress); + setNetMask(netMask); + setDefaultGateway(defaultGateway); + } public String getIpAddress() { return ipAddress; @@ -63,11 +68,28 @@ public class NetworkInterface extends Entity { this.defaultGateway = defaultGateway; } - public NetworkInterface(String name, Entity parent, String ipAddress, String netMask, String defaultGateway) { - super(name, parent); - setIpAddress(ipAddress); - setNetMask(netMask); - setDefaultGateway(defaultGateway); + public String getHwAddr() { + return hwAddr; } - + + public void setHwAddr(String hwAddr) { + this.hwAddr = hwAddr; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getSpeed() { + return speed; + } + + public void setSpeed(String speed) { + this.speed = speed; + } + } 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 4f870eaf..256b9ec4 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 @@ -133,7 +133,7 @@ public class Server extends Entity { } public void addDisk(Disk disk) { - if (disks.add(disk)) { + if (disks.add(disk) && disk.isReady()) { totalDiskSpace += disk.getSpace(); diskSpaceInUse += disk.getSpaceInUse(); } @@ -180,4 +180,19 @@ public class Server extends Entity { public boolean filter(String filterString, boolean caseSensitive) { return StringUtil.filterString(getName() + getIpAddressesAsString(), filterString, caseSensitive); } + + @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()); + } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java index 9b258be1..3f7ac4f1 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/DiskTableLabelProvider.java @@ -42,7 +42,7 @@ public class DiskTableLabelProvider extends TableLabelProviderAdapter { switch (status) { case READY: return guiHelper.getImage(IImageKeys.STATUS_ONLINE); - case OFFLINE: + case IO_ERROR: return guiHelper.getImage(IImageKeys.STATUS_OFFLINE); case UNINITIALIZED: return guiHelper.getImage(IImageKeys.DISK_UNINITIALIZED); @@ -65,7 +65,7 @@ public class DiskTableLabelProvider extends TableLabelProviderAdapter { } private String getDiskSpace(Disk disk) { - if (disk.isOffline()) { + if (disk.hasErrors() || disk.isUninitialized()) { return "NA"; } else { return NumberUtil.formatNumber(disk.getSpace()); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java index d7b700d4..78f703ea 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java @@ -19,6 +19,7 @@ package com.gluster.storage.management.gui; +import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.NetworkInterface; import com.gluster.storage.management.gui.views.details.tabcreators.GlusterServerTabCreator.NETWORK_INTERFACE_TABLE_COLUMN_INDICES; @@ -30,11 +31,13 @@ public class NetworkInterfaceTableLabelProvider extends TableLabelProviderAdapte } NetworkInterface networkInterface = (NetworkInterface) element; - return (columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE.ordinal() ? networkInterface.getName() + String columnText = (columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE.ordinal() ? networkInterface.getName() + : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.MODEL.ordinal() ? networkInterface.getModel() + : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.SPEED.ordinal() ? networkInterface.getSpeed() : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.IP_ADDRESS.ordinal() ? networkInterface.getIpAddress() : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.NETMASK.ordinal() ? networkInterface.getNetMask() : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.GATEWAY.ordinal() ? networkInterface.getDefaultGateway() - // : columnIndex == NETWORK_INTERFACE_TABLE_COLUMN_INDICES.PREFERRED.ordinal() ? (networkInterface.isPreferred() ? "Yes" : "No") : "Invalid"); + return ((columnText == null || columnText.trim().equals("")) ? CoreConstants.NA : columnText); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java index cd5fab62..a07c64bf 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/ServerDiskTableLabelProvider.java @@ -20,6 +20,7 @@ package com.gluster.storage.management.gui; import org.eclipse.swt.graphics.Image; +import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Disk; import com.gluster.storage.management.core.model.Disk.DISK_STATUS; @@ -43,7 +44,7 @@ public class ServerDiskTableLabelProvider extends TableLabelProviderAdapter { switch (status) { case READY: return guiHelper.getImage(IImageKeys.STATUS_ONLINE); - case OFFLINE: + case IO_ERROR: return guiHelper.getImage(IImageKeys.STATUS_OFFLINE); case UNINITIALIZED: return guiHelper.getImage(IImageKeys.DISK_UNINITIALIZED); @@ -58,16 +59,16 @@ public class ServerDiskTableLabelProvider extends TableLabelProviderAdapter { } private String getDiskSpaceInUse(Disk disk) { - if(disk.isReady()) { - return NumberUtil.formatNumber(disk.getSpaceInUse()); + if(disk.hasErrors() || disk.isUninitialized()) { + return CoreConstants.NA; } else { - return "NA"; + return NumberUtil.formatNumber(disk.getSpaceInUse()); } } private String getDiskSpace(Disk disk) { - if(disk.isOffline()) { - return "NA"; + if(disk.hasErrors() || disk.isUninitialized()) { + return CoreConstants.NA; } else { return NumberUtil.formatNumber(disk.getSpace()); } @@ -78,13 +79,13 @@ public class ServerDiskTableLabelProvider extends TableLabelProviderAdapter { if (!(element instanceof Disk)) { return null; } - Disk disk = (Disk) element; - return (columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.DISK.ordinal() ? disk.getName() - : columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? getDiskSpace(disk) + String columnText = (columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.DISK.ordinal() ? disk.getName() + : columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.SPACE.ordinal() ? getDiskSpace(disk) : columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.SPACE_IN_USE.ordinal() ? getDiskSpaceInUse(disk) : columnIndex == SERVER_DISK_TABLE_COLUMN_INDICES.STATUS.ordinal() ? disk.getStatusStr() : "Invalid"); + return ((columnText == null || columnText.trim().equals("")) ? CoreConstants.NA : columnText); } } diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java index d43cab15..8d3217f1 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServerSummaryView.java @@ -57,11 +57,11 @@ public class GlusterServerSummaryView extends ViewPart { private GlusterServer server; public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { - INTERFACE, IP_ADDRESS, NETMASK, GATEWAY + INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY }; - private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "IP Address", "Netmask", - "Gateway" }; + private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "Model", "Speed", "IP Address", + "Netmask", "Gateway" }; @Override public void createPartControl(Composite parent) { @@ -206,10 +206,11 @@ public class GlusterServerSummaryView extends ViewPart { parent.setLayout(tableColumnLayout); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE, SWT.CENTER, 70); + setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.MODEL, SWT.CENTER, 70); + setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.SPEED, SWT.CENTER, 70); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.IP_ADDRESS, SWT.CENTER, 100); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.NETMASK, SWT.CENTER, 70); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.GATEWAY, SWT.CENTER, 70); - // setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.PREFERRED, SWT.CENTER, 70); } private Composite createTableViewerComposite(Composite parent) { diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java index e1aa59ff..00318373 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java @@ -58,18 +58,18 @@ import com.richclientgui.toolbox.gauges.CoolGauge; public class GlusterServerTabCreator implements TabCreator { public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { - INTERFACE, IP_ADDRESS, NETMASK, GATEWAY + INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY }; - private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "IP Address", "Netmask", - "Gateway" }; + private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "Model", "Speed", "IP Address", + "Netmask", "Gateway" }; private static final GUIHelper guiHelper = GUIHelper.getInstance(); private void createServerSummarySection(GlusterServer server, FormToolkit toolkit, final ScrolledForm form) { Composite section = guiHelper.createSection(form, toolkit, "Summary", null, 2, false); -// toolkit.createLabel(section, "Preferred Network: ", SWT.NONE); -// toolkit.createLabel(section, server.getPreferredNetworkInterface().getName(), SWT.NONE); + // toolkit.createLabel(section, "Preferred Network: ", SWT.NONE); + // toolkit.createLabel(section, server.getPreferredNetworkInterface().getName(), SWT.NONE); boolean online = server.getStatus() == SERVER_STATUS.ONLINE; @@ -168,6 +168,8 @@ public class GlusterServerTabCreator implements TabCreator { parent.setLayout(tableColumnLayout); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE, SWT.CENTER, 70); + setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.MODEL, SWT.CENTER, 70); + setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.SPEED, SWT.CENTER, 70); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.IP_ADDRESS, SWT.CENTER, 100); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.NETMASK, SWT.CENTER, 70); setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.GATEWAY, SWT.CENTER, 70); @@ -217,19 +219,20 @@ public class GlusterServerTabCreator implements TabCreator { private Composite createNetworkInterfacesSection(GlusterServer server, FormToolkit toolkit, ScrolledForm form) { final Composite section = guiHelper.createSection(form, toolkit, "Network Interfaces", null, 1, false); createNetworkInterfacesTableViewer(createTableViewerComposite(section), server); -// Hyperlink changePreferredNetworkLink = toolkit.createHyperlink(section, "Change Preferred Network", SWT.NONE); -// changePreferredNetworkLink.addHyperlinkListener(new HyperlinkAdapter() { -// -// @Override -// public void linkActivated(HyperlinkEvent e) { -// new MessageDialog( -// section.getShell(), -// "Gluster Storage Platform", -// guiHelper.getImage(IImageKeys.SERVER), -// "This will show additional controls to help user choose a new network interface. TO BE IMPLEMENTED.", -// MessageDialog.INFORMATION, new String[] { "OK" }, 0).open(); -// } -// }); + // Hyperlink changePreferredNetworkLink = toolkit.createHyperlink(section, "Change Preferred Network", + // SWT.NONE); + // changePreferredNetworkLink.addHyperlinkListener(new HyperlinkAdapter() { + // + // @Override + // public void linkActivated(HyperlinkEvent e) { + // new MessageDialog( + // section.getShell(), + // "Gluster Storage Platform", + // guiHelper.getImage(IImageKeys.SERVER), + // "This will show additional controls to help user choose a new network interface. TO BE IMPLEMENTED.", + // MessageDialog.INFORMATION, new String[] { "OK" }, 0).open(); + // } + // }); return section; } @@ -241,7 +244,8 @@ public class GlusterServerTabCreator implements TabCreator { serverLogsTab.layout(); // IMP: lays out the form properly } - private void createServerDisksTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { + private void createServerDisksTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit, + IWorkbenchSite site) { Composite serverDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.SERVER); ServerDisksPage page = new ServerDisksPage(serverDisksTab, SWT.NONE, site, server.getDisks()); diff --git a/src/com.gluster.storage.management.server.scripts/src/common/NetworkUtils.py b/src/com.gluster.storage.management.server.scripts/src/common/NetworkUtils.py index f8a5de30..7a854564 100644 --- a/src/com.gluster.storage.management.server.scripts/src/common/NetworkUtils.py +++ b/src/com.gluster.storage.management.server.scripts/src/common/NetworkUtils.py @@ -177,6 +177,26 @@ def writeIfcfgConfFile(deviceName, conf, root="", deviceFile=None): return True +def getNetModel(deviceName): + rv = runCommandFG("ifconfig %s" % deviceName, stdout=True, root=True) + if rv["Status"] != 0: + return False + for line in rv["Stdout"].split(): + tokens = line.strip().split(":") + if tokens[0].upper() == "ENCAP": + return tokens[1].strip().upper() + return None + +def getNetSpeed(deviceName): + rv = runCommandFG("ethtool %s" % deviceName, stdout=True, root=True) + if rv["Status"] != 0: + return False + for line in rv["Stdout"].split("\n"): + tokens = line.strip().split(":") + if tokens[0].upper() == "SPEED": + return tokens[1].strip().upper() + return None + def getLinkStatus(deviceName): return True ## ethtool takes very long time to respond. So its disabled now @@ -276,6 +296,9 @@ def getNetDeviceList(root=""): netDevice["type"] = None netDevice["link"] = getLinkStatus(deviceName) netDevice["mode"] = getBondMode(deviceName, root + Globals.MODPROBE_CONF_FILE) + netDevice["model"] = getNetModel(deviceName) + netDevice["speed"] = getNetSpeed(deviceName) + try: netDevice["hwaddr"] = open("/sys/class/net/%s/address" % deviceName).read().strip() except IOError: diff --git a/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py b/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py index 6a4c2998..a1ab9264 100644 --- a/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py +++ b/src/com.gluster.storage.management.server.scripts/src/nodes/Disk.py @@ -80,6 +80,8 @@ class Disk: else: # iterate over children looking for a volume children = self.hal.FindDeviceStringMatch("info.parent", device) + if not children and "disk" == dev.GetProperty("storage.drive_type"): + self._add_volume(dev) for child in children: child = self._get_device(child) if child.GetProperty("block.is_volume"): @@ -88,6 +90,23 @@ class Disk: def _add_volume(self, dev, parent=None): volume = str(dev.GetProperty('block.device')) + if not parent: + self.volumes.append ({ + 'device' : volume, + 'label' : str(dev.GetProperty('block.device')), + 'fstype' : None, + 'fsversion': None, + 'uuid' : None, + 'interface': str(dev.GetProperty('storage.bus')), + 'parent' : None, + 'description': str(dev.GetProperty('storage.model')) + " " + str(dev.GetProperty('storage.vendor')), + 'size' : None, + 'totalsize' : str(int(dev.GetProperty('storage.size')) / 1024**2), + 'drive_type': str(dev.GetProperty('storage.drive_type')), + 'mount_point': "NA" + }) + return + self.volumes.append ({ 'device' : volume, 'label' : str(dev.GetProperty('volume.label')), @@ -102,6 +121,7 @@ class Disk: 'drive_type': str(parent.GetProperty('storage.drive_type')), 'mount_point': str(dev.GetProperty('volume.mount_point')) }) + return def _get_device(self, udi): """ Return a dbus Interface to a specific HAL device UDI """ diff --git a/src/com.gluster.storage.management.server.scripts/src/nodes/get_server_details.py b/src/com.gluster.storage.management.server.scripts/src/nodes/get_server_details.py index 67148586..932be8d7 100755 --- a/src/com.gluster.storage.management.server.scripts/src/nodes/get_server_details.py +++ b/src/com.gluster.storage.management.server.scripts/src/nodes/get_server_details.py @@ -117,16 +117,18 @@ def getServerDetails(): #TODO: probe and retrieve timezone, ntp-server, preferred-network details and update the tags deviceList = {} + interfaces = responseDom.createTag("networkInterfaces", None) for device in getNetDeviceList(): deviceList[device["device"]] = device try: macAddress = open("/sys/class/net/%s/address" % device["device"]).read().strip() except IOError: continue - interfaces = responseDom.createTag("networkInterfaces", None) interfaceTag = responseDom.createTag("networkInterface", None) interfaceTag.appendChild(responseDom.createTag("name", device["device"])) - interfaceTag.appendChild(responseDom.createTag("hwaddr", macAddress)) + interfaceTag.appendChild(responseDom.createTag("hwAddr", macAddress)) + interfaceTag.appendChild(responseDom.createTag("speed", device["speed"])) + interfaceTag.appendChild(responseDom.createTag("model", device["model"])) if deviceList[device["device"]]: if deviceList[device["device"]]["onboot"]: interfaceTag.appendChild(responseDom.createTag("onboot", "yes")) @@ -147,6 +149,7 @@ def getServerDetails(): interfaceTag.appendChild(responseDom.createTag("bootProto", "none")) interfaces.appendChild(interfaceTag) serverTag.appendChild(interfaces) + responseDom.appendTag(serverTag) serverTag.appendChild(responseDom.createTag("numOfCPUs", int(os.sysconf('SC_NPROCESSORS_ONLN')))) @@ -192,14 +195,21 @@ def getServerDetails(): partitionTag.appendChild(responseDom.createTag("mountPoint", disk['mount_point'])) partitionTag.appendChild(responseDom.createTag("serverName", serverName)) partitionTag.appendChild(responseDom.createTag("description", disk['description'])) - total, used, free = getDiskSizeInfo(disk['device']) + total, used, free = 0, 0, 0 + if disk['size']: + total, used, free = getDiskSizeInfo(disk['device']) if total: partitionTag.appendChild(responseDom.createTag("space", str(total))) totalDiskSpace += total + else: + partitionTag.appendChild(responseDom.createTag("space", "NA")) if used: partitionTag.appendChild(responseDom.createTag("spaceInUse", str(used))) diskSpaceInUse += used partitionTag.appendChild(responseDom.createTag("status", "READY")) + else: + partitionTag.appendChild(responseDom.createTag("spaceInUse", "NA")) + partitionTag.appendChild(responseDom.createTag("status", "UNINITIALIZED")) diskTag.appendChild(partitionTag) serverTag.appendChild(diskTag) serverTag.appendChild(responseDom.createTag("totalDiskSpace", str(totalDiskSpace))) 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/AbstractServersResource.java index 13147465..8c7f54ae 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/AbstractServersResource.java @@ -20,17 +20,22 @@ */ package com.gluster.storage.management.server.resources; -import com.gluster.storage.management.core.model.Disk; -import com.gluster.storage.management.core.model.NetworkInterface; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.server.utils.GlusterUtil; +import com.gluster.storage.management.server.utils.ServerUtil; +import com.sun.jersey.api.core.InjectParam; /** * Abstract resource class for servers. Abstracts basic server related functionality like "get server details". */ public class AbstractServersResource { - // TODO: Used for generating dummy ip address. To be removed after implementing actual logic for fetching server - // details - private static int ipCount = 1; + @InjectParam + private ServerUtil serverUtil; + + @InjectParam + private GlusterUtil glusterUtil; /** * Fetch details of the given server. The server name must be populated in the object before calling this method. @@ -39,41 +44,19 @@ public class AbstractServersResource { * Server whose details are to be fetched */ protected void fetchServerDetails(Server server) { - String serverName = server.getName(); - - // TODO: Fetch the server details and populate in the object. - // For now, populating dummy data. - populateDummyData(server); - } - - /** - * @param server - */ - private void populateDummyData(Server server) { - server.setNumOfCPUs((int) (Math.ceil(Math.random() * 8))); - server.setCpuUsage(Math.random() * 100); - server.setTotalMemory(Math.ceil(Math.random() * 8)); - server.setMemoryInUse(Math.random() * server.getTotalMemory()); - addDummyDisks(server); - addDummyNetworkInterfaces(server, (int) Math.ceil(Math.random() * 4)); + // fetch standard server details like cpu, disk, memory details + Object response = serverUtil.executeOnServer(true, server.getName(), "get_server_details.py", Server.class); + if (response instanceof Status) { + throw new GlusterRuntimeException(((Status)response).getMessage()); + } + server.copyFrom((Server) response); // Update the details in <Server> object } - private void addDummyNetworkInterfaces(Server server, int interfaceCount) { - for (int i = 0; i < interfaceCount; i++) { - server.addNetworkInterface(new NetworkInterface("eth" + i, server, "192.168.1." + ipCount++, - "255.255.255.0", "192.168.1.1")); - } + protected void setGlusterUtil(GlusterUtil glusterUtil) { + this.glusterUtil = glusterUtil; } - /** - * @param server - */ - private void addDummyDisks(Server server) { - double dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sda", "/export/md0", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); - dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sdb", "/export/md1", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); - dummyDiskSpace = Math.random() * 500; - server.addDisk(new Disk(server, "sdc", "/export/md2", dummyDiskSpace, Math.random() * dummyDiskSpace, Disk.DISK_STATUS.READY)); + protected GlusterUtil getGlusterUtil() { + return glusterUtil; } } 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/DiscoveredServersResource.java index c1ddffd1..eba06bf5 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/DiscoveredServersResource.java @@ -30,11 +30,15 @@ import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; +import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.Response; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.response.GenericResponse; import com.gluster.storage.management.core.response.ServerListResponse; import com.gluster.storage.management.core.response.StringListResponse; +import com.gluster.storage.management.server.utils.ServerUtil; +import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; @Component @@ -42,29 +46,48 @@ import com.sun.jersey.spi.resource.Singleton; @Path("/discoveredservers") public class DiscoveredServersResource extends AbstractServersResource { private List<String> discoveredServerNames = new ArrayList<String>(); - + public List<String> getDiscoveredServerNames() { return discoveredServerNames; } + @GET @Produces(MediaType.TEXT_XML) + @SuppressWarnings("rawtypes") public Response getDiscoveredServers(@QueryParam("details") Boolean getDetails) { if(getDetails != null && getDetails == true) { - return new ServerListResponse(Status.STATUS_SUCCESS, getDiscoveredServerDetails()); + return getDiscoveredServerDetails(); } return new StringListResponse(getDiscoveredServerNames()); } - private List<Server> getDiscoveredServerDetails() { + private ServerListResponse getDiscoveredServerDetails() { List<Server> discoveredServers = new ArrayList<Server>(); List<String> serverNames = getDiscoveredServerNames(); + GenericResponse<Server> discoveredServerResponse; + int errCount = 0; + StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): "); for (String serverName : serverNames) { - discoveredServers.add(getDiscoveredServer(serverName)); + discoveredServerResponse = getDiscoveredServer(serverName); + if (!discoveredServerResponse.getStatus().isSuccess()) { + errMsg.append(CoreConstants.NEWLINE + serverName + " : " + discoveredServerResponse.getStatus()); + errCount++; + } else { + discoveredServers.add(discoveredServerResponse.getData()); + } + } + Status status = null; + if(errCount == 0) { + status = new Status(Status.STATUS_CODE_SUCCESS, "Success"); + } else if(errCount == serverNames.size()) { + status = new Status(Status.STATUS_CODE_FAILURE, errMsg.toString()); + } else { + status = new Status(Status.STATUS_CODE_PART_SUCCESS, errMsg.toString()); } - return discoveredServers; + return new ServerListResponse(status, discoveredServers); } - + public void setDiscoveredServerNames(List<String> discoveredServerNames) { synchronized (discoveredServerNames) { this.discoveredServerNames = discoveredServerNames; @@ -74,12 +97,16 @@ public class DiscoveredServersResource extends AbstractServersResource { @Path("/{serverName}") @GET @Produces(MediaType.TEXT_XML) - public Server getDiscoveredServer(@PathParam("serverName") String serverName) { + public GenericResponse<Server> getDiscoveredServer(@PathParam("serverName") String serverName) { Server server = new Server(serverName); - fetchServerDetails(server); - return server; + try { + fetchServerDetails(server); + } catch (Exception e) { + return new GenericResponse<Server>(new Status(e), null); + } + return new GenericResponse<Server>(Status.STATUS_SUCCESS, server); } - + public static void main(String[] args) { StringListResponse listResponse = (StringListResponse)new DiscoveredServersResource().getDiscoveredServers(false); for (String server : listResponse.getData()) { 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/GlusterServersResource.java index 3092e80d..71c0f7db 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/GlusterServersResource.java @@ -32,92 +32,92 @@ import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; +import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.constants.RESTConstants; 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.Server; import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GlusterServerListResponse; import com.gluster.storage.management.core.response.GlusterServerResponse; import com.gluster.storage.management.server.utils.GlusterUtil; import com.gluster.storage.management.server.utils.SshUtil; -import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; @Component @Singleton @Path("/cluster/servers") public class GlusterServersResource extends AbstractServersResource { - @InjectParam - private GlusterUtil glusterUtil; - - public static final String HOSTNAMETAG = "hostname:"; - - public void setGlusterUtil(GlusterUtil glusterUtil) { - this.glusterUtil = glusterUtil; - } - public GlusterUtil getGlusterUtil() { - return glusterUtil; - } + public static final String HOSTNAMETAG = "hostname:"; - private List<GlusterServer> getServerDetails(String knownServer) { - List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(knownServer); + private GlusterServerListResponse getServerDetails(String knownServer) { + List<GlusterServer> glusterServers = getGlusterUtil().getGlusterServers(knownServer); + int errCount = 0; + StringBuilder errMsg = new StringBuilder("Couldn't fetch details for server(s): "); + for (GlusterServer server : glusterServers) { if (server.getStatus() == SERVER_STATUS.ONLINE) { + try { fetchServerDetails(server); + } catch (Exception e) { + errMsg.append(CoreConstants.NEWLINE + server.getName() + " : [" + e.getMessage() + "]"); + errCount++; + } } } - return glusterServers; + Status status; + if (errCount==0) { + status = new Status(Status.STATUS_CODE_SUCCESS, "Success"); + } else if(errCount == glusterServers.size()) { + status = new Status(Status.STATUS_CODE_FAILURE, errMsg.toString()); + } else { + status = new Status(Status.STATUS_CODE_PART_SUCCESS, errMsg.toString()); + } + return new GlusterServerListResponse(status, glusterServers); } @GET @Produces(MediaType.TEXT_XML) - public GlusterServerListResponse getGlusterServers(@QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) { - return new GlusterServerListResponse(Status.STATUS_SUCCESS, getServerDetails(knownServer)); + public GlusterServerListResponse getGlusterServers( + @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) { + return getServerDetails(knownServer); } @GET @Path("{serverName}") @Produces(MediaType.TEXT_XML) - public GlusterServer getGlusterServer(@PathParam("serverName") String serverName) { - // TODO: Implement logic to fetch details of a single gluster server (peer) - GlusterServer server = new GlusterServer(serverName); - fetchServerDetails(server); - server.setStatus(SERVER_STATUS.ONLINE); - return server; - } - - /* - * (non-Javadoc) - * - * @see - * com.gluster.storage.management.server.resources.AbstractServersResource#fetchServerDetails(com.gluster.storage - * .management.core.model.Server) - */ - @Override - protected void fetchServerDetails(Server server) { - // fetch standard server details like cpu, disk, memory details - super.fetchServerDetails(server); - - // TODO: Fetch gluster server details like status + public GlusterServerResponse getGlusterServer( + @QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer, + @PathParam("serverName") String serverName) { + GlusterServer server = getGlusterUtil().getGlusterServer(knownServer, serverName); + Status status = Status.STATUS_SUCCESS; + if(server.isOnline()) { + try { + fetchServerDetails(server); + } catch (Exception e) { + status.setCode(Status.STATUS_CODE_FAILURE); + } + } + return new GlusterServerResponse(status, server); } @POST @Produces(MediaType.TEXT_XML) - public GlusterServerResponse addServer(@FormParam("serverName") String serverName, @FormParam("existingServer") String existingServer) { - Status status = glusterUtil.addServer(serverName, existingServer); + public GlusterServerResponse addServer(@FormParam("serverName") String serverName, + @FormParam("existingServer") String existingServer) { + Status status = getGlusterUtil().addServer(serverName, existingServer); if (!status.isSuccess()) { return new GlusterServerResponse(status, null); } - return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(serverName)); + return new GlusterServerResponse(Status.STATUS_SUCCESS, getGlusterServer(existingServer, serverName) + .getGlusterServer()); } - + @DELETE @Produces(MediaType.TEXT_XML) public Status removeServer(@QueryParam("serverName") String serverName) { - return glusterUtil.removeServer(serverName); + return getGlusterUtil().removeServer(serverName); } public static void main(String[] args) { @@ -125,10 +125,10 @@ public class GlusterServersResource extends AbstractServersResource { GlusterUtil glusterUtil = new GlusterUtil(); glusterUtil.setSshUtil(new SshUtil()); glusterServersResource.setGlusterUtil(glusterUtil); - System.out.println(glusterServersResource.getServerDetails("127.0.0.1").size()); + // System.out.println(glusterServersResource.getServerDetails("127.0.0.1").size()); // To add a server -// GlusterServerResponse response = glusterServersResource.addServer("my-server"); -// System.out.println(response.getData().getName()); + // GlusterServerResponse response = glusterServersResource.addServer("my-server"); + // System.out.println(response.getData().getName()); } } 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 91f809b8..a7ce9bc5 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 @@ -92,6 +92,25 @@ public class GlusterUtil { return null; } + private GlusterServer getKnownServer(String knownServer) { + GlusterServer server = new GlusterServer(knownServer); + server.setStatus(SERVER_STATUS.ONLINE); //TODO: If pingable + //NOTE: No UUID assumed, it can be fetch while getting server details + return server; + } + + + public GlusterServer getGlusterServer(String knownServer, String serverName) { + List<GlusterServer> servers = getGlusterServers(knownServer); + for(GlusterServer server : servers) { + if(server.getName().equals(serverName)) { + return server; + } + } + return null; + } + + public List<GlusterServer> getGlusterServers(String knownServer) { String output = getPeerStatus(knownServer); if (output == null) { @@ -99,6 +118,7 @@ public class GlusterUtil { } List<GlusterServer> glusterServers = new ArrayList<GlusterServer>(); + glusterServers.add(getKnownServer(knownServer)); // Append the known server GlusterServer server = null; boolean foundHost = false; boolean foundUuid = false; 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 20f5252d..5b953c3d 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 @@ -50,6 +50,9 @@ public class ServerUtil { @Autowired ServletContext servletContext; + @Autowired + private SshUtil sshUtil; + private static final String SCRIPT_DIR = "scripts"; private static final String SCRIPT_COMMAND = "python"; private static final String REMOTE_SCRIPT_GET_DISK_FOR_DIR = "get_disk_for_dir.py"; @@ -101,42 +104,53 @@ public class ServerUtil { } private String executeOnServer(String serverName, String commandWithArgs) { - try { - InetAddress address = InetAddress.getByName(serverName); - Socket connection = new Socket(address, 50000); - - PrintWriter writer = new PrintWriter(connection.getOutputStream(), true); - writer.println(commandWithArgs); - writer.println(); // empty line means end of request - - InputStream inputStream = connection.getInputStream(); - int available = inputStream.available(); - - StringBuffer output = new StringBuffer(); - if( available > 0 ) { - // This happens when PeerAgent sends complete file - byte[] responseData = new byte[available]; - inputStream.read(responseData); - output.append(new String(responseData, "UTF-8")); - } else { - // This happens in case of normal XML response from PeerAgent - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); - - String line; - while (!(line = reader.readLine()).trim().isEmpty()) { - output.append(line + CoreConstants.NEWLINE); - } - } - connection.close(); - - return output.toString(); - } catch (Exception e) { - throw new GlusterRuntimeException("Error during remote execution: [" + e.getMessage() + "]"); + ProcessResult result = sshUtil.executeRemote(serverName, commandWithArgs); + if (!result.isSuccess()) { + throw new GlusterRuntimeException("Command [" + commandWithArgs + "] failed on [" + serverName + + "] with error [" + result.getExitValue() + "][" + result.getOutput() + "]"); } + return result.getOutput(); } - + + // This is the old executeOnServer that used socket communication. + // We can keep it commented for the time being. + // private String executeOnServerUsingSocket(String serverName, String commandWithArgs) { + // try { + // InetAddress address = InetAddress.getByName(serverName); + // Socket connection = new Socket(address, 50000); + // + // PrintWriter writer = new PrintWriter(connection.getOutputStream(), true); + // writer.println(commandWithArgs); + // writer.println(); // empty line means end of request + // + // InputStream inputStream = connection.getInputStream(); + // int available = inputStream.available(); + // + // StringBuffer output = new StringBuffer(); + // if( available > 0 ) { + // // This happens when PeerAgent sends complete file + // byte[] responseData = new byte[available]; + // inputStream.read(responseData); + // output.append(new String(responseData, "UTF-8")); + // } else { + // // This happens in case of normal XML response from PeerAgent + // BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + // + // String line; + // while (!(line = reader.readLine()).trim().isEmpty()) { + // output.append(line + CoreConstants.NEWLINE); + // } + // } + // connection.close(); + // + // return output.toString(); + // } catch (Exception e) { + // throw new GlusterRuntimeException("Error during remote execution: [" + e.getMessage() + "]"); + // } + // } + public String getFileFromServer(String serverName, String fileName) { - return executeOnServer(serverName, "get_file " + fileName); + return executeOnServer(serverName, "get_file " + fileName); } /** @@ -160,27 +174,30 @@ public class ServerUtil { Unmarshaller um = context.createUnmarshaller(); return um.unmarshal(new ByteArrayInputStream(input.getBytes())); } catch (JAXBException e) { - if(tryGenericResponseOnFailure) { + if (tryGenericResponseOnFailure) { // unmarshalling failed. try to unmarshal a GenericResponse object return unmarshal(GenericResponse.class, input, false); } - + return new Status(Status.STATUS_CODE_FAILURE, "Error during unmarshalling string [" + input + "] for class [" + expectedClass.getName() + ": [" + e.getMessage() + "]"); } } - public static void main(String args[]) throws Exception { - // CreateVolumeExportDirectory.py md0 testvol - System.out.println(new ServerUtil().getFileFromServer("localhost", "/tmp/python/PeerAgent.py")); - } - /** - * @param serverName Server on which the directory is present - * @param brickDir Directory whose disk is to be fetched + * @param serverName + * Server on which the directory is present + * @param brickDir + * Directory whose disk is to be fetched * @return Status object containing the disk name, or error message in case the remote script fails. */ public Status getDiskForDir(String serverName, String brickDir) { return (Status) executeOnServer(true, serverName, REMOTE_SCRIPT_GET_DISK_FOR_DIR + " " + brickDir, Status.class); } + + public static void main(String args[]) throws Exception { + // CreateVolumeExportDirectory.py md0 testvol + System.out.println(new ServerUtil().getFileFromServer("localhost", "/tmp/python/PeerAgent.py")); + } + } |
