X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fweb%2Ftopology%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ftopology%2Fweb%2FTopology.java;h=285e33f53b91690ef7711bd1352b8956da90a63c;hb=077392a1ab706962b0da04b78a9cae5422e70e6c;hp=aeffad241b716486676545b4a51ddb0d4760a7a1;hpb=29f7cfb54b580928c7feac63abce028a7014b0d5;p=controller.git 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 aeffad241b..285e33f53b 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 @@ -19,6 +19,8 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.servlet.http.HttpServletRequest; + import org.opendaylight.controller.sal.authorization.UserLevel; import org.opendaylight.controller.sal.core.Bandwidth; import org.opendaylight.controller.sal.core.Edge; @@ -33,7 +35,6 @@ 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.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -50,7 +51,7 @@ import edu.uci.ics.jung.graph.SparseMultigraph; public class Topology { protected Map> cache = new HashMap>(); - protected Map> stage; + protected Map> stagedNodes; protected Map> newNodes; protected Integer nodeHash = null; protected Integer hostHash = null; @@ -82,7 +83,7 @@ public class Topology { List switchConfigurations = new ArrayList(); for(Switch sw : nodes) { Node n = sw.getNode(); - SwitchConfig config = switchManager.getSwitchConfig(n.getNodeIDString()); + SwitchConfig config = switchManager.getSwitchConfig(n.toString()); switchConfigurations.add(config); } @@ -100,7 +101,7 @@ public class Topology { nodeSingleHash = nodes.hashCode(); nodeConfigurationHash = switchConfigurations.hashCode(); - stage = new HashMap>(); + stagedNodes = new HashMap>(); newNodes = new HashMap>(); // nodeEdges addition @@ -130,8 +131,8 @@ public class Topology { for (Map.Entry> e : nodeEdges.entrySet()) { Node n = e.getKey(); - SwitchConfig config = switchManager.getSwitchConfig(n.getNodeIDString()); - NodeBean node = createNodeBean(config, n); + String description = switchManager.getNodeDescription(n); + NodeBean node = createNodeBean(description, n); List> adjacencies = new LinkedList>(); Set links = e.getValue(); @@ -148,45 +149,51 @@ public class Topology { node.setLinks(adjacencies); if (cache.containsKey(node.id())) { + // retrieve node from cache Map nodeEntry = cache.get(node.id()); - if (config != null) { - Map data = (Map) nodeEntry.get("data"); - data.put("$desc", config.getNodeName()); - nodeEntry.put("data", data); - } - stage.put(node.id(), nodeEntry); + + 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()); } } } - protected NodeBean createNodeBean(SwitchConfig config, Node node) { - NodeBean bean = null; - if (config != null) { - bean = new NodeBean(node.toString(), config.getNodeName(), NodeType.NODE); - } else { - bean = new NodeBean(node.toString(), node.toString(), NodeType.NODE); - } - - return bean; + 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); } - private void addSingleNodes(List nodes, ISwitchManager switchManager) { + @SuppressWarnings("unchecked") + private void addSingleNodes(List nodes, ISwitchManager switchManager) { if (nodes == null) return; for (Switch sw : nodes) { Node n = sw.getNode(); - SwitchConfig config = switchManager.getSwitchConfig(n.getNodeIDString()); - if (cache.containsKey(n.toString()) || newNodes.containsKey(n.toString())) continue; - NodeBean node = createNodeBean(config, n); - if (cache.containsKey(node.id())) { + + 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()); - if (config != null) { - Map data = (Map) nodeEntry.get("data"); - data.put("$desc", config.getNodeName()); - nodeEntry.put("data", data); - } - stage.put(node.id(), nodeEntry); + Map data = (Map) nodeEntry.get("data"); + data.put("$desc", description); + nodeEntry.put("data", data); + stagedNodes.put(node.id(), nodeEntry); } else { newNodes.put(node.id(), node.out()); } @@ -212,15 +219,18 @@ public class Topology { addressByteBuffer.rewind(); long hid = addressByteBuffer.getLong(); + String hostId = String.valueOf(hid); - NodeBean hostBean = new NodeBean(String.valueOf(hid), host.getNetworkAddressAsString(), NodeType.HOST); + 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(String.valueOf(hid))) { - stage.put(String.valueOf(hid), cache.get(String.valueOf(hid))); + 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()); } @@ -234,7 +244,7 @@ public class Topology { private void repositionTopology() { Graph graph = new SparseMultigraph(); cache.clear(); - cache.putAll(stage); + cache.putAll(stagedNodes); cache.putAll(newNodes); for (Map on : cache.values()) { graph.addVertex(on.toString()); @@ -249,7 +259,7 @@ public class Topology { } } - 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(); @@ -274,8 +284,8 @@ 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) { - if (!authorize(UserLevel.NETWORKADMIN)) { + @RequestParam(required = true) String y, HttpServletRequest request) { + if (!authorize(UserLevel.NETWORKADMIN, request)) { return new HashMap(); // silently disregard new node position } @@ -427,14 +437,14 @@ public class Topology { public static final String HOST = "host"; } - private boolean authorize(UserLevel level) { + private boolean authorize(UserLevel level, HttpServletRequest request) { IUserManager userManager = (IUserManager) ServiceHelper .getGlobalInstance(IUserManager.class, this); if (userManager == null) { return false; } - String username = SecurityContextHolder.getContext().getAuthentication().getName(); + String username = request.getUserPrincipal().getName(); UserLevel userLevel = userManager.getUserLevel(username); if (userLevel.toNumber() <= level.toNumber()) { return true;