X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=elanmanager%2Felanmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Felan%2Finternal%2FElanSmacFlowEventListener.java;fp=elanmanager%2Felanmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fvpnservice%2Felan%2Finternal%2FElanSmacFlowEventListener.java;h=d8ff705d101ee26b644e206da5450a16556f017c;hb=00790a95c5e403cb62d2cc544af55e8ab3fef03b;hp=9ea543e3473230650fd328aa8e5846b45b1747e8;hpb=4110307879cad1aa54943aedbf937b2f21575b4c;p=vpnservice.git diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java index 9ea543e3..d8ff705d 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java @@ -7,30 +7,41 @@ */ package org.opendaylight.vpnservice.elan.internal; +import java.math.BigInteger; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.vpnservice.elan.utils.ElanConstants; import org.opendaylight.vpnservice.elan.utils.ElanUtils; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; -import org.opendaylight.vpnservice.itm.api.IITMProvider; import org.opendaylight.vpnservice.mdsalutil.MetaDataUtil; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowRemoved; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowUpdated; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeErrorNotification; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeExperimenterErrorNotification; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowListener; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SalFlowService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.SwitchFlowRemoved; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.tag.name.map.ElanTagName; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; -//import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331._if.indexes._interface.map.IfIndexInterface; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.math.BigInteger; +import com.google.common.base.Optional; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +@SuppressWarnings("deprecation") public class ElanSmacFlowEventListener implements SalFlowListener { private final DataBroker broker; - private IMdsalApiManager mdsalManager; private IInterfaceManager interfaceManager; private static final Logger logger = LoggerFactory.getLogger(ElanSmacFlowEventListener.class); @@ -52,7 +63,6 @@ public class ElanSmacFlowEventListener implements SalFlowListener { public void setMdSalApiManager(IMdsalApiManager mdsalManager) { - this.mdsalManager = mdsalManager; } @Override public void onFlowAdded(FlowAdded arg0) { @@ -94,15 +104,19 @@ public class ElanSmacFlowEventListener implements SalFlowListener { if (elanTagInfo == null) { return; } - String srcMacAddress = switchFlowRemoved.getMatch().getEthernetMatch() + final String srcMacAddress = switchFlowRemoved.getMatch().getEthernetMatch() .getEthernetSource().getAddress().getValue().toUpperCase(); int portTag = MetaDataUtil.getLportFromMetadata(metadata).intValue(); if (portTag == 0) { logger.debug(String.format("Flow removed event on SMAC flow entry. But having port Tag as 0 ")); return; } - IfIndexInterface existingInterfaceInfo = ElanUtils.getInterfaceInfoByInterfaceTag(portTag); - String interfaceName = existingInterfaceInfo.getInterfaceName(); + Optional existingInterfaceInfo = ElanUtils.getInterfaceInfoByInterfaceTag(portTag); + if (!existingInterfaceInfo.isPresent()) { + logger.debug("Interface is not available for port Tag {}", portTag); + return; + } + String interfaceName = existingInterfaceInfo.get().getInterfaceName(); PhysAddress physAddress = new PhysAddress(srcMacAddress); if (interfaceName == null) { logger.error(String.format("LPort record not found for tag %d", portTag)); @@ -113,9 +127,25 @@ public class ElanSmacFlowEventListener implements SalFlowListener { if(macEntry != null && interfaceInfo != null) { ElanUtils.deleteMacFlows(ElanUtils.getElanInstanceByName(elanTagInfo.getName()), interfaceInfo, macEntry); } - InstanceIdentifier macEntryId = ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress); - ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, macEntryId); + InstanceIdentifier macEntryIdForElanInterface = ElanUtils.getInterfaceMacEntriesIdentifierOperationalDataPath(interfaceName, physAddress); + InstanceIdentifier macEntryIdForElanInstance = ElanUtils.getMacEntryOperationalDataPath(elanTagInfo.getName(), physAddress); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryIdForElanInterface); + tx.delete(LogicalDatastoreType.OPERATIONAL, macEntryIdForElanInstance); + ListenableFuture writeResult = tx.submit(); + + //WRITE Callback + Futures.addCallback(writeResult, new FutureCallback() { + @Override + public void onSuccess(Void noarg) { + logger.debug("Successfully removed macEntry {} from Operational Datastore", srcMacAddress); + } + + @Override + public void onFailure(Throwable error) { + logger.debug("Error {} while removing macEntry {} from Operational Datastore", error, srcMacAddress); + } + }); } } - }