From 6a24dc872d8caf614b2d5e43c90a6794a82bed44 Mon Sep 17 00:00:00 2001 From: Periyasamy Palanisamy Date: Thu, 18 Feb 2016 14:28:39 +0530 Subject: [PATCH] Bug 5308 Changes are made to remove the entries when VLAN interface is deleted. Change-Id: I8095fdf7de426ddfa823552f9c80fbb03660d38d Signed-off-by: Periyasamy Palanisamy (cherry picked from commit c6cba053f717ac46f42418a496c6f780f26b5cb1) --- .../ElanInterfaceStateChangeListener.java | 7 +- .../vpnservice/elan/utils/ElanConstants.java | 2 +- .../vpnservice/interfacemgr/IfmUtil.java | 4 +- .../interfacemgr/InterfacemgrProvider.java | 6 +- .../mdsalutil/internal/MDSALManager.java | 104 ++++++++++++++++++ 5 files changed, 116 insertions(+), 7 deletions(-) diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java index 58f0aea2..256e8b26 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceStateChangeListener.java @@ -74,7 +74,12 @@ public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener return; } ElanInstance elanInfo = ElanUtils.getElanInstanceByName(elanInterface.getElanInstanceName()); - InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(interfaceName); + InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfoFromOperationalDataStore(interfaceName, + InterfaceInfo.InterfaceType.VLAN_INTERFACE); + if (interfaceInfo == null) { + logger.warn("Interface {} doesn't exist in operational datastore", interfaceName); + return; + } logger.trace("ElanService Interface Operational state has changes for Interface:{}", interfaceName); elanInterfaceManager.handleInterfaceUpated(interfaceInfo, elanInfo , isStateUp); diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanConstants.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanConstants.java index a4afd5be..fb3634eb 100755 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanConstants.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanConstants.java @@ -21,7 +21,7 @@ public class ElanConstants { public static final short ELAN_SERVICE_INDEX = 3; public static final int ELAN_SERVICE_PRIORITY = 5; public static final int STATIC_MAC_TIMEOUT = 0; - public static final long DELAY_TIME_IN_MILLISECOND = 10000; + public static final long DELAY_TIME_IN_MILLISECOND = 5000; public static final BigInteger INVALID_DPN = BigInteger.valueOf(-1); public static final BigInteger COOKIE_ELAN_UNKNOWN_DMAC = new BigInteger("8700000", 16); public static final BigInteger COOKIE_ELAN_KNOWN_SMAC = new BigInteger("8050000", 16); diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java index 76f78b2a..894189c9 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java @@ -37,8 +37,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instru import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeGre; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInputBuilder; @@ -52,6 +50,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan.L2vlanMode; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeGre; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeVxlan; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; 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 fb597cc7..6f110536 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 @@ -35,6 +35,7 @@ import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; 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.AdminStatus; 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.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput; @@ -250,13 +251,12 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable return null; } Integer lportTag = ifState.getIfIndex(); - Interface intf = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), dataBroker); - NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(intf, dataBroker); + NodeConnectorId ncId = IfmUtil.getNodeConnectorIdFromInterface(ifState); if (ncId != null) { interfaceInfo.setDpId(new BigInteger(IfmUtil.getDpnFromNodeConnectorId(ncId))); interfaceInfo.setPortNo(Integer.parseInt(IfmUtil.getPortNoFromNodeConnectorId(ncId))); } - interfaceInfo.setAdminState((intf.isEnabled() == true) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED); + interfaceInfo.setAdminState((ifState.getAdminStatus() == AdminStatus.Up) ? InterfaceAdminState.ENABLED : InterfaceAdminState.DISABLED); interfaceInfo.setInterfaceName(interfaceName); interfaceInfo.setInterfaceTag(lportTag); interfaceInfo.setInterfaceType(interfaceType); diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java index cbd11417..1192208f 100644 --- a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java +++ b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java @@ -13,6 +13,8 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import org.opendaylight.vpnservice.mdsalutil.ActionInfo; import org.opendaylight.vpnservice.mdsalutil.ActionType; @@ -40,12 +42,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService; +import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.opendaylight.vpnservice.mdsalutil.*; import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.md.sal.common.api.data.OptimisticLockFailedException; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; @@ -62,8 +67,11 @@ public class MDSALManager implements AutoCloseable { private DataBroker m_dataBroker; private PacketProcessingService m_packetProcessingService; + private ListenerRegistration groupListenerRegistration; + private ListenerRegistration flowListenerRegistration; private ConcurrentMap flowMap = new ConcurrentHashMap(); private ConcurrentMap groupMap = new ConcurrentHashMap (); + private ExecutorService executorService = Executors.newSingleThreadExecutor(); /** * Writes the flows and Groups to the MD SAL DataStore @@ -77,14 +85,39 @@ public class MDSALManager implements AutoCloseable { public MDSALManager(final DataBroker db, PacketProcessingService pktProcService) { m_dataBroker = db; m_packetProcessingService = pktProcService; + registerListener(db); s_logger.info( "MDSAL Manager Initialized ") ; } @Override public void close() throws Exception { + groupListenerRegistration.close(); + flowListenerRegistration.close(); s_logger.info("MDSAL Manager Closed"); } + private void registerListener(DataBroker db) { + try { + flowListenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, getWildCardFlowPath(), + new FlowListener(), + DataChangeScope.SUBTREE); + groupListenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL, getWildCardGroupPath(), + new GroupListener(), + DataChangeScope.SUBTREE); + } catch (final Exception e) { + s_logger.error("GroupEventHandler: DataChange listener registration fail!", e); + throw new IllegalStateException("GroupEventHandler: registration Listener failed.", e); + } + } + + private InstanceIdentifier getWildCardGroupPath() { + return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class).child(Group.class); + } + + private InstanceIdentifier getWildCardFlowPath() { + return InstanceIdentifier.create(Nodes.class).child(Node.class).augmentation(FlowCapableNode.class).child(Table.class).child(Flow.class); + } + public void installFlow(FlowEntity flowEntity) { try { @@ -417,4 +450,75 @@ public class MDSALManager implements AutoCloseable { } } + class GroupListener extends AbstractDataChangeListener { + + public GroupListener() { + super(Group.class); + } + + @Override + protected void remove(InstanceIdentifier identifier, Group del) { + BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue()); + executeNotifyTaskIfRequired(dpId, del); + } + + private void executeNotifyTaskIfRequired(BigInteger dpId, Group group) { + GroupInfoKey groupKey = new GroupInfoKey(dpId, group.getGroupId().getValue()); + Runnable notifyTask = groupMap.remove(groupKey); + if (notifyTask == null) { + return; + } + executorService.execute(notifyTask); + } + + @Override + protected void update(InstanceIdentifier identifier, Group original, Group update) { + BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue()); + executeNotifyTaskIfRequired(dpId, update); + } + + @Override + protected void add(InstanceIdentifier identifier, Group add) { + BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue()); + executeNotifyTaskIfRequired(dpId, add); + } + } + + class FlowListener extends AbstractDataChangeListener { + + public FlowListener() { + super(Flow.class); + } + + @Override + protected void remove(InstanceIdentifier identifier, Flow del) { + BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue()); + notifyTaskIfRequired(dpId, del); + } + + private void notifyTaskIfRequired(BigInteger dpId, Flow flow) { + FlowInfoKey flowKey = new FlowInfoKey(dpId, flow.getTableId(), flow.getMatch(), flow.getId().getValue()); + Runnable notifyTask = flowMap.remove(flowKey); + if (notifyTask == null) { + return; + } + executorService.execute(notifyTask); + } + + @Override + protected void update(InstanceIdentifier identifier, Flow original, Flow update) { + } + + @Override + protected void add(InstanceIdentifier identifier, Flow add) { + BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue()); + notifyTaskIfRequired(dpId, add); + } + } + + private BigInteger getDpnFromString(String dpnString) { + String[] split = dpnString.split(":"); + return new BigInteger(split[1]); + } + } -- 2.36.6