From cdd14ba56a3898e80e73e72a0605f9d63b8ca774 Mon Sep 17 00:00:00 2001 From: Chi-Vien Ly Date: Wed, 27 Mar 2013 11:39:20 -0700 Subject: [PATCH] This commit fixes the followings - Change routing.dijkstra_implementation to implement ITopologyManagerAware instead of IListenTopoUpdates - Correct the bundle bringup sequence using the init(), start() called by dependency manager - Add routing.dijkstra_implementation restartability through OSGI stop/start Change-Id: Ia624ab4ea51f4d35c5ffe31d14b1aed58ca123c3 Signed-off-by: Chi-Vien Ly --- .../routing/dijkstra_implementation/pom.xml | 7 +- .../internal/Activator.java | 12 ++- .../internal/DijkstraImplementation.java | 95 ++++++++++++++----- .../dijkstra_implementation/DijkstraTest.java | 3 + .../MaxThruputTest.java | 1 + .../internal/TopologyManagerImpl.java | 1 + 6 files changed, 92 insertions(+), 27 deletions(-) diff --git a/opendaylight/routing/dijkstra_implementation/pom.xml b/opendaylight/routing/dijkstra_implementation/pom.xml index 6c394cf5c9..e89beb8c36 100644 --- a/opendaylight/routing/dijkstra_implementation/pom.xml +++ b/opendaylight/routing/dijkstra_implementation/pom.xml @@ -26,11 +26,11 @@ org.slf4j, org.opendaylight.controller.sal.routing, org.opendaylight.controller.sal.core, - org.opendaylight.controller.sal.topology, org.opendaylight.controller.sal.utils, org.opendaylight.controller.sal.reader, org.apache.commons.collections15, org.opendaylight.controller.switchmanager, + org.opendaylight.controller.topologymanager, edu.uci.ics.jung.graph, edu.uci.ics.jung.algorithms.shortestpath, edu.uci.ics.jung.graph.util, @@ -61,6 +61,11 @@ switchmanager 0.4.0-SNAPSHOT + + org.opendaylight.controller + topologymanager + 0.4.0-SNAPSHOT + junit junit diff --git a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/Activator.java b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/Activator.java index 2137cda5b0..2ee1583af7 100644 --- a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/Activator.java +++ b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/Activator.java @@ -18,9 +18,10 @@ import org.slf4j.LoggerFactory; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; import org.opendaylight.controller.sal.routing.IListenRoutingUpdates; import org.opendaylight.controller.sal.routing.IRouting; -import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.switchmanager.ISwitchManager; import org.opendaylight.controller.sal.reader.IReadService; +import org.opendaylight.controller.topologymanager.ITopologyManager; +import org.opendaylight.controller.topologymanager.ITopologyManagerAware; public class Activator extends ComponentActivatorAbstractBase { protected static final Logger logger = LoggerFactory @@ -33,7 +34,6 @@ public class Activator extends ComponentActivatorAbstractBase { * */ public void init() { - logger.debug("routing.dijkstra_implementation INIT called!"); } /** @@ -76,8 +76,8 @@ public class Activator extends ComponentActivatorAbstractBase { if (imp.equals(DijkstraImplementation.class)) { // export the service Dictionary props = new Hashtable(); - props.put("salListenerName", "routing.Dijkstra"); - c.setInterface(new String[] { IListenTopoUpdates.class.getName(), + props.put("topoListenerName", "routing.Dijkstra"); + c.setInterface(new String[] { ITopologyManagerAware.class.getName(), IRouting.class.getName() }, props); // Now lets add a service dependency to make sure the @@ -91,6 +91,10 @@ public class Activator extends ComponentActivatorAbstractBase { ISwitchManager.class).setCallbacks("setSwitchManager", "unsetSwitchManager").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( + ITopologyManager.class).setCallbacks("setTopologyManager", + "unsetTopologyManager").setRequired(true)); + c.add(createContainerServiceDependency(containerName).setService( IReadService.class).setCallbacks("setReadService", "unsetReadService").setRequired(true)); diff --git a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java index 386b226567..77e6d95dc9 100644 --- a/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java +++ b/opendaylight/routing/dijkstra_implementation/src/main/java/org/opendaylight/controller/routing/dijkstra_implementation/internal/DijkstraImplementation.java @@ -25,12 +25,12 @@ import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.core.Path; import org.opendaylight.controller.sal.core.Property; import org.opendaylight.controller.sal.core.UpdateType; -import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType; import org.opendaylight.controller.sal.reader.IReadService; import org.opendaylight.controller.sal.routing.IListenRoutingUpdates; import org.opendaylight.controller.sal.routing.IRouting; -import org.opendaylight.controller.sal.topology.IListenTopoUpdates; import org.opendaylight.controller.switchmanager.ISwitchManager; +import org.opendaylight.controller.topologymanager.ITopologyManager; +import org.opendaylight.controller.topologymanager.ITopologyManagerAware; import edu.uci.ics.jung.algorithms.shortestpath.DijkstraShortestPath; import edu.uci.ics.jung.graph.Graph; @@ -39,6 +39,7 @@ import edu.uci.ics.jung.graph.util.EdgeType; import java.lang.Exception; import java.lang.IllegalArgumentException; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Map; @@ -48,7 +49,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.commons.collections15.Transformer; -public class DijkstraImplementation implements IRouting, IListenTopoUpdates { +public class DijkstraImplementation implements IRouting, ITopologyManagerAware { private static Logger log = LoggerFactory .getLogger(DijkstraImplementation.class); private ConcurrentMap> topologyBWAware; @@ -56,6 +57,7 @@ public class DijkstraImplementation implements IRouting, IListenTopoUpdates { DijkstraShortestPath mtp; //Max Throughput Path private Set routingAware; private ISwitchManager switchManager; + private ITopologyManager topologyManager; private IReadService readService; private static final long DEFAULT_LINK_SPEED = Bandwidth.BW1Gbps; @@ -64,7 +66,7 @@ public class DijkstraImplementation implements IRouting, IListenTopoUpdates { this.routingAware = new HashSet(); } if (this.routingAware != null) { - log.debug("Adding routingAware listener"); + log.debug("Adding routingAware listener: " + i); this.routingAware.add(i); } } @@ -81,19 +83,6 @@ public class DijkstraImplementation implements IRouting, IListenTopoUpdates { } } - @SuppressWarnings( { "unchecked", "rawtypes" }) - public DijkstraImplementation() { - this.topologyBWAware = (ConcurrentMap>) new ConcurrentHashMap(); - this.sptBWAware = (ConcurrentMap>) new ConcurrentHashMap(); - // Now create the default topology, which doesn't consider the - // BW, also create the corresponding Dijkstra calculation - Graph g = new SparseMultigraph(); - Short sZero = Short.valueOf((short) 0); - this.topologyBWAware.put(sZero, g); - this.sptBWAware.put(sZero, new DijkstraShortestPath(g)); - // Topologies for other BW will be added on a needed base - } - @Override public synchronized void initMaxThroughput( final Map EdgeWeightMap) { @@ -383,14 +372,66 @@ public class DijkstraImplementation implements IRouting, IListenTopoUpdates { } } - public void startUp() { - log.debug(this.getClass().getName() + ":startUp Method Called"); + /** + * Function called by the dependency manager when all the required + * dependencies are satisfied + * + */ + @SuppressWarnings({ "unchecked", "rawtypes" }) + public void init() { + log.debug("Routing init() is called"); + this.topologyBWAware = (ConcurrentMap>) new ConcurrentHashMap(); + this.sptBWAware = (ConcurrentMap>) new ConcurrentHashMap(); + // Now create the default topology, which doesn't consider the + // BW, also create the corresponding Dijkstra calculation + Graph g = new SparseMultigraph(); + Short sZero = Short.valueOf((short) 0); + this.topologyBWAware.put(sZero, g); + this.sptBWAware.put(sZero, new DijkstraShortestPath(g)); + // Topologies for other BW will be added on a needed base } - - public void shutDown() { - log.debug(this.getClass().getName() + ":shutDown Method Called"); + /** + * Function called by the dependency manager when at least one dependency + * become unsatisfied or when the component is shutting down because for + * example bundle is being stopped. + * + */ + void destroy() { + log.debug("Routing destroy() is called"); } + /** + * Function called by dependency manager after "init ()" is called + * and after the services provided by the class are registered in + * the service registry + * + */ + void start() { + log.debug("Routing start() is called"); + // build the routing database from the topology if it exists. + Map> edges = topologyManager.getEdges(); + if (edges.isEmpty()) { + return; + } + log.debug("Creating routing database from the topology"); + for (Iterator>> i = edges.entrySet().iterator(); i.hasNext();) { + Map.Entry> entry = i.next(); + Edge e = entry.getKey(); + Set props = entry.getValue(); + edgeUpdate(e, UpdateType.ADDED, props); + } + } + + /** + * Function called by the dependency manager before the services exported by + * the component are unregistered, this will be followed by a "destroy ()" + * calls + * + */ + public void stop() { + log.debug("Routing stop() is called"); + } + @Override public void edgeOverUtilized(Edge edge) { // TODO Auto-generated method stub @@ -422,4 +463,14 @@ public class DijkstraImplementation implements IRouting, IListenTopoUpdates { this.readService = null; } } + + public void setTopologyManager(ITopologyManager tm) { + this.topologyManager = tm; + } + + public void unsetTopologyManager(ITopologyManager tm) { + if (this.topologyManager == tm) { + this.topologyManager = null; + } + } } diff --git a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java index 45c75f1c06..2022601321 100644 --- a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java +++ b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/DijkstraTest.java @@ -34,6 +34,7 @@ public class DijkstraTest { @Test public void testSinglePathRouteNoBw() { DijkstraImplementation imp = new DijkstraImplementation(); + imp.init(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); @@ -84,6 +85,7 @@ public class DijkstraTest { @Test public void testShortestPathRouteNoBw() { DijkstraImplementation imp = new DijkstraImplementation(); + imp.init(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); @@ -149,6 +151,7 @@ public class DijkstraTest { @Test public void testShortestPathRouteNoBwAfterLinkDelete() { DijkstraImplementation imp = new DijkstraImplementation(); + imp.init(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); diff --git a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java index 1bab078959..77c55f3c10 100644 --- a/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java +++ b/opendaylight/routing/dijkstra_implementation/src/test/java/org/opendaylight/controller/routing/dijkstra_implementation/MaxThruputTest.java @@ -35,6 +35,7 @@ public class MaxThruputTest { @Test public void testMaxThruPut() { DijkstraImplementation imp = new DijkstraImplementation(); + imp.init(); Node node1 = NodeCreator.createOFNode((long) 1); Node node2 = NodeCreator.createOFNode((long) 2); Node node3 = NodeCreator.createOFNode((long) 3); diff --git a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java index 92d0c391d3..9d24cc6fa8 100644 --- a/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java +++ b/opendaylight/topologymanager/src/main/java/org/opendaylight/controller/topologymanager/internal/TopologyManagerImpl.java @@ -94,6 +94,7 @@ public class TopologyManagerImpl implements ITopologyManager, void setTopologyManagerAware(ITopologyManagerAware s) { if (this.topologyManagerAware != null) { + log.debug("Adding ITopologyManagerAware: " + s); this.topologyManagerAware.add(s); } } -- 2.36.6