From 9144b0b91bbcd2fa8b8c93c5dd3db6763b2710d4 Mon Sep 17 00:00:00 2001 From: Faseela K Date: Mon, 25 Jan 2016 11:22:53 +0530 Subject: [PATCH] Bug 5064 : Deletion of TEP is not removing the tunnel ingress flow from the switch Description : Removal of tunnel ingress flow was handled during nodeConnectorRemoved event alone, but if the deletion is initiated by northbound, config will be removed before nodeConnectorRemoved event comes, and hence deletion of the ingress flow was not happening. Change-Id: I4458a79be8e5dd8aaaff6b80f0e6bf00a6555044 Signed-off-by: Faseela K (cherry picked from commit 63b42a3937b9ab3facfa83ac0fe954bf70ece35c) --- .../interfacemgr/InterfacemgrProvider.java | 2 +- .../listeners/InterfaceConfigListener.java | 11 +++++--- .../OvsInterfaceConfigRemoveHelper.java | 27 +++++++++++++++---- .../OvsInterfaceConfigUpdateHelper.java | 5 ++-- .../TunnelInterfaceConfigurationTest.java | 16 ++++++++--- .../test/VlanInterfaceConfigurationTest.java | 6 +++-- 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index 656d5ef0..69930e9d 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -102,7 +102,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable rpcRegistration = getRpcProviderRegistry().addRpcImplementation( OdlInterfaceRpcService.class, interfaceManagerRpcService); - interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager,alivenessManager); + interfaceConfigListener = new InterfaceConfigListener(dataBroker, idManager,alivenessManager, mdsalManager); interfaceConfigListener.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); interfaceInventoryStateListener = new InterfaceInventoryStateListener(dataBroker, idManager, mdsalManager, alivenessManager); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceConfigListener.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceConfigListener.java index a519f3a0..9eb7869c 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceConfigListener.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/listeners/InterfaceConfigListener.java @@ -16,6 +16,7 @@ import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigUpdateHelper; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorService; @@ -37,12 +38,16 @@ public class InterfaceConfigListener extends AsyncDataTreeChangeListenerBase> removeConfiguration(DataBroker dataBroker, AlivenessMonitorService alivenessMonitorService, Interface interfaceOld, - IdManagerService idManager, ParentRefs parentRefs) { + IdManagerService idManager, + IMdsalApiManager mdsalApiManager, + ParentRefs parentRefs) { List> futures = new ArrayList<>(); WriteTransaction t = dataBroker.newWriteOnlyTransaction(); IfTunnel ifTunnel = interfaceOld.getAugmentation(IfTunnel.class); if (ifTunnel != null) { - removeTunnelConfiguration(alivenessMonitorService, parentRefs, dataBroker, interfaceOld, idManager, t); - futures.add(t.submit()); - AlivenessMonitorUtils.stopLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceOld); + removeTunnelConfiguration(alivenessMonitorService, parentRefs, dataBroker, interfaceOld, + idManager, mdsalApiManager, futures); }else { removeVlanConfiguration(dataBroker, interfaceOld, t); futures.add(t.submit()); @@ -132,8 +135,10 @@ public class OvsInterfaceConfigRemoveHelper { private static void removeTunnelConfiguration(AlivenessMonitorService alivenessMonitorService, ParentRefs parentRefs, DataBroker dataBroker, Interface interfaceOld, - IdManagerService idManager, WriteTransaction t) { + IdManagerService idManager, IMdsalApiManager mdsalApiManager, + List> futures) { + WriteTransaction t = dataBroker.newWriteOnlyTransaction(); BigInteger dpId = null; if (parentRefs != null) { dpId = parentRefs.getDatapathNodeIdentifier(); @@ -154,6 +159,15 @@ public class OvsInterfaceConfigRemoveHelper { InstanceIdentifier tpIid = SouthboundUtils.createTerminationPointInstanceIdentifier( InstanceIdentifier.keyOf(bridgeIid.firstIdentifierOf(Node.class)), interfaceOld.getName()); t.delete(LogicalDatastoreType.CONFIGURATION, tpIid); + + // delete tunnel ingress flow + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceOld.getName(), dataBroker); + NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(interfaceOld, dataBroker); + long portNo = Long.valueOf(IfmUtil.getPortNoFromNodeConnectorId(ncId)); + InterfaceManagerCommonUtils.makeTunnelIngressFlow(futures, mdsalApiManager, + interfaceOld.getAugmentation(IfTunnel.class), + dpId, portNo, interfaceOld, + NwConstants.DEL_FLOW); } BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId); @@ -178,5 +192,8 @@ public class OvsInterfaceConfigRemoveHelper { bridgeInterfaceEntryKey); t.delete(LogicalDatastoreType.CONFIGURATION, bridgeInterfaceEntryIid); } + futures.add(t.submit()); + // stop LLDP monitoring for the tunnel interface + AlivenessMonitorUtils.stopLLDPMonitoring(alivenessMonitorService, dataBroker, interfaceOld); } } \ No newline at end of file diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigUpdateHelper.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigUpdateHelper.java index f6a76d33..cc00a4e5 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigUpdateHelper.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/renderer/ovs/confighelpers/OvsInterfaceConfigUpdateHelper.java @@ -17,6 +17,7 @@ import org.opendaylight.vpnservice.interfacemgr.commons.AlivenessMonitorUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; @@ -47,13 +48,13 @@ public class OvsInterfaceConfigUpdateHelper{ private static final Logger LOG = LoggerFactory.getLogger(OvsInterfaceConfigUpdateHelper.class); public static List> updateConfiguration(DataBroker dataBroker, AlivenessMonitorService alivenessMonitorService, - IdManagerService idManager, + IdManagerService idManager, IMdsalApiManager mdsalApiManager, Interface interfaceNew, Interface interfaceOld) { List> futures = new ArrayList<>(); if(portAttributesModified(interfaceOld, interfaceNew)) { futures.addAll(OvsInterfaceConfigRemoveHelper.removeConfiguration(dataBroker, alivenessMonitorService, interfaceOld, idManager, - interfaceOld.getAugmentation(ParentRefs.class))); + mdsalApiManager, interfaceOld.getAugmentation(ParentRefs.class))); futures.addAll(OvsInterfaceConfigAddHelper.addConfiguration(dataBroker, interfaceNew.getAugmentation(ParentRefs.class), interfaceNew, idManager)); return futures; diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java index 966976ec..cdf1e48a 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/TunnelInterfaceConfigurationTest.java @@ -26,6 +26,7 @@ import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigUpdateHelper; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder; @@ -90,7 +91,8 @@ public class TunnelInterfaceConfigurationTest { @Mock ListenerRegistration dataChangeListenerRegistration; @Mock ReadOnlyTransaction mockReadTx; @Mock WriteTransaction mockWriteTx; - + @Mock + IMdsalApiManager mdsalApiManager; OvsInterfaceConfigAddHelper addHelper; OvsInterfaceConfigRemoveHelper removeHelper; OvsInterfaceConfigUpdateHelper updateHelper; @@ -190,17 +192,21 @@ public class TunnelInterfaceConfigurationTest { public void testDeleteGreInterfaceWhenSwitchIsConnected() { Optional expectedBridgeRefEntry = Optional.of(bridgeRefEntry); Optional expectedBridgeEntry = Optional.of(bridgeEntry); + Optional expectedInterfaceState = Optional.of(stateInterface); doReturn(Futures.immediateCheckedFuture(expectedBridgeRefEntry)).when(mockReadTx).read( LogicalDatastoreType.OPERATIONAL, dpnBridgeEntryIid); doReturn(Futures.immediateCheckedFuture(expectedBridgeEntry)).when(mockReadTx).read( LogicalDatastoreType.CONFIGURATION, bridgeEntryIid); + doReturn(Futures.immediateCheckedFuture(expectedInterfaceState)).when(mockReadTx).read( + LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder ifaceBuilder = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceBuilder(); ifaceBuilder.setOperStatus(OperStatus.Down); ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(tunnelInterfaceEnabled.getName())); stateInterface = ifaceBuilder.build(); - removeHelper.removeConfiguration(dataBroker, alivenessMonitorService, tunnelInterfaceEnabled, idManager, parentRefs); + removeHelper.removeConfiguration(dataBroker, alivenessMonitorService, tunnelInterfaceEnabled, idManager, + mdsalApiManager, parentRefs); //Add some verifications verify(mockWriteTx).delete(LogicalDatastoreType.CONFIGURATION, bridgeEntryIid); @@ -215,7 +221,8 @@ public class TunnelInterfaceConfigurationTest { doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); - updateHelper.updateConfiguration(dataBroker, alivenessMonitorService, idManager,tunnelInterfaceDisabled,tunnelInterfaceEnabled); + updateHelper.updateConfiguration(dataBroker, alivenessMonitorService, idManager, mdsalApiManager, + tunnelInterfaceDisabled,tunnelInterfaceEnabled); //verify whether operational data store is updated with the new oper state. InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); @@ -236,7 +243,8 @@ public class TunnelInterfaceConfigurationTest { doReturn(Futures.immediateCheckedFuture(expectedStateInterface)).when(mockReadTx).read( LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier); - updateHelper.updateConfiguration(dataBroker, alivenessMonitorService, idManager,tunnelInterfaceEnabled,tunnelInterfaceDisabled); + updateHelper.updateConfiguration(dataBroker, alivenessMonitorService, idManager, mdsalApiManager, + tunnelInterfaceEnabled,tunnelInterfaceDisabled); //verify whether operational data store is updated with the new oper state. InterfaceBuilder ifaceBuilder = new InterfaceBuilder(); diff --git a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java index 29c7c35f..8355014e 100644 --- a/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java +++ b/interfacemgr/interfacemgr-impl/src/test/java/org/opendaylight/vpnservice/interfacemgr/test/VlanInterfaceConfigurationTest.java @@ -33,6 +33,7 @@ import org.opendaylight.idmanager.IdManager; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigAddHelper; import org.opendaylight.vpnservice.interfacemgr.renderer.ovs.confighelpers.OvsInterfaceConfigRemoveHelper; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; @@ -53,7 +54,7 @@ public class VlanInterfaceConfigurationTest { @Mock ListenerRegistration dataChangeListenerRegistration; @Mock ReadOnlyTransaction mockReadTx; @Mock WriteTransaction mockWriteTx; - + @Mock IMdsalApiManager mdsalApiManager; OvsInterfaceConfigAddHelper addHelper; OvsInterfaceConfigRemoveHelper removeHelper; @@ -167,7 +168,8 @@ public class VlanInterfaceConfigurationTest { ifaceBuilder.setKey(IfmUtil.getStateInterfaceKeyFromName(vlanInterfaceEnabled.getName())); stateInterface = ifaceBuilder.build(); - removeHelper.removeConfiguration(dataBroker,alivenessMonitorService, vlanInterfaceEnabled, idManager, null); + removeHelper.removeConfiguration(dataBroker,alivenessMonitorService, vlanInterfaceEnabled, idManager, + mdsalApiManager, null); //verification verify(mockWriteTx).merge(LogicalDatastoreType.OPERATIONAL, interfaceStateIdentifier, stateInterface); -- 2.36.6