From: Ed Warnicke Date: Wed, 15 Jan 2014 21:13:36 +0000 (+0000) Subject: Merge "increased test coverage" X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~86 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=edb3b76df1fa27594d5f9ee368d737576b0b38f8;hp=4a1ea7b3cd735982883a984338355a368f8f888a Merge "increased test coverage" --- diff --git a/opendaylight/appauth/pom.xml b/opendaylight/appauth/pom.xml index cba2bb89ba..f3a6a3bf4d 100644 --- a/opendaylight/appauth/pom.xml +++ b/opendaylight/appauth/pom.xml @@ -50,7 +50,7 @@ org.opendaylight.controller sal - 0.6.0-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/arphandler/pom.xml b/opendaylight/arphandler/pom.xml index e3576e6ed8..8d3df87c58 100644 --- a/opendaylight/arphandler/pom.xml +++ b/opendaylight/arphandler/pom.xml @@ -78,7 +78,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/clustering/services_implementation/pom.xml b/opendaylight/clustering/services_implementation/pom.xml index 90df7511e4..536fb7dd2e 100644 --- a/opendaylight/clustering/services_implementation/pom.xml +++ b/opendaylight/clustering/services_implementation/pom.xml @@ -142,7 +142,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.jboss.jbossts.jta diff --git a/opendaylight/clustering/stub/pom.xml b/opendaylight/clustering/stub/pom.xml index 8fe1a99a0d..26980e4ff5 100644 --- a/opendaylight/clustering/stub/pom.xml +++ b/opendaylight/clustering/stub/pom.xml @@ -53,7 +53,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/clustering/test/pom.xml b/opendaylight/clustering/test/pom.xml index 4c00ba0db1..e6f889c478 100644 --- a/opendaylight/clustering/test/pom.xml +++ b/opendaylight/clustering/test/pom.xml @@ -52,12 +52,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT equinoxSDK381 diff --git a/opendaylight/config/config-persister-directory-autodetect-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/autodetect/FileType.java b/opendaylight/config/config-persister-directory-autodetect-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/autodetect/FileType.java index 03654ebcb2..779a887924 100644 --- a/opendaylight/config/config-persister-directory-autodetect-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/autodetect/FileType.java +++ b/opendaylight/config/config-persister-directory-autodetect-adapter/src/main/java/org/opendaylight/controller/config/persist/storage/directory/autodetect/FileType.java @@ -23,6 +23,7 @@ enum FileType { plaintext, xml; public static final String XML_STORAGE_FIRST_LINE = "<" + ConfigSnapshot.SNAPSHOT_ROOT_ELEMENT_NAME + ">"; + private static final String XML_FILE_DEFINITION_LINE = " org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/configuration/implementation/pom.xml b/opendaylight/configuration/implementation/pom.xml index 498b3d4e93..db596bf346 100644 --- a/opendaylight/configuration/implementation/pom.xml +++ b/opendaylight/configuration/implementation/pom.xml @@ -52,7 +52,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -62,7 +62,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/configuration/integrationtest/pom.xml b/opendaylight/configuration/integrationtest/pom.xml index e18fe8c1ed..65d46c3e0a 100644 --- a/opendaylight/configuration/integrationtest/pom.xml +++ b/opendaylight/configuration/integrationtest/pom.xml @@ -35,7 +35,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/connectionmanager/api/pom.xml b/opendaylight/connectionmanager/api/pom.xml index 4471863c0d..ab0a32882e 100644 --- a/opendaylight/connectionmanager/api/pom.xml +++ b/opendaylight/connectionmanager/api/pom.xml @@ -45,7 +45,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/connectionmanager/implementation/pom.xml b/opendaylight/connectionmanager/implementation/pom.xml index 58b21eccb8..a3cbe51607 100644 --- a/opendaylight/connectionmanager/implementation/pom.xml +++ b/opendaylight/connectionmanager/implementation/pom.xml @@ -54,7 +54,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -64,7 +64,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/containermanager/api/pom.xml b/opendaylight/containermanager/api/pom.xml index f7e385c878..1ca905054b 100644 --- a/opendaylight/containermanager/api/pom.xml +++ b/opendaylight/containermanager/api/pom.xml @@ -54,7 +54,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/containermanager/implementation/pom.xml b/opendaylight/containermanager/implementation/pom.xml index 18ed78c37b..bd12bfc87d 100644 --- a/opendaylight/containermanager/implementation/pom.xml +++ b/opendaylight/containermanager/implementation/pom.xml @@ -62,7 +62,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -87,7 +87,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/containermanager/it.implementation/pom.xml b/opendaylight/containermanager/it.implementation/pom.xml index 3b86a797ca..ee1ef12c11 100644 --- a/opendaylight/containermanager/it.implementation/pom.xml +++ b/opendaylight/containermanager/it.implementation/pom.xml @@ -57,7 +57,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -67,7 +67,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/forwarding/staticrouting/pom.xml b/opendaylight/forwarding/staticrouting/pom.xml index f160cddaad..a0b7367acd 100644 --- a/opendaylight/forwarding/staticrouting/pom.xml +++ b/opendaylight/forwarding/staticrouting/pom.xml @@ -67,7 +67,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -86,7 +86,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/forwardingrulesmanager/api/pom.xml b/opendaylight/forwardingrulesmanager/api/pom.xml index 499b98c28a..afd3d0ba7c 100644 --- a/opendaylight/forwardingrulesmanager/api/pom.xml +++ b/opendaylight/forwardingrulesmanager/api/pom.xml @@ -78,7 +78,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/forwardingrulesmanager/implementation/pom.xml b/opendaylight/forwardingrulesmanager/implementation/pom.xml index 6b3f5347ad..ef69b49ca9 100644 --- a/opendaylight/forwardingrulesmanager/implementation/pom.xml +++ b/opendaylight/forwardingrulesmanager/implementation/pom.xml @@ -84,7 +84,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/hosttracker/api/pom.xml b/opendaylight/hosttracker/api/pom.xml index ea66c34fa3..bf2e360334 100644 --- a/opendaylight/hosttracker/api/pom.xml +++ b/opendaylight/hosttracker/api/pom.xml @@ -66,12 +66,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/hosttracker/implementation/pom.xml b/opendaylight/hosttracker/implementation/pom.xml index 258327cca7..78c4ae4160 100644 --- a/opendaylight/hosttracker/implementation/pom.xml +++ b/opendaylight/hosttracker/implementation/pom.xml @@ -129,12 +129,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/hosttracker_new/api/pom.xml b/opendaylight/hosttracker_new/api/pom.xml index d8b5a48435..ba3da5f764 100644 --- a/opendaylight/hosttracker_new/api/pom.xml +++ b/opendaylight/hosttracker_new/api/pom.xml @@ -65,12 +65,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/hosttracker_new/implementation/pom.xml b/opendaylight/hosttracker_new/implementation/pom.xml index 0405d45b6e..c5caa7f317 100644 --- a/opendaylight/hosttracker_new/implementation/pom.xml +++ b/opendaylight/hosttracker_new/implementation/pom.xml @@ -110,12 +110,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/md-sal/clustered-data-store/implementation/pom.xml b/opendaylight/md-sal/clustered-data-store/implementation/pom.xml index 9cbf35576f..62775c1eec 100644 --- a/opendaylight/md-sal/clustered-data-store/implementation/pom.xml +++ b/opendaylight/md-sal/clustered-data-store/implementation/pom.xml @@ -104,12 +104,12 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT junit diff --git a/opendaylight/md-sal/clustered-data-store/integrationtest/pom.xml b/opendaylight/md-sal/clustered-data-store/integrationtest/pom.xml index 176ab6cbe0..129e6ff5fc 100644 --- a/opendaylight/md-sal/clustered-data-store/integrationtest/pom.xml +++ b/opendaylight/md-sal/clustered-data-store/integrationtest/pom.xml @@ -71,12 +71,12 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.yangtools @@ -95,22 +95,22 @@ org.opendaylight.controller sal.implementation - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller containermanager - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT org.opendaylight.controller containermanager.it.implementation - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT org.opendaylight.controller clustering.stub - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/md-sal/compatibility/flow-management-compatibility/pom.xml b/opendaylight/md-sal/compatibility/flow-management-compatibility/pom.xml index 3c8bf97961..fd31e35859 100644 --- a/opendaylight/md-sal/compatibility/flow-management-compatibility/pom.xml +++ b/opendaylight/md-sal/compatibility/flow-management-compatibility/pom.xml @@ -77,7 +77,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/pom.xml b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/pom.xml index d9fb18f84d..1b510d0e0b 100644 --- a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/pom.xml +++ b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/pom.xml @@ -51,7 +51,7 @@ org.opendaylight.controller switchmanager - 0.6.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller @@ -98,7 +98,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/switchmanager/CompatibleSwitchManager.xtend b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/switchmanager/CompatibleSwitchManager.xtend index 62e767b8da..5d0e7e6fe7 100644 --- a/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/switchmanager/CompatibleSwitchManager.xtend +++ b/opendaylight/md-sal/compatibility/inventory-topology-compatibility/src/main/java/org/opendaylight/controller/md/compatibility/switchmanager/CompatibleSwitchManager.xtend @@ -286,4 +286,7 @@ class CompatibleSwitchManager extends ConfigurableSwitchManager implements ISwit throw new UnsupportedOperationException("TODO: auto-generated method stub") } + override getConfiguredNotConnectedSwitches() { + return null; } +} diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/pom.xml b/opendaylight/md-sal/compatibility/sal-compatibility/pom.xml index 5e52e3bb89..74193ea128 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/pom.xml +++ b/opendaylight/md-sal/compatibility/sal-compatibility/pom.xml @@ -33,7 +33,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT bundle diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ComponentActivator.xtend b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ComponentActivator.xtend index 2156a81787..3d19c98632 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ComponentActivator.xtend +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/ComponentActivator.xtend @@ -28,8 +28,10 @@ import org.opendaylight.controller.sal.utils.GlobalConstants import org.opendaylight.controller.sal.utils.INodeConnectorFactory import org.opendaylight.controller.sal.utils.INodeFactory import org.opendaylight.controller.clustering.services.IClusterGlobalServices +import org.opendaylight.controller.sal.packet.IPluginInDataPacketService import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService +import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.OpendaylightFlowStatisticsService import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.topology.discovery.rev130819.FlowTopologyDiscoveryService @@ -38,6 +40,7 @@ import org.osgi.framework.BundleContext import static org.opendaylight.controller.sal.compatibility.NodeMapping.* import org.opendaylight.controller.sal.compatibility.topology.TopologyProvider +import org.opendaylight.controller.sal.compatibility.adsal.DataPacketServiceAdapter class ComponentActivator extends ComponentActivatorAbstractBase implements BindingAwareConsumer { @@ -64,6 +67,10 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi @Property TopologyProvider tpProvider = new TopologyProvider() + @Property + DataPacketServiceAdapter dataPacketService = new DataPacketServiceAdapter() + + override protected init() { Node.NodeIDType.registerIDType(MD_SAL_TYPE, String); @@ -89,6 +96,7 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi // Data Packet Service subscribe.registerNotificationListener(inventory); + dataPacketService.delegate = session.getRpcService(PacketProcessingService) // Inventory Service inventory.dataService = session.getSALService(DataBrokerService); @@ -99,6 +107,8 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi inventory.dataProviderService = session.getSALService(DataProviderService) topology.dataService = session.getSALService(DataProviderService) tpProvider.dataService = session.getSALService(DataProviderService) + + tpProvider.start(); subscribe.registerNotificationListener(dataPacket) @@ -113,6 +123,14 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi configure(imp, c); } + override protected getImplementations() { + return Arrays.asList(dataPacketService) + } + + override protected configureInstance(Component c, Object imp, String containerName) { + instanceConfigure(imp, c, containerName); + } + private def dispatch configure(MDSalNodeFactory imp, Component it) { setInterface(INodeFactory.name, properties); } @@ -154,6 +172,14 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi } + private def dispatch instanceConfigure(DataPacketServiceAdapter imp, Component it, String containerName) { + setInterface(IPluginInDataPacketService.name, properties) + } + + private def dispatch instanceConfigure(ComponentActivator imp, Component it, String containerName) { + } + + private def dispatch configure(InventoryAndReadAdapter imp, Component it) { setInterface(Arrays.asList(IPluginInInventoryService.name, IPluginInReadService.name), properties) add( @@ -164,7 +190,7 @@ class ComponentActivator extends ComponentActivatorAbstractBase implements Bindi add( createServiceDependency() // .setService(IPluginOutInventoryService) // - .setCallbacks("setInventoryPublisher", "setInventoryPublisher") // + .setCallbacks("setInventoryPublisher", "unsetInventoryPublisher") // .setRequired(false)) add( createServiceDependency() // diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryAndReadAdapter.xtend b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryAndReadAdapter.xtend index 47a3d11325..21af047c3d 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryAndReadAdapter.xtend +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/InventoryAndReadAdapter.xtend @@ -3,6 +3,8 @@ package org.opendaylight.controller.sal.compatibility import java.util.ArrayList import java.util.Collections import java.util.List +import java.util.Set +import java.util.concurrent.CopyOnWriteArrayList; import org.opendaylight.controller.sal.binding.api.data.DataBrokerService import org.opendaylight.controller.sal.binding.api.data.DataProviderService import org.opendaylight.controller.sal.core.Edge @@ -93,15 +95,23 @@ class InventoryAndReadAdapter implements IPluginInReadService, @Property OpendaylightFlowTableStatisticsService flowTableStatisticsService; - @Property - IPluginOutInventoryService inventoryPublisher; - @Property FlowTopologyDiscoveryService topologyDiscovery; @Property - List statisticsPublisher = new ArrayList(); - + List statisticsPublisher = new CopyOnWriteArrayList(); + + @Property + List inventoryPublisher = new CopyOnWriteArrayList(); + + def setInventoryPublisher(IPluginOutInventoryService listener){ + inventoryPublisher.add(listener); + } + + def unsetInventoryPublisher(IPluginOutInventoryService listener){ + inventoryPublisher.remove(listener); + } + def setReadPublisher(IPluginOutReadService listener) { statisticsPublisher.add(listener); } @@ -330,7 +340,7 @@ class InventoryAndReadAdapter implements IPluginInReadService, override onNodeRemoved(NodeRemoved notification) { val properties = Collections.emptySet(); - inventoryPublisher.updateNode(notification.nodeRef.toADNode, UpdateType.REMOVED, properties); + publishNodeUpdate(notification.nodeRef.toADNode, UpdateType.REMOVED, properties); } override onNodeConnectorUpdated(NodeConnectorUpdated update) { @@ -341,7 +351,7 @@ class InventoryAndReadAdapter implements IPluginInReadService, var nodeConnector = update.nodeConnectorRef.toADNodeConnector - inventoryPublisher.updateNodeConnector(nodeConnector , updateType , update.toADNodeConnectorProperties); + publishNodeConnectorUpdate(nodeConnector , updateType , update.toADNodeConnectorProperties); } override onNodeUpdated(NodeUpdated notification) { @@ -351,7 +361,7 @@ class InventoryAndReadAdapter implements IPluginInReadService, if ( this._dataService.readOperationalData(identifier) == null ){ updateType = UpdateType.ADDED; } - inventoryPublisher.updateNode(notification.nodeRef.toADNode, updateType, notification.toADNodeProperties); + publishNodeUpdate(notification.nodeRef.toADNode, updateType, notification.toADNodeProperties); //Notify the listeners of IPluginOutReadService @@ -574,4 +584,17 @@ class InventoryAndReadAdapter implements IPluginInReadService, override getConfiguredNotConnectedNodes() { return Collections.emptySet(); } + + + private def publishNodeUpdate(Node node, UpdateType updateType, Set properties){ + for( publisher : inventoryPublisher){ + publisher.updateNode(node, updateType, properties); + } + } + + private def publishNodeConnectorUpdate(org.opendaylight.controller.sal.core.NodeConnector nodeConnector, UpdateType updateType, Set properties){ + for( publisher : inventoryPublisher){ + publisher.updateNodeConnector(nodeConnector, updateType, properties); + } + } } diff --git a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/DataPacketServiceAdapter.java b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/DataPacketServiceAdapter.java index aa67600124..edd3a27255 100644 --- a/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/DataPacketServiceAdapter.java +++ b/opendaylight/md-sal/compatibility/sal-compatibility/src/main/java/org/opendaylight/controller/sal/compatibility/adsal/DataPacketServiceAdapter.java @@ -3,7 +3,6 @@ package org.opendaylight.controller.sal.compatibility.adsal; import org.opendaylight.controller.sal.compatibility.NodeMapping; import org.opendaylight.controller.sal.packet.IPluginInDataPacketService; import org.opendaylight.controller.sal.packet.RawPacket; -import org.opendaylight.controller.sal.packet.RawPacket; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput; @@ -22,8 +21,12 @@ public class DataPacketServiceAdapter implements IPluginInDataPacketService { private TransmitPacketInput toTransmitPacketInput(RawPacket rawPacket) { TransmitPacketInputBuilder builderTPIB = new TransmitPacketInputBuilder(); - NodeConnectorRef egress = NodeMapping.toNodeConnectorRef(rawPacket.getOutgoingNodeConnector()); - NodeConnectorRef ingress = NodeMapping.toNodeConnectorRef(rawPacket.getIncomingNodeConnector()); + builderTPIB.setNode(NodeMapping.toNodeRef(rawPacket.getOutgoingNodeConnector().getNode())); + + NodeConnectorRef egress = rawPacket.getOutgoingNodeConnector() == null ? null : + NodeMapping.toNodeConnectorRef(rawPacket.getOutgoingNodeConnector()); + NodeConnectorRef ingress = rawPacket.getIncomingNodeConnector() == null ? null : + NodeMapping.toNodeConnectorRef(rawPacket.getIncomingNodeConnector()); byte[] payload = rawPacket.getPacketData(); builderTPIB.setEgress(egress); @@ -33,4 +36,14 @@ public class DataPacketServiceAdapter implements IPluginInDataPacketService { return builderTPIB.build(); } + public PacketProcessingService getDelegate() { + return delegate; + } + + public void setDelegate(PacketProcessingService delegate) { + this.delegate = delegate; + } + + + } diff --git a/opendaylight/md-sal/model/model-flow-base/pom.xml b/opendaylight/md-sal/model/model-flow-base/pom.xml index 1c21effd05..5e69548d9a 100644 --- a/opendaylight/md-sal/model/model-flow-base/pom.xml +++ b/opendaylight/md-sal/model/model-flow-base/pom.xml @@ -19,7 +19,7 @@ org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27.0 + 2013.08.27.1 ${project.groupId} diff --git a/opendaylight/md-sal/model/model-flow-management/pom.xml b/opendaylight/md-sal/model/model-flow-management/pom.xml index 1a0c37055b..db2c62d9af 100644 --- a/opendaylight/md-sal/model/model-flow-management/pom.xml +++ b/opendaylight/md-sal/model/model-flow-management/pom.xml @@ -29,7 +29,7 @@ org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27.0 + 2013.08.27.1 bundle diff --git a/opendaylight/md-sal/model/model-flow-service/pom.xml b/opendaylight/md-sal/model/model-flow-service/pom.xml index 6b8df6a4c8..c2e48b3df5 100644 --- a/opendaylight/md-sal/model/model-flow-service/pom.xml +++ b/opendaylight/md-sal/model/model-flow-service/pom.xml @@ -29,7 +29,7 @@ org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27.0 + 2013.08.27.1 bundle diff --git a/opendaylight/md-sal/model/model-flow-statistics/pom.xml b/opendaylight/md-sal/model/model-flow-statistics/pom.xml index 476c817c90..e95fe24f28 100644 --- a/opendaylight/md-sal/model/model-flow-statistics/pom.xml +++ b/opendaylight/md-sal/model/model-flow-statistics/pom.xml @@ -29,7 +29,7 @@ org.opendaylight.yangtools.model opendaylight-l2-types - 2013.08.27-SNAPSHOT + 2013.08.27.1-SNAPSHOT bundle diff --git a/opendaylight/md-sal/remoterpc-routingtable/implementation/pom.xml b/opendaylight/md-sal/remoterpc-routingtable/implementation/pom.xml index a788baf4c0..dedd318a0c 100644 --- a/opendaylight/md-sal/remoterpc-routingtable/implementation/pom.xml +++ b/opendaylight/md-sal/remoterpc-routingtable/implementation/pom.xml @@ -86,7 +86,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java index e20640d420..72c6b1d75d 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcConsumerRegistry.java @@ -7,7 +7,7 @@ import org.opendaylight.yangtools.yang.binding.RpcService; * version of RpcServices * */ -public interface RpcConsumerRegistry { +public interface RpcConsumerRegistry extends BindingAwareService { /** * Returns a session specific instance (implementation) of requested * YANG module implentation / service provided by consumer. diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java index 972e64faf6..cc764888cc 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/RpcProviderRegistry.java @@ -1,18 +1,22 @@ package org.opendaylight.controller.sal.binding.api; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; /** - * Interface defining provider's access to the Rpc Registry - * which could be used to register their implementations of service to the MD-SAL. + * Interface defining provider's access to the Rpc Registry which could be used + * to register their implementations of service to the MD-SAL. * * @author ttkacik - * + * */ -public interface RpcProviderRegistry extends RpcConsumerRegistry { +public interface RpcProviderRegistry extends // + RpcConsumerRegistry, // + RouteChangePublisher> { /** * Registers an global RpcService implementation. * @@ -25,12 +29,16 @@ public interface RpcProviderRegistry extends RpcConsumerRegistry { /** * - * Register an Routed RpcService where routing is determined on annotated (in YANG model) - * context-reference and value of annotated leaf. + * Register an Routed RpcService where routing is determined on annotated + * (in YANG model) context-reference and value of annotated leaf. * - * @param type Type of RpcService, use generated interface class, not your implementation clas - * @param implementation Implementation of RpcService - * @return Registration object for routed Rpc which could be used to close an + * @param type + * Type of RpcService, use generated interface class, not your + * implementation clas + * @param implementation + * Implementation of RpcService + * @return Registration object for routed Rpc which could be used to close + * an * * @throws IllegalStateException */ diff --git a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/mount/MountProviderService.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/mount/MountProviderService.java index d91a216baa..194c431ec0 100644 --- a/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/mount/MountProviderService.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/mount/MountProviderService.java @@ -1,18 +1,36 @@ package org.opendaylight.controller.sal.binding.api.mount; +import java.util.EventListener; + import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; /** - * Provider MountProviderService, this version allows access to MD-SAL - * services specific for this mountpoint and registration / provision of - * interfaces for mount point. + * Provider MountProviderService, this version allows access to MD-SAL services + * specific for this mountpoint and registration / provision of interfaces for + * mount point. * * @author ttkacik * */ -public interface MountProviderService extends MountInstance { +public interface MountProviderService extends MountService { + + @Override + public MountProviderInstance getMountPoint(InstanceIdentifier path); MountProviderInstance createMountPoint(InstanceIdentifier path); + + MountProviderInstance createOrGetMountPoint(InstanceIdentifier path); + + ListenerRegistration registerProvisionListener(MountProvisionListener listener); + + public interface MountProvisionListener extends EventListener { + + void onMountPointCreated(InstanceIdentifier path); + + void onMountPointRemoved(InstanceIdentifier path); + + } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcContextIdentifier.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcContextIdentifier.java similarity index 97% rename from opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcContextIdentifier.java rename to opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcContextIdentifier.java index 33569eb077..8437c18f09 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcContextIdentifier.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcContextIdentifier.java @@ -1,4 +1,4 @@ -package org.opendaylight.controller.sal.binding.spi; +package org.opendaylight.controller.sal.binding.api.rpc; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.binding.BaseIdentity; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRouter.java similarity index 98% rename from opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java rename to opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRouter.java index 621d048dfd..31fed62d87 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRouter.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRouter.java @@ -5,7 +5,7 @@ * 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.controller.sal.binding.spi; +package org.opendaylight.controller.sal.binding.api.rpc; import java.util.Set; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingContext.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingContext.java similarity index 82% rename from opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingContext.java rename to opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingContext.java index e3a7235652..db93766c3c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingContext.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingContext.java @@ -1,4 +1,4 @@ -package org.opendaylight.controller.sal.binding.spi; +package org.opendaylight.controller.sal.binding.api.rpc; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.RpcService; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingTable.java similarity index 96% rename from opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java rename to opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingTable.java index 4d9d51b133..cc800b6bbb 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RpcRoutingTable.java +++ b/opendaylight/md-sal/sal-binding-api/src/main/java/org/opendaylight/controller/sal/binding/api/rpc/RpcRoutingTable.java @@ -5,7 +5,7 @@ * 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.controller.sal.binding.spi; +package org.opendaylight.controller.sal.binding.api.rpc; import java.util.Map; diff --git a/opendaylight/md-sal/sal-binding-broker/pom.xml b/opendaylight/md-sal/sal-binding-broker/pom.xml index 1b0f78384f..29357c0432 100644 --- a/opendaylight/md-sal/sal-binding-broker/pom.xml +++ b/opendaylight/md-sal/sal-binding-broker/pom.xml @@ -163,6 +163,11 @@ sal-binding-api 1.0-SNAPSHOT + + org.opendaylight.controller + sal-binding-util + 1.0-SNAPSHOT + org.slf4j slf4j-api diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java index c46b0dd6b4..cd45f2c8b2 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/BindingBrokerImplModule.java @@ -1,48 +1,85 @@ /** -* Generated file + * Generated file -* Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-broker-impl -* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator -* Generated at: Wed Nov 20 17:33:01 CET 2013 -* -* Do not modify this file unless it is present under src/main directory -*/ + * Generated from: yang module name: opendaylight-sal-binding-broker-impl yang module local name: binding-broker-impl + * Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator + * Generated at: Wed Nov 20 17:33:01 CET 2013 + * + * Do not modify this file unless it is present under src/main directory + */ package org.opendaylight.controller.config.yang.md.sal.binding.impl; -import org.opendaylight.controller.sal.binding.impl.BindingAwareBrokerImpl; +import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; +import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker; +import org.opendaylight.controller.sal.binding.impl.RpcProviderRegistryImpl; +import org.opendaylight.controller.sal.binding.impl.forward.DomForwardedBindingBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.forward.DomForwardingUtils; import org.osgi.framework.BundleContext; -import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.MoreExecutors; /** * */ -public final class BindingBrokerImplModule extends org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule { +public final class BindingBrokerImplModule extends + org.opendaylight.controller.config.yang.md.sal.binding.impl.AbstractBindingBrokerImplModule { private BundleContext bundleContext; - public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { + public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { super(identifier, dependencyResolver); } - public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, BindingBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { + public BindingBrokerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, + org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, + BindingBrokerImplModule oldModule, java.lang.AutoCloseable oldInstance) { super(identifier, dependencyResolver, oldModule, oldInstance); } @Override - public void validate(){ + public void validate() { super.validate(); } @Override public java.lang.AutoCloseable createInstance() { - BindingAwareBrokerImpl broker = new BindingAwareBrokerImpl(getIdentifier().getInstanceName(),getBundleContext()); - broker.setDataBroker(getDataBrokerDependency()); - broker.setNotifyBroker(getNotificationServiceDependency()); + + RootBindingAwareBroker broker; + if (DomForwardingUtils.isDomForwardedBroker(getDataBrokerDependency())) { + broker = createForwardedBroker(); + } else { + broker = createStandaloneBroker(); + } broker.start(); return broker; } + private RootBindingAwareBroker createStandaloneBroker() { + RootBindingAwareBroker broker = new RootBindingAwareBroker(getIdentifier().getInstanceName()); + + broker.setDataBroker(getDataBrokerDependency()); + broker.setNotificationBroker(getNotificationServiceDependency()); + broker.setRpcBroker(new RpcProviderRegistryImpl(broker.getIdentifier())); + return broker; + } + + private RootBindingAwareBroker createForwardedBroker() { + DomForwardedBindingBrokerImpl broker = new DomForwardedBindingBrokerImpl(getIdentifier().getInstanceName()); + + broker.setDataBroker(getDataBrokerDependency()); + broker.setNotificationBroker(getNotificationServiceDependency()); + broker.setRpcBroker(new RpcProviderRegistryImpl(broker.getIdentifier())); + + broker.getMountManager().setDataCommitExecutor(SingletonHolder.getDefaultCommitExecutor()); + broker.getMountManager().setNotificationExecutor(SingletonHolder.getDefaultNotificationExecutor()); + + + DomForwardingUtils.reuseForwardingFrom(broker, broker.getDataBroker()); + broker.startForwarding(); + return broker; + } + public BundleContext getBundleContext() { return bundleContext; } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java index 01dc6b8c0c..185b37bab5 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/DataBrokerImplModule.java @@ -13,12 +13,16 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; -import org.opendaylight.controller.config.yang.md.sal.binding.statistics.DataBrokerRuntimeMXBeanImpl; import org.opendaylight.controller.md.sal.common.impl.routing.AbstractDataReadRouter; +import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.RootDataBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService; +import org.opendaylight.controller.sal.binding.impl.forward.DomForwardedDataBrokerImpl; import org.opendaylight.controller.sal.core.api.Broker; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; import org.opendaylight.controller.sal.core.api.data.DataProviderService; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -52,25 +56,38 @@ public final class DataBrokerImplModule extends @Override public java.lang.AutoCloseable createInstance() { - DataBrokerRuntimeMXBeanImpl dataBindingBroker = new DataBrokerRuntimeMXBeanImpl(); + RootDataBrokerImpl dataBindingBroker; - // FIXME: obtain via dependency management - ExecutorService executor = Executors.newCachedThreadPool(); - ExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); - dataBindingBroker.setExecutor(listeningExecutor); - - Broker domBroker = getDomBrokerDependency(); - BindingIndependentMappingService mappingService = getMappingServiceDependency(); - if (domBroker != null && mappingService != null) { - BindingIndependentConnector runtimeMapping = new BindingIndependentConnector(); - runtimeMapping.setMappingService(mappingService); - runtimeMapping.setBaDataService(dataBindingBroker); - domBroker.registerProvider(runtimeMapping, getBundleContext()); + ExecutorService listeningExecutor = SingletonHolder.getDefaultCommitExecutor(); + + if (getDomBrokerDependency() != null && getMappingServiceDependency() != null) { + + dataBindingBroker = createDomConnectedBroker(listeningExecutor); + } else { + dataBindingBroker = createStandAloneBroker(listeningExecutor); } - getRootRuntimeBeanRegistratorWrapper().register(dataBindingBroker); + dataBindingBroker.registerRuntimeBean(getRootRuntimeBeanRegistratorWrapper()); + return dataBindingBroker; } + private RootDataBrokerImpl createStandAloneBroker(ExecutorService listeningExecutor) { + RootDataBrokerImpl broker = new RootDataBrokerImpl(); + broker.setExecutor(listeningExecutor); + return broker; + } + + private RootDataBrokerImpl createDomConnectedBroker(ExecutorService listeningExecutor) { + DomForwardedDataBrokerImpl forwardedBroker = new DomForwardedDataBrokerImpl(); + forwardedBroker.setExecutor(listeningExecutor); + BindingIndependentConnector connector = BindingDomConnectorDeployer.createConnector(getMappingServiceDependency()); + getDomBrokerDependency().registerProvider(forwardedBroker, getBundleContext()); + ProviderSession domContext = forwardedBroker.getDomProviderContext(); + forwardedBroker.setConnector(connector); + forwardedBroker.setDomProviderContext(domContext); + forwardedBroker.startForwarding(); + return forwardedBroker; + } public BundleContext getBundleContext() { return bundleContext; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java index e4f74deb4b..644860595e 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/impl/NotificationBrokerImplModule.java @@ -13,6 +13,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; +import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; import org.opendaylight.controller.sal.binding.impl.NotificationBrokerImpl; import com.google.common.util.concurrent.ListeningExecutorService; @@ -43,8 +44,7 @@ public final class NotificationBrokerImplModule extends @Override public java.lang.AutoCloseable createInstance() { - ExecutorService executor = Executors.newFixedThreadPool(5); - ListeningExecutorService listeningExecutor = MoreExecutors.listeningDecorator(executor); + ListeningExecutorService listeningExecutor = SingletonHolder.getDefaultNotificationExecutor(); NotificationBrokerImpl broker = new NotificationBrokerImpl(listeningExecutor); return broker; } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/statistics/DataBrokerRuntimeMXBeanImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/statistics/DataBrokerRuntimeMXBeanImpl.java deleted file mode 100644 index 5da084e9bd..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/config/yang/md/sal/binding/statistics/DataBrokerRuntimeMXBeanImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.opendaylight.controller.config.yang.md.sal.binding.statistics; - -import org.opendaylight.controller.config.yang.md.sal.binding.impl.Data; -import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplRuntimeMXBean; -import org.opendaylight.controller.config.yang.md.sal.binding.impl.Transactions; -import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl; - -public class DataBrokerRuntimeMXBeanImpl extends DataBrokerImpl implements DataBrokerImplRuntimeMXBean { - - private final Transactions transactions = new Transactions(); - private final Data data = new Data(); - - public Transactions getTransactions() { - transactions.setCreated(getCreatedTransactionsCount().get()); - transactions.setSubmitted(getSubmittedTransactionsCount().get()); - transactions.setSuccessful(getFinishedTransactionsCount().get()); - transactions.setFailed(getFailedTransactionsCount().get()); - return transactions; - } - - @Override - public Data getData() { - transactions.setCreated(getCreatedTransactionsCount().get()); - transactions.setSubmitted(getSubmittedTransactionsCount().get()); - transactions.setSuccessful(getFinishedTransactionsCount().get()); - transactions.setFailed(getFailedTransactionsCount().get()); - data.setTransactions(transactions); - return data; - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java index 7789a06fe8..8aff12b44a 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/RuntimeCodeGenerator.java @@ -7,8 +7,8 @@ */ package org.opendaylight.controller.sal.binding.codegen; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; -import org.opendaylight.controller.sal.binding.spi.RpcRouter; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.annotations.RoutingContext; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java index 8b2db8b13c..d976a0cec9 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRouterCodegenInstance.java @@ -3,7 +3,8 @@ package org.opendaylight.controller.sal.binding.codegen.impl; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; -import org.opendaylight.controller.sal.binding.spi.RpcRouter; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -13,7 +14,6 @@ import java.util.Map; import java.util.Set; import java.util.HashMap; -import org.opendaylight.controller.sal.binding.spi.RpcRoutingTable; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.RpcImplementation; import org.opendaylight.controller.md.sal.common.api.routing.MutableRoutingTable; @@ -147,7 +147,6 @@ public class RpcRouterCodegenInstance implements // @Override public void unregisterPath(Class context, InstanceIdentifier path) { routingTables.get(context).removeRoute(path, getInstance()); - } @Override diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java index 808358fb35..76318ae843 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/RpcRoutingTableImpl.java @@ -1,6 +1,6 @@ package org.opendaylight.controller.sal.binding.codegen.impl; -import org.opendaylight.controller.sal.binding.spi.RpcRoutingTable; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; import org.opendaylight.yangtools.yang.binding.BaseIdentity; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java index 266293fb6d..446a9caf8e 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/codegen/impl/SingletonHolder.java @@ -1,14 +1,49 @@ package org.opendaylight.controller.sal.binding.codegen.impl; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; + import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator; import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; +import com.google.common.util.concurrent.ListeningExecutorService; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.common.util.concurrent.ThreadFactoryBuilder; + import javassist.ClassPool; public class SingletonHolder { - public static final ClassPool CLASS_POOL = new ClassPool(); - public static final org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator RPC_GENERATOR_IMPL = new org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator(CLASS_POOL); + public static final ClassPool CLASS_POOL = new ClassPool(); + public static final org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator RPC_GENERATOR_IMPL = new org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator( + CLASS_POOL); public static final RuntimeCodeGenerator RPC_GENERATOR = RPC_GENERATOR_IMPL; public static final NotificationInvokerFactory INVOKER_FACTORY = RPC_GENERATOR_IMPL.getInvokerFactory(); + private static ListeningExecutorService NOTIFICATION_EXECUTOR = null; + private static ListeningExecutorService COMMIT_EXECUTOR = null; + + public static synchronized final ListeningExecutorService getDefaultNotificationExecutor() { + if (NOTIFICATION_EXECUTOR == null) { + NOTIFICATION_EXECUTOR = createNamedExecutor("md-sal-binding-notification-%d"); + } + return NOTIFICATION_EXECUTOR; + } + + public static synchronized final ListeningExecutorService getDefaultCommitExecutor() { + if (COMMIT_EXECUTOR == null) { + COMMIT_EXECUTOR = createNamedExecutor("md-sal-binding-commit-%d"); + } + + return COMMIT_EXECUTOR; + } + + private static ListeningExecutorService createNamedExecutor(String format) { + ThreadFactory factory = new ThreadFactoryBuilder().setDaemon(true).setNameFormat(format).build(); + ExecutorService executor = Executors.newCachedThreadPool(factory); + return MoreExecutors.listeningDecorator(executor); + + } + } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend deleted file mode 100644 index b4bf3f5a83..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/BindingAwareBrokerImpl.xtend +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.controller.sal.binding.impl - -import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer -import org.opendaylight.controller.sal.binding.api.BindingAwareProvider -import org.osgi.framework.BundleContext -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker -import org.opendaylight.controller.sal.binding.api.NotificationProviderService -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier -import org.opendaylight.yangtools.yang.binding.DataObject -import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener -import org.opendaylight.controller.sal.binding.spi.RpcContextIdentifier -import org.opendaylight.controller.sal.binding.api.data.DataProviderService -import org.slf4j.LoggerFactory - -class BindingAwareBrokerImpl extends RpcProviderRegistryImpl implements BindingAwareBroker, AutoCloseable { - private static val log = LoggerFactory.getLogger(BindingAwareBrokerImpl) - - private InstanceIdentifier root = InstanceIdentifier.builder().toInstance(); - - @Property - private var NotificationProviderService notifyBroker - - @Property - private var DataProviderService dataBroker - - @Property - var BundleContext brokerBundleContext - - public new(String name,BundleContext bundleContext) { - super(name); - _brokerBundleContext = bundleContext; - } - - def start() { - log.info("Starting MD-SAL: Binding Aware Broker"); - } - - - - override registerConsumer(BindingAwareConsumer consumer, BundleContext bundleCtx) { - val ctx = consumer.createContext(bundleCtx) - consumer.onSessionInitialized(ctx) - return ctx - } - - override registerProvider(BindingAwareProvider provider, BundleContext bundleCtx) { - val ctx = provider.createContext(bundleCtx) - provider.onSessionInitialized(ctx) - provider.onSessionInitiated(ctx as ProviderContext) - return ctx - } - - private def createContext(BindingAwareConsumer consumer, BundleContext consumerCtx) { - new OsgiConsumerContext(consumerCtx, this) - } - - private def createContext(BindingAwareProvider provider, BundleContext providerCtx) { - new OsgiProviderContext(providerCtx, this) - } - - override >> registerRouteChangeListener(L listener) { - super.registerRouteChangeListener(listener) - } - - override close() throws Exception { - - } -} \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java index 5db522f56c..0069de9802 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/DataBrokerImpl.java @@ -3,7 +3,7 @@ package org.opendaylight.controller.sal.binding.impl; import java.util.Set; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicLong; - + import org.opendaylight.controller.md.sal.common.impl.service.AbstractDataBroker; import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; @@ -11,12 +11,13 @@ import org.opendaylight.controller.sal.binding.impl.util.BindingAwareDataReaderR import org.opendaylight.controller.sal.common.DataStoreIdentifier; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.DataRoot; +import org.opendaylight.yangtools.yang.binding.Identifiable; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; -public class DataBrokerImpl extends AbstractDataBroker, DataObject, DataChangeListener> implements - DataProviderService, AutoCloseable { +public class DataBrokerImpl extends AbstractDataBroker, DataObject, DataChangeListener> // + implements DataProviderService, AutoCloseable { private final AtomicLong nextTransaction = new AtomicLong(); private final AtomicLong createdTransactionsCount = new AtomicLong(); @@ -114,7 +115,6 @@ public class DataBrokerImpl extends AbstractDataBroker, BindingMountPointImpl> mountPoints; + private final ListenerRegistry listeners = ListenerRegistry.create(); + + private ListeningExecutorService notificationExecutor; + private ListeningExecutorService dataCommitExecutor; + + public MountPointManagerImpl() { + mountPoints = new ConcurrentHashMap<>(); + } + + public ListeningExecutorService getNotificationExecutor() { + return notificationExecutor; + } + + public void setNotificationExecutor(ListeningExecutorService notificationExecutor) { + this.notificationExecutor = notificationExecutor; + } + + public ListeningExecutorService getDataCommitExecutor() { + return dataCommitExecutor; + } + + public void setDataCommitExecutor(ListeningExecutorService dataCommitExecutor) { + this.dataCommitExecutor = dataCommitExecutor; + } + + @Override + public synchronized BindingMountPointImpl createMountPoint(InstanceIdentifier path) { + BindingMountPointImpl potential = mountPoints.get(path); + if (potential != null) { + throw new IllegalStateException("Mount point already exists."); + } + return createOrGetMountPointImpl(path); + } + + @Override + public BindingMountPointImpl createOrGetMountPoint(InstanceIdentifier path) { + BindingMountPointImpl potential = getMountPoint(path); + if (potential != null) { + return potential; + } + return createOrGetMountPointImpl(path); + } + + @Override + public BindingMountPointImpl getMountPoint(InstanceIdentifier path) { + return mountPoints.get(path); + } + + private synchronized BindingMountPointImpl createOrGetMountPointImpl(InstanceIdentifier path) { + BindingMountPointImpl potential = getMountPoint(path); + if (potential != null) { + return potential; + } + RpcProviderRegistryImpl rpcRegistry = new RpcProviderRegistryImpl("mount"); + NotificationBrokerImpl notificationBroker = new NotificationBrokerImpl(); + notificationBroker.setExecutor(getNotificationExecutor()); + DataBrokerImpl dataBroker = new DataBrokerImpl(); + dataBroker.setExecutor(getDataCommitExecutor()); + BindingMountPointImpl mountInstance = new BindingMountPointImpl(path, rpcRegistry, notificationBroker, + dataBroker); + mountPoints.putIfAbsent(path, mountInstance); + notifyMountPointCreated(path); + return mountInstance; + } + + private void notifyMountPointCreated(InstanceIdentifier path) { + for (ListenerRegistration listener : listeners) { + try { + listener.getInstance().onMountPointCreated(path); + } catch (Exception e) { + LOG.error("Unhandled exception during invoking listener.", e); + } + } + } + + @Override + public ListenerRegistration registerProvisionListener(MountProvisionListener listener) { + return listeners.register(listener); + } + + public class BindingMountPointImpl extends + AbstractBindingSalProviderInstance + implements MountProviderInstance { + + private InstanceIdentifier identifier; + + public BindingMountPointImpl(org.opendaylight.yangtools.yang.binding.InstanceIdentifier identifier, + RpcProviderRegistryImpl rpcRegistry, NotificationBrokerImpl notificationBroker, + DataBrokerImpl dataBroker) { + super(rpcRegistry, notificationBroker, dataBroker); + this.identifier = identifier; + } + + @Override + public InstanceIdentifier getIdentifier() { + return this.identifier; + } + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend index b0939a043f..b4fd6b6771 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/NotificationBrokerImpl.xtend @@ -175,6 +175,7 @@ class NotifyTask implements Callable { private static val log = LoggerFactory.getLogger(NotifyTask); + @SuppressWarnings("rawtypes") val NotificationListener listener; val Notification notification; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiConsumerContext.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiConsumerContext.xtend deleted file mode 100644 index 644c50b86a..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiConsumerContext.xtend +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.controller.sal.binding.impl; - -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; -import org.opendaylight.controller.sal.binding.api.BindingAwareService; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.osgi.framework.BundleContext; -import org.osgi.framework.InvalidSyntaxException; -import org.osgi.framework.ServiceReference; -import org.slf4j.LoggerFactory -import static org.opendaylight.controller.sal.binding.impl.osgi.Constants.* - -class OsgiConsumerContext implements ConsumerContext { - - static val log = LoggerFactory.getLogger(OsgiConsumerContext) - protected val BundleContext bundleContext; - protected val BindingAwareBrokerImpl broker; - - new(BundleContext ctx, BindingAwareBrokerImpl broker) { - this.bundleContext = ctx; - this.broker = broker; - } - - override def getSALService(Class service) { - - // SAL Services are global - var ref = bundleContext.getServiceReference(service); - return bundleContext.getService(ref) as T; - } - - override def T getRpcService(Class module) { - try { - - val services = bundleContext.getServiceReferences(module, getProxyFilter()); - - // Proxy service found / using first implementation - // FIXME: Add advanced logic to retrieve service with right set of models - if (false == services.empty) { - val ref = services.iterator().next() as ServiceReference; - return bundleContext.getService(ref) as T; - } else { - return broker.getRpcService(module); - } - } catch (InvalidSyntaxException e) { - log.error("Created filter was invalid:", e.message, e) - } - return null; - - } - - private def getProxyFilter() { - return '''(«SAL_SERVICE_TYPE»=«SAL_SERVICE_TYPE_CONSUMER_PROXY»)''' - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend deleted file mode 100644 index d1ec35157f..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/OsgiProviderContext.xtend +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.controller.sal.binding.impl; - -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Map; - -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; -import org.opendaylight.yangtools.yang.binding.RpcService; -import org.osgi.framework.BundleContext; - -import static org.opendaylight.controller.sal.binding.impl.osgi.Constants.*; -import static extension org.opendaylight.controller.sal.binding.impl.osgi.PropertiesUtils.*; -import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration -import org.opendaylight.yangtools.yang.binding.InstanceIdentifier -import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality -import static com.google.common.base.Preconditions.* - -class OsgiProviderContext extends OsgiConsumerContext implements ProviderContext { - - @Property - val Map, RpcRegistration> registeredServices - - new(BundleContext ctx, BindingAwareBrokerImpl broker) { - super(ctx, broker); - _registeredServices = new HashMap(); - } - - override addRpcImplementation(Class type, T implementation) { - val salReg = broker.addRpcImplementation(type, implementation) - registeredServices.put(type, salReg) - return salReg; - } - - override addRoutedRpcImplementation(Class type, T implementation) throws IllegalStateException { - val salReg = broker.addRoutedRpcImplementation(type, implementation) - registeredServices.put(type, salReg) - return salReg; - } - - override registerFunctionality(ProviderFunctionality functionality) { - // NOOP for now - } - - override unregisterFunctionality(ProviderFunctionality functionality) { - // NOOP for now - } -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java new file mode 100644 index 0000000000..35c2bee646 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootBindingAwareBroker.java @@ -0,0 +1,174 @@ +package org.opendaylight.controller.sal.binding.impl; + +import static com.google.common.base.Preconditions.checkState; + +import org.opendaylight.controller.md.sal.binding.util.AbstractBindingSalProviderInstance; +import org.opendaylight.controller.md.sal.binding.util.BindingContextUtils; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; +import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; +import org.opendaylight.controller.sal.binding.api.BindingAwareService; +import org.opendaylight.controller.sal.binding.api.NotificationProviderService; +import org.opendaylight.controller.sal.binding.api.NotificationService; +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; +import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderService; +import org.opendaylight.controller.sal.binding.api.mount.MountService; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Mutable; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; +import org.osgi.framework.BundleContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.ImmutableClassToInstanceMap; + +public class RootBindingAwareBroker implements // + Mutable, // + Identifiable, // + BindingAwareBroker, AutoCloseable, + RpcProviderRegistry { + + private final static Logger LOG = LoggerFactory.getLogger(RootBindingAwareBroker.class); + + RootSalInstance controllerRoot; + + private final String identifier; + + private RpcProviderRegistry rpcBroker; + + private NotificationProviderService notificationBroker; + + private DataProviderService dataBroker; + + private MountPointManagerImpl mountManager; + + public MountPointManagerImpl getMountManager() { + return mountManager; + } + + public void setMountManager(MountPointManagerImpl mountManager) { + this.mountManager = mountManager; + } + + private ImmutableClassToInstanceMap supportedConsumerServices; + + private ImmutableClassToInstanceMap supportedProviderServices; + + public RootBindingAwareBroker(String instanceName) { + this.identifier = instanceName; + mountManager = new MountPointManagerImpl(); + } + + public String getIdentifier() { + return identifier; + } + + public RootSalInstance getRoot() { + return controllerRoot; + } + + public DataProviderService getDataBroker() { + return this.dataBroker; + } + + public NotificationProviderService getNotificationBroker() { + return this.notificationBroker; + } + + public RpcProviderRegistry getRpcProviderRegistry() { + return this.rpcBroker; + } + + public RpcProviderRegistry getRpcBroker() { + return rpcBroker; + } + + public void setRpcBroker(RpcProviderRegistry rpcBroker) { + this.rpcBroker = rpcBroker; + } + + public void setNotificationBroker(NotificationProviderService notificationBroker) { + this.notificationBroker = notificationBroker; + } + + public void setDataBroker(DataProviderService dataBroker) { + this.dataBroker = dataBroker; + } + + public void start() { + checkState(controllerRoot == null, "Binding Aware Broker was already started."); + LOG.info("Starting Binding Aware Broker: {}", identifier); + + controllerRoot = new RootSalInstance(getRpcProviderRegistry(), getNotificationBroker(), getDataBroker()); + + + supportedConsumerServices = ImmutableClassToInstanceMap. builder() + .put(NotificationService.class, getRoot()) // + .put(DataBrokerService.class, getRoot()) // + .put(RpcConsumerRegistry.class, getRoot()) // + .put(MountService.class, mountManager).build(); + + supportedProviderServices = ImmutableClassToInstanceMap. builder() + .putAll(supportedConsumerServices) + .put(NotificationProviderService.class, getRoot()) // + .put(DataProviderService.class, getRoot()) // + .put(RpcProviderRegistry.class, getRoot()) // + .put(MountProviderService.class, mountManager).build(); + } + + @Override + public ConsumerContext registerConsumer(BindingAwareConsumer consumer, BundleContext ctx) { + checkState(supportedConsumerServices != null, "Broker is not initialized."); + return BindingContextUtils.createConsumerContextAndInitialize(consumer, supportedConsumerServices); + } + + @Override + public ProviderContext registerProvider(BindingAwareProvider provider, BundleContext ctx) { + checkState(supportedProviderServices != null, "Broker is not initialized."); + return BindingContextUtils.createProviderContextAndInitialize(provider, supportedProviderServices); + } + + @Override + public void close() throws Exception { + // FIXME: Close all sessions + } + + @Override + public RoutedRpcRegistration addRoutedRpcImplementation(Class type, T implementation) + throws IllegalStateException { + return getRoot().addRoutedRpcImplementation(type, implementation); + } + + @Override + public RpcRegistration addRpcImplementation(Class type, T implementation) + throws IllegalStateException { + return getRoot().addRpcImplementation(type, implementation); + } + + @Override + public T getRpcService(Class module) { + return getRoot().getRpcService(module); + } + @Override + public >> ListenerRegistration registerRouteChangeListener( + L arg0) { + return getRoot().registerRouteChangeListener(arg0); + } + + + public class RootSalInstance extends + AbstractBindingSalProviderInstance { + + public RootSalInstance(RpcProviderRegistry rpcRegistry, NotificationProviderService notificationBroker, + DataProviderService dataBroker) { + super(rpcRegistry, notificationBroker, dataBroker); + } + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootDataBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootDataBrokerImpl.java new file mode 100644 index 0000000000..1b6c56d15d --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RootDataBrokerImpl.java @@ -0,0 +1,43 @@ +package org.opendaylight.controller.sal.binding.impl; + +import org.opendaylight.controller.config.yang.md.sal.binding.impl.Data; +import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplRuntimeMXBean; +import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplRuntimeRegistration; +import org.opendaylight.controller.config.yang.md.sal.binding.impl.DataBrokerImplRuntimeRegistrator; +import org.opendaylight.controller.config.yang.md.sal.binding.impl.Transactions; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; + +public class RootDataBrokerImpl extends DataBrokerImpl implements DataBrokerImplRuntimeMXBean { + + private final Transactions transactions = new Transactions(); + private final Data data = new Data(); + private BindingIndependentConnector bindingIndependentConnector; + private DataBrokerImplRuntimeRegistration runtimeBeanRegistration; + + public BindingIndependentConnector getBindingIndependentConnector() { + return bindingIndependentConnector; + } + + public Transactions getTransactions() { + transactions.setCreated(getCreatedTransactionsCount().get()); + transactions.setSubmitted(getSubmittedTransactionsCount().get()); + transactions.setSuccessful(getFinishedTransactionsCount().get()); + transactions.setFailed(getFailedTransactionsCount().get()); + return transactions; + } + + @Override + public Data getData() { + data.setTransactions(getTransactions()); + return data; + } + + public void setBindingIndependentConnector(BindingIndependentConnector runtimeMapping) { + this.bindingIndependentConnector = runtimeMapping; + } + + public void registerRuntimeBean(DataBrokerImplRuntimeRegistrator rootRegistrator) { + runtimeBeanRegistration = rootRegistrator.register(this); + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java index 6a17007d22..8773476cae 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/RpcProviderRegistryImpl.java @@ -15,11 +15,11 @@ import org.opendaylight.controller.md.sal.common.impl.routing.RoutingUtils; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeGenerator; import org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper; import org.opendaylight.controller.sal.binding.codegen.impl.SingletonHolder; -import org.opendaylight.controller.sal.binding.spi.RpcContextIdentifier; -import org.opendaylight.controller.sal.binding.spi.RpcRouter; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; import org.opendaylight.yangtools.concepts.AbstractObjectRegistration; import org.opendaylight.yangtools.concepts.Identifiable; import org.opendaylight.yangtools.concepts.ListenerRegistration; diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingDomConnectorDeployer.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingDomConnectorDeployer.java new file mode 100644 index 0000000000..f200b4d08d --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingDomConnectorDeployer.java @@ -0,0 +1,103 @@ +package org.opendaylight.controller.sal.binding.impl.connect.dom; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.opendaylight.controller.sal.binding.api.NotificationProviderService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; +import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService; + +public class BindingDomConnectorDeployer { + + private static BindingIndependentMappingService mappingService; + + public static BindingIndependentConnector tryToDeployConnector(RootBindingAwareBroker baBroker, + ProviderSession domSession) { + checkNotNull(baBroker); + checkNotNull(domSession); + BindingIndependentConnector connector = createConnector(mappingService); + return connector; + } + + public static BindingIndependentConnector createConnector(BindingIndependentMappingService mappingService) { + BindingIndependentConnector connector = new BindingIndependentConnector(); + connector.setMappingService(mappingService); + return connector; + } + + public static BindingIndependentConnector createConnector(BindingIndependentConnector source) { + BindingIndependentConnector connector = new BindingIndependentConnector(); + connector.setMappingService(source.getMappingService()); + return connector; + } + + public static void startDataForwarding(BindingIndependentConnector connector, DataProviderService baService, + ProviderSession domContext) { + startDataForwarding(connector, baService, + domContext.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class)); + } + + public static void startRpcForwarding(BindingIndependentConnector connector, + RpcProviderRegistry rpcProviderRegistry, ProviderSession domProviderContext) { + startRpcForwarding(connector, rpcProviderRegistry, domProviderContext.getService(RpcProvisionRegistry.class)); + + } + + public static void startNotificationForwarding(BindingIndependentConnector connector, NotificationProviderService provider,ProviderSession domProviderContext) { + startNotificationForwarding(connector, provider, domProviderContext.getService(NotificationPublishService.class)); + } + + public static void startRpcForwarding(BindingIndependentConnector connector, RpcProviderRegistry baService, + RpcProvisionRegistry domService) { + if (connector.isRpcForwarding()) { + return; + } + + connector.setDomRpcRegistry(domService); + connector.setBindingRpcRegistry(baService); + connector.startRpcForwarding(); + } + + public static void startDataForwarding(BindingIndependentConnector connector, DataProviderService baService, + org.opendaylight.controller.sal.core.api.data.DataProviderService domService) { + if (connector.isDataForwarding()) { + return; + } + + connector.setBindingDataService(baService); + connector.setDomDataService(domService); + connector.startDataForwarding(); + } + + public static void startNotificationForwarding(BindingIndependentConnector connector, NotificationProviderService baService, NotificationPublishService domService) { + if(connector.isNotificationForwarding()) { + return; + } + + // FIXME + } + + // + // public static BindingIndependentMappingService getGlobalMappingService() + // { + // return mappingService; + // } + // + // protected static BindingIndependentMappingService + // setGlobalMappingService(BindingIndependentMappingService service) { + // mappingService= service; + // return mappingService; + // } + // + // public static BindingIndependentConnector + // tryToDeployConnector(MountProviderInstance baMount,MountProvisionInstance + // domMount) { + // + // + // return null; + // } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java index 0a769921d8..75b0138e7c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java @@ -1,12 +1,9 @@ package org.opendaylight.controller.sal.binding.impl.connect.dom; import java.lang.ref.WeakReference; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; @@ -18,21 +15,23 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; - import org.opendaylight.controller.md.sal.common.api.RegistrationListener; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandlerRegistration; import org.opendaylight.controller.md.sal.common.api.data.DataModification; +import org.opendaylight.controller.md.sal.common.api.data.DataReader; import org.opendaylight.controller.md.sal.common.api.routing.RouteChange; import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.binding.api.data.RuntimeDataProvider; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; import org.opendaylight.controller.sal.binding.impl.RpcProviderRegistryImpl; -import org.opendaylight.controller.sal.binding.spi.RpcContextIdentifier; -import org.opendaylight.controller.sal.binding.spi.RpcRouter; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.controller.sal.common.util.CommitHandlerTransactions; import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.controller.sal.core.api.Provider; import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; @@ -49,7 +48,6 @@ import org.opendaylight.yangtools.yang.binding.BindingMapping; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; -import org.opendaylight.yangtools.yang.binding.RpcInput; import org.opendaylight.yangtools.yang.binding.RpcService; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; import org.opendaylight.yangtools.yang.common.QName; @@ -65,7 +63,6 @@ import com.google.common.collect.FluentIterable; import com.google.common.collect.ImmutableSet; import static com.google.common.base.Preconditions.*; -import static org.opendaylight.yangtools.concepts.util.ClassLoaderUtils.*; public class BindingIndependentConnector implements // RuntimeDataProvider, // @@ -96,7 +93,7 @@ public class BindingIndependentConnector implements // private Registration> biCommitHandlerRegistration; private RpcProvisionRegistry biRpcRegistry; - private RpcProviderRegistryImpl baRpcRegistry; + private RpcProviderRegistry baRpcRegistry; private ListenerRegistration domToBindingRpcManager; // private ListenerRegistration @@ -111,6 +108,14 @@ public class BindingIndependentConnector implements // }; + private Registration, DataObject>> baDataReaderRegistration; + + private boolean rpcForwarding = false; + + private boolean dataForwarding = false; + + private boolean notificationForwarding = false; + @Override public DataObject readOperationalData(InstanceIdentifier path) { try { @@ -222,7 +227,7 @@ public class BindingIndependentConnector implements // return biDataService; } - public void setBiDataService(org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService) { + protected void setDomDataService(org.opendaylight.controller.sal.core.api.data.DataProviderService biDataService) { this.biDataService = biDataService; } @@ -230,7 +235,7 @@ public class BindingIndependentConnector implements // return baDataService; } - public void setBaDataService(DataProviderService baDataService) { + protected void setBindingDataService(DataProviderService baDataService) { this.baDataService = baDataService; } @@ -238,23 +243,33 @@ public class BindingIndependentConnector implements // return baRpcRegistry; } - public void setRpcRegistry(RpcProviderRegistryImpl rpcRegistry) { + protected void setBindingRpcRegistry(RpcProviderRegistry rpcRegistry) { this.baRpcRegistry = rpcRegistry; } - public void start() { - baDataService.registerDataReader(ROOT, this); + public void startDataForwarding() { + checkState(!dataForwarding, "Connector is already forwarding data."); + baDataReaderRegistration = baDataService.registerDataReader(ROOT, this); baCommitHandlerRegistration = baDataService.registerCommitHandler(ROOT, bindingToDomCommitHandler); biCommitHandlerRegistration = biDataService.registerCommitHandler(ROOT_BI, domToBindingCommitHandler); baDataService.registerCommitHandlerListener(domToBindingCommitHandler); - - if (baRpcRegistry != null && biRpcRegistry != null) { + dataForwarding = true; + } + + public void startRpcForwarding() { + if (baRpcRegistry != null && biRpcRegistry != null && baRpcRegistry instanceof RouteChangePublisher) { + checkState(!rpcForwarding,"Connector is already forwarding RPCs"); domToBindingRpcManager = baRpcRegistry.registerRouteChangeListener(new DomToBindingRpcForwardingManager()); - + rpcForwarding = true; } } + + public void startNotificationForwarding() { + checkState(!notificationForwarding, "Connector is already forwarding notifications."); + notificationForwarding = true; + } - public void setMappingService(BindingIndependentMappingService mappingService) { + protected void setMappingService(BindingIndependentMappingService mappingService) { this.mappingService = mappingService; } @@ -265,8 +280,9 @@ public class BindingIndependentConnector implements // @Override public void onSessionInitiated(ProviderSession session) { - setBiDataService(session.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class)); - start(); + setDomDataService(session.getService(org.opendaylight.controller.sal.core.api.data.DataProviderService.class)); + setDomRpcRegistry(session.getService(RpcProvisionRegistry.class)); + } public void onRpcRouterCreated(Class serviceType, RpcRouter router) { @@ -381,7 +397,7 @@ public class BindingIndependentConnector implements // */ if (bindingOpenedTransactions.containsKey(bindingTransaction.getIdentifier())) { - return CommitHandlersTransactions.allwaysSuccessfulTransaction(bindingTransaction); + return CommitHandlerTransactions.allwaysSuccessfulTransaction(bindingTransaction); } DataModificationTransaction domTransaction = createBindingToDomTransaction(bindingTransaction); BindingToDomTransaction wrapped = new BindingToDomTransaction(domTransaction, bindingTransaction); @@ -420,7 +436,7 @@ public class BindingIndependentConnector implements // * duplicating data. */ if (domOpenedTransactions.containsKey(identifier)) { - return CommitHandlersTransactions.allwaysSuccessfulTransaction(domTransaction); + return CommitHandlerTransactions.allwaysSuccessfulTransaction(domTransaction); } org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction baTransaction = createDomToBindingTransaction(domTransaction); @@ -597,6 +613,7 @@ public class BindingIndependentConnector implements // @SuppressWarnings("rawtypes") private WeakReference outputClass; + @SuppressWarnings({ "rawtypes", "unchecked" }) public DefaultInvocationStrategy(Method targetMethod, Class outputClass, Class inputClass) { super(targetMethod); @@ -624,10 +641,27 @@ public class BindingIndependentConnector implements // } public RpcResult uncheckedInvoke(RpcService rpcService, CompositeNode domInput) throws Exception { + @SuppressWarnings("unchecked") Future> result = (Future>) targetMethod.invoke(rpcService); RpcResult bindingResult = result.get(); return Rpcs.getRpcResult(bindingResult.isSuccessful(), bindingResult.getErrors()); } + } + + public boolean isRpcForwarding() { + return rpcForwarding; + } + + public boolean isDataForwarding() { + return dataForwarding; + } + + public boolean isNotificationForwarding() { + // TODO Auto-generated method stub + return notificationForwarding; + } + public BindingIndependentMappingService getMappingService() { + return mappingService; } } diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMountPointForwarder.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMountPointForwarder.java new file mode 100644 index 0000000000..630b5fa8df --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentMountPointForwarder.java @@ -0,0 +1,128 @@ +package org.opendaylight.controller.sal.binding.impl.connect.dom; + +import java.util.concurrent.ConcurrentMap; + +import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderService; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class BindingIndependentMountPointForwarder { + + private MountProvisionService domMountService; + private MountProviderService baMountService; + private BindingIndependentMappingService mappingService; + + private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager(); + private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager(); + + private ConcurrentMap, BindingIndependentConnector> connectors; + private ConcurrentMap, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded; + private ListenerRegistration domListenerRegistration; + private ListenerRegistration baListenerRegistration; + + public MountProvisionService getDomMountService() { + return domMountService; + } + + public void setDomMountService(MountProvisionService domMountService) { + this.domMountService = domMountService; + } + + public void start() { + if(domMountService != null && baMountService != null) { + domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager); + baListenerRegistration = baMountService.registerProvisionListener(bindingForwardingManager); + } + } + + private void tryToDeployConnector(InstanceIdentifier baPath, + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) { + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath); + if(previous != null) { + return; + } + MountProviderInstance baMountPoint = baMountService.getMountPoint(baPath); + MountProvisionInstance domMountPoint = domMountService.getMountPoint(biPath); + BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint); + connectors.put(baPath, connector); + connector.startDataForwarding(); + connector.startRpcForwarding(); + connector.startNotificationForwarding(); + } + + private BindingIndependentConnector createForwarder(InstanceIdentifier path, MountProviderInstance baMountPoint, + MountProvisionInstance domMountPoint) { + BindingIndependentConnector connector = new BindingIndependentConnector(); + + connector.setBindingDataService(baMountPoint); + connector.setBindingRpcRegistry(baMountPoint); + //connector.setBindingNotificationBroker(baMountPoint); + + connector.setDomDataService(domMountPoint); + connector.setDomRpcRegistry(domMountPoint); + //connector.setDomNotificationBroker(domMountPoint); + return connector; + } + + public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) { + InstanceIdentifier baPath; + try { + baPath = mappingService.fromDataDom(domPath); + BindingIndependentConnector potentialConnector = connectors.get(baPath); + if(potentialConnector != null) { + return; + } + tryToDeployConnector(baPath,domPath); + } catch (DeserializationException e) { + + } + } + + public synchronized void tryToDeployBindingForwarder(InstanceIdentifier baPath) { + BindingIndependentConnector potentialConnector =connectors.get(baPath); + if(potentialConnector != null) { + return; + } + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = mappingService.toDataDom(baPath); + tryToDeployConnector(baPath, domPath); + } + + public synchronized void undeployBindingForwarder(InstanceIdentifier baPath) { + // FIXME: Implement closeMountPoint + } + + public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) { + // FIXME: Implement closeMountPoint + } + + private class DomMountPointForwardingManager implements MountProvisionListener { + + @Override + public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) { + tryToDeployDomForwarder(path); + } + + @Override + public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) { + undeployDomForwarder(path); + } + } + + private class BindingMountPointForwardingManager implements + org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener { + + @Override + public void onMountPointCreated(InstanceIdentifier path) { + tryToDeployBindingForwarder(path); + } + + @Override + public void onMountPointRemoved(InstanceIdentifier path) { + undeployBindingForwarder(path); + } + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentRpcConnector.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentRpcConnector.java deleted file mode 100644 index d22da3038c..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentRpcConnector.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.opendaylight.controller.sal.binding.impl.connect.dom; - -public class BindingIndependentRpcConnector { - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBindingBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBindingBrokerImpl.java new file mode 100644 index 0000000000..c715c67dd2 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBindingBrokerImpl.java @@ -0,0 +1,166 @@ +package org.opendaylight.controller.sal.binding.impl.forward; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance; +import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService; +import org.opendaylight.controller.sal.binding.impl.connect.dom.DeserializationException; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class DomForwardedBindingBrokerImpl extends RootBindingAwareBroker implements DomForwardedBroker { + + private ProviderSession domProviderContext; + private BindingIndependentConnector connector; + + private MountProvisionService domMountService; + + private final DomMountPointForwardingManager domForwardingManager = new DomMountPointForwardingManager(); + private final BindingMountPointForwardingManager bindingForwardingManager = new BindingMountPointForwardingManager(); + + private ConcurrentMap, BindingIndependentConnector> connectors = new ConcurrentHashMap<>(); + private ConcurrentMap, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier> forwarded = new ConcurrentHashMap<>(); + private ListenerRegistration domListenerRegistration; + private ListenerRegistration baListenerRegistration; + + + public DomForwardedBindingBrokerImpl(String instanceName) { + super(instanceName); + } + + @Override + public BindingIndependentConnector getConnector() { + return connector; + } + + @Override + public ProviderSession getDomProviderContext() { + return domProviderContext; + } + + @Override + public void setConnector(BindingIndependentConnector connector) { + this.connector = connector; + } + + @Override + public void setDomProviderContext(ProviderSession domProviderContext) { + this.domProviderContext = domProviderContext; + } + + @Override + public void startForwarding() { + BindingDomConnectorDeployer.startDataForwarding(getConnector(), getDataBroker(), getDomProviderContext()); + BindingDomConnectorDeployer.startRpcForwarding(getConnector(), getRpcProviderRegistry(), + getDomProviderContext()); + BindingDomConnectorDeployer.startNotificationForwarding(getConnector(), getNotificationBroker(), + getDomProviderContext()); + startMountpointForwarding(); + } + + private void startMountpointForwarding() { + domMountService = getDomProviderContext().getService(MountProvisionService.class); + if (domMountService != null && getMountManager() != null) { + domListenerRegistration = domMountService.registerProvisionListener(domForwardingManager); + baListenerRegistration = getMountManager().registerProvisionListener(bindingForwardingManager); + } + } + + public MountProvisionService getDomMountService() { + return domMountService; + } + + public void setDomMountService(MountProvisionService domMountService) { + this.domMountService = domMountService; + } + + private void tryToDeployConnector(InstanceIdentifier baPath, + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) { + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier previous = forwarded.putIfAbsent(baPath, biPath); + if (previous != null) { + return; + } + MountProviderInstance baMountPoint = getMountManager().createOrGetMountPoint(baPath); + MountProvisionInstance domMountPoint = domMountService.createOrGetMountPoint(biPath); + BindingIndependentConnector connector = createForwarder(baPath, baMountPoint, domMountPoint); + connectors.put(baPath, connector); + } + + private BindingIndependentConnector createForwarder(InstanceIdentifier path, MountProviderInstance baMountPoint, + MountProvisionInstance domMountPoint) { + BindingIndependentConnector mountConnector = BindingDomConnectorDeployer.createConnector(getConnector()); + + BindingDomConnectorDeployer.startDataForwarding(mountConnector, baMountPoint, domMountPoint); + BindingDomConnectorDeployer.startRpcForwarding(mountConnector, baMountPoint, domMountPoint); + BindingDomConnectorDeployer.startNotificationForwarding(mountConnector, baMountPoint, domMountPoint); + // connector.setDomNotificationBroker(domMountPoint); + return connector; + } + + public synchronized void tryToDeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath) { + InstanceIdentifier baPath; + try { + baPath = connector.getMappingService().fromDataDom(domPath); + BindingIndependentConnector potentialConnector = connectors.get(baPath); + if (potentialConnector != null) { + return; + } + tryToDeployConnector(baPath, domPath); + } catch (DeserializationException e) { + + } + } + + public synchronized void tryToDeployBindingForwarder(InstanceIdentifier baPath) { + BindingIndependentConnector potentialConnector = connectors.get(baPath); + if (potentialConnector != null) { + return; + } + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier domPath = connector.getMappingService().toDataDom(baPath); + tryToDeployConnector(baPath, domPath); + } + + public synchronized void undeployBindingForwarder(InstanceIdentifier baPath) { + // FIXME: Implement closeMountPoint + } + + public synchronized void undeployDomForwarder(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath) { + // FIXME: Implement closeMountPoint + } + + private class DomMountPointForwardingManager implements MountProvisionListener { + + @Override + public void onMountPointCreated(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) { + tryToDeployDomForwarder(path); + } + + @Override + public void onMountPointRemoved(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier path) { + undeployDomForwarder(path); + } + } + + private class BindingMountPointForwardingManager implements + org.opendaylight.controller.sal.binding.api.mount.MountProviderService.MountProvisionListener { + + @Override + public void onMountPointCreated(InstanceIdentifier path) { + tryToDeployBindingForwarder(path); + } + + @Override + public void onMountPointRemoved(InstanceIdentifier path) { + undeployBindingForwarder(path); + } + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBroker.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBroker.java new file mode 100644 index 0000000000..c7dbcd4f5c --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedBroker.java @@ -0,0 +1,17 @@ +package org.opendaylight.controller.sal.binding.impl.forward; + +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; + +interface DomForwardedBroker { + + public BindingIndependentConnector getConnector(); + + public void setConnector(BindingIndependentConnector connector); + + public void setDomProviderContext(ProviderSession domProviderContext); + + public ProviderSession getDomProviderContext(); + + void startForwarding(); +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedDataBrokerImpl.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedDataBrokerImpl.java new file mode 100644 index 0000000000..f90a4acf2a --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardedDataBrokerImpl.java @@ -0,0 +1,49 @@ +package org.opendaylight.controller.sal.binding.impl.forward; + +import java.util.Collection; +import java.util.Collections; + +import org.opendaylight.controller.sal.binding.impl.RootDataBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; +import org.opendaylight.controller.sal.core.api.Provider; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; + +public class DomForwardedDataBrokerImpl extends RootDataBrokerImpl implements Provider, DomForwardedBroker { + + private BindingIndependentConnector connector; + private ProviderSession domProviderContext; + + public void setConnector(BindingIndependentConnector connector) { + this.connector = connector; + } + + @Override + public void onSessionInitiated(ProviderSession session) { + this.setDomProviderContext(session); + } + + @Override + public Collection getProviderFunctionality() { + return Collections.emptySet(); + } + + @Override + public BindingIndependentConnector getConnector() { + return connector; + } + + @Override + public ProviderSession getDomProviderContext() { + return domProviderContext; + } + + public void setDomProviderContext(ProviderSession domProviderContext) { + this.domProviderContext = domProviderContext; + } + + @Override + public void startForwarding() { + BindingDomConnectorDeployer.startDataForwarding(getConnector(), this, getDomProviderContext()); + } +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardingUtils.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardingUtils.java new file mode 100644 index 0000000000..581b217bfa --- /dev/null +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/forward/DomForwardingUtils.java @@ -0,0 +1,25 @@ +package org.opendaylight.controller.sal.binding.impl.forward; + +import com.google.common.base.Preconditions; + +public class DomForwardingUtils { + + public static boolean isDomForwardedBroker(Object obj) { + return obj instanceof DomForwardedBroker; + } + + public static void reuseForwardingFrom(Object target,Object source) { + Preconditions.checkArgument(isDomForwardedBroker(source)); + Preconditions.checkArgument(isDomForwardedBroker(target)); + DomForwardedBroker forwardedSource = (DomForwardedBroker) source; + DomForwardedBroker forwardedTarget = (DomForwardedBroker) target; + reuseForwardingFrom(forwardedTarget, forwardedSource); + + } + + private static void reuseForwardingFrom(DomForwardedBroker target, DomForwardedBroker source) { + target.setConnector(source.getConnector()); + target.setDomProviderContext(source.getDomProviderContext()); + } + +} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/Constants.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/Constants.xtend deleted file mode 100644 index 9fb2140e83..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/Constants.xtend +++ /dev/null @@ -1,19 +0,0 @@ -/* - * 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.controller.sal.binding.impl.osgi - -class Constants { - - private new() { - } - - public static val SAL_SERVICE_TYPE = "salServiceType" - public static val SAL_SERVICE_TYPE_CONSUMER_PROXY = "consumerProxy" - public static val SAL_SERVICE_TYPE_PROVIDER = "provider" - public static val SAL_SERVICE_TYPE_CONNECTOR = "connector" -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/PropertiesUtils.xtend b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/PropertiesUtils.xtend deleted file mode 100644 index d04ca7f4ce..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/PropertiesUtils.xtend +++ /dev/null @@ -1,31 +0,0 @@ -/* - * 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.controller.sal.binding.impl.osgi - -import java.util.Hashtable -import static org.opendaylight.controller.sal.binding.impl.osgi.Constants.* - -class PropertiesUtils { - - private new() { - } - - static def setSalServiceType(Hashtable properties, String value) { - properties.put(SAL_SERVICE_TYPE, value) - return properties - } - - static def getSalServiceType(Hashtable properties) { - return properties.get(SAL_SERVICE_TYPE) - } - - static def newProperties() { - new Hashtable() - } - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/package-info.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/package-info.java deleted file mode 100644 index d788ccf3a3..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/osgi/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/* - * 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.controller.sal.binding.impl.osgi; \ No newline at end of file diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RoutingContext.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RoutingContext.java deleted file mode 100644 index 49e056b100..0000000000 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/spi/RoutingContext.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.opendaylight.controller.sal.binding.spi; - -public class RoutingContext { - -} diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang index b040aa025e..b0d1629a73 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang +++ b/opendaylight/md-sal/sal-binding-broker/src/main/yang/opendaylight-binding-broker-impl.yang @@ -85,10 +85,10 @@ module opendaylight-sal-binding-broker-impl { config:required-identity sal:binding-notification-service; } } - } + } } } - + augment "/config:modules/config:module/config:configuration" { case binding-data-broker { when "/config:modules/config:module/config:type = 'binding-data-broker'"; @@ -100,6 +100,7 @@ module opendaylight-sal-binding-broker-impl { } } } + container mapping-service { uses config:service-ref { refine type { diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/RuntimeCodeGeneratorTest.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/RuntimeCodeGeneratorTest.java index 6f0db4cd8d..20181a62c8 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/RuntimeCodeGeneratorTest.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/RuntimeCodeGeneratorTest.java @@ -16,11 +16,11 @@ import org.junit.Test; import static org.opendaylight.controller.sal.binding.codegen.RuntimeCodeHelper.*; import org.opendaylight.controller.sal.binding.api.NotificationListener; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRouter; +import org.opendaylight.controller.sal.binding.api.rpc.RpcRoutingTable; import org.opendaylight.controller.sal.binding.codegen.impl.RuntimeCodeGenerator; import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory; import org.opendaylight.controller.sal.binding.spi.NotificationInvokerFactory.NotificationInvoker; -import org.opendaylight.controller.sal.binding.spi.RpcRouter; -import org.opendaylight.controller.sal.binding.spi.RpcRoutingTable; import org.opendaylight.controller.sal.binding.test.mock.BarListener; import org.opendaylight.controller.sal.binding.test.mock.BarUpdate; import org.opendaylight.controller.sal.binding.test.mock.CompositeListener; diff --git a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java index d4d27a14ec..c03d851f5c 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java +++ b/opendaylight/md-sal/sal-binding-broker/src/test/java/org/opendaylight/controller/sal/binding/test/util/BindingTestContext.java @@ -4,26 +4,44 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.concurrent.Future; import javassist.ClassPool; +import org.eclipse.xtext.xbase.lib.Pure; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderService; import org.opendaylight.controller.sal.binding.dom.serializer.impl.RuntimeGeneratedMappingServiceImpl; -import org.opendaylight.controller.sal.binding.impl.BindingAwareBrokerImpl; import org.opendaylight.controller.sal.binding.impl.DataBrokerImpl; import org.opendaylight.controller.sal.binding.impl.NotificationBrokerImpl; +import org.opendaylight.controller.sal.binding.impl.RootBindingAwareBroker; +import org.opendaylight.controller.sal.binding.impl.RpcProviderRegistryImpl; +import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingDomConnectorDeployer; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentConnector; import org.opendaylight.controller.sal.binding.impl.connect.dom.BindingIndependentMappingService; +import org.opendaylight.controller.sal.binding.impl.forward.DomForwardedBindingBrokerImpl; import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest; +import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; +import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration; +import org.opendaylight.controller.sal.core.api.BrokerService; import org.opendaylight.controller.sal.core.api.RpcImplementation; import org.opendaylight.controller.sal.core.api.RpcProvisionRegistry; +import org.opendaylight.controller.sal.core.api.RpcRegistrationListener; import org.opendaylight.controller.sal.core.api.data.DataStore; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; +import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService; import org.opendaylight.controller.sal.dom.broker.BrokerImpl; +import org.opendaylight.controller.sal.dom.broker.MountPointManagerImpl; import org.opendaylight.controller.sal.dom.broker.impl.DataStoreStatsWrapper; import org.opendaylight.controller.sal.dom.broker.impl.HashMapDataStore; import org.opendaylight.controller.sal.dom.broker.impl.RpcRouterImpl; import org.opendaylight.controller.sal.dom.broker.impl.SchemaAwareDataStoreAdapter; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl; @@ -33,26 +51,26 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Predicate; +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import static com.google.common.base.Preconditions.*; public class BindingTestContext implements AutoCloseable { - - + public static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier TREE_ROOT = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier .builder().toInstance(); private static final Logger LOG = LoggerFactory.getLogger(BindingTestContext.class); - + private RuntimeGeneratedMappingServiceImpl mappingServiceImpl; - - - private BindingAwareBrokerImpl baBrokerImpl; + + private DomForwardedBindingBrokerImpl baBrokerImpl; private DataBrokerImpl baDataImpl; private NotificationBrokerImpl baNotifyImpl; - private BindingIndependentConnector baConnectDataServiceImpl; + private BindingIndependentConnector baConnectImpl; private org.opendaylight.controller.sal.dom.broker.DataBrokerImpl biDataImpl; private BrokerImpl biBrokerImpl; @@ -61,15 +79,15 @@ public class BindingTestContext implements AutoCloseable { private DataStoreStatsWrapper dataStoreStats; private DataStore dataStore; - private boolean dataStoreStatisticsEnabled = false; - + private final ListeningExecutorService executor; private final ClassPool classPool; private final boolean startWithSchema; - + private MountPointManagerImpl biMountImpl; + protected BindingTestContext(ListeningExecutorService executor, ClassPool classPool, boolean startWithSchema) { this.executor = executor; this.classPool = classPool; @@ -82,74 +100,133 @@ public class BindingTestContext implements AutoCloseable { rawDataStore = new HashMapDataStore(); schemaAwareDataStore = new SchemaAwareDataStoreAdapter(); schemaAwareDataStore.changeDelegate(rawDataStore); - if(dataStoreStatisticsEnabled) { - dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore); - dataStore = dataStoreStats; + if (dataStoreStatisticsEnabled) { + dataStoreStats = new DataStoreStatsWrapper(schemaAwareDataStore); + dataStore = dataStoreStats; } else { dataStore = schemaAwareDataStore; } - + biDataImpl.registerConfigurationReader(TREE_ROOT, dataStore); biDataImpl.registerOperationalReader(TREE_ROOT, dataStore); biDataImpl.registerCommitHandler(TREE_ROOT, dataStore); } - + public void startDomDataBroker() { - checkState(executor != null,"Executor needs to be set"); + checkState(executor != null, "Executor needs to be set"); biDataImpl = new org.opendaylight.controller.sal.dom.broker.DataBrokerImpl(); biDataImpl.setExecutor(executor); } - + public void startBindingDataBroker() { - checkState(executor != null,"Executor needs to be set"); + checkState(executor != null, "Executor needs to be set"); baDataImpl = new DataBrokerImpl(); baDataImpl.setExecutor(executor); } - + public void startBindingBroker() { - checkState(executor != null,"Executor needs to be set"); - checkState(baDataImpl != null,"Binding Data Broker must be started"); + checkState(executor != null, "Executor needs to be set"); + checkState(baDataImpl != null, "Binding Data Broker must be started"); checkState(baNotifyImpl != null, "Notification Service must be started"); - baBrokerImpl = new BindingAwareBrokerImpl("test",null); - + baBrokerImpl = new DomForwardedBindingBrokerImpl("test"); + + baBrokerImpl.getMountManager().setDataCommitExecutor(executor); + baBrokerImpl.getMountManager().setNotificationExecutor(executor); + baBrokerImpl.setRpcBroker(new RpcProviderRegistryImpl("test")); baBrokerImpl.setDataBroker(baDataImpl); - baBrokerImpl.setNotifyBroker(baNotifyImpl); - + baBrokerImpl.setNotificationBroker(baNotifyImpl); baBrokerImpl.start(); } - - public void startBindingToDomDataConnector() { - checkState(baDataImpl != null,"Binding Data Broker needs to be started"); - checkState(biDataImpl != null,"DOM Data Broker needs to be started."); - checkState(mappingServiceImpl != null,"DOM Mapping Service needs to be started."); - baConnectDataServiceImpl = new BindingIndependentConnector(); - baConnectDataServiceImpl.setRpcRegistry(baBrokerImpl); - baConnectDataServiceImpl.setDomRpcRegistry(getDomRpcRegistry()); - baConnectDataServiceImpl.setBaDataService(baDataImpl); - baConnectDataServiceImpl.setBiDataService(biDataImpl); - baConnectDataServiceImpl.setMappingService(mappingServiceImpl); - baConnectDataServiceImpl.start(); + + public void startForwarding() { + checkState(baDataImpl != null, "Binding Data Broker needs to be started"); + checkState(biDataImpl != null, "DOM Data Broker needs to be started."); + checkState(mappingServiceImpl != null, "DOM Mapping Service needs to be started."); + + baConnectImpl = BindingDomConnectorDeployer.createConnector(getBindingToDomMappingService()); + baConnectImpl.setDomRpcRegistry(getDomRpcRegistry()); + baBrokerImpl.setConnector(baConnectImpl); + baBrokerImpl.setDomProviderContext(createMockContext()); + baBrokerImpl.startForwarding(); } - + + private ProviderSession createMockContext() { + // TODO Auto-generated method stub + final ClassToInstanceMap domBrokerServices = ImmutableClassToInstanceMap + . builder() + // + .put(org.opendaylight.controller.sal.core.api.data.DataProviderService.class, biDataImpl) // + .put(RpcProvisionRegistry.class, biBrokerImpl.getRouter()) // + .put(MountProvisionService.class, biMountImpl) // + .build(); + + return new ProviderSession() { + + @Override + public Future> rpc(QName rpc, CompositeNode input) { + throw new UnsupportedOperationException(); + } + + @Override + public T getService(Class service) { + return domBrokerServices.getInstance(service); + } + + @Override + public boolean isClosed() { + return false; + } + + @Override + public Set getSupportedRpcs() { + return null; + } + + @Override + public void close() { + } + + @Override + public ListenerRegistration addRpcRegistrationListener( + RpcRegistrationListener listener) { + return null; + } + + @Override + public RpcRegistration addRpcImplementation(QName rpcType, RpcImplementation implementation) + throws IllegalArgumentException { + return null; + } + + @Override + public RoutedRpcRegistration addRoutedRpcImplementation(QName rpcType, RpcImplementation implementation) { + return null; + } + + @Override + public RoutedRpcRegistration addMountedRpcImplementation(QName rpcType, RpcImplementation implementation) { + return null; + } + }; + } + public void startBindingToDomMappingService() { - checkState(classPool != null,"ClassPool needs to be present"); + checkState(classPool != null, "ClassPool needs to be present"); mappingServiceImpl = new RuntimeGeneratedMappingServiceImpl(); mappingServiceImpl.setPool(classPool); mappingServiceImpl.start(null); } - - + public void updateYangSchema(String[] files) { SchemaContext context = getContext(files); - if(schemaAwareDataStore != null) { + if (schemaAwareDataStore != null) { schemaAwareDataStore.onGlobalContextUpdated(context); } - if(mappingServiceImpl != null) { + if (mappingServiceImpl != null) { mappingServiceImpl.onGlobalContextUpdated(context); } } - - + public static String[] getAllYangFilesOnClasspath() { Predicate predicate = new Predicate() { @Override @@ -161,7 +238,7 @@ public class BindingTestContext implements AutoCloseable { Set result = reflection.getResources(predicate); return (String[]) result.toArray(new String[result.size()]); } - + private static SchemaContext getContext(String[] yangFiles) { ClassLoader loader = BindingTestContext.class.getClassLoader(); List streams = new ArrayList<>(); @@ -173,7 +250,7 @@ public class BindingTestContext implements AutoCloseable { Set modules = parser.parseYangModelsFromStreams(streams); return parser.resolveSchemaContext(modules); } - + public void start() { startBindingDataBroker(); startBindingNotificationBroker(); @@ -181,13 +258,19 @@ public class BindingTestContext implements AutoCloseable { startDomDataBroker(); startDomDataStore(); startDomBroker(); + startDomMountPoint(); startBindingToDomMappingService(); - startBindingToDomDataConnector(); - if(startWithSchema) { + startForwarding(); + if (startWithSchema) { loadYangSchemaFromClasspath(); } } + private void startDomMountPoint() { + biMountImpl = new MountPointManagerImpl(); + biMountImpl.setDataBroker(getDomDataBroker()); + } + private void startDomBroker() { checkState(executor != null); biBrokerImpl = new BrokerImpl(); @@ -198,7 +281,7 @@ public class BindingTestContext implements AutoCloseable { public void startBindingNotificationBroker() { checkState(executor != null); baNotifyImpl = new NotificationBrokerImpl(executor); - + } public void loadYangSchemaFromClasspath() { @@ -223,10 +306,10 @@ public class BindingTestContext implements AutoCloseable { } public void logDataStoreStatistics() { - if(dataStoreStats == null) { + if (dataStoreStats == null) { return; } - + LOG.info("BIDataStore Statistics: Configuration Read Count: {} TotalTime: {} ms AverageTime (ns): {} ms", dataStoreStats.getConfigurationReadCount(), dataStoreStats.getConfigurationReadTotalTime(), dataStoreStats.getConfigurationReadAverageTime()); @@ -241,22 +324,30 @@ public class BindingTestContext implements AutoCloseable { } public RpcProviderRegistry getBindingRpcRegistry() { - return baBrokerImpl; + return baBrokerImpl.getRoot(); } public RpcProvisionRegistry getDomRpcRegistry() { - if(biBrokerImpl == null) { + if (biBrokerImpl == null) { return null; } return biBrokerImpl.getRouter(); } - + public RpcImplementation getDomRpcInvoker() { return biBrokerImpl.getRouter(); } - + @Override public void close() throws Exception { - + + } + + public MountProviderService getBindingMountProviderService() { + return baBrokerImpl.getMountManager(); + } + + public MountProvisionService getDomMountProviderService() { + return biMountImpl; } } diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/ChangeOriginatedInDomBrokerTest.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/ChangeOriginatedInDomBrokerTest.java index 55bff1a5c7..0258c3e439 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/ChangeOriginatedInDomBrokerTest.java +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/ChangeOriginatedInDomBrokerTest.java @@ -5,7 +5,7 @@ import org.junit.Test; import org.opendaylight.controller.md.sal.common.api.TransactionStatus; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; import org.opendaylight.controller.md.sal.common.api.data.DataModification; -import org.opendaylight.controller.sal.binding.impl.connect.dom.CommitHandlersTransactions; +import org.opendaylight.controller.sal.common.util.CommitHandlerTransactions; import org.opendaylight.controller.sal.binding.test.AbstractDataServiceTest; import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpVersion; @@ -136,7 +136,7 @@ public class ChangeOriginatedInDomBrokerTest extends AbstractDataServiceTest { public org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction, DataObject> requestCommit( DataModification, DataObject> modification) { modificationCapture = modification; - return CommitHandlersTransactions.allwaysSuccessfulTransaction(modification); + return CommitHandlerTransactions.allwaysSuccessfulTransaction(modification); } }; diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerMountPointTest.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerMountPointTest.java new file mode 100644 index 0000000000..a99d80ff30 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/connect/dom/CrossBrokerMountPointTest.java @@ -0,0 +1,154 @@ +package org.opendaylight.controller.sal.binding.test.connect.dom; + +import static junit.framework.Assert.assertNotNull; +import static org.junit.Assert.assertEquals; + +import java.math.BigInteger; +import java.util.Collections; +import java.util.Map; + +import javax.management.Notification; + +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.controller.md.sal.common.api.data.DataModification; +import org.opendaylight.controller.md.sal.common.api.data.DataReader; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderService; +import org.opendaylight.controller.sal.binding.test.util.BindingBrokerTestFactory; +import org.opendaylight.controller.sal.binding.test.util.BindingTestContext; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.NodeGroupStatistics; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.statistics.GroupStatistics; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; +import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; + +import com.google.common.collect.ImmutableMap; +import com.google.common.util.concurrent.MoreExecutors; + +public class CrossBrokerMountPointTest { + + private static final QName NODE_ID_QNAME = QName.create(Node.QNAME, "id"); + private static final QName FLOW_ID_QNAME = QName.create(Flow.QNAME, "id"); + private static final QName FLOW_NODE_QNAME = QName.create(Flow.QNAME, "node"); + private static final QName TABLE_ID_QNAME = QName.create(Table.QNAME, "id"); + + private static final String NODE_ID = "node:1"; + + private static final NodeKey NODE_KEY = new NodeKey(new NodeId(NODE_ID)); + + private static final Map NODE_KEY_BI = Collections. singletonMap(NODE_ID_QNAME, + NODE_ID); + + private static final InstanceIdentifier NODE_INSTANCE_ID_BA = InstanceIdentifier.builder(Nodes.class) // + .child(Node.class, NODE_KEY).toInstance(); + private static GroupKey GROUP_KEY = new GroupKey(new GroupId(0L)); + + private static final InstanceIdentifier GROUP_STATISTICS_ID_BA = InstanceIdentifier + .builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class) // + .child(Group.class, GROUP_KEY) // + .augmentation(NodeGroupStatistics.class) // + .child(GroupStatistics.class) // + .toInstance(); + + private static final QName AUGMENTED_GROUP_STATISTICS = QName.create(NodeGroupStatistics.QNAME, + GroupStatistics.QNAME.getLocalName()); + + private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier NODE_INSTANCE_ID_BI = // + org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.builder() // + .node(Nodes.QNAME) // + .nodeWithKey(Node.QNAME, NODE_KEY_BI) // + .toInstance(); + + private static final org.opendaylight.yangtools.yang.data.api.InstanceIdentifier GROUP_STATISTICS_ID_BI = org.opendaylight.yangtools.yang.data.api.InstanceIdentifier + // + .builder(NODE_INSTANCE_ID_BI) + .nodeWithKey(QName.create(FlowCapableNode.QNAME, "group"), QName.create(FlowCapableNode.QNAME, "group-id"), + 0L).node(AUGMENTED_GROUP_STATISTICS).toInstance(); + + private static final NodeRef NODE_REF = new NodeRef(NODE_INSTANCE_ID_BA); + + private BindingTestContext testContext; + private MountProviderService bindingMountPointService; + private MountProvisionService domMountPointService; + + @Before + public void setup() { + BindingBrokerTestFactory testFactory = new BindingBrokerTestFactory(); + testFactory.setExecutor(MoreExecutors.sameThreadExecutor()); + testFactory.setStartWithParsedSchema(true); + testContext = testFactory.getTestContext(); + + testContext.start(); + bindingMountPointService = testContext.getBindingMountProviderService(); + domMountPointService = testContext.getDomMountProviderService(); + + // biRpcInvoker = testContext.getDomRpcInvoker(); + assertNotNull(bindingMountPointService); + assertNotNull(domMountPointService); + + // flowService = MessageCapturingFlowService.create(baRpcRegistry); + } + + @Test + public void testMountPoint() { + + testContext.getBindingDataBroker().readOperationalData(NODE_INSTANCE_ID_BA); + + MountProvisionInstance domMountPoint = domMountPointService.createMountPoint(NODE_INSTANCE_ID_BI); + assertNotNull(domMountPoint); + MountProviderInstance bindingMountPoint = bindingMountPointService.getMountPoint(NODE_INSTANCE_ID_BA); + assertNotNull(bindingMountPoint); + + final BigInteger packetCount = BigInteger.valueOf(500L); + + + DataReader simpleReader = new DataReader() { + + @Override + public CompositeNode readConfigurationData(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier arg0) { + return null; + } + + + @Override + public CompositeNode readOperationalData(org.opendaylight.yangtools.yang.data.api.InstanceIdentifier arg0) { + if (arg0.equals(GROUP_STATISTICS_ID_BI)) { + ImmutableCompositeNode data = ImmutableCompositeNode + .builder() + .setQName(AUGMENTED_GROUP_STATISTICS) + .addLeaf(QName.create(AUGMENTED_GROUP_STATISTICS, "packet-count"), packetCount) // + .toInstance(); + + return data; + } + return null; + } + + }; + domMountPoint.registerOperationalReader(NODE_INSTANCE_ID_BI, simpleReader); + + GroupStatistics data = (GroupStatistics) bindingMountPoint.readOperationalData(GROUP_STATISTICS_ID_BA); + assertNotNull(data); + assertEquals(packetCount,data.getPacketCount().getValue()); + } +} diff --git a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java index 112b57cd33..c943226cca 100644 --- a/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java +++ b/opendaylight/md-sal/sal-binding-it/src/main/java/org/opendaylight/controller/test/sal/binding/it/TestHelper.java @@ -87,6 +87,7 @@ public class TestHelper { mavenBundle(CONTROLLER, "sal-binding-api").versionAsInProject(), // // mavenBundle(CONTROLLER, "sal-binding-config").versionAsInProject(), // mavenBundle(CONTROLLER, "sal-binding-broker-impl").versionAsInProject(), // // + mavenBundle(CONTROLLER, "sal-binding-util").versionAsInProject(), // mavenBundle("org.javassist", "javassist").versionAsInProject(), // // mavenBundle(CONTROLLER, "sal-common-util").versionAsInProject(), // // diff --git a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/NoficationTest.java b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/NoficationTest.java index 6fec18033f..2f86ee4cc2 100644 --- a/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/NoficationTest.java +++ b/opendaylight/md-sal/sal-binding-it/src/test/java/org/opendaylight/controller/test/sal/binding/it/NoficationTest.java @@ -5,13 +5,16 @@ import static org.junit.Assert.assertNotNull; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import org.junit.Before; import org.junit.Test; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality; import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; import org.opendaylight.controller.sal.binding.api.NotificationService; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded; @@ -24,6 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalF import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved; import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.binding.NotificationListener; +import org.opendaylight.yangtools.yang.binding.RpcService; public class NoficationTest extends AbstractTest { @@ -95,16 +99,36 @@ public class NoficationTest extends AbstractTest { * The registration of the Consumer 2. SalFlowListener is registered * registered as notification listener. */ - BindingAwareConsumer consumer2 = new BindingAwareConsumer() { + BindingAwareProvider provider = new BindingAwareProvider() { + @Override - public void onSessionInitialized(ConsumerContext session) { + public void onSessionInitiated(ProviderContext session) { listener2Reg = session.getSALService(NotificationProviderService.class).registerNotificationListener( listener2); } + + @Override + public void onSessionInitialized(ConsumerContext session) { + // TODO Auto-generated method stub + + } + + @Override + public Collection getImplementations() { + // TODO Auto-generated method stub + return null; + } + + @Override + public Collection getFunctionality() { + // TODO Auto-generated method stub + return null; + } + }; // registerConsumer method calls onSessionInitialized method above - broker.registerConsumer(consumer2, getBundleContext()); + broker.registerProvider(provider, getBundleContext()); /** * 3 notifications are published diff --git a/opendaylight/md-sal/sal-binding-util/pom.xml b/opendaylight/md-sal/sal-binding-util/pom.xml index 26041ea85e..67c10f4a04 100644 --- a/opendaylight/md-sal/sal-binding-util/pom.xml +++ b/opendaylight/md-sal/sal-binding-util/pom.xml @@ -24,10 +24,5 @@ sal-binding-api 1.0-SNAPSHOT - - org.apache.felix - org.apache.felix.dependencymanager - 3.1.0 - diff --git a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java new file mode 100644 index 0000000000..ff6f6185ea --- /dev/null +++ b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalConsumerInstance.java @@ -0,0 +1,178 @@ +package org.opendaylight.controller.md.sal.binding.util; + +import java.util.concurrent.Future; +import java.util.zip.Checksum; + +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.NotificationListener; +import org.opendaylight.controller.sal.binding.api.NotificationService; +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.controller.sal.binding.api.data.DataBrokerService; +import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; +import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; +import org.opendaylight.controller.sal.binding.api.mount.MountInstance; +import org.opendaylight.controller.sal.common.DataStoreIdentifier; +import org.opendaylight.yangtools.concepts.Identifiable; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.DataRoot; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.Notification; +import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.yang.common.RpcResult; + +import com.google.common.base.Preconditions; + +public abstract class AbstractBindingSalConsumerInstance // + implements // + RpcConsumerRegistry, // + NotificationService, // + DataBrokerService { + + private final R rpcRegistry; + private final N notificationBroker; + private final D dataBroker; + + protected final R getRpcRegistry() { + return rpcRegistry; + } + + protected final N getNotificationBroker() { + return notificationBroker; + } + + protected final D getDataBroker() { + return dataBroker; + } + + protected final R getRpcRegistryChecked() { + Preconditions.checkState(rpcRegistry != null,"Rpc Registry is not available."); + return rpcRegistry; + } + + protected final N getNotificationBrokerChecked() { + Preconditions.checkState(notificationBroker != null,"Notification Broker is not available."); + return notificationBroker; + } + + protected final D getDataBrokerChecked() { + Preconditions.checkState(dataBroker != null, "Data Broker is not available"); + return dataBroker; + } + + + protected AbstractBindingSalConsumerInstance(R rpcRegistry, N notificationBroker, D dataBroker) { + this.rpcRegistry = rpcRegistry; + this.notificationBroker = notificationBroker; + this.dataBroker = dataBroker; + } + + public T getRpcService(Class module) { + return getRpcRegistryChecked().getRpcService(module); + } + + @Deprecated + public void addNotificationListener(Class notificationType, + NotificationListener listener) { + getNotificationBrokerChecked().addNotificationListener(notificationType, listener); + } + + @Deprecated + public void addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) { + getNotificationBrokerChecked().addNotificationListener(listener); + } + + @Deprecated + public void removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) { + getNotificationBrokerChecked().removeNotificationListener(listener); + } + + @Deprecated + public void removeNotificationListener(Class notificationType, + NotificationListener listener) { + getNotificationBrokerChecked().removeNotificationListener(notificationType, listener); + } + + public Registration> registerNotificationListener( + Class notificationType, NotificationListener listener) { + return getNotificationBrokerChecked().registerNotificationListener(notificationType, listener); + } + + public Registration registerNotificationListener( + org.opendaylight.yangtools.yang.binding.NotificationListener listener) { + return getNotificationBrokerChecked().registerNotificationListener(listener); + } + + @Deprecated + public T getData(DataStoreIdentifier store, Class rootType) { + return getDataBrokerChecked().getData(store, rootType); + } + + @Deprecated + public T getData(DataStoreIdentifier store, T filter) { + return getDataBrokerChecked().getData(store, filter); + } + + @Deprecated + public T getCandidateData(DataStoreIdentifier store, Class rootType) { + return getDataBrokerChecked().getCandidateData(store, rootType); + } + + @Deprecated + public T getCandidateData(DataStoreIdentifier store, T filter) { + return getDataBrokerChecked().getCandidateData(store, filter); + } + + @Deprecated + public RpcResult editCandidateData(DataStoreIdentifier store, DataRoot changeSet) { + return getDataBrokerChecked().editCandidateData(store, changeSet); + } + + @Deprecated + public Future> commit(DataStoreIdentifier store) { + return getDataBrokerChecked().commit(store); + } + + @Deprecated + public DataObject getData(InstanceIdentifier data) { + return getDataBrokerChecked().getData(data); + } + + @Deprecated + public DataObject getConfigurationData(InstanceIdentifier data) { + return getDataBrokerChecked().getConfigurationData(data); + } + + public DataModificationTransaction beginTransaction() { + return getDataBrokerChecked().beginTransaction(); + } + + @Deprecated + public void registerChangeListener(InstanceIdentifier path, DataChangeListener changeListener) { + getDataBrokerChecked().registerChangeListener(path, changeListener); + } + + @Deprecated + public void unregisterChangeListener(InstanceIdentifier path, + DataChangeListener changeListener) { + getDataBrokerChecked().unregisterChangeListener(path, changeListener); + } + + @Deprecated + public DataObject readConfigurationData(InstanceIdentifier path) { + return getDataBrokerChecked().readConfigurationData(path); + } + + public DataObject readOperationalData(InstanceIdentifier path) { + return getDataBrokerChecked().readOperationalData(path); + } + + @Deprecated + public ListenerRegistration registerDataChangeListener( + InstanceIdentifier path, DataChangeListener listener) { + return getDataBrokerChecked().registerDataChangeListener(path, listener); + } +} diff --git a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalProviderInstance.java b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalProviderInstance.java new file mode 100644 index 0000000000..278e90ee6b --- /dev/null +++ b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/AbstractBindingSalProviderInstance.java @@ -0,0 +1,95 @@ +package org.opendaylight.controller.md.sal.binding.util; + +import java.util.concurrent.ExecutorService; + +import org.opendaylight.controller.md.sal.common.api.RegistrationListener; +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler; +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandlerRegistration; +import org.opendaylight.controller.md.sal.common.api.data.DataReader; +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.NotificationProviderService; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.controller.sal.binding.api.data.DataProviderService; +import org.opendaylight.controller.sal.binding.api.mount.MountProviderInstance; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.concepts.Registration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.Notification; +import org.opendaylight.yangtools.yang.binding.RpcService; + +public abstract class AbstractBindingSalProviderInstance // + extends AbstractBindingSalConsumerInstance // + implements // + DataProviderService, // + RpcProviderRegistry, // + NotificationProviderService { + + public AbstractBindingSalProviderInstance(R rpcRegistry, N notificationBroker, + D dataBroker) { + super(rpcRegistry, notificationBroker, dataBroker); + } + + @Override + public Registration, DataObject>> registerDataReader( + InstanceIdentifier path, + DataReader, DataObject> reader) { + return getDataBrokerChecked().registerDataReader(path, reader); + } + + @Override + public Registration, DataObject>> registerCommitHandler( + InstanceIdentifier path, + DataCommitHandler, DataObject> commitHandler) { + return getDataBrokerChecked().registerCommitHandler(path, commitHandler); + } + + @Override + public ListenerRegistration, DataObject>>> registerCommitHandlerListener( + RegistrationListener, DataObject>> commitHandlerListener) { + return getDataBrokerChecked().registerCommitHandlerListener(commitHandlerListener); + } + + @Override + public RpcRegistration addRpcImplementation(Class type, T implementation) + throws IllegalStateException { + return getRpcRegistryChecked().addRpcImplementation(type, implementation); + } + + @Override + public RoutedRpcRegistration addRoutedRpcImplementation(Class type, T implementation) + throws IllegalStateException { + return getRpcRegistryChecked().addRoutedRpcImplementation(type, implementation); + } + + @Override + @Deprecated + public void notify(Notification notification) { + getNotificationBrokerChecked().notify(notification); + } + + @Override + @Deprecated + public void notify(Notification notification, ExecutorService service) { + getNotificationBrokerChecked().notify(notification, service); + } + + @Override + public void publish(Notification notification) { + getNotificationBrokerChecked().publish(notification); + } + + @Override + public void publish(Notification notification, ExecutorService service) { + getNotificationBrokerChecked().publish(notification, service); + } + + @Override + public >> ListenerRegistration registerRouteChangeListener( + L listener) { + return getRpcRegistryChecked().registerRouteChangeListener(listener); + } +} diff --git a/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/BindingContextUtils.java b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/BindingContextUtils.java new file mode 100644 index 0000000000..6f2186be88 --- /dev/null +++ b/opendaylight/md-sal/sal-binding-util/src/main/java/org/opendaylight/controller/md/sal/binding/util/BindingContextUtils.java @@ -0,0 +1,143 @@ +package org.opendaylight.controller.md.sal.binding.util; + +import java.awt.image.SinglePixelPackedSampleModel; + +import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RpcRegistration; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; +import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality; +import org.opendaylight.controller.sal.binding.api.rpc.RpcContextIdentifier; +import org.opendaylight.controller.sal.binding.api.BindingAwareConsumer; +import org.opendaylight.controller.sal.binding.api.BindingAwareService; +import org.opendaylight.controller.sal.binding.api.RpcConsumerRegistry; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; + +import static com.google.common.base.Preconditions.*; + +import com.google.common.collect.ClassToInstanceMap; +import com.google.common.collect.MutableClassToInstanceMap; + +public class BindingContextUtils { + + public static ConsumerContext createConsumerContext(BindingAwareConsumer consumer, + ClassToInstanceMap serviceProvider) { + checkNotNull(consumer,"Consumer should not be null"); + checkNotNull(serviceProvider,"Service map should not be null"); + return new SingleConsumerContextImpl(serviceProvider); + } + + public static ProviderContext createProviderContext(BindingAwareProvider provider, + ClassToInstanceMap serviceProvider) { + checkNotNull(provider,"Provider should not be null"); + checkNotNull(serviceProvider,"Service map should not be null"); + return new SingleProviderContextImpl(serviceProvider); + } + + public static ConsumerContext createConsumerContextAndInitialize(BindingAwareConsumer consumer, + ClassToInstanceMap serviceProvider) { + ConsumerContext context = createConsumerContext(consumer, serviceProvider); + consumer.onSessionInitialized(context); + return context; + } + + public static ProviderContext createProviderContextAndInitialize(BindingAwareProvider provider, + ClassToInstanceMap serviceProvider) { + ProviderContext context = createProviderContext(provider, serviceProvider); + provider.onSessionInitiated(context); + return context; + } + + public static T createContextProxyOrReturnService(Class service, T instance) { + // FIXME: Create Proxy + return instance; + } + + private static class SingleConsumerContextImpl implements ConsumerContext, AutoCloseable { + + private ClassToInstanceMap alreadyRetrievedServices; + private ClassToInstanceMap serviceProvider; + + public SingleConsumerContextImpl(ClassToInstanceMap serviceProvider) { + this.alreadyRetrievedServices = MutableClassToInstanceMap.create(); + this.serviceProvider = serviceProvider; + } + + @Override + public final T getRpcService(Class module) { + return getSALService(RpcConsumerRegistry.class).getRpcService(module); + } + + @Override + public final T getSALService(Class service) { + checkNotNull(service,"Service class should not be null."); + T potential = alreadyRetrievedServices.getInstance(service); + if(potential != null) { + return potential; + } + return tryToRetrieveSalService(service); + } + + private synchronized T tryToRetrieveSalService(Class service) { + final T potential = alreadyRetrievedServices.getInstance(service); + if(potential != null) { + return potential; + } + final T requested = serviceProvider.getInstance(service); + if(requested == null) { + throw new IllegalArgumentException("Requested service "+service.getName() +" is not available."); + } + final T retrieved = BindingContextUtils.createContextProxyOrReturnService(service,requested); + alreadyRetrievedServices.put(service, retrieved); + return retrieved; + } + + @Override + public final void close() throws Exception { + alreadyRetrievedServices = null; + serviceProvider = null; + } + } + + private static class SingleProviderContextImpl extends SingleConsumerContextImpl implements ProviderContext { + + public SingleProviderContextImpl(ClassToInstanceMap serviceProvider) { + super(serviceProvider); + } + + @Override + public >> ListenerRegistration registerRouteChangeListener( + L listener) { + return getSALService(RpcProviderRegistry.class).registerRouteChangeListener(listener); + } + + @Override + public RoutedRpcRegistration addRoutedRpcImplementation(Class type, + T implementation) throws IllegalStateException { + return getSALService(RpcProviderRegistry.class).addRoutedRpcImplementation(type, implementation); + } + + @Override + public RpcRegistration addRpcImplementation(Class type, T implementation) + throws IllegalStateException { + return getSALService(RpcProviderRegistry.class).addRpcImplementation(type, implementation); + } + + @Deprecated + @Override + public void registerFunctionality(ProviderFunctionality functionality) { + // NOOP + } + + @Deprecated + @Override + public void unregisterFunctionality(ProviderFunctionality functionality) { + // NOOP + } + } +} 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 fd81af353c..17de595a8b 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 @@ -6,32 +6,26 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; public final class TypeSafeDataReader { - - private final DataReader,DataObject> delegate; - - - + private final DataReader, DataObject> delegate; + public DataReader, DataObject> getDelegate() { return delegate; } - public TypeSafeDataReader(DataReader, DataObject> delegate) { this.delegate = delegate; } - @SuppressWarnings("unchecked") public D readConfigurationData(InstanceIdentifier path) { return (D) delegate.readConfigurationData(path); } - - + @SuppressWarnings("unchecked") - public D readOperationalData(InstanceIdentifier path) { + public D readOperationalData(InstanceIdentifier path) { return (D) delegate.readOperationalData(path); } - + public static TypeSafeDataReader forReader(DataReader, DataObject> delegate) { return new TypeSafeDataReader(delegate); } diff --git a/opendaylight/md-sal/sal-common-util/pom.xml b/opendaylight/md-sal/sal-common-util/pom.xml index ff15e72ba6..adbe3d2a49 100644 --- a/opendaylight/md-sal/sal-common-util/pom.xml +++ b/opendaylight/md-sal/sal-common-util/pom.xml @@ -27,6 +27,12 @@ com.google.guava guava + + org.opendaylight.controller + sal-common-api + ${project.version} + + bundle diff --git a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Arguments.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Arguments.java index 2d10fba8a5..902665d1a6 100644 --- a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Arguments.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Arguments.java @@ -1,3 +1,10 @@ +/* + * 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.controller.sal.common.util; public class Arguments { diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/CommitHandlersTransactions.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java similarity index 89% rename from opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/CommitHandlersTransactions.java rename to opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java index 254b8725b9..bffeb59fab 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/CommitHandlersTransactions.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/CommitHandlerTransactions.java @@ -1,15 +1,14 @@ -package org.opendaylight.controller.sal.binding.impl.connect.dom; +package org.opendaylight.controller.sal.common.util; import java.util.Collections; import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; -import org.opendaylight.controller.sal.common.util.Rpcs; import org.opendaylight.yangtools.concepts.Path; import org.opendaylight.yangtools.yang.common.RpcError; import org.opendaylight.yangtools.yang.common.RpcResult; -public class CommitHandlersTransactions { +public class CommitHandlerTransactions { private static class AllwaysSuccessfulTransaction

,D> implements DataCommitTransaction { @@ -33,7 +32,6 @@ public class CommitHandlersTransactions { } } - public static final

,D> AllwaysSuccessfulTransaction allwaysSuccessfulTransaction(DataModification modification) { return new AllwaysSuccessfulTransaction<>(modification); } diff --git a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Futures.java b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Futures.java index d9cf5cc477..42b00ba03d 100644 --- a/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Futures.java +++ b/opendaylight/md-sal/sal-common-util/src/main/java/org/opendaylight/controller/sal/common/util/Futures.java @@ -1,3 +1,10 @@ +/* + * 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.controller.sal.common.util; import java.util.concurrent.ExecutionException; diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcProvisionRegistry.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcProvisionRegistry.java index c326bab7a4..951d5b142e 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcProvisionRegistry.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/RpcProvisionRegistry.java @@ -4,7 +4,7 @@ import org.opendaylight.controller.sal.core.api.Broker.RoutedRpcRegistration; import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration; import org.opendaylight.yangtools.yang.common.QName; -public interface RpcProvisionRegistry { +public interface RpcProvisionRegistry extends BrokerService { /** * Registers an implementation of the rpc. diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountInstance.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountInstance.java index 910c7cb623..18c854646c 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountInstance.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountInstance.java @@ -6,7 +6,6 @@ * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.controller.sal.core.api.mount; import java.util.concurrent.Future; @@ -18,9 +17,11 @@ import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; -public interface MountInstance extends NotificationService, DataBrokerService { +public interface MountInstance extends // + NotificationService, // + DataBrokerService { Future> rpc(QName type, CompositeNode input); - + SchemaContext getSchemaContext(); } diff --git a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountProvisionService.java b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountProvisionService.java index fade7d341b..c1f873c3af 100644 --- a/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountProvisionService.java +++ b/opendaylight/md-sal/sal-dom-api/src/main/java/org/opendaylight/controller/sal/core/api/mount/MountProvisionService.java @@ -1,5 +1,8 @@ package org.opendaylight.controller.sal.core.api.mount; +import java.util.EventListener; + +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; public interface MountProvisionService extends MountService { @@ -10,4 +13,14 @@ public interface MountProvisionService extends MountService { MountProvisionInstance createMountPoint(InstanceIdentifier path); MountProvisionInstance createOrGetMountPoint(InstanceIdentifier path); + + ListenerRegistration registerProvisionListener(MountProvisionListener listener); + + public interface MountProvisionListener extends EventListener { + + void onMountPointCreated(InstanceIdentifier path); + + void onMountPointRemoved(InstanceIdentifier path); + + } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/$ModuleInfo.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/$ModuleInfo.java new file mode 100644 index 0000000000..3cc5a61afb --- /dev/null +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/$ModuleInfo.java @@ -0,0 +1,6 @@ +package org.opendaylight.controller.sal.dom.broker; + +public class $ModuleInfo { + + +} diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataBrokerImpl.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataBrokerImpl.java index 56eae97848..8f62be97d8 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataBrokerImpl.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/DataBrokerImpl.java @@ -13,6 +13,8 @@ import org.opendaylight.yangtools.concepts.Registration; import org.opendaylight.yangtools.yang.data.api.CompositeNode; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import com.google.common.util.concurrent.MoreExecutors; + public class DataBrokerImpl extends AbstractDataBroker implements DataProviderService, AutoCloseable { @@ -21,6 +23,7 @@ public class DataBrokerImpl extends AbstractDataBroker readWrapper; @@ -48,7 +48,7 @@ public class MountPointImpl implements MountProvisionInstance { public MountPointImpl(InstanceIdentifier path) { this.mountPath = path; rpcs = new RpcRouterImpl(""); - dataReader = new DataReaderRouter(); + dataReader = new DataBrokerImpl(); notificationRouter = new NotificationRouterImpl(); readWrapper = new ReadWrapper(); } @@ -124,15 +124,13 @@ public class MountPointImpl implements MountProvisionInstance { @Override public DataModificationTransaction beginTransaction() { - // TODO Auto-generated method stub - return null; + return dataReader.beginTransaction(); } @Override public ListenerRegistration registerDataChangeListener(InstanceIdentifier path, DataChangeListener listener) { - // TODO Auto-generated method stub - return null; + return dataReader.registerDataChangeListener(path, listener); } @Override @@ -143,8 +141,7 @@ public class MountPointImpl implements MountProvisionInstance { @Override public Registration> registerCommitHandler( InstanceIdentifier path, DataCommitHandler commitHandler) { - // TODO Auto-generated method stub - return null; + return dataReader.registerCommitHandler(path, commitHandler); } @Override @@ -208,7 +205,6 @@ public class MountPointImpl implements MountProvisionInstance { @Override public ListenerRegistration>> registerCommitHandlerListener( RegistrationListener> commitHandlerListener) { - // TODO Auto-generated method stub - return null; + return dataReader.registerCommitHandlerListener(commitHandlerListener); } } diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/MountPointManagerImpl.xtend b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/MountPointManagerImpl.xtend index 19634d79c2..5d441bddbd 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/MountPointManagerImpl.xtend +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/MountPointManagerImpl.xtend @@ -7,12 +7,16 @@ import java.util.concurrent.ConcurrentMap import java.util.concurrent.ConcurrentHashMap import static com.google.common.base.Preconditions.*; import org.opendaylight.controller.sal.core.api.data.DataProviderService +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService.MountProvisionListener +import org.opendaylight.yangtools.concepts.util.ListenerRegistry class MountPointManagerImpl implements MountProvisionService { @Property DataProviderService dataBroker; + val ListenerRegistry listeners = ListenerRegistry.create() + ConcurrentMap mounts = new ConcurrentHashMap(); override createMountPoint(InstanceIdentifier path) { @@ -20,15 +24,26 @@ class MountPointManagerImpl implements MountProvisionService { val mount = new MountPointImpl(path); registerMountPoint(mount); mounts.put(path,mount); + notifyMountCreated(path); return mount; } + def notifyMountCreated(InstanceIdentifier identifier) { + for(listener : listeners) { + listener.instance.onMountPointCreated(identifier); + } + } + def registerMountPoint(MountPointImpl impl) { dataBroker?.registerConfigurationReader(impl.mountPath,impl.readWrapper); dataBroker?.registerOperationalReader(impl.mountPath,impl.readWrapper); } + override registerProvisionListener(MountProvisionListener listener) { + listeners.register(listener) + } + override createOrGetMountPoint(InstanceIdentifier path) { val mount = mounts.get(path); diff --git a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/MountProviderServiceProxy.java b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/MountProviderServiceProxy.java index 0d18cb323a..0021dd8f0f 100644 --- a/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/MountProviderServiceProxy.java +++ b/opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/sal/dom/broker/osgi/MountProviderServiceProxy.java @@ -3,6 +3,7 @@ package org.opendaylight.controller.sal.dom.broker.osgi; import org.opendaylight.controller.sal.core.api.data.DataBrokerService; import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; import org.opendaylight.controller.sal.core.api.mount.MountProvisionService; +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; import org.osgi.framework.ServiceReference; @@ -24,4 +25,9 @@ public class MountProviderServiceProxy extends AbstractBrokerServiceProxy registerProvisionListener(MountProvisionListener listener) { + return getDelegate().registerProvisionListener(listener); + } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.xtend b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.xtend index bfe352ad41..da0790c599 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.xtend +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.xtend @@ -1,61 +1,55 @@ package org.opendaylight.controller.sal.connect.netconf -import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance -import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier -import org.opendaylight.controller.md.sal.common.api.data.DataReader -import org.opendaylight.yangtools.yang.data.api.CompositeNode -import org.opendaylight.controller.netconf.client.NetconfClient -import org.opendaylight.controller.sal.core.api.RpcImplementation -import static extension org.opendaylight.controller.sal.connect.netconf.NetconfMapping.* +import com.google.common.base.Optional +import com.google.common.collect.FluentIterable +import io.netty.util.concurrent.EventExecutor +import java.io.InputStream import java.net.InetSocketAddress -import org.opendaylight.yangtools.yang.data.api.Node -import org.opendaylight.yangtools.yang.data.api.SimpleNode -import org.opendaylight.yangtools.yang.common.QName +import java.net.URI import java.util.Collections +import java.util.List +import java.util.Set +import java.util.concurrent.ExecutorService +import java.util.concurrent.Future +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler +import org.opendaylight.controller.md.sal.common.api.data.DataModification +import org.opendaylight.controller.md.sal.common.api.data.DataReader +import org.opendaylight.controller.netconf.api.NetconfMessage +import org.opendaylight.controller.netconf.client.NetconfClient import org.opendaylight.controller.netconf.client.NetconfClientDispatcher -import org.opendaylight.yangtools.concepts.Registration -import org.opendaylight.controller.sal.core.api.Provider import org.opendaylight.controller.sal.core.api.Broker.ProviderSession -import org.opendaylight.controller.sal.core.api.mount.MountProvisionService -import static org.opendaylight.controller.sal.connect.netconf.InventoryUtils.*; +import org.opendaylight.controller.sal.core.api.Provider +import org.opendaylight.controller.sal.core.api.RpcImplementation import org.opendaylight.controller.sal.core.api.data.DataBrokerService import org.opendaylight.controller.sal.core.api.data.DataModificationTransaction -import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl -import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl +import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance +import org.opendaylight.controller.sal.core.api.mount.MountProvisionService import org.opendaylight.protocol.framework.ReconnectStrategy -import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler -import org.opendaylight.controller.md.sal.common.api.data.DataModification -import com.google.common.collect.FluentIterable -import org.opendaylight.yangtools.yang.model.api.SchemaContext -import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState +import org.opendaylight.yangtools.concepts.Registration +import org.opendaylight.yangtools.yang.common.QName +import org.opendaylight.yangtools.yang.data.api.CompositeNode +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier +import org.opendaylight.yangtools.yang.data.api.Node +import org.opendaylight.yangtools.yang.data.api.SimpleNode +import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode +import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl +import org.opendaylight.yangtools.yang.model.api.SchemaContext +import org.opendaylight.yangtools.yang.model.util.repo.AbstractCachingSchemaSourceProvider +import org.opendaylight.yangtools.yang.model.util.repo.SchemaSourceProvider +import org.opendaylight.yangtools.yang.model.util.repo.SchemaSourceProviders +import org.opendaylight.yangtools.yang.model.util.repo.SourceIdentifier import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl -import java.io.InputStream -import org.slf4j.LoggerFactory +import org.opendaylight.yangtools.yang.parser.impl.util.YangSourceContext import org.slf4j.Logger -import org.opendaylight.controller.netconf.client.AbstractNetconfClientNotifySessionListener -import org.opendaylight.controller.netconf.client.NetconfClientSession -import org.opendaylight.controller.netconf.api.NetconfMessage -import io.netty.util.concurrent.EventExecutor +import org.slf4j.LoggerFactory -import java.util.Map -import java.util.Set -import com.google.common.collect.ImmutableMap +import static com.google.common.base.Preconditions.* +import static org.opendaylight.controller.sal.connect.netconf.InventoryUtils.* -import org.opendaylight.yangtools.yang.model.util.repo.AbstractCachingSchemaSourceProvider -import org.opendaylight.yangtools.yang.model.util.repo.SchemaSourceProvider -import com.google.common.base.Optional -import com.google.common.collect.ImmutableList -import org.opendaylight.yangtools.yang.model.util.repo.SchemaSourceProviders -import static com.google.common.base.Preconditions.*; -import java.util.concurrent.ExecutorService -import java.util.concurrent.Future -import org.opendaylight.controller.netconf.client.NetconfClientSessionListener -import io.netty.util.concurrent.Promise -import org.opendaylight.controller.netconf.util.xml.XmlElement -import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants -import java.util.concurrent.ExecutionException -import java.util.concurrent.locks.ReentrantLock +import static extension org.opendaylight.controller.sal.connect.netconf.NetconfMapping.* +import org.opendaylight.controller.netconf.util.xml.XmlUtil class NetconfDevice implements Provider, // DataReader, // @@ -86,7 +80,8 @@ AutoCloseable { @Property var AbstractCachingSchemaSourceProvider schemaSourceProvider; - private NetconfDeviceSchemaContextProvider schemaContextProvider + @Property + private NetconfDeviceSchemaContextProvider deviceContextProvider protected val Logger logger @@ -105,9 +100,12 @@ AutoCloseable { @Property var NetconfClientDispatcher dispatcher - + static val InstanceIdentifier ROOT_PATH = InstanceIdentifier.builder().toInstance(); + @Property + var SchemaSourceProvider remoteSourceProvider + public new(String name) { this.name = name; this.logger = LoggerFactory.getLogger(NetconfDevice.name + "#" + name); @@ -120,11 +118,12 @@ AutoCloseable { checkState(schemaSourceProvider != null, "Schema Source Provider must be set.") checkState(eventExecutor != null, "Event executor must be set."); - val listener = new NetconfDeviceListener(this,eventExecutor); + val listener = new NetconfDeviceListener(this, eventExecutor); val task = startClientTask(dispatcher, listener) - if(mountInstance != null) { + if (mountInstance != null) { confReaderReg = mountInstance.registerConfigurationReader(ROOT_PATH, this); operReaderReg = mountInstance.registerOperationalReader(ROOT_PATH, this); + commitHandlerReg = mountInstance.registerCommitHandler(ROOT_PATH, this) } return processingExecutor.submit(task) as Future; @@ -132,27 +131,28 @@ AutoCloseable { } def Optional getSchemaContext() { - if (schemaContextProvider == null) { + if (deviceContextProvider == null) { return Optional.absent(); } - return schemaContextProvider.currentContext; + return deviceContextProvider.currentContext; } private def Runnable startClientTask(NetconfClientDispatcher dispatcher, NetconfDeviceListener listener) { + return [ | logger.info("Starting Netconf Client on: {}", socketAddress); client = NetconfClient.clientFor(name, socketAddress, reconnectStrategy, dispatcher, listener); logger.debug("Initial capabilities {}", initialCapabilities); var SchemaSourceProvider delegate; - if (initialCapabilities.contains(NetconfMapping.IETF_NETCONF_MONITORING_MODULE)) { - delegate = new NetconfDeviceSchemaSourceProvider(this); - } else { - logger.info("Device does not support IETF Netconf Monitoring.", socketAddress); + if (NetconfRemoteSchemaSourceProvider.isSupportedFor(initialCapabilities)) { + delegate = new NetconfRemoteSchemaSourceProvider(this); + } else { + logger.info("Netconf server {} does not support IETF Netconf Monitoring", socketAddress); delegate = SchemaSourceProviders.noopProvider(); } - val sourceProvider = schemaSourceProvider.createInstanceFor(delegate); - schemaContextProvider = new NetconfDeviceSchemaContextProvider(this, sourceProvider); - schemaContextProvider.createContextFromCapabilities(initialCapabilities); + remoteSourceProvider = schemaSourceProvider.createInstanceFor(delegate); + deviceContextProvider = new NetconfDeviceSchemaContextProvider(this, remoteSourceProvider); + deviceContextProvider.createContextFromCapabilities(initialCapabilities); if (mountInstance != null && schemaContext.isPresent) { mountInstance.schemaContext = schemaContext.get(); } @@ -175,18 +175,31 @@ AutoCloseable { override getSupportedRpcs() { Collections.emptySet; } - + def createSubscription(String streamName) { val it = ImmutableCompositeNode.builder() QName = NETCONF_CREATE_SUBSCRIPTION_QNAME - addLeaf("stream",streamName); - invokeRpc(QName,toInstance()) + addLeaf("stream", streamName); + invokeRpc(QName, toInstance()) } override invokeRpc(QName rpc, CompositeNode input) { - val message = rpc.toRpcMessage(input); - val result = client.sendMessage(message, messegeRetryCount, messageTimeoutCount); - return result.toRpcResult(); + try { + val message = rpc.toRpcMessage(input,schemaContext); + val result = sendMessageImpl(message, messegeRetryCount, messageTimeoutCount); + return result.toRpcResult(rpc, schemaContext); + + } catch (Exception e) { + logger.error("Rpc was not processed correctly.", e) + throw e; + } + } + + def NetconfMessage sendMessageImpl(NetconfMessage message, int retryCount, int timeout) { + logger.debug("Send message {}",XmlUtil.toString(message.document)) + val result = client.sendMessage(message, retryCount, timeout); + NetconfMapping.checkValidReply(message, result) + return result; } override getProviderFunctionality() { @@ -221,7 +234,7 @@ AutoCloseable { return null === transaction.readOperationalData(path); } - def Node findNode(CompositeNode node, InstanceIdentifier identifier) { + static def Node findNode(CompositeNode node, InstanceIdentifier identifier) { var Node current = node; for (arg : identifier.path) { @@ -229,12 +242,17 @@ AutoCloseable { return null; } else if (current instanceof CompositeNode) { val currentComposite = (current as CompositeNode); - - current = currentComposite.getFirstCompositeByName(arg.nodeType.withoutRevision()); - if (current == null) { - current = currentComposite.getFirstSimpleByName(arg.nodeType.withoutRevision()); + + current = currentComposite.getFirstCompositeByName(arg.nodeType); + if(current == null) { + current = currentComposite.getFirstCompositeByName(arg.nodeType.withoutRevision()); + } + if(current == null) { + current = currentComposite.getFirstSimpleByName(arg.nodeType); } if (current == null) { + current = currentComposite.getFirstSimpleByName(arg.nodeType.withoutRevision()); + } if (current == null) { return null; } } @@ -243,7 +261,9 @@ AutoCloseable { } override requestCommit(DataModification modification) { - throw new UnsupportedOperationException("TODO: auto-generated method stub") + val twoPhaseCommit = new NetconfDeviceTwoPhaseCommitTransaction(this, modification); + twoPhaseCommit.prepare() + return twoPhaseCommit; } def getInitialCapabilities() { @@ -257,8 +277,18 @@ AutoCloseable { val parts = split("\\?"); val namespace = parts.get(0); val queryParams = FluentIterable.from(parts.get(1).split("&")); - val revision = queryParams.findFirst[startsWith("revision=")].replaceAll("revision=", ""); - val moduleName = queryParams.findFirst[startsWith("module=")].replaceAll("module=", ""); + var revision = queryParams.findFirst[startsWith("revision=")]?.replaceAll("revision=", ""); + val moduleName = queryParams.findFirst[startsWith("module=")]?.replaceAll("module=", ""); + if (revision === null) { + logger.warn("Netconf device was not reporting revision correctly, trying to get amp;revision="); + revision = queryParams.findFirst[startsWith("&revision=")]?.replaceAll("revision=", ""); + if (revision != null) { + logger.warn("Netconf device returned revision incorectly escaped for {}", it) + } + } + if (revision == null) { + return QName.create(URI.create(namespace), null, moduleName); + } return QName.create(namespace, revision, moduleName); ].toSet(); } @@ -273,96 +303,6 @@ AutoCloseable { } -package class NetconfDeviceListener extends NetconfClientSessionListener { - - val NetconfDevice device - val EventExecutor eventExecutor - - new(NetconfDevice device,EventExecutor eventExecutor) { - this.device = device - this.eventExecutor = eventExecutor - } - - var Promise messagePromise; - val promiseLock = new ReentrantLock; - - override onMessage(NetconfClientSession session, NetconfMessage message) { - if (isNotification(message)) { - onNotification(session, message); - } else try { - promiseLock.lock - if (messagePromise != null) { - messagePromise.setSuccess(message); - messagePromise = null; - } - } finally { - promiseLock.unlock - } - } - - /** - * Method intended to customize notification processing. - * - * @param session - * {@see - * NetconfClientSessionListener#onMessage(NetconfClientSession, - * NetconfMessage)} - * @param message - * {@see - * NetconfClientSessionListener#onMessage(NetconfClientSession, - * NetconfMessage)} - */ - def void onNotification(NetconfClientSession session, NetconfMessage message) { - device.logger.debug("Received NETCONF notification.",message); - val domNotification = message?.toCompositeNode?.notificationBody; - if(domNotification != null) { - device?.mountInstance?.publish(domNotification); - } - } - - private static def CompositeNode getNotificationBody(CompositeNode node) { - for(child : node.children) { - if(child instanceof CompositeNode) { - return child as CompositeNode; - } - } - } - - override getLastMessage(int attempts, int attemptMsDelay) throws InterruptedException { - val promise = promiseReply(); - val messageAvailable = promise.await(attempts + attemptMsDelay); - if (messageAvailable) { - try { - return promise.get(); - } catch (ExecutionException e) { - throw new IllegalStateException(e); - } - } - - throw new IllegalStateException("Unsuccessful after " + attempts + " attempts."); - - // throw new TimeoutException("Message was not received on time."); - } - - def Promise promiseReply() { - promiseLock.lock - try { - if (messagePromise == null) { - messagePromise = eventExecutor.newPromise(); - return messagePromise; - } - return messagePromise; - } finally { - promiseLock.unlock - } - } - - def boolean isNotification(NetconfMessage message) { - val xmle = XmlElement.fromDomDocument(message.getDocument()); - return XmlNetconfConstants.NOTIFICATION_ELEMENT_NAME.equals(xmle.getName()); - } -} - package class NetconfDeviceSchemaContextProvider { @Property @@ -380,22 +320,29 @@ package class NetconfDeviceSchemaContextProvider { } def createContextFromCapabilities(Iterable capabilities) { - - val modelsToParse = ImmutableMap.builder(); - for (cap : capabilities) { - val source = sourceProvider.getSchemaSource(cap.localName, Optional.fromNullable(cap.formattedRevision)); - if (source.present) { - modelsToParse.put(cap, source.get()); - } + val sourceContext = YangSourceContext.createFrom(capabilities, sourceProvider) + if (!sourceContext.missingSources.empty) { + device.logger.warn("Sources for following models are missing {}", sourceContext.missingSources); + } + device.logger.debug("Trying to create schema context from {}", sourceContext.validSources) + val modelsToParse = YangSourceContext.getValidInputStreams(sourceContext); + if (!sourceContext.validSources.empty) { + val schemaContext = tryToCreateContext(modelsToParse); + currentContext = Optional.fromNullable(schemaContext); + } else { + currentContext = Optional.absent(); } - val context = tryToCreateContext(modelsToParse.build); - currentContext = Optional.fromNullable(context); + if (currentContext.present) { + device.logger.debug("Schema context successfully created."); + } + } - def SchemaContext tryToCreateContext(Map modelsToParse) { + def SchemaContext tryToCreateContext(List modelsToParse) { val parser = new YangParserImpl(); try { - val models = parser.parseYangModelsFromStreams(ImmutableList.copyOf(modelsToParse.values)); + + val models = parser.parseYangModelsFromStreams(modelsToParse); val result = parser.resolveSchemaContext(models); return result; } catch (Exception e) { @@ -404,33 +351,3 @@ package class NetconfDeviceSchemaContextProvider { } } } - -package class NetconfDeviceSchemaSourceProvider implements SchemaSourceProvider { - - val NetconfDevice device; - - new(NetconfDevice device) { - this.device = device; - } - - override getSchemaSource(String moduleName, Optional revision) { - val it = ImmutableCompositeNode.builder() // - setQName(QName::create(NetconfState.QNAME, "get-schema")) // - addLeaf("format", "yang") - addLeaf("identifier", moduleName) - if (revision.present) { - addLeaf("version", revision.get()) - } - - device.logger.info("Loading YANG schema source for {}:{}", moduleName, revision) - val schemaReply = device.invokeRpc(getQName(), toInstance()); - - if (schemaReply.successful) { - val schemaBody = schemaReply.result.getFirstSimpleByName( - QName::create(NetconfState.QNAME.namespace, null, "data"))?.value; - device.logger.info("YANG Schema successfully received for: {}:{}", moduleName, revision); - return Optional.of(schemaBody as String); - } - return Optional.absent(); - } -} diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceListener.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceListener.java new file mode 100644 index 0000000000..8623d90fe5 --- /dev/null +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceListener.java @@ -0,0 +1,155 @@ +package org.opendaylight.controller.sal.connect.netconf; + +import com.google.common.base.Objects; + +import io.netty.util.concurrent.EventExecutor; +import io.netty.util.concurrent.Promise; + +import java.util.List; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.locks.ReentrantLock; + +import org.eclipse.xtext.xbase.lib.Exceptions; +import org.eclipse.xtext.xbase.lib.Functions.Function0; +import org.opendaylight.controller.netconf.api.NetconfMessage; +import org.opendaylight.controller.netconf.client.NetconfClientSession; +import org.opendaylight.controller.netconf.client.NetconfClientSessionListener; +import org.opendaylight.controller.netconf.util.xml.XmlElement; +import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants; +import org.opendaylight.controller.sal.connect.netconf.NetconfDevice; +import org.opendaylight.controller.sal.connect.netconf.NetconfMapping; +import org.opendaylight.controller.sal.core.api.mount.MountProvisionInstance; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.Node; +import org.w3c.dom.Document; + +@SuppressWarnings("all") +class NetconfDeviceListener extends NetconfClientSessionListener { + private final NetconfDevice device; + private final EventExecutor eventExecutor; + + public NetconfDeviceListener(final NetconfDevice device, final EventExecutor eventExecutor) { + this.device = device; + this.eventExecutor = eventExecutor; + } + + private Promise messagePromise; + private ConcurrentMap> promisedMessages; + + private final ReentrantLock promiseLock = new ReentrantLock(); + + public void onMessage(final NetconfClientSession session, final NetconfMessage message) { + if (isNotification(message)) { + this.onNotification(session, message); + } else { + try { + this.promiseLock.lock(); + boolean _notEquals = (!Objects.equal(this.messagePromise, null)); + if (_notEquals) { + this.device.logger.debug("Setting promised reply {} with message {}", this.messagePromise, message); + this.messagePromise.setSuccess(message); + this.messagePromise = null; + } + } finally { + this.promiseLock.unlock(); + } + } + } + + /** + * Method intended to customize notification processing. + * + * @param session + * {@see + * NetconfClientSessionListener#onMessage(NetconfClientSession, + * NetconfMessage)} + * @param message + * {@see + * NetconfClientSessionListener#onMessage(NetconfClientSession, + * NetconfMessage)} + */ + public void onNotification(final NetconfClientSession session, final NetconfMessage message) { + this.device.logger.debug("Received NETCONF notification.", message); + CompositeNode _notificationBody = null; + CompositeNode _compositeNode = null; + if (message != null) { + _compositeNode = NetconfMapping.toCompositeNode(message,device.getSchemaContext()); + } + if (_compositeNode != null) { + _notificationBody = NetconfDeviceListener.getNotificationBody(_compositeNode); + } + final CompositeNode domNotification = _notificationBody; + boolean _notEquals = (!Objects.equal(domNotification, null)); + if (_notEquals) { + MountProvisionInstance _mountInstance = null; + if (this.device != null) { + _mountInstance = this.device.getMountInstance(); + } + if (_mountInstance != null) { + _mountInstance.publish(domNotification); + } + } + } + + private static CompositeNode getNotificationBody(final CompositeNode node) { + List> _children = node.getChildren(); + for (final Node child : _children) { + if ((child instanceof CompositeNode)) { + return ((CompositeNode) child); + } + } + return null; + } + + public NetconfMessage getLastMessage(final int attempts, final int attemptMsDelay) throws InterruptedException { + final Promise promise = this.promiseReply(); + this.device.logger.debug("Waiting for reply {}", promise); + int _plus = (attempts * attemptMsDelay); + final boolean messageAvailable = promise.await(_plus); + if (messageAvailable) { + try { + try { + return promise.get(); + } catch (Throwable _e) { + throw Exceptions.sneakyThrow(_e); + } + } catch (final Throwable _t) { + if (_t instanceof ExecutionException) { + final ExecutionException e = (ExecutionException) _t; + IllegalStateException _illegalStateException = new IllegalStateException(e); + throw _illegalStateException; + } else { + throw Exceptions.sneakyThrow(_t); + } + } + } + String _plus_1 = ("Unsuccessful after " + Integer.valueOf(attempts)); + String _plus_2 = (_plus_1 + " attempts."); + IllegalStateException _illegalStateException_1 = new IllegalStateException(_plus_2); + throw _illegalStateException_1; + } + + public synchronized Promise promiseReply() { + this.device.logger.debug("Promising reply."); + this.promiseLock.lock(); + try { + boolean _equals = Objects.equal(this.messagePromise, null); + if (_equals) { + Promise _newPromise = this.eventExecutor. newPromise(); + this.messagePromise = _newPromise; + return this.messagePromise; + } + return this.messagePromise; + } finally { + this.promiseLock.unlock(); + } + } + + public boolean isNotification(final NetconfMessage message) { + Document _document = message.getDocument(); + final XmlElement xmle = XmlElement.fromDomDocument(_document); + String _name = xmle.getName(); + return XmlNetconfConstants.NOTIFICATION_ELEMENT_NAME.equals(_name); + } +} diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTwoPhaseCommitTransaction.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTwoPhaseCommitTransaction.java new file mode 100644 index 0000000000..216a27aaaa --- /dev/null +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDeviceTwoPhaseCommitTransaction.java @@ -0,0 +1,134 @@ +package org.opendaylight.controller.sal.connect.netconf; + +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; + +import org.eclipse.xtext.xbase.lib.IterableExtensions; +import org.opendaylight.controller.md.sal.common.api.data.DataModification; +import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler.DataCommitTransaction; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument; +import org.opendaylight.yangtools.yang.data.api.Node; +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; +import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; +import com.google.common.collect.Collections2; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +import static org.opendaylight.controller.sal.connect.netconf.NetconfMapping.*; + +public class NetconfDeviceTwoPhaseCommitTransaction implements DataCommitTransaction { + + private NetconfDevice device; + private final DataModification modification; + private boolean candidateSupported = true; + + public NetconfDeviceTwoPhaseCommitTransaction(NetconfDevice device, + DataModification modification) { + super(); + this.device = device; + this.modification = modification; + } + + public void prepare() { + for (InstanceIdentifier toRemove : modification.getRemovedConfigurationData()) { + sendRemove(toRemove); + } + for(Entry toUpdate : modification.getUpdatedConfigurationData().entrySet()) { + sendMerge(toUpdate.getKey(),toUpdate.getValue()); + } + + } + + private void sendMerge(InstanceIdentifier key, CompositeNode value) { + sendEditRpc(createEditStructure(key, Optional.absent(), Optional.of(value))); + } + + private void sendRemove(InstanceIdentifier toRemove) { + sendEditRpc(createEditStructure(toRemove, Optional.of("remove"), Optional. absent())); + } + + private void sendEditRpc(CompositeNode editStructure) { + CompositeNodeBuilder builder = configurationRpcBuilder(); + builder.setQName(NETCONF_EDIT_CONFIG_QNAME); + builder.add(editStructure); + + RpcResult rpcResult = device.invokeRpc(NETCONF_EDIT_CONFIG_QNAME, builder.toInstance()); + Preconditions.checkState(rpcResult.isSuccessful(),"Rpc Result was unsuccessful"); + + } + + private CompositeNodeBuilder configurationRpcBuilder() { + CompositeNodeBuilder ret = ImmutableCompositeNode.builder(); + + Node targetNode; + if(candidateSupported) { + targetNode = ImmutableCompositeNode.create(NETCONF_CANDIDATE_QNAME, ImmutableList.>of()); + } else { + targetNode = ImmutableCompositeNode.create(NETCONF_RUNNING_QNAME, ImmutableList.>of()); + } + Node targetWrapperNode = ImmutableCompositeNode.create(NETCONF_TARGET_QNAME, ImmutableList.>of(targetNode)); + ret.add(targetWrapperNode); + return ret; + } + + private CompositeNode createEditStructure(InstanceIdentifier dataPath, Optional action, + Optional lastChildOverride) { + List path = dataPath.getPath(); + List reversed = Lists.reverse(path); + CompositeNode previous = null; + boolean isLast = true; + for (PathArgument arg : reversed) { + CompositeNodeBuilder builder = ImmutableCompositeNode.builder(); + builder.setQName(arg.getNodeType()); + + if (arg instanceof NodeIdentifierWithPredicates) { + for (Entry entry : ((NodeIdentifierWithPredicates) arg).getKeyValues().entrySet()) { + builder.addLeaf(entry.getKey(), entry.getValue()); + } + } + if (isLast) { + if (action.isPresent()) { + builder.setAttribute(NETCONF_ACTION_QNAME, action.get()); + } + if (lastChildOverride.isPresent()) { + List> children = lastChildOverride.get().getChildren(); + builder.addAll(children); + } + } else { + builder.add(previous); + } + previous = builder.toInstance(); + isLast = false; + } + return ImmutableCompositeNode.create(NETCONF_CONFIG_QNAME, ImmutableList.>of(previous)); + } + + @Override + public RpcResult finish() throws IllegalStateException { + CompositeNodeBuilder commitInput = ImmutableCompositeNode.builder(); + commitInput.setQName(NETCONF_COMMIT_QNAME); + RpcResult rpcResult = device.invokeRpc(NetconfMapping.NETCONF_COMMIT_QNAME, commitInput.toInstance()); + return (RpcResult) rpcResult; + } + + @Override + public DataModification getModification() { + return this.modification; + } + + @Override + public RpcResult rollback() throws IllegalStateException { + // TODO Auto-generated method stub + return null; + } +} diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend index 794b58294e..c151e42fbb 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfMapping.xtend @@ -22,6 +22,10 @@ import java.util.List import com.google.common.collect.ImmutableList import org.opendaylight.yangtools.yang.data.api.SimpleNode import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode +import com.google.common.base.Preconditions +import com.google.common.base.Optional +import org.opendaylight.yangtools.yang.model.api.SchemaContext +import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlDocumentUtils class NetconfMapping { @@ -36,8 +40,19 @@ class NetconfMapping { public static val NETCONF_FILTER_QNAME = QName.create(NETCONF_QNAME, "filter"); public static val NETCONF_TYPE_QNAME = QName.create(NETCONF_QNAME, "type"); public static val NETCONF_GET_CONFIG_QNAME = QName.create(NETCONF_QNAME, "get-config"); + public static val NETCONF_EDIT_CONFIG_QNAME = QName.create(NETCONF_QNAME, "edit-config"); + public static val NETCONF_DELETE_CONFIG_QNAME = QName.create(NETCONF_QNAME, "delete-config"); + public static val NETCONF_ACTION_QNAME = QName.create(NETCONF_QNAME, "action"); + public static val NETCONF_COMMIT_QNAME = QName.create(NETCONF_QNAME, "commit"); + + public static val NETCONF_CONFIG_QNAME = QName.create(NETCONF_QNAME, "config"); public static val NETCONF_SOURCE_QNAME = QName.create(NETCONF_QNAME, "source"); + public static val NETCONF_TARGET_QNAME = QName.create(NETCONF_QNAME, "target"); + + public static val NETCONF_CANDIDATE_QNAME = QName.create(NETCONF_QNAME, "candidate"); public static val NETCONF_RUNNING_QNAME = QName.create(NETCONF_QNAME, "running"); + + public static val NETCONF_RPC_REPLY_QNAME = QName.create(NETCONF_QNAME, "rpc-reply"); public static val NETCONF_OK_QNAME = QName.create(NETCONF_QNAME, "ok"); public static val NETCONF_DATA_QNAME = QName.create(NETCONF_QNAME, "data"); @@ -80,11 +95,11 @@ class NetconfMapping { } } - static def CompositeNode toCompositeNode(NetconfMessage message) { - return message.toRpcResult().result; + static def CompositeNode toCompositeNode(NetconfMessage message,Optional ctx) { + return null//message.toRpcResult().result; } - static def NetconfMessage toRpcMessage(QName rpc, CompositeNode node) { + static def NetconfMessage toRpcMessage(QName rpc, CompositeNode node,Optional ctx) { val rpcPayload = wrap(NETCONF_RPC_QNAME, flattenInput(node)); val w3cPayload = NodeUtils.buildShadowDomTree(rpcPayload); w3cPayload.documentElement.setAttribute("message-id", "m-" + messageId.andIncrement); @@ -106,12 +121,41 @@ class NetconfMapping { } - static def RpcResult toRpcResult(NetconfMessage message) { - val rawRpc = message.document.toCompositeNode() as CompositeNode; - + static def RpcResult toRpcResult(NetconfMessage message,QName rpc,Optional context) { + var CompositeNode rawRpc; + if(context.present) { + if(isDataRetrievalReply(rpc)) { + + val xmlData = message.document.dataSubtree + val dataNodes = XmlDocumentUtils.toDomNodes(xmlData,Optional.of(context.get.dataDefinitions)) + + val it = ImmutableCompositeNode.builder() + setQName(NETCONF_RPC_REPLY_QNAME) + add(ImmutableCompositeNode.create(NETCONF_DATA_QNAME,dataNodes)); + + rawRpc = it.toInstance; + //sys(xmlData) + } else { + val rpcSchema = context.get.operations.findFirst[QName == rpc] + rawRpc = message.document.toCompositeNode() as CompositeNode; + } + + + + } else { + rawRpc = message.document.toCompositeNode() as CompositeNode; + } //rawRpc. return Rpcs.getRpcResult(true, rawRpc, Collections.emptySet()); } + + def static Element getDataSubtree(Document doc) { + doc.getElementsByTagNameNS(NETCONF_URI.toString,"data").item(0) as Element + } + + def static boolean isDataRetrievalReply(QName it) { + return NETCONF_URI == namespace && ( localName == NETCONF_GET_CONFIG_QNAME.localName || localName == NETCONF_GET_QNAME.localName) + } static def wrap(QName name, Node node) { if (node != null) { @@ -141,6 +185,14 @@ class NetconfMapping { } public static def Node toCompositeNode(Document document) { - return XmlDocumentUtils.toNode(document) as Node + return XmlDocumentUtils.toDomNode(document) as Node } + + public static def checkValidReply(NetconfMessage input, NetconfMessage output) { + val inputMsgId = input.document.documentElement.getAttribute("message-id") + val outputMsgId = output.document.documentElement.getAttribute("message-id") + Preconditions.checkState(inputMsgId == outputMsgId,"Rpc request and reply message IDs must be same."); + + } + } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfRemoteSchemaSourceProvider.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfRemoteSchemaSourceProvider.java new file mode 100644 index 0000000000..12be689cb9 --- /dev/null +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfRemoteSchemaSourceProvider.java @@ -0,0 +1,69 @@ +package org.opendaylight.controller.sal.connect.netconf; + +import java.util.Set; + +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004.NetconfState; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcResult; +import org.opendaylight.yangtools.yang.data.api.CompositeNode; +import org.opendaylight.yangtools.yang.data.api.SimpleNode; +import org.opendaylight.yangtools.yang.data.impl.ImmutableCompositeNode; +import org.opendaylight.yangtools.yang.data.impl.util.CompositeNodeBuilder; +import org.opendaylight.yangtools.yang.model.util.repo.SchemaSourceProvider; + +import com.google.common.base.Optional; +import com.google.common.base.Preconditions; + +class NetconfRemoteSchemaSourceProvider implements SchemaSourceProvider { + + public static final QName IETF_NETCONF_MONITORING = QName.create( + "urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring", "2010-10-04", "ietf-netconf-monitoring"); + public static final QName GET_SCHEMA_QNAME = QName.create(IETF_NETCONF_MONITORING, "get-schema"); + public static final QName GET_DATA_QNAME = QName.create(IETF_NETCONF_MONITORING, "data"); + + NetconfDevice device; + + public NetconfRemoteSchemaSourceProvider(NetconfDevice device) { + super(); + this.device = device; + } + + @Override + public Optional getSchemaSource(String moduleName, Optional revision) { + CompositeNodeBuilder request = ImmutableCompositeNode.builder(); // + request.setQName(GET_SCHEMA_QNAME) // + .addLeaf("format", "yang") // + .addLeaf("identifier", moduleName); // + if (revision.isPresent()) { + request.addLeaf("version", revision.get()); + } + + device.logger.info("Loading YANG schema source for {}:{}", moduleName, revision); + RpcResult schemaReply = device.invokeRpc(GET_SCHEMA_QNAME, request.toInstance()); + if (schemaReply.isSuccessful()) { + String schemaBody = getSchemaFromRpc(schemaReply.getResult()); + if (schemaBody != null) { + device.logger.info("YANG Schema successfully retrieved from remote for {}:{}", moduleName, revision); + return Optional.of(schemaBody); + } + } + device.logger.info("YANG shcema was not successfully retrieved."); + return Optional.absent(); + } + + private String getSchemaFromRpc(CompositeNode result) { + if (result == null) { + return null; + } + SimpleNode simpleNode = result.getFirstSimpleByName(GET_DATA_QNAME.withoutRevision()); + Object potential = simpleNode.getValue(); + if (potential instanceof String) { + return (String) potential; + } + return null; + } + + public static final boolean isSupportedFor(Set capabilities) { + return capabilities.contains(IETF_NETCONF_MONITORING); + } +} diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/XmlDocumentUtils.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/XmlDocumentUtils.java deleted file mode 100644 index e151fca009..0000000000 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/XmlDocumentUtils.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.opendaylight.controller.sal.connect.netconf; - -import java.net.URI; -import java.util.ArrayList; -import java.util.List; - -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.CompositeNode; -import org.opendaylight.yangtools.yang.data.api.Node; -import org.opendaylight.yangtools.yang.data.impl.CompositeNodeTOImpl; -import org.opendaylight.yangtools.yang.data.impl.SimpleNodeTOImpl; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -import com.google.common.base.Strings; - -public class XmlDocumentUtils { - - public static Node toNode(Document doc) { - return toCompositeNode(doc.getDocumentElement()); - } - - private static Node toCompositeNode(Element element) { - String orgNamespace = element.getNamespaceURI(); - URI biNamespace = null; - if (orgNamespace != null) { - biNamespace = URI.create(orgNamespace); - } - QName qname = new QName(biNamespace, element.getLocalName()); - - List> values = new ArrayList<>(); - NodeList nodes = element.getChildNodes(); - boolean isSimpleObject = true; - String value = null; - for (int i = 0; i < nodes.getLength(); i++) { - org.w3c.dom.Node child = nodes.item(i); - if (child instanceof Element) { - isSimpleObject = false; - values.add(toCompositeNode((Element) child)); - } - if (isSimpleObject && child instanceof org.w3c.dom.Text) { - value = element.getTextContent(); - if (!Strings.isNullOrEmpty(value)) { - isSimpleObject = true; - } - } - } - - if (isSimpleObject) { - return new SimpleNodeTOImpl<>(qname, null, value); - } - return new CompositeNodeTOImpl(qname, null, values); - } -} diff --git a/opendaylight/networkconfiguration/neutron/implementation/pom.xml b/opendaylight/networkconfiguration/neutron/implementation/pom.xml index 3b335463d9..1590873b70 100644 --- a/opendaylight/networkconfiguration/neutron/implementation/pom.xml +++ b/opendaylight/networkconfiguration/neutron/implementation/pom.xml @@ -76,7 +76,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -86,7 +86,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/networkconfiguration/neutron/pom.xml b/opendaylight/networkconfiguration/neutron/pom.xml index 588a61653a..b6cdd2512b 100644 --- a/opendaylight/networkconfiguration/neutron/pom.xml +++ b/opendaylight/networkconfiguration/neutron/pom.xml @@ -67,12 +67,12 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT commons-net diff --git a/opendaylight/protocol_plugins/stub/pom.xml b/opendaylight/protocol_plugins/stub/pom.xml index 2457ddeb67..b7d7b05b60 100644 --- a/opendaylight/protocol_plugins/stub/pom.xml +++ b/opendaylight/protocol_plugins/stub/pom.xml @@ -57,7 +57,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/InventoryService.java b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/InventoryService.java index ec050fa305..9f2454bbff 100644 --- a/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/InventoryService.java +++ b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/InventoryService.java @@ -65,6 +65,12 @@ public class InventoryService implements IPluginInInventoryService { } } + @Override + public Set getConfiguredNotConnectedNodes() { + // TODO + return null; + } + /** * Function called by the dependency manager when all the required * dependencies are satisfied diff --git a/opendaylight/routing/dijkstra_implementation/pom.xml b/opendaylight/routing/dijkstra_implementation/pom.xml index eeea5d91d7..aa3f625939 100644 --- a/opendaylight/routing/dijkstra_implementation/pom.xml +++ b/opendaylight/routing/dijkstra_implementation/pom.xml @@ -59,7 +59,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/sal/connection/api/pom.xml b/opendaylight/sal/connection/api/pom.xml index d60e7abe70..006334edfe 100644 --- a/opendaylight/sal/connection/api/pom.xml +++ b/opendaylight/sal/connection/api/pom.xml @@ -50,7 +50,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/sal/connection/implementation/pom.xml b/opendaylight/sal/connection/implementation/pom.xml index e171a8de59..4a7e70b836 100644 --- a/opendaylight/sal/connection/implementation/pom.xml +++ b/opendaylight/sal/connection/implementation/pom.xml @@ -58,7 +58,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/sal/networkconfiguration/api/pom.xml b/opendaylight/sal/networkconfiguration/api/pom.xml index 79707cbc57..3c08b439ae 100644 --- a/opendaylight/sal/networkconfiguration/api/pom.xml +++ b/opendaylight/sal/networkconfiguration/api/pom.xml @@ -47,7 +47,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/sal/networkconfiguration/implementation/pom.xml b/opendaylight/sal/networkconfiguration/implementation/pom.xml index 9d7b84ac79..c25ce0fa4f 100644 --- a/opendaylight/sal/networkconfiguration/implementation/pom.xml +++ b/opendaylight/sal/networkconfiguration/implementation/pom.xml @@ -50,7 +50,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/samples/loadbalancer/pom.xml b/opendaylight/samples/loadbalancer/pom.xml index cf7a18ea65..6f951ca2f6 100644 --- a/opendaylight/samples/loadbalancer/pom.xml +++ b/opendaylight/samples/loadbalancer/pom.xml @@ -85,7 +85,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -95,7 +95,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/samples/northbound/loadbalancer/pom.xml b/opendaylight/samples/northbound/loadbalancer/pom.xml index 1bbc5bf23e..3b054b6339 100644 --- a/opendaylight/samples/northbound/loadbalancer/pom.xml +++ b/opendaylight/samples/northbound/loadbalancer/pom.xml @@ -28,7 +28,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT @@ -90,7 +90,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/samples/simpleforwarding/pom.xml b/opendaylight/samples/simpleforwarding/pom.xml index edd146e615..a4bb76d5ab 100644 --- a/opendaylight/samples/simpleforwarding/pom.xml +++ b/opendaylight/samples/simpleforwarding/pom.xml @@ -68,12 +68,12 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller hosttracker - 0.4.1-SNAPSHOT + 0.5.1-SNAPSHOT org.opendaylight.controller @@ -86,7 +86,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT diff --git a/opendaylight/security/pom.xml b/opendaylight/security/pom.xml index 2e7466daf0..ef45e76833 100644 --- a/opendaylight/security/pom.xml +++ b/opendaylight/security/pom.xml @@ -58,7 +58,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT orbit diff --git a/opendaylight/statisticsmanager/api/pom.xml b/opendaylight/statisticsmanager/api/pom.xml index 0dca7396e7..3a1367901b 100644 --- a/opendaylight/statisticsmanager/api/pom.xml +++ b/opendaylight/statisticsmanager/api/pom.xml @@ -47,7 +47,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller @@ -57,12 +57,12 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT diff --git a/opendaylight/statisticsmanager/implementation/pom.xml b/opendaylight/statisticsmanager/implementation/pom.xml index 54ba4865b2..c69e752549 100644 --- a/opendaylight/statisticsmanager/implementation/pom.xml +++ b/opendaylight/statisticsmanager/implementation/pom.xml @@ -100,7 +100,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller @@ -110,12 +110,12 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/statisticsmanager/integrationtest/pom.xml b/opendaylight/statisticsmanager/integrationtest/pom.xml index d04371461f..026811f75b 100644 --- a/opendaylight/statisticsmanager/integrationtest/pom.xml +++ b/opendaylight/statisticsmanager/integrationtest/pom.xml @@ -45,7 +45,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/switchmanager/api/pom.xml b/opendaylight/switchmanager/api/pom.xml index b9cac8f2f8..a4e96dd6a0 100644 --- a/opendaylight/switchmanager/api/pom.xml +++ b/opendaylight/switchmanager/api/pom.xml @@ -92,7 +92,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -102,7 +102,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/switchmanager/implementation/pom.xml b/opendaylight/switchmanager/implementation/pom.xml index 76bfd56c29..93c076dcba 100644 --- a/opendaylight/switchmanager/implementation/pom.xml +++ b/opendaylight/switchmanager/implementation/pom.xml @@ -97,7 +97,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -117,7 +117,7 @@ org.opendaylight.controller statisticsmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT junit diff --git a/opendaylight/topologymanager/implementation/pom.xml b/opendaylight/topologymanager/implementation/pom.xml index a91e7275ba..10b1a7243b 100644 --- a/opendaylight/topologymanager/implementation/pom.xml +++ b/opendaylight/topologymanager/implementation/pom.xml @@ -61,12 +61,12 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/topologymanager/integrationtest/pom.xml b/opendaylight/topologymanager/integrationtest/pom.xml index 5dfa1632f7..93e8dcc89f 100644 --- a/opendaylight/topologymanager/integrationtest/pom.xml +++ b/opendaylight/topologymanager/integrationtest/pom.xml @@ -32,52 +32,52 @@ org.opendaylight.controller sal - 0.5.0-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller sal.implementation - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller containermanager - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT org.opendaylight.controller containermanager.it.implementation - 0.5.0-SNAPSHOT + 0.5.1-SNAPSHOT org.opendaylight.controller forwardingrulesmanager - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller clustering.services - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller clustering.stub - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller statisticsmanager - 0.4.0-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller statisticsmanager.implementation - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller switchmanager.implementation - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller @@ -87,12 +87,12 @@ org.opendaylight.controller configuration - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller configuration.implementation - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT org.opendaylight.controller @@ -102,7 +102,7 @@ org.opendaylight.controller topologymanager - 0.4.0-SNAPSHOT + 0.4.1-SNAPSHOT diff --git a/opendaylight/usermanager/api/pom.xml b/opendaylight/usermanager/api/pom.xml index 5d9e6c70ce..f7064a3c6d 100644 --- a/opendaylight/usermanager/api/pom.xml +++ b/opendaylight/usermanager/api/pom.xml @@ -76,7 +76,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -86,7 +86,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT junit diff --git a/opendaylight/usermanager/implementation/pom.xml b/opendaylight/usermanager/implementation/pom.xml index dcdc2f6d50..dbf71fec68 100644 --- a/opendaylight/usermanager/implementation/pom.xml +++ b/opendaylight/usermanager/implementation/pom.xml @@ -79,7 +79,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -89,7 +89,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.springframework.security diff --git a/opendaylight/web/devices/pom.xml b/opendaylight/web/devices/pom.xml index 8f6e1cc593..82abfbadb0 100644 --- a/opendaylight/web/devices/pom.xml +++ b/opendaylight/web/devices/pom.xml @@ -93,7 +93,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -112,7 +112,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/flows/pom.xml b/opendaylight/web/flows/pom.xml index 2b4dcd3de5..5812c0e861 100644 --- a/opendaylight/web/flows/pom.xml +++ b/opendaylight/web/flows/pom.xml @@ -91,7 +91,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -110,7 +110,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/root/pom.xml b/opendaylight/web/root/pom.xml index 8ebab10ca5..1a801a2fe4 100644 --- a/opendaylight/web/root/pom.xml +++ b/opendaylight/web/root/pom.xml @@ -97,7 +97,7 @@ org.opendaylight.controller clustering.services - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -112,7 +112,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/topology/pom.xml b/opendaylight/web/topology/pom.xml index 97c5e3ccdc..358ea21ad9 100644 --- a/opendaylight/web/topology/pom.xml +++ b/opendaylight/web/topology/pom.xml @@ -109,7 +109,7 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller diff --git a/opendaylight/web/troubleshoot/pom.xml b/opendaylight/web/troubleshoot/pom.xml index 4550be87f9..033cc6d9e9 100644 --- a/opendaylight/web/troubleshoot/pom.xml +++ b/opendaylight/web/troubleshoot/pom.xml @@ -93,7 +93,7 @@ org.opendaylight.controller forwardingrulesmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller @@ -107,12 +107,12 @@ org.opendaylight.controller sal - 0.5.1-SNAPSHOT + 0.7.0-SNAPSHOT org.opendaylight.controller statisticsmanager - 0.4.1-SNAPSHOT + 0.5.0-SNAPSHOT org.opendaylight.controller