X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fweb%2Ftopology%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ftopology%2Fweb%2FTopology.java;h=a6c390d799bb1fa54ac1329436ab2a3b47d2b037;hp=af25abded0ca51c8d6812345a4f6b7f3549da289;hb=efc25496a3fc6771d0f52acdf30807c9b62e582f;hpb=2429b6be7f76de1a8f4f9f7008bcff405adc4059 diff --git a/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java b/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java index af25abded0..a6c390d799 100644 --- a/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java +++ b/opendaylight/web/topology/src/main/java/org/opendaylight/controller/topology/web/Topology.java @@ -10,6 +10,9 @@ package org.opendaylight.controller.topology.web; import java.awt.Dimension; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.ObjectInputStream; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collection; @@ -21,21 +24,30 @@ import java.util.Set; import javax.servlet.http.HttpServletRequest; -import org.opendaylight.controller.sal.authorization.UserLevel; +import org.opendaylight.controller.configuration.IConfigurationAware; +import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Bandwidth; +import org.opendaylight.controller.sal.core.Description; import org.opendaylight.controller.sal.core.Edge; import org.opendaylight.controller.sal.core.Host; +import org.opendaylight.controller.sal.core.Name; import org.opendaylight.controller.sal.core.Node; +import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Property; -import org.opendaylight.controller.sal.core.Node.NodeIDType; import org.opendaylight.controller.sal.packet.address.EthernetAddress; +import org.opendaylight.controller.sal.utils.GlobalConstants; +import org.opendaylight.controller.sal.utils.IObjectReader; +import org.opendaylight.controller.sal.utils.ObjectReader; +import org.opendaylight.controller.sal.utils.ObjectWriter; import org.opendaylight.controller.sal.utils.ServiceHelper; +import org.opendaylight.controller.sal.utils.Status; +import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.switchmanager.ISwitchManager; import org.opendaylight.controller.switchmanager.Switch; import org.opendaylight.controller.switchmanager.SwitchConfig; import org.opendaylight.controller.topologymanager.ITopologyManager; -import org.opendaylight.controller.usermanager.IUserManager; +import org.opendaylight.controller.web.DaylightWebUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -49,74 +61,107 @@ import edu.uci.ics.jung.graph.SparseMultigraph; @Controller @RequestMapping("/") -public class Topology { +public class Topology implements IObjectReader, IConfigurationAware { + private static String ROOT = GlobalConstants.STARTUPHOME.toString(); + private String topologyWebFileName = null; - protected Map> cache = new HashMap>(); + protected Map>> metaCache = new HashMap>>(); protected Map> stagedNodes; protected Map> newNodes; - protected Integer nodeHash = null; - protected Integer hostHash = null; - protected Integer nodeSingleHash = null; - protected Integer nodeConfigurationHash = null; - + + protected Map metaNodeHash = new HashMap(); + protected Map metaHostHash = new HashMap(); + protected Map metaNodeSingleHash = new HashMap(); + protected Map metaNodeConfigurationHash = new HashMap(); + + public Topology() { + ServiceHelper.registerGlobalService(IConfigurationAware.class, this, null); + topologyWebFileName = ROOT + "topologyCache.sav"; + loadConfiguration(); + } + /** * Topology of nodes and hosts in the network in JSON format. - * + * * Mainly intended for consumption by the visual topology. - * + * * @return - JSON output for visual topology */ @RequestMapping(value = "/visual.json", method = RequestMethod.GET) @ResponseBody - public Collection> getLinkData() { + public Collection> getLinkData(@RequestParam(required = false) String container, HttpServletRequest request) { + String containerName = (container == null) ? GlobalConstants.DEFAULT.toString() : container; + + // Derive the privilege this user has on the current container + String userName = request.getUserPrincipal().getName(); + Privilege privilege = DaylightWebUtil.getContainerPrivilege(userName, containerName, this); + + if (privilege == Privilege.NONE) { + return null; + } + ITopologyManager topologyManager = (ITopologyManager) ServiceHelper - .getInstance(ITopologyManager.class, "default", this); - if (topologyManager == null) return null; + .getInstance(ITopologyManager.class, containerName, this); + if (topologyManager == null) { + return null; + } ISwitchManager switchManager = (ISwitchManager) ServiceHelper - .getInstance(ISwitchManager.class, "default", this); - if (switchManager == null) return null; - + .getInstance(ISwitchManager.class, containerName, this); + if (switchManager == null) { + return null; + } + Map> nodeEdges = topologyManager.getNodeEdges(); Map> hostEdges = topologyManager .getNodesWithNodeConnectorHost(); List nodes = switchManager.getNetworkDevices(); - + List switchConfigurations = new ArrayList(); for(Switch sw : nodes) { - Node n = sw.getNode(); - SwitchConfig config = switchManager.getSwitchConfig(n.toString()); - switchConfigurations.add(config); + Node n = sw.getNode(); + SwitchConfig config = switchManager.getSwitchConfig(n.toString()); + switchConfigurations.add(config); + } + + // initialize cache if needed + if (!metaCache.containsKey(containerName)) { + metaCache.put(containerName, new HashMap>()); + // initialize hashes + metaNodeHash.put(containerName, null); + metaHostHash.put(containerName, null); + metaNodeSingleHash.put(containerName, null); + metaNodeConfigurationHash.put(containerName, null); } - + // return cache if topology hasn't changed if ( - (nodeHash != null && hostHash != null && nodeSingleHash != null && nodeConfigurationHash != null) && - nodeHash == nodeEdges.hashCode() && hostHash == hostEdges.hashCode() && nodeSingleHash == nodes.hashCode() && nodeConfigurationHash == switchConfigurations.hashCode() + (metaNodeHash.get(containerName) != null && metaHostHash.get(containerName) != null && metaNodeSingleHash.get(containerName) != null && metaNodeConfigurationHash.get(containerName) != null) && + metaNodeHash.get(containerName).equals(nodeEdges.hashCode()) && metaHostHash.get(containerName).equals(hostEdges.hashCode()) && metaNodeSingleHash.get(containerName).equals(nodes.hashCode()) && metaNodeConfigurationHash.get(containerName).equals(switchConfigurations.hashCode()) ) { - return cache.values(); + return metaCache.get(containerName).values(); } - + // cache has changed, we must assign the new values - nodeHash = nodeEdges.hashCode(); - hostHash = hostEdges.hashCode(); - nodeSingleHash = nodes.hashCode(); - nodeConfigurationHash = switchConfigurations.hashCode(); - + metaNodeHash.put(containerName, nodeEdges.hashCode()); + metaHostHash.put(containerName, hostEdges.hashCode()); + metaNodeSingleHash.put(containerName, nodes.hashCode()); + metaNodeConfigurationHash.put(containerName, switchConfigurations.hashCode()); + stagedNodes = new HashMap>(); newNodes = new HashMap>(); // nodeEdges addition - addNodes(nodeEdges, topologyManager, switchManager); + addNodes(nodeEdges, topologyManager, switchManager, containerName); // single nodes addition - addSingleNodes(nodes, switchManager); - + addSingleNodes(nodes, switchManager, containerName); + // hostNodes addition - addHostNodes(hostEdges, topologyManager); - - repositionTopology(); - - return cache.values(); + addHostNodes(hostEdges, topologyManager, containerName); + + repositionTopology(containerName); + + return metaCache.get(containerName).values(); } /** @@ -126,21 +171,21 @@ public class Topology { * @param topology - the topology instance */ private void addNodes(Map> nodeEdges, - ITopologyManager topology, ISwitchManager switchManager) { + ITopologyManager topology, ISwitchManager switchManager, String containerName) { Bandwidth bandwidth = new Bandwidth(0); Map> properties = topology.getEdges(); - + for (Map.Entry> e : nodeEdges.entrySet()) { Node n = e.getKey(); - + String description = getNodeDesc(n, switchManager); + + NodeBean node = createNodeBean(description, n); + // skip production node if (nodeIgnore(n)) { continue; } - - String description = switchManager.getNodeDescription(n); - NodeBean node = createNodeBean(description, n); - + List> adjacencies = new LinkedList>(); Set links = e.getValue(); for (Edge link : links) { @@ -149,53 +194,60 @@ public class Topology { } for (Property p : properties.get(link)) { if (p instanceof Bandwidth) { - bandwidth = (Bandwidth) p; + bandwidth = (Bandwidth) p; break; } } - EdgeBean edge = new EdgeBean(link, bandwidth); + NodeConnector headNodeConnector = link.getHeadNodeConnector(); + NodeConnector tailNodeConnector = link.getTailNodeConnector(); + + String headDescription = this.getNodeConnectorDescription(headNodeConnector, switchManager); + String tailDescription = this.getNodeConnectorDescription(tailNodeConnector, switchManager); + String headPortDescription = this.getNodeConnectorPortDescription(headNodeConnector, switchManager); + String tailPortDescription = this.getNodeConnectorPortDescription(tailNodeConnector, switchManager); + EdgeBean edge = new EdgeBean(link, bandwidth, headDescription, tailDescription, headPortDescription, tailPortDescription); adjacencies.add(edge.out()); } - + node.setLinks(adjacencies); - if (cache.containsKey(node.id())) { - // retrieve node from cache - Map nodeEntry = cache.get(node.id()); - - Map data = (Map) nodeEntry.get("data"); - data.put("$desc", description); - nodeEntry.put("data", data); - - // always update adjacencies - nodeEntry.put("adjacencies", adjacencies); - // stage this cached node (with position) - stagedNodes.put(node.id(), nodeEntry); + if (metaCache.get(containerName).containsKey(node.id())) { + // retrieve node from cache + Map nodeEntry = metaCache.get(containerName).get(node.id()); + + Map data = (Map) nodeEntry.get("data"); + data.put("$desc", description); + nodeEntry.put("data", data); + + // always update adjacencies + nodeEntry.put("adjacencies", adjacencies); + // stage this cached node (with position) + stagedNodes.put(node.id(), nodeEntry); } else { - newNodes.put(node.id(), node.out()); + newNodes.put(node.id(), node.out()); } } } - + /** * Check if this node shouldn't appear in the visual topology - * + * * @param node * @return */ private boolean nodeIgnore(Node node) { String nodeType = node.getType(); - + // add other node types to ignore later if (nodeType.equals(NodeIDType.PRODUCTION)) { return true; } - + return false; } - + /** * Check if this edge shouldn't appear in the visual topology - * + * * @param edge * @return */ @@ -205,53 +257,77 @@ public class Topology { if (nodeIgnore(headNode)) { return true; } - + NodeConnector tailNodeConnector = edge.getTailNodeConnector(); Node tailNode = tailNodeConnector.getNode(); if (nodeIgnore(tailNode)) { return true; } - + return false; } - + protected NodeBean createNodeBean(String description, Node node) { - String name = (description == null || - description.trim().isEmpty() || - description.equalsIgnoreCase("none"))? - node.toString() : description; - return new NodeBean(node.toString(), name, NodeType.NODE); + String name = this.getDescription(description, node); + return new NodeBean(node.toString(), name, NodeType.NODE); + } + + private String getDescription(String description, Node node) { + String name = (description == null || + description.trim().isEmpty() || + description.equalsIgnoreCase("none"))? + node.toString() : description; + return name; } - + + private String getNodeConnectorDescription(NodeConnector nodeConnector, ISwitchManager switchManager) { + Node node = nodeConnector.getNode(); + String name = this.getDescription(getNodeDesc(node, switchManager), node); + return name; + } + + private String getNodeConnectorPortDescription(NodeConnector nodeConnector, ISwitchManager switchManager) { + Name ncName = (Name) switchManager.getNodeConnectorProp(nodeConnector, Name.NamePropName); + String nodeConnectorName = nodeConnector.getNodeConnectorIDString(); + if (ncName != null) { + nodeConnectorName = ncName.getValue(); + } + return nodeConnectorName; + } + @SuppressWarnings("unchecked") - private void addSingleNodes(List nodes, ISwitchManager switchManager) { - if (nodes == null) return; - for (Switch sw : nodes) { - Node n = sw.getNode(); - - // skip production node + private void addSingleNodes(List nodes, ISwitchManager switchManager, String containerName) { + if (nodes == null) { + return; + } + for (Switch sw : nodes) { + Node n = sw.getNode(); + + // skip production node if (nodeIgnore(n)) { continue; } - String description = switchManager.getNodeDescription(n); - - if ((stagedNodes.containsKey(n.toString()) && cache.containsKey(n.toString())) || newNodes.containsKey(n.toString())) { - continue; - } - NodeBean node = createNodeBean(description, n); - - // FIXME still doesn't display standalone node when last remaining link is removed - if (cache.containsKey(node.id()) && !stagedNodes.containsKey(node.id())) { - Map nodeEntry = cache.get(node.id()); - Map data = (Map) nodeEntry.get("data"); - data.put("$desc", description); - nodeEntry.put("data", data); - stagedNodes.put(node.id(), nodeEntry); + String description = getNodeDesc(n, switchManager); + + if ((stagedNodes.containsKey(n.toString()) && metaCache.get(containerName).containsKey(n.toString())) || newNodes.containsKey(n.toString())) { + continue; + } + NodeBean node = createNodeBean(description, n); + + // FIXME still doesn't display standalone node when last remaining link is removed + if (metaCache.get(containerName).containsKey(node.id()) && !stagedNodes.containsKey(node.id())) { + Map nodeEntry = metaCache.get(containerName).get(node.id()); + Map data = (Map) nodeEntry.get("data"); + data.put("$desc", description); + nodeEntry.put("data", data); + // clear adjacencies since this is now a single node + nodeEntry.put("adjacencies", new LinkedList>()); + stagedNodes.put(node.id(), nodeEntry); } else { - newNodes.put(node.id(), node.out()); + newNodes.put(node.id(), node.out()); } - } + } } /** @@ -261,32 +337,34 @@ public class Topology { * @param topology - topology instance */ private void addHostNodes(Map> hostEdges, - ITopologyManager topology) { + ITopologyManager topology, String containerName) { for (Map.Entry> e : hostEdges.entrySet()) { for (NodeConnector connector : e.getValue()) { - Host host = topology.getHostAttachedToNodeConnector(connector); - EthernetAddress dmac = (EthernetAddress) host.getDataLayerAddress(); - - ByteBuffer addressByteBuffer = ByteBuffer.allocate(8); - addressByteBuffer.putShort((short) 0); - addressByteBuffer.put(dmac.getValue()); - addressByteBuffer.rewind(); - - long hid = addressByteBuffer.getLong(); - String hostId = String.valueOf(hid); - - NodeBean hostBean = new NodeBean(hostId, host.getNetworkAddressAsString(), NodeType.HOST); - List> adjacencies = new LinkedList>(); - EdgeBean edge = new EdgeBean(connector, hid); - adjacencies.add(edge.out()); - hostBean.setLinks(adjacencies); - - if (cache.containsKey(hostId)) { - Map hostEntry = cache.get(hostId); - hostEntry.put("adjacencies", adjacencies); - stagedNodes.put(hostId, hostEntry); - } else { - newNodes.put(String.valueOf(hid), hostBean.out()); + List hosts = topology.getHostsAttachedToNodeConnector(connector); + for (Host host : hosts) { + EthernetAddress dmac = (EthernetAddress) host.getDataLayerAddress(); + + ByteBuffer addressByteBuffer = ByteBuffer.allocate(8); + addressByteBuffer.putShort((short) 0); + addressByteBuffer.put(dmac.getValue()); + addressByteBuffer.rewind(); + + long hid = addressByteBuffer.getLong(); + String hostId = String.valueOf(hid); + + NodeBean hostBean = new NodeBean(hostId, host.getNetworkAddressAsString(), NodeType.HOST); + List> adjacencies = new LinkedList>(); + EdgeBean edge = new EdgeBean(connector, hid); + adjacencies.add(edge.out()); + hostBean.setLinks(adjacencies); + + if (metaCache.get(containerName).containsKey(hostId)) { + Map hostEntry = metaCache.get(containerName).get(hostId); + hostEntry.put("adjacencies", adjacencies); + stagedNodes.put(hostId, hostEntry); + } else { + newNodes.put(String.valueOf(hid), hostBean.out()); + } } } } @@ -295,25 +373,27 @@ public class Topology { /** * Re-position nodes in circular layout */ - private void repositionTopology() { + private void repositionTopology(String containerName) { Graph graph = new SparseMultigraph(); - cache.clear(); - cache.putAll(stagedNodes); - cache.putAll(newNodes); - for (Map on : cache.values()) { + + metaCache.get(containerName).clear(); + metaCache.get(containerName).putAll(stagedNodes); + metaCache.get(containerName).putAll(newNodes); + + for (Map on : metaCache.get(containerName).values()) { graph.addVertex(on.toString()); List> adjacencies = (List>) on.get("adjacencies"); - + for (Map adj : adjacencies) { graph.addEdge( - adj.toString(), adj.get("nodeFrom").toString(), - adj.get("nodeTo").toString() + adj.toString(), adj.get("nodeFrom").toString(), + adj.get("nodeTo").toString() ); } } - - CircleLayout layout = new CircleLayout(graph); + + CircleLayout layout = new CircleLayout(graph); layout.setSize(new Dimension(1200, 365)); for (Map.Entry> v : newNodes.entrySet()) { Double x = layout.transform(v.getKey()).getX(); @@ -329,7 +409,7 @@ public class Topology { /** * Update node position - * + * * This method is mainly used by the visual topology * * @param nodeId - The node to update @@ -338,140 +418,159 @@ public class Topology { @RequestMapping(value = "/node/{nodeId}", method = RequestMethod.POST) @ResponseBody public Map post(@PathVariable String nodeId, @RequestParam(required = true) String x, - @RequestParam(required = true) String y, HttpServletRequest request) { - if (!authorize(UserLevel.NETWORKADMIN, request)) { - return new HashMap(); // silently disregard new node position - } - + @RequestParam(required = true) String y, @RequestParam(required = false) String container, + HttpServletRequest request) { + String containerName = (container == null) ? GlobalConstants.DEFAULT.toString() : container; + + // Derive the privilege this user has on the current container + String userName = request.getUserPrincipal().getName(); + Privilege privilege = DaylightWebUtil.getContainerPrivilege(userName, containerName, this); + + if (privilege != Privilege.WRITE) { + return new HashMap(); // silently disregard new node position + } + String id = new String(nodeId); - - if (!cache.containsKey(id)) + + if (!metaCache.get(containerName).containsKey(id)) { return null; + } - Map node = cache.get(id); + Map node = metaCache.get(containerName).get(id); Map data = (Map) node.get("data"); data.put("$x", x); data.put("$y", y); node.put("data", data); - + return node; } - + /** * Node object for visual topology */ protected class NodeBean { - protected String id; - protected String name; - protected Map data; - protected List> links; - - public NodeBean() { - data = new HashMap(); - links = new ArrayList>(); - } - - public NodeBean(String id, String name, String type) { - this(); - this.id = id; - this.name = name; - data.put("$desc", name); - data.put("$type", type); - } - - public void setLinks(List> links) { - this.links = links; - } - - public Map out() { - Map node = new HashMap(); - node.put("id", this.id); - node.put("name", this.name); - node.put("data", this.data); - node.put("adjacencies", this.links); - - return node; - } - - public String name() { - return this.name; - } - - public String id() { - return this.id; - } + protected String id; + protected String name; + protected Map data; + protected List> links; + + public NodeBean() { + data = new HashMap(); + links = new ArrayList>(); + } + + public NodeBean(String id, String name, String type) { + this(); + this.id = id; + this.name = name; + data.put("$desc", name); + data.put("$type", type); + } + + public void setLinks(List> links) { + this.links = links; + } + + public Map out() { + Map node = new HashMap(); + node.put("id", this.id); + node.put("name", this.name); + node.put("data", this.data); + node.put("adjacencies", this.links); + + return node; + } + + public String name() { + return this.name; + } + + public String id() { + return this.id; + } } - + /** * Edge object for visual topology */ protected class EdgeBean { - protected NodeConnector source; - protected NodeConnector destination; - protected Map data; - protected Long hostId; - - public EdgeBean() { - data = new HashMap(); - } - - public EdgeBean(Edge link, Bandwidth bandwidth) { - this(); - this.source = link.getHeadNodeConnector(); - this.destination = link.getTailNodeConnector(); - - // data - data.put("$bandwidth", bandwidth.toString()); - data.put("$color", bandwidthColor(bandwidth)); - data.put("$nodeToPort", destination.getID().toString()); - data.put("$nodeFromPort", source.getID().toString()); - data.put("$descFrom", source.getNode().toString()); - data.put("$descTo", destination.getNode().toString()); - data.put("$nodeFromPortName", source.toString()); - data.put("$nodeToPortName", destination.toString()); - } - - public EdgeBean(NodeConnector connector, Long hostId) { - this(); - this.source = null; - this.destination = connector; - this.hostId = hostId; - - data.put("$bandwidth", "N/A"); - data.put("$color", bandwidthColor(new Bandwidth(0))); - data.put("$nodeToPort", connector.getNodeConnectorIDString()); - data.put("$nodeFromPort", connector.getNodeConnectorIDString()); - data.put("$descTo", ""); - data.put("$descFrom", ""); - data.put("$nodeToPortName", ""); - data.put("$nodeFromPortName", ""); - } - - public Map out() { - Map edge = new HashMap(); - - edge.put("data", data); - if (source == null) { - edge.put("nodeFrom", String.valueOf(this.hostId)); - } else { - edge.put("nodeFrom", source.getNode().toString()); - } - edge.put("nodeTo", destination.getNode().toString()); - - - return edge; - } - - private String bandwidthColor(Bandwidth bandwidth) { - String color = null; - long bandwidthValue = bandwidth.getValue(); - - if (bandwidthValue == 0) { + protected NodeConnector source; + protected NodeConnector destination; + protected Map data; + protected Long hostId; + + public EdgeBean() { + data = new HashMap(); + } + + /** + * EdgeBean object that includes complete node description + * + * @param link + * @param bandwidth + * @param headDescription + * @param tailDescription + */ + public EdgeBean(Edge link, Bandwidth bandwidth, String headDescription, + String tailDescription, String headPortDescription, String tailPortDescription) { + this(); + this.source = link.getHeadNodeConnector(); + this.destination = link.getTailNodeConnector(); + + // data + data.put("$bandwidth", bandwidth.toString()); + data.put("$color", bandwidthColor(bandwidth)); + data.put("$nodeToPort", destination.getID().toString()); + data.put("$nodeFromPort", source.getID().toString()); + data.put("$descFrom", headDescription); + data.put("$descTo", tailDescription); + data.put("$nodeFromPortName", source.toString()); + data.put("$nodeToPortName", destination.toString()); + data.put("$nodeFromPortDescription", headPortDescription); + data.put("$nodeToPortDescription", tailPortDescription); + } + + public EdgeBean(NodeConnector connector, Long hostId) { + this(); + this.source = null; + this.destination = connector; + this.hostId = hostId; + + data.put("$bandwidth", "N/A"); + data.put("$color", bandwidthColor(new Bandwidth(0))); + data.put("$nodeToPort", connector.getNodeConnectorIDString()); + data.put("$nodeFromPort", connector.getNodeConnectorIDString()); + data.put("$descTo", ""); + data.put("$descFrom", ""); + data.put("$nodeToPortName", ""); + data.put("$nodeFromPortName", ""); + } + + public Map out() { + Map edge = new HashMap(); + + edge.put("data", data); + if (source == null) { + edge.put("nodeFrom", String.valueOf(this.hostId)); + } else { + edge.put("nodeFrom", source.getNode().toString()); + } + edge.put("nodeTo", destination.getNode().toString()); + + + return edge; + } + + private String bandwidthColor(Bandwidth bandwidth) { + String color = null; + long bandwidthValue = bandwidth.getValue(); + + if (bandwidthValue == 0) { color = "#000"; } else if (bandwidthValue < Bandwidth.BW1Kbps) { - color = "#148AC6"; + color = "#148AC6"; } else if (bandwidthValue < Bandwidth.BW1Mbps) { color = "#2858A0"; } else if (bandwidthValue < Bandwidth.BW1Gbps) { @@ -481,28 +580,42 @@ public class Topology { } else if (bandwidthValue < Bandwidth.BW1Pbps) { color = "#F9F464"; } - - return color; + + return color; } } - + protected class NodeType { - public static final String NODE = "swtch"; - public static final String HOST = "host"; + public static final String NODE = "swtch"; + public static final String HOST = "host"; } - - private boolean authorize(UserLevel level, HttpServletRequest request) { - IUserManager userManager = (IUserManager) ServiceHelper - .getGlobalInstance(IUserManager.class, this); - if (userManager == null) { - return false; - } - - String username = request.getUserPrincipal().getName(); - UserLevel userLevel = userManager.getUserLevel(username); - if (userLevel.toNumber() <= level.toNumber()) { - return true; + + @SuppressWarnings("unchecked") + private void loadConfiguration() { + ObjectReader objReader = new ObjectReader(); + metaCache = (Map>>) objReader.read(this, topologyWebFileName); + if (metaCache == null) { + metaCache = new HashMap>>(); } - return false; } -} + + @Override + public Status saveConfiguration() { + ObjectWriter objWriter = new ObjectWriter(); + objWriter.write(metaCache, topologyWebFileName); + return new Status(StatusCode.SUCCESS, null); + } + + @Override + public Object readObject(ObjectInputStream ois) + throws FileNotFoundException, IOException, ClassNotFoundException { + // Perform the class deserialization locally, from inside the package where the class is defined + return ois.readObject(); + } + + private String getNodeDesc(Node node, ISwitchManager switchManager) { + Description desc = (Description) switchManager.getNodeProp(node, Description.propertyName); + return (desc == null) ? "" : desc.getValue(); + } + +} \ No newline at end of file