From 3038140a932e3c0e1ce279433fe4cb451d4f10ca Mon Sep 17 00:00:00 2001 From: Periyasamy Palanisamy Date: Mon, 17 Jul 2017 12:33:27 +0530 Subject: [PATCH] ELAN service is not unbound when nova delete followed by neutron port delete * Fix added to listen on interface config remove and invoke unbind service * Changed elan interface job key while submitting to jc Change-Id: I0cf8e29fa4afdc1dcf050198e8296071bd90efac Signed-off-by: Periyasamy Palanisamy --- .../elan/internal/ElanInstanceManager.java | 7 +- .../internal/ElanInterfaceConfigListener.java | 109 ++++++++++++++++++ .../elan/internal/ElanInterfaceManager.java | 10 +- .../netvirt/elan/utils/ElanUtils.java | 6 +- .../opendaylight/blueprint/elanmanager.xml | 7 ++ 5 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceConfigListener.java diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java index 3bdd6a9360..788ac09dce 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java @@ -106,8 +106,8 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase dataStoreJobCoordinator.enqueueJob(elanInterfaceName, () -> { + ElanUtils.removeAndGetElanInterfaces(elanName).forEach(elanInterfaceName -> { + dataStoreJobCoordinator.enqueueJob(ElanUtils.getElanInterfaceJobKey(elanInterfaceName), () -> { WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction(); LOG.info("Deleting the elanInterface present under ConfigDS:{}", elanInterfaceName); ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION, @@ -117,7 +117,8 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase implements AutoCloseable { + + private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceConfigListener.class); + + private final DataBroker dataBroker; + private final ElanInterfaceManager elanInterfaceManager; + + @Inject + public ElanInterfaceConfigListener(DataBroker dataBroker, ElanInterfaceManager elanInterfaceManager) { + super(Interface.class, ElanInterfaceConfigListener.class); + this.dataBroker = dataBroker; + this.elanInterfaceManager = elanInterfaceManager; + } + + @Override + @PostConstruct + public void init() { + LOG.info("ElanInterfaceConfigListener init"); + registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker); + } + + @Override + public void close() { + LOG.info("ElanInterfaceConfigListener Closed"); + super.close(); + } + + @Override + protected InstanceIdentifier getWildCardPath() { + return InstanceIdentifier.create(Interfaces.class).child(Interface.class); + } + + @Override + protected void remove(InstanceIdentifier key, Interface intrf) { + // Sometimes elan service is not unbound on the interface when the user does nova delete followed + // by neutron port delete since interface config is deleted a bit later. so adding logic to + // unbind service for interface config removal. + String interfaceName = intrf.getName(); + if (intrf == null || intrf.getAugmentation(IfL2vlan.class) == null) { + LOG.debug("The interface {} is not a L2 interface. Ignoring it", interfaceName); + return; + } + ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(dataBroker, interfaceName); + if (elanInterface == null) { + LOG.debug("There is no ELAN service for interface {}. Ignoring it", interfaceName); + return; + } + DataStoreJobCoordinator.getInstance().enqueueJob(ElanUtils.getElanInterfaceJobKey(interfaceName), () -> { + WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction(); + LOG.debug("unbinding elan service on interface {} for its config removal", interfaceName); + elanInterfaceManager.unbindService(interfaceName, writeConfigTxn); + List> futures = new ArrayList<>(); + futures.add(writeConfigTxn.submit()); + return futures; + }, ElanConstants.JOB_MAX_RETRIES); + } + + @Override + protected void update(InstanceIdentifier key, Interface dataObjectModificationBefore, + Interface dataObjectModificationAfter) { + // Not required to handle this event + } + + @Override + protected void add(InstanceIdentifier key, Interface dataObjectModification) { + // Not required to handle this event + } + + @Override + protected ElanInterfaceConfigListener getDataTreeChangeListener() { + return this; + } + +} diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java index 8b33bdcb3b..551dc26a97 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java @@ -264,7 +264,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase> futures, ElanInstance elanInstance, @@ -1678,7 +1680,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase interfaceLists = new HashSet<>(); interfaceLists.addAll(finalDstDpnIf.getInterfaces()); for (String ifName : interfaceLists) { - dataStoreCoordinator.enqueueJob(ifName, () -> { + dataStoreCoordinator.enqueueJob(ElanUtils.getElanInterfaceJobKey(ifName), () -> { LOG.info("Processing tunnel up event for elan {} and interface {}", elanName, ifName); InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(ifName); List> elanInterfacefutures = new ArrayList<>(); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java index 49da74bc1d..1f73913168 100755 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java @@ -2326,4 +2326,8 @@ public class ElanUtils { nodeDpn.getKey()).augmentation(FlowCapableNode.class) .child(Table.class, new TableKey(flow.getTableId())).child(Flow.class, flowKey).build(); } -} + + public static String getElanInterfaceJobKey(String interfaceName) { + return "elaninterface-" + interfaceName; + } +} \ No newline at end of file diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml b/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml index e3fde92977..d2af26caf8 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/resources/org/opendaylight/blueprint/elanmanager.xml @@ -127,6 +127,13 @@ + + + + + -- 2.36.6