Migrate to serviceutils/tools and serviceutils/srm
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / internal / ElanInterfaceManager.java
index ffb0acf076653c4a391ed5005a002be384935b8a..0f6911a016fd318aa8c73c1309001a609b0e29fb 100644 (file)
@@ -66,6 +66,7 @@ import org.opendaylight.netvirt.elan.cache.ElanInstanceCache;
 import org.opendaylight.netvirt.elan.cache.ElanInterfaceCache;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayMulticastUtils;
 import org.opendaylight.netvirt.elan.l2gw.utils.ElanL2GatewayUtils;
+import org.opendaylight.netvirt.elan.recovery.impl.ElanServiceRecoveryHandler;
 import org.opendaylight.netvirt.elan.utils.ElanConstants;
 import org.opendaylight.netvirt.elan.utils.ElanEtreeUtils;
 import org.opendaylight.netvirt.elan.utils.ElanForwardingEntriesHandler;
@@ -76,6 +77,8 @@ import org.opendaylight.netvirt.elanmanager.utils.ElanL2GwCacheUtils;
 import org.opendaylight.netvirt.neutronvpn.api.l2gw.L2GatewayDevice;
 import org.opendaylight.netvirt.neutronvpn.api.utils.NeutronUtils;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
+import org.opendaylight.serviceutils.srm.RecoverableListener;
+import org.opendaylight.serviceutils.srm.ServiceRecoveryRegistry;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
@@ -131,7 +134,8 @@ import org.slf4j.LoggerFactory;
  * @see org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface
  */
 @Singleton
-public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanInterface, ElanInterfaceManager> {
+public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanInterface, ElanInterfaceManager>
+        implements RecoverableListener {
     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceManager.class);
     private static final long WAIT_TIME_FOR_SYNC_INSTALL = Long.getLong("wait.time.sync.install", 300L);
     private static final boolean SH_FLAG_SET = true;
@@ -165,7 +169,9 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                                 final ElanUtils elanUtils, final JobCoordinator jobCoordinator,
                                 final ElanL2GatewayMulticastUtils elanL2GatewayMulticastUtils,
                                 final ElanInstanceCache elanInstanceCache,
-                                final ElanInterfaceCache elanInterfaceCache) {
+                                final ElanInterfaceCache elanInterfaceCache,
+                                final ElanServiceRecoveryHandler elanServiceRecoveryHandler,
+                                final ServiceRecoveryRegistry serviceRecoveryRegistry) {
         super(ElanInterface.class, ElanInterfaceManager.class);
         this.broker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
@@ -182,11 +188,17 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         this.elanL2GatewayMulticastUtils = elanL2GatewayMulticastUtils;
         this.elanInstanceCache = elanInstanceCache;
         this.elanInterfaceCache = elanInterfaceCache;
+        serviceRecoveryRegistry.addRecoverableListener(elanServiceRecoveryHandler.buildServiceRegistryKey(), this);
     }
 
     @Override
     @PostConstruct
     public void init() {
+        registerListener();
+    }
+
+    @Override
+    public void registerListener() {
         registerListener(LogicalDatastoreType.CONFIGURATION, broker);
     }
 
@@ -219,6 +231,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         jobCoordinator.enqueueJob(elanInstanceName, configWorker, ElanConstants.JOB_MAX_RETRIES);
     }
 
+    @SuppressWarnings("checkstyle:ForbiddenMethod")
     public List<ListenableFuture<Void>> removeElanInterface(ElanInstance elanInfo, String interfaceName,
             InterfaceInfo interfaceInfo) {
         String elanName = elanInfo.getElanInstanceName();
@@ -303,7 +316,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
     private void removeLeavesLocalBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
             WriteTransaction deleteFlowGroupTx) {
-        EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+        EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
         if (etreeInstance != null) {
             BigInteger dpnId = interfaceInfo.getDpId();
             long groupId = ElanUtils.getEtreeLeafLocalBCGId(etreeInstance.getEtreeLeafTagVal().getValue());
@@ -319,7 +332,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
     private void removeLeavesEtreeBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
             WriteTransaction deleteFlowGroupTx) {
-        EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+        EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
         if (etreeInstance != null) {
             long etreeTag = etreeInstance.getEtreeLeafTagVal().getValue();
             int bucketId = 0;
@@ -359,7 +372,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                     ElanUtils.getElanInfoEntriesOperationalDataPath(elanInfo.getElanTag()));
         } else {
             Elan updateElanState = new ElanBuilder().setElanInterfaces(elanInterfaces).setName(elanName)
-                    .setKey(new ElanKey(elanName)).build();
+                    .withKey(new ElanKey(elanName)).build();
             tx.put(LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInstanceOperationalDataPath(elanName),
                     updateElanState);
         }
@@ -442,21 +455,24 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     private DpnInterfaces removeElanDpnInterfaceFromOperationalDataStore(String elanName, BigInteger dpId,
                                                                          String interfaceName, long elanTag,
                                                                          WriteTransaction tx) {
-        DpnInterfaces dpnInterfaces = elanUtils.getElanInterfaceInfoByElanDpn(elanName, dpId);
-        if (dpnInterfaces != null) {
-            List<String> interfaceLists = dpnInterfaces.getInterfaces();
-            if (interfaceLists != null) {
-                interfaceLists.remove(interfaceName);
-            }
+        synchronized (elanName.intern()) {
 
-            if (interfaceLists == null || interfaceLists.isEmpty()) {
-                deleteAllRemoteMacsInADpn(elanName, dpId, elanTag);
-                deleteElanDpnInterface(elanName, dpId, tx);
-            } else {
-                dpnInterfaces = updateElanDpnInterfacesList(elanName, dpId, interfaceLists, tx);
+            DpnInterfaces dpnInterfaces = elanUtils.getElanInterfaceInfoByElanDpn(elanName, dpId);
+            if (dpnInterfaces != null) {
+                List<String> interfaceLists = dpnInterfaces.getInterfaces();
+                if (interfaceLists != null) {
+                    interfaceLists.remove(interfaceName);
+                }
+
+                if (interfaceLists == null || interfaceLists.isEmpty()) {
+                    deleteAllRemoteMacsInADpn(elanName, dpId, elanTag);
+                    deleteElanDpnInterface(elanName, dpId, tx);
+                } else {
+                    dpnInterfaces = updateElanDpnInterfacesList(elanName, dpId, interfaceLists, tx);
+                }
             }
+            return dpnInterfaces;
         }
-        return dpnInterfaces;
     }
 
     private void deleteAllRemoteMacsInADpn(String elanName, BigInteger dpId, long elanTag) {
@@ -510,6 +526,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         e. if orig = {1,2,3,4} updated={2,3,4,5}
         then 1 should be removed , 5 should be added
     * */
+    @SuppressWarnings("checkstyle:ForbiddenMethod")
     @Override
     protected void update(InstanceIdentifier<ElanInterface> identifier, ElanInterface original, ElanInterface update) {
         // updating the static-Mac Entries for the existing elanInterface
@@ -540,7 +557,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                 elanForwardingEntriesHandler.addElanInterfaceForwardingTableList(
                         elanName, interfaceName, staticMacEntry, tx);
             }
-            ElanUtils.waitForTransactionToComplete(tx);
+            ListenableFutures.addErrorLogging(ElanUtils.waitForTransactionToComplete(tx), LOG,
+                    "Error in update: identifier={}, original={}, update={}", identifier, original, update);
         }
     }
 
@@ -618,7 +636,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
             for (String remoteIf : remoteElanInterfaces) {
                 ElanInterfaceMac elanIfMac = elanUtils.getElanInterfaceMacByInterfaceName(remoteIf);
                 InterfaceInfo remoteInterface = interfaceManager.getInterfaceInfo(remoteIf);
-                if (elanIfMac == null) {
+                if (elanIfMac == null || remoteInterface == null) {
                     continue;
                 }
                 List<MacEntry> remoteMacEntries = elanIfMac.getMacEntry();
@@ -636,6 +654,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         }
     }
 
+    @SuppressWarnings("checkstyle:ForbiddenMethod")
     List<ListenableFuture<Void>> addElanInterface(ElanInterface elanInterface,
             InterfaceInfo interfaceInfo, ElanInstance elanInstance) throws ElanException {
         Preconditions.checkNotNull(elanInstance, "elanInstance cannot be null");
@@ -662,27 +681,41 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         BigInteger dpId = interfaceInfo.getDpId();
         DpnInterfaces dpnInterfaces = null;
         if (dpId != null && !dpId.equals(ElanConstants.INVALID_DPN)) {
-            InstanceIdentifier<DpnInterfaces> elanDpnInterfaces = ElanUtils
-                    .getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId);
-            Optional<DpnInterfaces> existingElanDpnInterfaces = ElanUtils.read(broker,
-                    LogicalDatastoreType.OPERATIONAL, elanDpnInterfaces);
-            if (!existingElanDpnInterfaces.isPresent()) {
-                isFirstInterfaceInDpn = true;
-                // ELAN's 1st ElanInterface added to this DPN
-                dpnInterfaces = createElanInterfacesList(elanInstanceName, interfaceName, dpId, tx);
-                // The 1st ElanInterface in a DPN must program the Ext Tunnel
-                // table, but only if Elan has VNI
-                if (isVxlanNetworkOrVxlanSegment(elanInstance)) {
-                    setExternalTunnelTable(dpId, elanInstance);
+            synchronized (elanInstanceName.intern()) {
+                InstanceIdentifier<DpnInterfaces> elanDpnInterfaces = ElanUtils
+                        .getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId);
+                Optional<DpnInterfaces> existingElanDpnInterfaces = ElanUtils.read(broker,
+                        LogicalDatastoreType.OPERATIONAL, elanDpnInterfaces);
+                if (ElanUtils.isVlan(elanInstance)) {
+                    isFirstInterfaceInDpn =  checkIfFirstInterface(interfaceName,
+                            elanInstanceName, existingElanDpnInterfaces);
+                } else {
+                    isFirstInterfaceInDpn = !existingElanDpnInterfaces.isPresent();
                 }
-                elanL2GatewayUtils.installElanL2gwDevicesLocalMacsInDpn(dpId, elanInstance, interfaceName);
-            } else {
-                List<String> elanInterfaces = existingElanDpnInterfaces.get().getInterfaces();
-                elanInterfaces.add(interfaceName);
-                if (elanInterfaces.size() == 1) { // 1st dpn interface
+                if (isFirstInterfaceInDpn) {
+                    // ELAN's 1st ElanInterface added to this DPN
+                    if (!existingElanDpnInterfaces.isPresent()) {
+                        dpnInterfaces = createElanInterfacesList(elanInstanceName, interfaceName, dpId, tx);
+                    } else {
+                        List<String> elanInterfaces = existingElanDpnInterfaces.get().getInterfaces();
+                        elanInterfaces.add(interfaceName);
+                        dpnInterfaces = updateElanDpnInterfacesList(elanInstanceName, dpId,
+                                elanInterfaces, tx);
+                    }
+                    // The 1st ElanInterface in a DPN must program the Ext Tunnel
+                    // table, but only if Elan has VNI
+                    if (isVxlanNetworkOrVxlanSegment(elanInstance)) {
+                        setExternalTunnelTable(dpId, elanInstance);
+                    }
                     elanL2GatewayUtils.installElanL2gwDevicesLocalMacsInDpn(dpId, elanInstance, interfaceName);
+                } else {
+                    List<String> elanInterfaces = existingElanDpnInterfaces.get().getInterfaces();
+                    elanInterfaces.add(interfaceName);
+                    if (elanInterfaces.size() == 1) { // 1st dpn interface
+                        elanL2GatewayUtils.installElanL2gwDevicesLocalMacsInDpn(dpId, elanInstance, interfaceName);
+                    }
+                    dpnInterfaces = updateElanDpnInterfacesList(elanInstanceName, dpId, elanInterfaces, tx);
                 }
-                dpnInterfaces = updateElanDpnInterfacesList(elanInstanceName, dpId, elanInterfaces, tx);
             }
         }
 
@@ -718,6 +751,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         return futures;
     }
 
+    @SuppressWarnings("checkstyle:ForbiddenMethod")
     List<ListenableFuture<Void>> setupEntriesForElanInterface(ElanInstance elanInstance,
             ElanInterface elanInterface, InterfaceInfo interfaceInfo, boolean isFirstInterfaceInDpn)
             throws ElanException {
@@ -798,11 +832,34 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         }
 
         MacEntry macEntry = new MacEntryBuilder().setMacAddress(physAddress).setInterface(interfaceName)
-                .setKey(new MacEntryKey(physAddress)).build();
+                .withKey(new MacEntryKey(physAddress)).build();
         elanForwardingEntriesHandler.deleteElanInterfaceForwardingEntries(
                 elanInstanceCache.get(elanInstanceName).orNull(), interfaceInfo, macEntry);
     }
 
+    private boolean checkIfFirstInterface(String elanInterface, String elanInstanceName,
+            Optional<DpnInterfaces> existingElanDpnInterfaces) {
+        String routerPortUuid = ElanUtils.getRouterPordIdFromElanInstance(broker, elanInstanceName);
+        if (!existingElanDpnInterfaces.isPresent()) {
+            return true;
+        }
+        if (elanInterface.equals(elanInstanceName) || elanInterface.equals(routerPortUuid)) {
+            return false;
+        }
+        DpnInterfaces dpnInterfaces = existingElanDpnInterfaces.get();
+        int dummyInterfaceCount =  0;
+        if (dpnInterfaces.getInterfaces().contains(routerPortUuid)) {
+            dummyInterfaceCount++;
+        }
+        if (dpnInterfaces.getInterfaces().contains(elanInstanceName)) {
+            dummyInterfaceCount++;
+        }
+        if (dpnInterfaces.getInterfaces().size() - dummyInterfaceCount == 0) {
+            return true;
+        }
+        return false;
+    }
+
     private InstanceIdentifier<MacEntry> getMacEntryOperationalDataPath(String elanName, PhysAddress physAddress) {
         return InstanceIdentifier.builder(ElanForwardingTables.class).child(MacTable.class, new MacTableKey(elanName))
                 .child(MacEntry.class, new MacEntryKey(physAddress)).build();
@@ -890,11 +947,8 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     public void removeFilterEqualsTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
             WriteTransaction deleteFlowGroupTx) {
         int ifTag = interfaceInfo.getInterfaceTag();
-        Flow flow = MDSALUtil.buildFlowNew(NwConstants.ELAN_FILTER_EQUALS_TABLE,
-                getFlowRef(NwConstants.ELAN_FILTER_EQUALS_TABLE, ifTag, "group"), 9, elanInfo.getElanInstanceName(), 0,
-                0, ElanConstants.COOKIE_ELAN_FILTER_EQUALS.add(BigInteger.valueOf(ifTag)),
-                ElanUtils.getTunnelIdMatchForFilterEqualsLPortTag(ifTag),
-                elanUtils.getInstructionsInPortForOutGroup(interfaceInfo.getInterfaceName()));
+        Flow flow = MDSALUtil.buildFlow(NwConstants.ELAN_FILTER_EQUALS_TABLE,
+                getFlowRef(NwConstants.ELAN_FILTER_EQUALS_TABLE, ifTag, "group"));
 
         mdsalManager.removeFlowToTx(interfaceInfo.getDpId(), flow, deleteFlowGroupTx);
 
@@ -916,7 +970,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         int elanTag = elanInfo.getElanTag().intValue();
         long groupId = ElanUtils.getElanRemoteBCGId(elanTag);
         setBCGrouponOtherDpns(elanInfo, dpId, elanTag, groupId);
-        EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+        EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
         if (etreeInstance != null) {
             int etreeLeafTag = etreeInstance.getEtreeLeafTagVal().getValue().intValue();
             long etreeLeafGroupId = ElanUtils.getEtreeLeafRemoteBCGId(etreeLeafTag);
@@ -1033,6 +1087,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     }
 
     // Install DMAC entry on dst DPN
+    @SuppressWarnings("checkstyle:ForbiddenMethod")
     public List<ListenableFuture<Void>> installDMacAddressTables(ElanInstance elanInfo, InterfaceInfo interfaceInfo,
             BigInteger dstDpId) throws ElanException {
         String interfaceName = interfaceInfo.getInterfaceName();
@@ -1045,8 +1100,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                 LOG.info("Installing remote dmac for mac address {} and interface {}", macAddress, interfaceName);
                 synchronized (ElanUtils.getElanMacDPNKey(elanInfo.getElanTag(), macAddress,
                         interfaceInfo.getDpId())) {
-                    LOG.info("Acquired lock for mac : " + macAddress + ". Proceeding with remote dmac"
-                            + " install operation.");
+                    LOG.info("Acquired lock for mac : {}, proceeding with remote dmac install operation", macAddress);
                     elanUtils.setupDMacFlowOnRemoteDpn(elanInfo, interfaceInfo, dstDpId, macAddress,
                             writeFlowTx);
                 }
@@ -1104,7 +1158,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
     private void setupLeavesLocalBroadcastGroups(ElanInstance elanInfo, DpnInterfaces newDpnInterface,
             InterfaceInfo interfaceInfo) {
-        EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+        EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
         if (etreeInstance != null) {
             List<Bucket> listBucket = new ArrayList<>();
             int bucketId = 0;
@@ -1265,7 +1319,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
     private void setupEtreeTerminateServiceTable(ElanInstance elanInfo, BigInteger dpId,
             WriteTransaction writeFlowGroupTx) {
-        EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+        EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
         if (etreeInstance != null) {
             setupTerminateServiceTable(elanInfo, dpId, etreeInstance.getEtreeLeafTagVal().getValue(), writeFlowGroupTx);
         }
@@ -1375,14 +1429,14 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
 
     private void bindEtreeService(ElanInstance elanInfo, ElanInterface elanInterface, int lportTag,
             WriteTransaction tx) {
-        if (elanInterface.getAugmentation(EtreeInterface.class).getEtreeInterfaceType() == EtreeInterfaceType.Root) {
+        if (elanInterface.augmentation(EtreeInterface.class).getEtreeInterfaceType() == EtreeInterfaceType.Root) {
             bindElanService(elanInfo.getElanTag(), elanInfo.getElanInstanceName(), elanInterface.getName(),
                     lportTag, tx);
         } else {
-            EtreeInstance etreeInstance = elanInfo.getAugmentation(EtreeInstance.class);
+            EtreeInstance etreeInstance = elanInfo.augmentation(EtreeInstance.class);
             if (etreeInstance == null) {
-                LOG.error("EtreeInterface " + elanInterface.getName() + " is associated with a non EtreeInstance: "
-                        + elanInfo.getElanInstanceName());
+                LOG.error("EtreeInterface {} is associated with a non EtreeInstance: {}",
+                        elanInterface.getName(), elanInfo.getElanInstanceName());
             } else {
                 bindElanService(etreeInstance.getEtreeLeafTagVal().getValue(), elanInfo.getElanInstanceName(),
                         elanInterface.getName(), lportTag, tx);
@@ -1391,7 +1445,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     }
 
     private boolean isStandardElanService(ElanInterface elanInterface) {
-        return elanInterface.getAugmentation(EtreeInterface.class) == null;
+        return elanInterface.augmentation(EtreeInterface.class) == null;
     }
 
     protected void unbindService(String interfaceName, ReadWriteTransaction tx) throws ReadFailedException {
@@ -1428,7 +1482,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     private DpnInterfaces updateElanDpnInterfacesList(String elanInstanceName, BigInteger dpId,
             List<String> interfaceNames, WriteTransaction tx) {
         DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId).setInterfaces(interfaceNames)
-                .setKey(new DpnInterfacesKey(dpId)).build();
+                .withKey(new DpnInterfacesKey(dpId)).build();
         tx.put(LogicalDatastoreType.OPERATIONAL,
                 ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), dpnInterface,
                 WriteTransaction.CREATE_MISSING_PARENTS);
@@ -1458,7 +1512,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         List<String> interfaceNames = new ArrayList<>();
         interfaceNames.add(interfaceName);
         DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId).setInterfaces(interfaceNames)
-                .setKey(new DpnInterfacesKey(dpId)).build();
+                .withKey(new DpnInterfacesKey(dpId)).build();
         tx.put(LogicalDatastoreType.OPERATIONAL,
                 ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), dpnInterface,
                 WriteTransaction.CREATE_MISSING_PARENTS);
@@ -1474,7 +1528,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         // Static-Mac Entries..
         if (!interfaceMacTables.isPresent()) {
             ElanInterfaceMac elanInterfaceMacTable = new ElanInterfaceMacBuilder().setElanInterface(interfaceName)
-                    .setKey(new ElanInterfaceMacKey(interfaceName)).build();
+                    .withKey(new ElanInterfaceMacKey(interfaceName)).build();
             tx.put(LogicalDatastoreType.OPERATIONAL,
                     ElanUtils.getElanInterfaceMacEntriesOperationalDataPath(interfaceName), elanInterfaceMacTable,
                     WriteTransaction.CREATE_MISSING_PARENTS);
@@ -1494,7 +1548,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
             }
             interfaceLists.add(interfaceName);
             Elan elanState = new ElanBuilder().setName(elanInstanceName).setElanInterfaces(interfaceLists)
-                    .setKey(new ElanKey(elanInstanceName)).build();
+                    .withKey(new ElanKey(elanInstanceName)).build();
             tx.put(LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInstanceOperationalDataPath(elanInstanceName),
                     elanState, WriteTransaction.CREATE_MISSING_PARENTS);
         }
@@ -1525,7 +1579,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
                         + "skipping this ELAN for tunnel handling", elanName);
                 continue;
             }
-            if (ElanUtils.isFlat(elanInfo) || ElanUtils.isVlan(elanInfo)) {
+            if (!isVxlanNetworkOrVxlanSegment(elanInfo)) {
                 LOG.debug("Ignoring internal tunnel state event for Flat/Vlan elan {}", elanName);
                 continue;
             }