From: Ed Warnicke Date: Wed, 25 Dec 2013 23:00:30 +0000 (-0800) Subject: Fixed topology-manager now that we have topology-lldp-discovery X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~144^2~1 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=c46646539ef09dd0997697b83e1892e5328e3407 Fixed topology-manager now that we have topology-lldp-discovery Change-Id: I4499d7c76322c0a4e78e51eed84a0ce1497b62cc Signed-off-by: Ed Warnicke --- diff --git a/opendaylight/distribution/opendaylight/pom.xml b/opendaylight/distribution/opendaylight/pom.xml index 4feeff873b..64872e9f11 100644 --- a/opendaylight/distribution/opendaylight/pom.xml +++ b/opendaylight/distribution/opendaylight/pom.xml @@ -139,6 +139,26 @@ topology-lldp-discovery ${mdsal.version} + + org.opendaylight.controller.md + topology-manager + ${mdsal.version} + + + org.opendaylight.controller.model + model-topology + 1.0-SNAPSHOT + + + org.opendaylight.yangtools.model + ietf-topology + 2013.07.12.2-SNAPSHOT + + + org.opendaylight.controller + sal-binding-util + 1.0-SNAPSHOT + org.opendaylight.controller.md statistics-manager diff --git a/opendaylight/md-sal/model/model-topology/src/main/yang/opendaylight-topology-inventory.yang b/opendaylight/md-sal/model/model-topology/src/main/yang/opendaylight-topology-inventory.yang index 33c03ba059..ceeef45f23 100644 --- a/opendaylight/md-sal/model/model-topology/src/main/yang/opendaylight-topology-inventory.yang +++ b/opendaylight/md-sal/model/model-topology/src/main/yang/opendaylight-topology-inventory.yang @@ -21,12 +21,14 @@ module opendaylight-topology-inventory { augment "/topo:network-topology/topo:topology/topo:node" { ext:augment-identifier "inventory-node"; - uses inv:node-context-ref; + leaf inventory-node-ref { + type inv:node-ref; + } } augment "/topo:network-topology/topo:topology/topo:node/topo:termination-point" { ext:augment-identifier "inventory-node-connector"; - leaf node-connector { + leaf inventory-node-connector-ref { ext:context-reference "inv:node-connector-context"; type inv:node-connector-ref; } diff --git a/opendaylight/md-sal/pom.xml b/opendaylight/md-sal/pom.xml index 1bd0603770..efc84237b5 100644 --- a/opendaylight/md-sal/pom.xml +++ b/opendaylight/md-sal/pom.xml @@ -50,6 +50,7 @@ inventory-manager statistics-manager + topology-manager forwardingrules-manager topology-lldp-discovery diff --git a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/TypeSafeDataReader.java b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/TypeSafeDataReader.java index 738a14a9bd..fd81af353c 100644 --- a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/TypeSafeDataReader.java +++ b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/TypeSafeDataReader.java @@ -7,7 +7,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public final class TypeSafeDataReader { - private final DataReader,DataObject> delegate; + private final DataReader,DataObject> delegate; @@ -16,7 +16,7 @@ public final class TypeSafeDataReader { } - public TypeSafeDataReader(DataReader, DataObject> delegate) { + public TypeSafeDataReader(DataReader, DataObject> delegate) { this.delegate = delegate; } @@ -32,7 +32,7 @@ public final class TypeSafeDataReader { return (D) delegate.readOperationalData(path); } - public static TypeSafeDataReader forReader(DataReader, DataObject> delegate) { + public static TypeSafeDataReader forReader(DataReader, DataObject> delegate) { return new TypeSafeDataReader(delegate); } } diff --git a/opendaylight/md-sal/topology-manager/pom.xml b/opendaylight/md-sal/topology-manager/pom.xml index 6e50f9ce73..76300864fd 100644 --- a/opendaylight/md-sal/topology-manager/pom.xml +++ b/opendaylight/md-sal/topology-manager/pom.xml @@ -42,7 +42,7 @@ org.opendaylight.controller.model - model-topology-view + model-topology 1.0-SNAPSHOT @@ -58,8 +58,8 @@ maven-bundle-plugin - org.opendaylight.controller.md.inventory.manager.InventoryActivator - org.opendaylight.controller.md.inventory.manager + org.opendaylight.md.controller.topology.manager.FlowCapableTopologyProvider + org.opendaylight.md.controller.topology.manager diff --git a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableNodeMapping.xtend b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableNodeMapping.xtend index 46f5d2b406..05f7fe1272 100644 --- a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableNodeMapping.xtend +++ b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableNodeMapping.xtend @@ -5,7 +5,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeCon import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.IdentifiableItem import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnector +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated @@ -14,6 +14,17 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology. import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.SourceBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.link.attributes.DestinationBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkBuilder +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.LinkKey +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.LinkId +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNode +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnector +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.topology.inventory.rev131030.InventoryNodeConnectorBuilder +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode class FlowCapableNodeMapping { @@ -29,12 +40,6 @@ class FlowCapableNodeMapping { (ref?.value?.path?.get(2) as IdentifiableItem).key } - static def TerminationPoint toTerminationPoint(NodeConnectorUpdated updated) { - val it = new TerminationPointBuilder - key = new TerminationPointKey(new TpId(updated.id)); - return it.build() - } - static def NodeId toToplogyNodeId(org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId nodeId) { return new NodeId(nodeId); } @@ -42,4 +47,36 @@ class FlowCapableNodeMapping { static def toTerminationPointId(NodeConnectorId id) { return new TpId(id); } + + static def toTopologyNode(NodeId nodeId,NodeRef invNodeRef) { + val nb = new NodeBuilder(); + nb.setNodeId(nodeId) + val inb = new InventoryNodeBuilder + inb.setInventoryNodeRef(invNodeRef) + nb.addAugmentation(InventoryNode,inb.build) + return nb.build(); + } + + static def toTerminationPoint(TpId id, NodeConnectorRef invNodeConnectorRef) { + val tpb = new TerminationPointBuilder + tpb.setTpId(id); + val incb = new InventoryNodeConnectorBuilder + incb.setInventoryNodeConnectorRef(invNodeConnectorRef) + tpb.addAugmentation(InventoryNodeConnector,incb.build()) + return tpb.build(); + } + + static def toTopologyLink(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.Link link) { + val sb = new SourceBuilder(); + sb.setSourceNode(link.source.nodeKey.id.toToplogyNodeId) + sb.setSourceTp(link.source.nodeConnectorKey.id.toTerminationPointId) + val db = new DestinationBuilder(); + db.setDestNode(link.destination.nodeKey.id.toToplogyNodeId) + db.setDestTp(link.destination.nodeConnectorKey.id.toTerminationPointId) + val lb = new LinkBuilder(); + lb.setSource(sb.build()) + lb.setDestination(db.build()); + lb.setLinkId(new LinkId(lb.source.sourceTp.value)) + return lb.build(); + } } diff --git a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyExporter.xtend b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyExporter.xtend index fb129e4710..de61daeae3 100644 --- a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyExporter.xtend +++ b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyExporter.xtend @@ -1,101 +1,132 @@ package org.opendaylight.md.controller.topology.manager +import com.google.common.collect.FluentIterable +import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader +import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction +import org.opendaylight.controller.sal.binding.api.data.DataProviderService +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryListener import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkDiscovered import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkOverutilized import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkRemoved import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.LinkUtilizationNormal -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemoved import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdated -import org.opendaylight.controller.sal.binding.api.data.DataProviderService +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TopologyId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.Topology -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyBuilder import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.TopologyKey -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NetworkTopology +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Node - import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.NodeKey -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.NodeId +import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPoint import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.node.TerminationPointKey -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.TpId -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier + import static extension org.opendaylight.md.controller.topology.manager.FlowCapableNodeMapping.* -import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction -import org.opendaylight.controller.md.sal.binding.util.TypeSafeDataReader -import com.google.common.collect.FluentIterable -import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev130712.network.topology.topology.Link class FlowCapableTopologyExporter implements // FlowTopologyDiscoveryListener, // OpendaylightInventoryListener // { - var TopologyKey topology; + var TopologyKey topology = new TopologyKey(new TopologyId("flow:1")); @Property var DataProviderService dataService; + + def start() { + val tb = new TopologyBuilder(); + tb.setKey(topology); + val path = InstanceIdentifier.builder(NetworkTopology).child(Topology,topology).toInstance; + val top = tb.build(); + val it = dataService.beginTransaction + putOperationalData(path,top); + commit() + } override onNodeRemoved(NodeRemoved notification) { - val invNodeKey = notification.nodeRef.nodeKey - val tpNodeId = invNodeKey.id.toToplogyNodeId() - val tpNodeInstance = notification.nodeRef.toNodeIdentifier() + val nodeId = notification.nodeRef.nodeKey.id.toToplogyNodeId() + val nodeInstance = notification.nodeRef.toNodeIdentifier() val it = dataService.beginTransaction - removeRuntimeData(tpNodeInstance); - removeAffectedLinks(tpNodeId) + removeOperationalData(nodeInstance); + removeAffectedLinks(it,nodeId) commit() } override onNodeUpdated(NodeUpdated notification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + val fcnu = notification.getAugmentation(FlowCapableNodeUpdated) + if(fcnu != null) { + val node = notification.id.toToplogyNodeId.toTopologyNode(notification.nodeRef) + val path = notification.id.toToplogyNodeId.nodePath; + val it = dataService.beginTransaction + putOperationalData(path, node); + commit() + } } override onNodeConnectorRemoved(NodeConnectorRemoved notification) { - val tpRef = notification.nodeConnectorRef.toTerminationPointIdentifier(); + val tpInstance = notification.nodeConnectorRef.toTerminationPointIdentifier; + val tpId = notification.nodeConnectorRef.nodeConnectorKey.id.toTerminationPointId; val it = dataService.beginTransaction - removeRuntimeData(tpRef); + removeOperationalData(tpInstance); + removeAffectedLinks(it,tpId) commit() } override onNodeConnectorUpdated(NodeConnectorUpdated notification) { - val nodeId = notification.nodeConnectorRef.nodeKey.id.toToplogyNodeId(); - val TerminationPoint point = notification.toTerminationPoint(); - val path = tpPath(nodeId, point.key.tpId); - - val it = dataService.beginTransaction - putRuntimeData(path, point); - commit() + val fcncu = notification.getAugmentation(FlowCapableNodeConnectorUpdated) + if(fcncu != null) { + val nodeId = notification.nodeConnectorRef.nodeKey.id.toToplogyNodeId; + val TerminationPoint point = notification.id.toTerminationPointId.toTerminationPoint(notification.nodeConnectorRef); + val path = tpPath(nodeId, point.key.tpId); + + val it = dataService.beginTransaction + putOperationalData(path, point); + commit() + } } override onLinkDiscovered(LinkDiscovered notification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + val link = notification.toTopologyLink; + val path = link.linkPath; + val it = dataService.beginTransaction + putOperationalData(path, link); + commit() } override onLinkOverutilized(LinkOverutilized notification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + // NOOP } override onLinkRemoved(LinkRemoved notification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") - + val path = notification.toTopologyLink.linkPath + val it = dataService.beginTransaction + removeOperationalData(path); + commit() } override onLinkUtilizationNormal(LinkUtilizationNormal notification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + // NOOP } def InstanceIdentifier toNodeIdentifier(NodeRef ref) { val invNodeKey = ref.nodeKey val nodeKey = new NodeKey(invNodeKey.id.toToplogyNodeId); - return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey). + return InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Node, nodeKey). toInstance; } @@ -107,7 +138,7 @@ OpendaylightInventoryListener // private def void removeAffectedLinks(DataModificationTransaction transaction, NodeId id) { val reader = TypeSafeDataReader.forReader(transaction) - val topologyPath = InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).toInstance; + val topologyPath = InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).toInstance; val topologyData = reader.readOperationalData(topologyPath); if (topologyData === null) { return; @@ -115,18 +146,52 @@ OpendaylightInventoryListener // val affectedLinkInstances = FluentIterable.from(topologyData.link).filter[ source.sourceNode == id || destination.destNode == id].transform [ // - InstanceIdentifier.builder().node(NetworkTopology).child(Topology, topology).child(Link, key).toInstance + InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Link, key).toInstance // ] for(affectedLink : affectedLinkInstances) { - transaction.removeRuntimeData(affectedLink); + transaction.removeOperationalData(affectedLink); } } + private def void removeAffectedLinks(DataModificationTransaction transaction, TpId id) { + val reader = TypeSafeDataReader.forReader(transaction) + val topologyPath = InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).toInstance; + val topologyData = reader.readOperationalData(topologyPath); + if (topologyData === null) { + return; + } + val affectedLinkInstances = FluentIterable.from(topologyData.link).filter[ + source.sourceTp == id || destination.destTp == id].transform [ + // + InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Link, key).toInstance + // + ] + for(affectedLink : affectedLinkInstances) { + transaction.removeOperationalData(affectedLink); + } + } + + private def InstanceIdentifier nodePath(NodeId nodeId) { + val nodeKey = new NodeKey(nodeId); + return InstanceIdentifier.builder(NetworkTopology) + .child(Topology, topology) + .child(Node, nodeKey) + .toInstance; + } + private def InstanceIdentifier tpPath(NodeId nodeId, TpId tpId) { val nodeKey = new NodeKey(nodeId); val tpKey = new TerminationPointKey(tpId) - return InstanceIdentifier.builder.node(NetworkTopology).child(Topology, topology).child(Node, nodeKey). + return InstanceIdentifier.builder(NetworkTopology).child(Topology, topology).child(Node, nodeKey). child(TerminationPoint, tpKey).toInstance; } + + private def InstanceIdentifier linkPath(Link link) { + val linkInstanceId = InstanceIdentifier.builder(NetworkTopology) + .child(Topology, topology) + .child(Link, link.key) + .toInstance; + return linkInstanceId; + } } diff --git a/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyProvider.xtend b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyProvider.xtend new file mode 100644 index 0000000000..036fe733aa --- /dev/null +++ b/opendaylight/md-sal/topology-manager/src/main/java/org/opendaylight/md/controller/topology/manager/FlowCapableTopologyProvider.xtend @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.md.controller.topology.manager + +import org.opendaylight.controller.sal.binding.api.NotificationProviderService +import org.opendaylight.controller.sal.binding.api.data.DataProviderService +import org.opendaylight.yangtools.concepts.Registration +import org.opendaylight.yangtools.yang.binding.NotificationListener +import org.slf4j.LoggerFactory +import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext + +class FlowCapableTopologyProvider extends AbstractBindingAwareProvider implements AutoCloseable { + + + + static val LOG = LoggerFactory.getLogger(FlowCapableTopologyProvider); + + @Property + DataProviderService dataService; + + @Property + NotificationProviderService notificationService; + + val FlowCapableTopologyExporter exporter = new FlowCapableTopologyExporter(); + + Registration listenerRegistration + + override close() { + LOG.info("FlowCapableTopologyProvider stopped."); + listenerRegistration?.close(); + } + + override onSessionInitiated(ProviderContext session) { + dataService = session.getSALService(DataProviderService) + notificationService = session.getSALService(NotificationProviderService) + exporter.setDataService(dataService); + exporter.start(); + listenerRegistration = notificationService.registerNotificationListener(exporter); + } + +} + +