2 * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.controller.topologymanager.internal;
11 import java.net.InetAddress;
12 import java.net.UnknownHostException;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.HashSet;
16 import java.util.Iterator;
17 import java.util.List;
20 import java.util.concurrent.ConcurrentMap;
22 import org.junit.Assert;
23 import org.junit.Test;
24 import org.opendaylight.controller.sal.core.Bandwidth;
25 import org.opendaylight.controller.sal.core.ConstructionException;
26 import org.opendaylight.controller.sal.core.Edge;
27 import org.opendaylight.controller.sal.core.Host;
28 import org.opendaylight.controller.sal.core.Latency;
29 import org.opendaylight.controller.sal.core.Node;
30 import org.opendaylight.controller.sal.core.Node.NodeIDType;
31 import org.opendaylight.controller.sal.core.NodeConnector;
32 import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
33 import org.opendaylight.controller.sal.core.Property;
34 import org.opendaylight.controller.sal.core.State;
35 import org.opendaylight.controller.sal.core.UpdateType;
36 import org.opendaylight.controller.sal.packet.address.EthernetAddress;
37 import org.opendaylight.controller.sal.topology.TopoEdgeUpdate;
38 import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
39 import org.opendaylight.controller.sal.utils.NodeCreator;
40 import org.opendaylight.controller.sal.utils.Status;
41 import org.opendaylight.controller.sal.utils.StatusCode;
42 import org.opendaylight.controller.switchmanager.ISwitchManager;
43 import org.opendaylight.controller.switchmanager.SpanConfig;
44 import org.opendaylight.controller.switchmanager.Subnet;
45 import org.opendaylight.controller.switchmanager.SubnetConfig;
46 import org.opendaylight.controller.switchmanager.Switch;
47 import org.opendaylight.controller.switchmanager.SwitchConfig;
48 import org.opendaylight.controller.topologymanager.TopologyUserLinkConfig;
50 public class TopologyManagerImplTest {
52 * Mockup of switch manager that only maintains existence of node
55 private final class TestSwitchManager implements ISwitchManager {
56 private final Set<Node> nodeSet = new HashSet<Node>();
57 private final Set<NodeConnector> nodeConnectorSet =
58 new HashSet<NodeConnector>();
60 private void addNodeConnectors(NodeConnector ... connectors) {
61 for (NodeConnector nc: connectors) {
63 nodeSet.add(nc.getNode());
64 nodeConnectorSet.add(nc);
69 private void addNodeConnectors(TopologyUserLinkConfig ... links) {
70 for (TopologyUserLinkConfig link: links) {
72 NodeConnector.fromString(link.getSrcNodeConnector());
74 NodeConnector.fromString(link.getDstNodeConnector());
75 addNodeConnectors(src, dst);
80 public Status addSubnet(SubnetConfig configObject) {
85 public Status removeSubnet(SubnetConfig configObject) {
90 public Status modifySubnet(SubnetConfig configObject) {
95 public Status removeSubnet(String name) {
100 public List<Switch> getNetworkDevices() {
105 public List<SubnetConfig> getSubnetsConfigList() {
110 public SubnetConfig getSubnetConfig(String subnet) {
115 public Subnet getSubnetByNetworkAddress(InetAddress networkAddress) {
120 public Status saveSwitchConfig() {
125 public Status addSpanConfig(SpanConfig configObject) {
130 public Status removeSpanConfig(SpanConfig cfgObject) {
135 public List<SpanConfig> getSpanConfigList() {
140 public List<NodeConnector> getSpanPorts(Node node) {
145 public void updateSwitchConfig(SwitchConfig cfgObject) {
149 public Status updateNodeConfig(SwitchConfig switchConfig) {
154 public Status removeNodeConfig(String nodeId) {
159 public SwitchConfig getSwitchConfig(String nodeId) {
164 public Status addPortsToSubnet(String name, List<String> nodeConnectors) {
169 public Status removePortsFromSubnet(String name, List<String> nodeConnectors) {
174 public Set<Node> getNodes() {
175 return new HashSet<Node>(nodeSet);
179 public Map<String, Property> getNodeProps(Node node) {
180 return new HashMap<String, Property>();
184 public Property getNodeProp(Node node, String propName) {
189 public void setNodeProp(Node node, Property prop) {
193 public Status removeNodeProp(Node node, String propName) {
198 public Status removeNodeAllProps(Node node) {
203 public Set<NodeConnector> getUpNodeConnectors(Node node) {
204 return getNodeConnectors(node);
208 public Set<NodeConnector> getNodeConnectors(Node node) {
209 Set<NodeConnector> set = new HashSet<NodeConnector>();
210 for (NodeConnector nc: nodeConnectorSet) {
211 if (nc.getNode().equals(node)) {
220 public Set<NodeConnector> getPhysicalNodeConnectors(Node node) {
221 return getNodeConnectors(node);
225 public Map<String, Property> getNodeConnectorProps(NodeConnector nodeConnector) {
226 return new HashMap<String, Property>();
230 public Property getNodeConnectorProp(NodeConnector nodeConnector, String propName) {
235 public Status addNodeConnectorProp(NodeConnector nodeConnector, Property prop) {
240 public Status removeNodeConnectorProp(NodeConnector nc, String propName) {
245 public Status removeNodeConnectorAllProps(NodeConnector nodeConnector) {
250 public NodeConnector getNodeConnector(Node node, String nodeConnectorName) {
255 public boolean isSpecial(NodeConnector p) {
256 String type = p.getType();
257 return (type.equals(NodeConnectorIDType.CONTROLLER)
258 || type.equals(NodeConnectorIDType.ALL)
259 || type.equals(NodeConnectorIDType.SWSTACK)
260 || type.equals(NodeConnectorIDType.HWPATH));
264 public Boolean isNodeConnectorEnabled(NodeConnector nodeConnector) {
265 if (doesNodeConnectorExist(nodeConnector)) {
268 return Boolean.FALSE;
272 public boolean doesNodeConnectorExist(NodeConnector nc) {
273 return (nc != null && nodeConnectorSet.contains(nc));
277 public byte[] getControllerMAC() {
282 public byte[] getNodeMAC(Node node) {
287 public Property createProperty(String propName, String propValue) {
292 public String getNodeDescription(Node node) {
297 public Status removeControllerProperty(String propertyName){
302 public Set<Switch> getConfiguredNotConnectedSwitches() {
303 // TODO Auto-generated method stub
308 public Map<String, Property> getControllerProperties() {
309 // TODO Auto-generated method stub
314 public Property getControllerProperty(String propertyName) {
315 // TODO Auto-generated method stub
320 public Status setControllerProperty(Property property) {
321 // TODO Auto-generated method stub
327 * Sets the node, edges and properties for edges here: Edge <SwitchId :
328 * NodeConnectorId> : <1:1>--><11:11>; <1:2>--><11:12>; <3:3>--><13:13>;
329 * <3:4>--><13:14>; <5:5>--><15:15>; <5:6>--><15:16>; Method used by two
330 * tests: testGetNodeEdges and testGetEdges
332 * @param topoManagerImpl
334 * @throws ConstructionException
336 public void setNodeEdges(TopologyManagerImpl topoManagerImpl, TestSwitchManager swMgr)
337 throws ConstructionException {
338 topoManagerImpl.nonClusterObjectCreate();
344 Set<Property> props = new HashSet<Property>();
345 state = new State(State.EDGE_UP);
346 bw = new Bandwidth(Bandwidth.BW100Gbps);
347 l = new Latency(Latency.LATENCY100ns);
352 for (short i = 1; i < 6; i = (short) (i + 2)) {
353 List<TopoEdgeUpdate> topoedgeupdateList = new ArrayList<TopoEdgeUpdate>();
354 NodeConnector headnc1 = NodeConnectorCreator.createOFNodeConnector(
355 i, NodeCreator.createOFNode((long) i));
356 NodeConnector tailnc1 = NodeConnectorCreator
357 .createOFNodeConnector((short) (i + 10),
358 NodeCreator.createOFNode((long) (i + 10)));
359 swMgr.addNodeConnectors(tailnc1, headnc1);
360 Edge e1 = new Edge(tailnc1, headnc1);
361 TopoEdgeUpdate teu1 = new TopoEdgeUpdate(e1, props,
363 topoedgeupdateList.add(teu1);
365 NodeConnector tailnc2 = NodeConnectorCreator.createOFNodeConnector(
366 (short) (i + 1), headnc1.getNode());
367 NodeConnector headnc2 = NodeConnectorCreator.createOFNodeConnector(
368 (short) (i + 11), tailnc1.getNode());
369 swMgr.addNodeConnectors(tailnc1, headnc2);
370 Edge e2 = new Edge(tailnc2, headnc2);
371 TopoEdgeUpdate teu2 = new TopoEdgeUpdate(e2, props,
373 topoedgeupdateList.add(teu2);
374 topoManagerImpl.edgeUpdate(topoedgeupdateList);
379 public void testGetNodeEdges() throws ConstructionException {
380 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
381 TestSwitchManager swMgr = new TestSwitchManager();
382 topoManagerImpl.setSwitchManager(swMgr);
383 setNodeEdges(topoManagerImpl, swMgr);
385 Map<Node, Set<Edge>> nodeEdgeMap = topoManagerImpl.getNodeEdges();
386 for (Iterator<Map.Entry<Node, Set<Edge>>> i = nodeEdgeMap.entrySet()
387 .iterator(); i.hasNext();) {
388 Map.Entry<Node, Set<Edge>> entry = i.next();
389 Node node = entry.getKey();
390 Long nodeId = ((Long) node.getID()).longValue();
391 Assert.assertTrue((node.getType().equals(NodeIDType.OPENFLOW)));
393 Set<Edge> edges = entry.getValue();
394 for (Edge edge : edges) {
395 Long headNcId = ((Short) edge.getHeadNodeConnector().getID())
397 Long tailNcId = ((Short) edge.getTailNodeConnector().getID())
400 (headNcId.equals(nodeId) && tailNcId.equals(nodeId + 10))
401 || (headNcId.equals(nodeId + 11) && tailNcId.equals(nodeId + 1))
402 || (headNcId.equals(nodeId + 1) && tailNcId.equals(nodeId - 9))
403 || (headNcId.equals(nodeId - 10) && tailNcId.equals(nodeId))
408 Assert.assertTrue(nodeEdgeMap.isEmpty());
412 public void testGetEdges() throws ConstructionException {
413 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
414 TestSwitchManager swMgr = new TestSwitchManager();
415 topoManagerImpl.setSwitchManager(swMgr);
416 setNodeEdges(topoManagerImpl, swMgr);
418 Map<Edge, Set<Property>> edgeProperty = topoManagerImpl.getEdges();
420 for (Iterator<Map.Entry<Edge, Set<Property>>> i = edgeProperty
421 .entrySet().iterator(); i.hasNext();) {
422 Map.Entry<Edge, Set<Property>> entry = i.next();
423 Edge e = entry.getKey();
424 NodeConnector headnc = e.getHeadNodeConnector();
425 NodeConnector tailnc = e.getTailNodeConnector();
427 Long headNodeId = (Long) headnc.getNode().getID();
429 Long headNcId = ((Short) headnc.getID()).longValue();
430 Long tailNcId = ((Short) tailnc.getID()).longValue();
432 if (headNodeId == 1 || headNodeId == 3 || headNodeId == 5) {
433 Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId
434 .equals(headNodeId + 10))
435 || (headNcId.equals(headNodeId + 10) && tailNcId
437 || (headNcId.equals(headNodeId + 1) && tailNcId
438 .equals(headNodeId + 11))
439 || (headNcId.equals(headNodeId + 11) && tailNcId
440 .equals(headNodeId + 1)));
441 } else if (headNodeId == 11 || headNodeId == 13 || headNodeId == 15) {
442 Assert.assertTrue((headNcId.equals(headNodeId) && tailNcId
443 .equals(headNodeId - 10))
444 || (headNcId.equals(headNodeId) && tailNcId
445 .equals(headNodeId - 10))
446 || (headNcId.equals(headNodeId - 9) && tailNcId
447 .equals(headNodeId + 1))
448 || (headNcId.equals(headNodeId + 1) && tailNcId
449 .equals(headNodeId - 9)));
452 Set<Property> prop = entry.getValue();
453 for (Property p : prop) {
456 if (p instanceof Bandwidth) {
457 Bandwidth b = (Bandwidth) p;
458 pName = Bandwidth.BandwidthPropName;
459 pValue = b.getValue();
460 Assert.assertTrue(pName.equals(p.getName())
461 && pValue == Bandwidth.BW100Gbps);
464 if (p instanceof Latency) {
465 Latency l = (Latency) p;
466 pName = Latency.LatencyPropName;
467 pValue = l.getValue();
468 Assert.assertTrue(pName.equals(p.getName())
469 && pValue == Latency.LATENCY100ns);
472 if (p instanceof State) {
473 State state = (State) p;
474 pName = State.StatePropName;
475 pValue = state.getValue();
476 Assert.assertTrue(pName.equals(p.getName())
477 && pValue == State.EDGE_UP);
483 Assert.assertTrue(edgeProperty.isEmpty());
487 public void testAddDeleteUserLink() {
488 TopologyUserLinkConfig link1 = new TopologyUserLinkConfig("default1",
489 "OF|1@OF|2", "OF|1@OF|3");
490 TopologyUserLinkConfig link2 = new TopologyUserLinkConfig("default1",
491 "OF|10@OF|20", "OF|10@OF|30");
492 TopologyUserLinkConfig link3 = new TopologyUserLinkConfig("default2",
493 "OF|1@OF|2", "OF|1@OF|3");
494 TopologyUserLinkConfig link4 = new TopologyUserLinkConfig("default20",
495 "OF|10@OF|20", "OF|10@OF|30");
497 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
498 TestSwitchManager swMgr = new TestSwitchManager();
499 topoManagerImpl.setSwitchManager(swMgr);
500 topoManagerImpl.nonClusterObjectCreate();
502 swMgr.addNodeConnectors(link1, link2, link3, link4);
504 Assert.assertTrue(topoManagerImpl.addUserLink(link1).isSuccess());
505 Assert.assertTrue(topoManagerImpl.addUserLink(link2).getCode() == StatusCode.CONFLICT);
506 Assert.assertTrue(topoManagerImpl.addUserLink(link3).getCode() == StatusCode.CONFLICT);
507 Assert.assertTrue(topoManagerImpl.addUserLink(link4).isSuccess());
509 Assert.assertTrue(topoManagerImpl.deleteUserLink(null).getCode() == StatusCode.BADREQUEST);
510 Assert.assertTrue(topoManagerImpl.deleteUserLink(link1.getName())
512 Assert.assertTrue(topoManagerImpl.deleteUserLink(link4.getName())
514 Assert.assertTrue(topoManagerImpl.getUserLinks().isEmpty());
516 TopologyUserLinkConfig badlink1 =
517 new TopologyUserLinkConfig("bad1", "OF|1@OF|4", "OF|1@OF|5");
518 TopologyUserLinkConfig badlink2 =
519 new TopologyUserLinkConfig("bad2", "OF|10@OF|7", "OF|7@OF|13");
520 Assert.assertEquals(StatusCode.NOTFOUND,
521 topoManagerImpl.addUserLink(badlink1).getCode());
522 Assert.assertEquals(StatusCode.NOTFOUND,
523 topoManagerImpl.addUserLink(badlink2).getCode());
527 public void testGetUserLink() {
528 TopologyUserLinkConfig[] link = new TopologyUserLinkConfig[5];
529 TopologyUserLinkConfig[] reverseLink = new TopologyUserLinkConfig[5];
530 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
531 TestSwitchManager swMgr = new TestSwitchManager();
532 topoManagerImpl.setSwitchManager(swMgr);
533 topoManagerImpl.nonClusterObjectCreate();
535 String name = "Test";
536 String srcSwitchId = null;
537 String srcNodeConnectorIDType = null;
538 String srcPort = null;
539 String srcNodeIDType = null;
540 String dstNodeIDType = null;
541 String dstSwitchId = null;
542 String dstNodeConnectorIDType = null;
543 String dstPort = null;
544 String srcNodeConnector = null;
545 String dstNodeConnector = null;
547 /* Creating userlinks and checking for their validity */
548 link[0] = new TopologyUserLinkConfig(name, srcNodeConnector, dstNodeConnector);
549 Assert.assertTrue(link[0].isValid() == false);
551 srcNodeConnector = "OF|1@OF|1";
552 link[0] = new TopologyUserLinkConfig(name, srcNodeConnector, dstNodeConnector);
553 Assert.assertTrue(link[0].isValid() == false);
555 dstNodeConnector = "OF|1@OF|2";
556 link[0] = new TopologyUserLinkConfig(name, srcNodeConnector, dstNodeConnector);
557 Assert.assertTrue(link[0].isValid() == true);
561 for (i = 0; i < 5; i++) {
562 link[i] = new TopologyUserLinkConfig();
564 name = Integer.toString(i + 1);
565 srcSwitchId = Integer.toString(i + 1);
566 srcPort = Integer.toString(i + 1);
567 dstSwitchId = Integer.toString((i + 1) * 10);
568 dstPort = Integer.toString((i + 1) * 10);
570 link[i].setName(name);
571 srcNodeConnectorIDType = dstNodeConnectorIDType = "INCORRECT";
572 srcNodeConnector = srcNodeConnectorIDType+"|"+srcSwitchId+"@"+srcNodeConnectorIDType+"|"+srcPort;
573 dstNodeConnector = dstNodeConnectorIDType+"|"+dstSwitchId+"@"+dstNodeConnectorIDType+"|"+dstPort;
575 link[i].setSrcNodeConnector(srcNodeConnector);
576 Assert.assertTrue(link[i].isValid() == false);
578 srcNodeConnectorIDType = "OF";
579 srcNodeConnector = srcNodeConnectorIDType+"|"+srcSwitchId+"@"+srcNodeConnectorIDType+"|"+srcPort;
580 link[i].setSrcNodeConnector(srcNodeConnector);
581 Assert.assertTrue(link[i].isValid() == false);
583 dstNodeConnectorIDType = "OF";
584 dstNodeConnector = dstNodeConnectorIDType+"|"+dstSwitchId+"@"+dstNodeConnectorIDType+"|"+dstPort;
585 link[i].setDstNodeConnector(dstNodeConnector);
586 Assert.assertTrue(link[i].isValid() == true);
588 reverseLink[i] = new TopologyUserLinkConfig(name, dstNodeConnector, srcNodeConnector);
590 Assert.assertEquals(StatusCode.NOTFOUND,
591 topoManagerImpl.addUserLink(link[i]).getCode());
592 swMgr.addNodeConnectors(link[i]);
593 Assert.assertTrue(topoManagerImpl.addUserLink(link[i]).isSuccess());
596 ConcurrentMap<String, TopologyUserLinkConfig> userLinks = topoManagerImpl
598 TopologyUserLinkConfig resultLink;
600 for (i = 0; i < 5; i++) {
601 resultLink = userLinks.get(((Integer) (i + 1)).toString());
603 Assert.assertTrue(resultLink.getName().equals(
604 reverseLink[i].getName()));
605 Assert.assertTrue(resultLink.getDstNodeConnector().equals(
606 reverseLink[i].getSrcNodeConnector()));
607 Assert.assertTrue(resultLink.getSrcNodeConnector().equals(
608 reverseLink[i].getDstNodeConnector()));
613 public void testHostLinkMethods() throws ConstructionException,
614 UnknownHostException {
615 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
616 TestSwitchManager swMgr = new TestSwitchManager();
617 topoManagerImpl.setSwitchManager(swMgr);
618 topoManagerImpl.nonClusterObjectCreate();
624 Set<Property> props = new HashSet<Property>();
625 state = new State(State.EDGE_UP);
626 bw = new Bandwidth(Bandwidth.BW100Gbps);
627 l = new Latency(Latency.LATENCY100ns);
634 Host[] h = new Host[5];
635 NodeConnector[] nc = new NodeConnector[5];
638 * Adding host, nodeConnector to hostsDB for the i = 0,1,2,3. No host
641 for (int i = 0; i < 5; i++) {
642 if (hostCounter < 4) {
643 ea = new EthernetAddress(new byte[] { (byte) 0x0, (byte) 0x0,
644 (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) i });
645 String stringIP = new StringBuilder().append(i + 1).append(".")
646 .append(i + 10).append(".").append(i + 20).append(".")
647 .append(i + 30).toString();
648 ip = InetAddress.getByName(stringIP);
649 h[hostCounter] = new Host(ea, ip);
651 h[hostCounter] = null;
654 nc[i] = NodeConnectorCreator.createOFNodeConnector((short) (i + 1),
655 NodeCreator.createOFNode((long) (i + 1)));
657 .updateHostLink(nc[i], h[i], UpdateType.ADDED, props);
660 for (int i = 0; i < 5; i++) {
661 Host host = topoManagerImpl.getHostAttachedToNodeConnector(nc[i]);
663 Assert.assertTrue(host == null);
665 Assert.assertTrue(host.equals(h[i]));
669 Set<NodeConnector> ncSet = topoManagerImpl.getNodeConnectorWithHost();
670 for (int i = 0; i < 5; i++) {
671 Assert.assertTrue(ncSet.remove(nc[i]));
673 Assert.assertTrue(ncSet.isEmpty());
677 public void testGetNodesWithNodeConnectorHost()
678 throws ConstructionException, UnknownHostException {
679 TopologyManagerImpl topoManagerImpl = new TopologyManagerImpl();
680 TestSwitchManager swMgr = new TestSwitchManager();
681 topoManagerImpl.setSwitchManager(swMgr);
682 topoManagerImpl.nonClusterObjectCreate();
688 Set<Property> props = new HashSet<Property>();
689 state = new State(State.EDGE_UP);
690 bw = new Bandwidth(Bandwidth.BW100Gbps);
691 l = new Latency(Latency.LATENCY100ns);
698 Host[] h = new Host[5];
699 NodeConnector[] nc = new NodeConnector[5];
702 * Adding host, nodeconnector, properties of edge to hostsDB for the
703 * first three nodes only
705 for (int i = 1; i < 6; i++) {
707 ea = new EthernetAddress(new byte[] { (byte) 0x0, (byte) 0x0,
708 (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) i });
709 String stringIP = new StringBuilder().append(i).append(".")
710 .append(i + 10).append(".").append(i + 20).append(".")
711 .append(i + 30).toString();
712 ip = InetAddress.getByName(stringIP);
713 h[hostCounter] = new Host(ea, ip);
715 h[hostCounter] = null;
718 nc[i - 1] = NodeConnectorCreator.createOFNodeConnector((short) i,
719 NodeCreator.createOFNode((long) i));
720 topoManagerImpl.updateHostLink(nc[i - 1], h[i - 1],
721 UpdateType.ADDED, props);
724 /* Get the nodes which have host connected to its nodeConnector */
725 Map<Node, Set<NodeConnector>> nodeNCmap = topoManagerImpl
726 .getNodesWithNodeConnectorHost();
727 for (int i = 1; i < 6; i++) {
728 Node node = nc[i - 1].getNode();
729 Set<NodeConnector> ncSet = nodeNCmap.get(nc[i - 1].getNode());
731 Assert.assertTrue(ncSet == nodeNCmap.remove(node));
734 Assert.assertTrue(nodeNCmap.isEmpty());