1. InventoryUpdates were not getting to ConnectionManager because the InventoryAndReadAdapter was not tracking all listeners
2. DataPacketServiceAdapter was not setup as an IPluginInDataPacketService
3. DataPacketServiceAdapters delegate was not set to the PacketProcessingService
4. Node was not set on the TransmitPacketInput causing an NPE somewhere in the MD-SAL internals (this should probably be better addressed as I have hit this twice already)
5. DataPacketServiceAdapter now handles situation where the NodeConnectors is null
Current state
An IllegalArgumentException is being thrown from the openflowplugin "Session cookie is invalid" - Need to look at that further
Change-Id: I643ea435d7bda9ee7b3a5d603a381c3cfbaa0cce
Signed-off-by: Moiz Raja <moraja@cisco.com>
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
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 {
@Property
TopologyProvider tpProvider = new TopologyProvider()
+ @Property
+ DataPacketServiceAdapter dataPacketService = new DataPacketServiceAdapter()
+
+
override protected init() {
Node.NodeIDType.registerIDType(MD_SAL_TYPE, String);
// Data Packet Service
subscribe.registerNotificationListener(inventory);
+ dataPacketService.delegate = session.getRpcService(PacketProcessingService)
// Inventory Service
inventory.dataService = session.getSALService(DataBrokerService);
inventory.dataProviderService = session.getSALService(DataProviderService)
topology.dataService = session.getSALService(DataProviderService)
tpProvider.dataService = session.getSALService(DataProviderService)
+
+
tpProvider.start();
subscribe.registerNotificationListener(dataPacket)
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);
}
}
+ 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(
add(
createServiceDependency() //
.setService(IPluginOutInventoryService) //
- .setCallbacks("setInventoryPublisher", "setInventoryPublisher") //
+ .setCallbacks("setInventoryPublisher", "unsetInventoryPublisher") //
.setRequired(false))
add(
createServiceDependency() //
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
@Property
OpendaylightFlowTableStatisticsService flowTableStatisticsService;
- @Property
- IPluginOutInventoryService inventoryPublisher;
-
@Property
FlowTopologyDiscoveryService topologyDiscovery;
@Property
- List<IPluginOutReadService> statisticsPublisher = new ArrayList<IPluginOutReadService>();
-
+ List<IPluginOutReadService> statisticsPublisher = new CopyOnWriteArrayList<IPluginOutReadService>();
+
+ @Property
+ List<IPluginOutInventoryService> inventoryPublisher = new CopyOnWriteArrayList<IPluginOutInventoryService>();
+
+ def setInventoryPublisher(IPluginOutInventoryService listener){
+ inventoryPublisher.add(listener);
+ }
+
+ def unsetInventoryPublisher(IPluginOutInventoryService listener){
+ inventoryPublisher.remove(listener);
+ }
+
def setReadPublisher(IPluginOutReadService listener) {
statisticsPublisher.add(listener);
}
override onNodeRemoved(NodeRemoved notification) {
val properties = Collections.<org.opendaylight.controller.sal.core.Property>emptySet();
- inventoryPublisher.updateNode(notification.nodeRef.toADNode, UpdateType.REMOVED, properties);
+ publishNodeUpdate(notification.nodeRef.toADNode, UpdateType.REMOVED, properties);
}
override onNodeConnectorUpdated(NodeConnectorUpdated update) {
var nodeConnector = update.nodeConnectorRef.toADNodeConnector
- inventoryPublisher.updateNodeConnector(nodeConnector , updateType , update.toADNodeConnectorProperties);
+ publishNodeConnectorUpdate(nodeConnector , updateType , update.toADNodeConnectorProperties);
}
override onNodeUpdated(NodeUpdated notification) {
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
override getConfiguredNotConnectedNodes() {
return Collections.emptySet();
}
+
+
+ private def publishNodeUpdate(Node node, UpdateType updateType, Set<org.opendaylight.controller.sal.core.Property> properties){
+ for( publisher : inventoryPublisher){
+ publisher.updateNode(node, updateType, properties);
+ }
+ }
+
+ private def publishNodeConnectorUpdate(org.opendaylight.controller.sal.core.NodeConnector nodeConnector, UpdateType updateType, Set<org.opendaylight.controller.sal.core.Property> properties){
+ for( publisher : inventoryPublisher){
+ publisher.updateNodeConnector(nodeConnector, updateType, properties);
+ }
+ }
}
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;
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);
return builderTPIB.build();
}
+ public PacketProcessingService getDelegate() {
+ return delegate;
+ }
+
+ public void setDelegate(PacketProcessingService delegate) {
+ this.delegate = delegate;
+ }
+
+
+
}