Elan Junit Testcases 94/62894/20
authorRiyazahmed D Talikoti <riyazahmed.d.talikoti@ericsson.com>
Fri, 8 Sep 2017 11:13:40 +0000 (16:43 +0530)
committerVivekanandan Narasimhan <n.vivekanandan@ericsson.com>
Fri, 17 Nov 2017 12:07:21 +0000 (12:07 +0000)
Test Cases below
1. Check for SMAC entry in DPN1 for port created in DPN1
2. Check for DMAC entry in DPN1 for port created in DPN1
3. Check for DMAC entry in DPN1 for port created in DPN2

InterfaceManager, ITM teststubs are moved to genius.

Expected object contains the flow details of SMAC and DMAC
where most of the values are parameterised.

Change-Id: I6fada494719b904465608cfc0e4a3cd5ec8a8911
Signed-off-by: Riyazahmed D Talikoti <riyazahmed.d.talikoti@ericsson.com>
vpnservice/elanmanager/elanmanager-impl/pom.xml
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/evpn/utils/EvpnUtils.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/utils/ElanUtils.java
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTest.java
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java [new file with mode: 0644]
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestModule.java
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ExpectedObjects.xtend
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/ElanEgressActionsHelper.java [new file with mode: 0644]
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/IdHelper.java [new file with mode: 0644]
vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/InterfaceHelper.java [new file with mode: 0644]

index 3acd4ce19b3bc1fa752fc8b65a33465e7ac3206a..32fd34d90fd17198eb4bfe6c584995a5b2d07f1b 100644 (file)
       <type>test-jar</type>
     </dependency>
     <dependency>
+        <groupId>org.opendaylight.genius</groupId>
+        <artifactId>mdsalutil-impl</artifactId>
+        <version>${genius.version}</version>
+        <scope>test</scope>
+    </dependency>
+      <dependency>
       <groupId>org.opendaylight.controller</groupId>
       <artifactId>sal-binding-broker-impl</artifactId>
       <scope>test</scope>
       <version>${genius.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin</groupId>
+      <artifactId>openflowplugin-extension-nicira</artifactId>
+      <version>${openflowplugin.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin.model</groupId>
+      <artifactId>model-flow-service</artifactId>
+      <version>${openflowplugin.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.openflowplugin.model</groupId>
+      <artifactId>model-flow-base</artifactId>
+      <version>${openflowplugin.version}</version>
+    </dependency>
   </dependencies>
 
   <build>
index 50161a2d3c0e8a9b192af5a8ea3de58724c337c5..4880ff9a405a71b7372bccdf59e63d6f9e80b191 100644 (file)
@@ -15,7 +15,8 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.function.BiPredicate;
 import java.util.function.Predicate;
-
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
@@ -36,6 +37,9 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
+
+@Singleton
 public class EvpnUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(EvpnUtils.class);
@@ -52,6 +56,7 @@ public class EvpnUtils {
     private volatile IBgpManager bgpManager;
     private volatile IVpnManager vpnManager;
 
+    @Inject
     public EvpnUtils(DataBroker broker, IInterfaceManager interfaceManager,
                      ElanUtils elanUtils, ItmRpcService itmRpcService) {
         this.broker = broker;
@@ -174,7 +179,7 @@ public class EvpnUtils {
     }
 
     @SuppressWarnings("checkstyle:IllegalCatch")
-    private void advertisePrefix(ElanInstance elanInfo, String rd,
+    public void advertisePrefix(ElanInstance elanInfo, String rd,
                                  String macAddress, String prefix, String interfaceName, BigInteger dpnId) {
         if (rd == null) {
             LOG.debug("advertisePrefix : rd is NULL for elanInfo {}, macAddress {}", elanInfo, macAddress);
index 8558d251cc9711f9575f4ace47db34ea85f6eb67..ad0ce127bae043cbeda3ce632d70504907c5f9c2 100755 (executable)
@@ -233,7 +233,8 @@ public class ElanUtils {
     }
 
     public final Boolean isOpenStackVniSemanticsEnforced() {
-        return elanConfig.isOpenstackVniSemanticsEnforced();
+        return elanConfig.isOpenstackVniSemanticsEnforced() != null
+                ? elanConfig.isOpenstackVniSemanticsEnforced() : false;
     }
 
     public static void addElanInstanceIntoCache(String elanInstanceName, ElanInstance elanInstance) {
index 5da24ccfb594bbf270643b2d792f97351acd4b9e..f3c4dc6b3115c34fe16d06c382c65df8b5ba3d87 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Red Hat, Inc. and others. All rights reserved.
+ * Copyright (C) 2016, 2017 Red Hat Inc., and others. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -7,41 +7,51 @@
  */
 package org.opendaylight.netvirt.elanmanager.tests;
 
-import static org.junit.Assert.assertNotNull;
 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
 
-import java.math.BigInteger;
-import java.util.Collections;
-import java.util.List;
+import com.google.common.base.Optional;
 import javax.inject.Inject;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+
 import org.junit.rules.MethodRule;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
-import org.opendaylight.genius.datastoreutils.testutils.AsyncEventsWaiter;
-import org.opendaylight.genius.datastoreutils.testutils.JobCoordinatorTestModule;
-import org.opendaylight.genius.datastoreutils.testutils.TestableDataTreeChangeListenerModule;
 import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
-import org.opendaylight.genius.testutils.TestInterfaceManager;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
 import org.opendaylight.infrautils.inject.guice.testutils.GuiceRule;
 import org.opendaylight.infrautils.testutils.LogRule;
 import org.opendaylight.mdsal.binding.testutils.AssertDataObjects;
+import org.opendaylight.netvirt.elan.evpn.listeners.ElanMacEntryListener;
+import org.opendaylight.netvirt.elan.evpn.listeners.EvpnElanInstanceListener;
+import org.opendaylight.netvirt.elan.evpn.listeners.MacVrfEntryListener;
+import org.opendaylight.netvirt.elan.evpn.utils.EvpnUtils;
+import org.opendaylight.netvirt.elan.utils.ElanUtils;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 
 /**
  * End-to-end test of IElanService.
  *
  * @author Michael Vorburger
+ * @author Riyazahmed Talikoti
  */
-public class ElanServiceTest {
+public class ElanServiceTest extends  ElanServiceTestBase {
 
-    private static final String TEST_ELAN_NAME = "TestElanName";
-    private static final String TEST_INTERFACE_NAME = "TestElanInterfaceName";
+    private static final Logger LOG = LoggerFactory.getLogger(ElanServiceTest.class);
 
     // TODO as-is, this test is flaky; as uncommenting will show
     // Uncomment this to keep running this test indefinitely
@@ -50,59 +60,137 @@ public class ElanServiceTest {
     // public @Rule RunUntilFailureRule repeater = new RunUntilFailureRule(classRepeater);
 
     public @Rule LogRule logRule = new LogRule();
+    public @Rule MethodRule guice = new GuiceRule(ElanServiceTestModule.class);
     // TODO re-enable after we can await completion of listeners and DJC:
     // Otherwise this too frequently causes spurious test failures, e.g. due to error
     // logs Caused by: java.lang.RuntimeException: java.util.concurrent.ExecutionException: Operation was interrupted
     // public @Rule LogCaptureRule logCaptureRule = new LogCaptureRule();
-
-    public @Rule MethodRule guice = new GuiceRule(JobCoordinatorTestModule.class,
-            ElanServiceTestModule.class, TestableDataTreeChangeListenerModule.class);
-
-    private @Inject DataBroker dataBroker;
     private @Inject IElanService elanService;
-    private @Inject AsyncEventsWaiter asyncEventsWaiter;
-    private @Inject TestInterfaceManager testInterfaceManager;
+    private @Inject IdManagerService idManager;
+    private @Inject EvpnElanInstanceListener evpnElanInstanceListener;
+    private @Inject ElanMacEntryListener elanMacEntryListener;
+    private @Inject MacVrfEntryListener macVrfEntryListener;
+    private @Inject EvpnUtils evpnUtils;
+
     private SingleTransactionDataBroker singleTxdataBroker;
 
-    @Before public void before() {
+    @Before public void before() throws TransactionCommitFailedException {
         singleTxdataBroker = new SingleTransactionDataBroker(dataBroker);
+        setupItm();
     }
 
     @Test public void elanServiceTestModule() {
         // Intentionally empty; the goal is just to first test the ElanServiceTestModule
     }
 
-    @Test public void createElanInstance() throws Exception {
-        // Given
-        // When
-        elanService.createElanInstance(TEST_ELAN_NAME, 12345, "TestElan description");
-        asyncEventsWaiter.awaitEventsConsumption();
-        // Then
-        ElanInstances actualElanInstances = singleTxdataBroker.syncRead(CONFIGURATION,
-                InstanceIdentifier.builder(ElanInstances.class).build());
-        AssertDataObjects.assertEqualBeans(ExpectedObjects.createElanInstance(), actualElanInstances);
-        assertNotNull(elanService.getElanInstance(TEST_ELAN_NAME));
+    @Test public void checkSMAC() throws Exception {
+        // Create Elan instance
+        createElanInstance(ExpectedObjects.ELAN1, ExpectedObjects.ELAN1_SEGMENT_ID);
+        awaitForElanTag(ExpectedObjects.ELAN1);
+
+        // Add Elan interface
+        InterfaceInfo interfaceInfo = ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft();
+        addElanInterface(ExpectedObjects.ELAN1, interfaceInfo);
+
+        // Read Elan instance
+        InstanceIdentifier<ElanInstance> elanInstanceIid = InstanceIdentifier.builder(ElanInstances.class)
+                .child(ElanInstance.class, new ElanInstanceKey(ExpectedObjects.ELAN1)).build();
+        ElanInstance actualElanInstances = singleTxdataBroker.syncRead(CONFIGURATION, elanInstanceIid);
+
+        // Read and Compare SMAC flow
+        String flowId =  new StringBuffer()
+                .append(NwConstants.ELAN_SMAC_TABLE)
+                .append(actualElanInstances.getElanTag())
+                .append(DPN1_ID)
+                .append(interfaceInfo.getInterfaceTag())
+                .append(interfaceInfo.getMacAddress())
+                .toString();
+        InstanceIdentifier<Flow> flowInstanceIidSrc = getFlowIid(NwConstants.ELAN_SMAC_TABLE,
+                new FlowId(flowId), DPN1_ID);
+        awaitForData(LogicalDatastoreType.CONFIGURATION, flowInstanceIidSrc);
+
+        Flow flowSrc = singleTxdataBroker.syncRead(CONFIGURATION, flowInstanceIidSrc);
+        flowSrc = getFlowWithoutCookie(flowSrc);
+
+        Flow expected = ExpectedObjects.checkSmac(flowId, interfaceInfo, actualElanInstances);
+        AssertDataObjects.assertEqualBeans(expected, flowSrc);
     }
 
-    @Test public void addElanInterface() throws Exception {
-        // Given
-        elanService.createElanInstance(TEST_ELAN_NAME, 12345, "...");
-        asyncEventsWaiter.awaitEventsConsumption();
-        testInterfaceManager.addInterfaceInfo(newInterfaceInfo(TEST_INTERFACE_NAME));
-        // When
-        List<String> macAddresses = Collections.singletonList("11:22:33:44:55:66");
-        elanService.addElanInterface(TEST_ELAN_NAME, TEST_INTERFACE_NAME, macAddresses, "...");
-        asyncEventsWaiter.awaitEventsConsumption();
-        // Then
-        ElanInterfaces actualElanInterfaces = singleTxdataBroker.syncRead(CONFIGURATION,
-                InstanceIdentifier.builder(ElanInterfaces.class).build());
-        AssertDataObjects.assertEqualBeans(ExpectedObjects.addElanInterface(), actualElanInterfaces);
+    @Test public void checkDmacSameDPN() throws Exception {
+        // Create Elan instance
+        createElanInstance(ExpectedObjects.ELAN1, ExpectedObjects.ELAN1_SEGMENT_ID);
+        awaitForElanTag(ExpectedObjects.ELAN1);
+
+        // Add Elan interface in DPN1
+        InterfaceInfo interfaceInfo = ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft();
+        addElanInterface(ExpectedObjects.ELAN1, interfaceInfo);
+
+        // Read Elan instance
+        InstanceIdentifier<ElanInstance> elanInstanceIid = InstanceIdentifier.builder(ElanInstances.class)
+                .child(ElanInstance.class, new ElanInstanceKey(ExpectedObjects.ELAN1)).build();
+        ElanInstance actualElanInstances = singleTxdataBroker.syncRead(CONFIGURATION, elanInstanceIid);
+
+        // Read DMAC Flow in DPN1
+        String flowId =  new StringBuffer()
+                .append(NwConstants.ELAN_DMAC_TABLE)
+                .append(actualElanInstances.getElanTag())
+                .append(DPN1_ID)
+                .append(interfaceInfo.getInterfaceTag())
+                .append(interfaceInfo.getMacAddress())
+                .toString();
+        InstanceIdentifier<Flow> flowInstanceIidDst = getFlowIid(NwConstants.ELAN_DMAC_TABLE,
+                new FlowId(flowId), DPN1_ID);
+        awaitForData(LogicalDatastoreType.CONFIGURATION, flowInstanceIidDst);
+
+        Flow flowDst = singleTxdataBroker.syncRead(CONFIGURATION, flowInstanceIidDst);
+        flowDst = getFlowWithoutCookie(flowDst);
+
+        Flow expected = ExpectedObjects.checkDmacOfSameDpn(flowId, interfaceInfo, actualElanInstances);
+        AssertDataObjects.assertEqualBeans(expected, flowDst);
     }
 
-    private InterfaceInfo newInterfaceInfo(String testInterfaceName) {
-        InterfaceInfo interfaceInfo = new InterfaceInfo(BigInteger.valueOf(789), "TestPortName");
-        interfaceInfo.setInterfaceName(TEST_INTERFACE_NAME);
-        return interfaceInfo;
+    @Test public void checkDmacOfOtherDPN() throws Exception {
+        // Create Elan instance
+        createElanInstance(ExpectedObjects.ELAN1, ExpectedObjects.ELAN1_SEGMENT_ID);
+        awaitForElanTag(ExpectedObjects.ELAN1);
+
+        InterfaceInfo interfaceInfo = ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft();
+        addElanInterface(ExpectedObjects.ELAN1, interfaceInfo);
+
+        // Read Elan instance
+        InstanceIdentifier<ElanInstance> elanInstanceIid = InstanceIdentifier.builder(ElanInstances.class)
+                .child(ElanInstance.class, new ElanInstanceKey(ExpectedObjects.ELAN1)).build();
+        ElanInstance actualElanInstances = singleTxdataBroker.syncRead(CONFIGURATION, elanInstanceIid);
+
+        interfaceInfo = ELAN_INTERFACES.get(ELAN1 + ":" + DPN2MAC1).getLeft();
+        addElanInterface(ExpectedObjects.ELAN1, interfaceInfo);
+
+        // Read and Compare DMAC flow in DPN1 for MAC1 of DPN2
+        String flowId = ElanUtils.getKnownDynamicmacFlowRef((short)51,
+                        DPN1_ID,
+                        DPN2_ID,
+                        interfaceInfo.getMacAddress().toString(),
+                        actualElanInstances.getElanTag());
+
+        InstanceIdentifier<Flow> flowInstanceIidDst = getFlowIid(NwConstants.ELAN_DMAC_TABLE,
+                new FlowId(flowId), DPN1_ID);
+        awaitForData(LogicalDatastoreType.CONFIGURATION, flowInstanceIidDst);
+
+        Flow flowDst = singleTxdataBroker.syncRead(CONFIGURATION, flowInstanceIidDst);
+        flowDst = getFlowWithoutCookie(flowDst);
+
+        TunnelInterfaceDetails tepDetails = EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN2_ID_STR);
+        Flow expected = ExpectedObjects.checkDmacOfOtherDPN(flowId, interfaceInfo, tepDetails,
+                actualElanInstances);
+        AssertDataObjects.assertEqualBeans(getSortedActions(expected), getSortedActions(flowDst));
     }
 
+    private void awaitForElanTag(String elanName) {
+        InstanceIdentifier<ElanInstance> elanInstanceIid = InstanceIdentifier.builder(ElanInstances.class)
+                .child(ElanInstance.class, new ElanInstanceKey(elanName)).build();
+        getAwaiter().until(() -> {
+            Optional<ElanInstance> elanInstance = MDSALUtil.read(dataBroker, CONFIGURATION, elanInstanceIid);
+            return elanInstance.isPresent() && elanInstance.get().getElanTag() != null;
+        });
+    }
 }
diff --git a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/ElanServiceTestBase.java
new file mode 100644 (file)
index 0000000..0cc0246
--- /dev/null
@@ -0,0 +1,277 @@
+/*
+ * Copyright © 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.elanmanager.tests;
+
+import com.google.common.collect.Lists;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionFactory;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.testutils.TestInterfaceManager;
+
+import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
+import org.opendaylight.genius.testutils.itm.ItmRpcTestImpl;
+import org.opendaylight.netvirt.elan.internal.ElanInstanceManager;
+import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
+import org.opendaylight.netvirt.elanmanager.tests.utils.InterfaceHelper;
+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.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
+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.netvirt.elan.rev150602.elan.instances.ElanInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntriesBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+public class ElanServiceTestBase {
+
+    protected  @Inject DataBroker dataBroker;
+    protected  @Inject TestInterfaceManager interfaceMgr;
+    protected  @Inject ItmRpcTestImpl itmRpc;
+    protected  @Inject ElanInstanceManager elanInstanceManager;
+
+    public static final String ELAN1 = "34701c04-1118-4c65-9425-78a80d49a211";
+    protected static final Long ELAN1_SEGMENT_ID = 100L;
+
+    protected static final BigInteger DPN1_ID = new BigInteger("1");
+    protected static final BigInteger DPN2_ID = new BigInteger("2");
+
+    protected static final String DPN1_ID_STR = "1";
+    protected static final String DPN2_ID_STR = "2";
+
+    protected static final String DPN1_TEPIP = "192.168.56.30";
+    protected static final String DPN2_TEPIP = "192.168.56.40";
+    protected static final String TOR1_TEPIP = "192.168.56.50";
+    protected static final String DCGW_TEPIP = "192.168.56.60";
+
+    protected static final String DPN1MAC1 = "10:00:00:00:00:01";
+    protected static final String DPN1MAC2 = "10:00:00:00:00:02";
+
+    protected static final String DPN2MAC1 = "10:00:00:00:00:03";
+    protected static final String DPN2MAC2 = "10:00:00:00:00:04";
+
+    protected static final String TOR1MAC1 = "10:00:00:00:00:05";
+    protected static final String TOR1MAC2 = "10:00:00:00:00:06";
+
+    protected static final String DPN1TODPN2TNLMAC = "91:00:00:00:00:01";
+    protected static final String DPN1TOTOR1TNLMAC = "91:00:00:00:00:02";
+    protected static final String DPN1TODCGWTNLMAC = "91:00:00:00:00:03";
+
+    protected static final String DPN2TODPN1TNLMAC = "92:00:00:00:00:01";
+    protected static final String DPN2TOTOR1TNLMAC = "92:00:00:00:00:02";
+    protected static final String DPN2TODCGWTNLMAC = "92:00:00:00:00:03";
+
+    protected static final String DPN1IP1 = "10.0.0.11";
+    protected static final String DPN1IP2 = "10.0.0.12";
+    protected static final String DPN2IP1 = "10.0.0.13";
+    protected static final String DPN2IP2 = "10.0.0.14";
+
+    protected static final String EVPNRECVMAC1 = "10:00:00:00:00:51";
+    protected static final String EVPNRECVMAC2 = "10:00:00:00:00:52";
+
+    protected static final String EVPNRECVIP1 = "192.168.122.51";
+    protected static final String EVPNRECVIP2 = "192.168.122.52";
+
+    protected static final String TOR1NODEID = "hwvtep://uuid/34701c04-1118-4c65-9425-78a80d49a211";
+    protected static final String DCGWID = DCGW_TEPIP;
+
+    protected static final String RD = "100:1";
+    protected static final String EVPN1 = "evpn1";
+
+    protected static Map<String, Pair<InterfaceInfo, String>> ELAN_INTERFACES = new HashMap<>();
+    protected static Map<String, TunnelInterfaceDetails> EXTN_INTFS = new HashMap<>();
+
+
+    static {
+        //Adding elan dpn macs
+        /*ELAN1+":"+DPN1MAC1 ->
+        (vlanInterfaceInfo(String interfaceName, BigInteger dpId, int portNo, int lportTag, String mac), vmPrefix)*/
+        ELAN_INTERFACES.put(ELAN1 + ":" + DPN1MAC1 ,
+                new ImmutablePair(InterfaceHelper.buildVlanInterfaceInfo("23701c04-1118-4c65-9425-78a80d49a211",
+                DPN1_ID, 1, 10, DPN1MAC1), DPN1IP1));
+
+        ELAN_INTERFACES.put(ELAN1 + ":" + DPN1MAC2 ,
+                new ImmutablePair(InterfaceHelper.buildVlanInterfaceInfo("23701c04-1218-4c65-9425-78a80d49a211",
+                DPN1_ID, 2, 11, DPN1MAC2), DPN1IP2));
+
+        ELAN_INTERFACES.put(ELAN1 + ":" + DPN2MAC1 ,
+                new ImmutablePair(InterfaceHelper.buildVlanInterfaceInfo("23701c04-2118-4c65-9425-78a80d49a211",
+                DPN2_ID, 3, 12, DPN2MAC1), DPN2IP1));
+
+        ELAN_INTERFACES.put(ELAN1 + ":" + DPN2MAC2 ,
+                new ImmutablePair(InterfaceHelper.buildVlanInterfaceInfo("23701c04-2218-4c65-9425-78a80d49a211",
+                DPN2_ID, 4, 13, DPN2MAC2), DPN2IP2));
+
+        //Adding the external tunnel interfaces
+        EXTN_INTFS.put(DPN1_ID_STR + ":" + DPN2_ID_STR, new TunnelInterfaceDetails(DPN1_TEPIP, DPN2_TEPIP, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-10", DPN1_ID, 5, 14, DPN1TODPN2TNLMAC)));
+
+        EXTN_INTFS.put(DPN1_ID_STR + ":" + TOR1NODEID, new TunnelInterfaceDetails(DPN1_TEPIP, TOR1_TEPIP, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-12", DPN1_ID, 6, 15, DPN1TOTOR1TNLMAC)));
+
+        EXTN_INTFS.put(DPN2_ID_STR + ":" + DPN1_ID_STR, new TunnelInterfaceDetails(DPN2_TEPIP, DPN1_TEPIP, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-11", DPN2_ID, 7, 16, DPN2TODPN1TNLMAC)));
+
+        EXTN_INTFS.put(DPN2_ID_STR + ":" + TOR1NODEID, new TunnelInterfaceDetails(DPN2_TEPIP, TOR1_TEPIP, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-13", DPN2_ID, 8, 17, DPN2TOTOR1TNLMAC)));
+
+
+        EXTN_INTFS.put(DPN1_ID_STR + ":" + DCGWID, new TunnelInterfaceDetails(DPN1_TEPIP, DCGW_TEPIP, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-14", DPN1_ID, 9, 18, DPN1TODCGWTNLMAC)));
+
+        EXTN_INTFS.put(DPN2_ID_STR + ":" + DCGWID, new TunnelInterfaceDetails(DPN2_TEPIP, DCGWID, true,
+                InterfaceHelper.buildVxlanInterfaceInfo("tun23701c04-15", DPN2_ID, 10, 19, DPN2TODCGWTNLMAC)));
+    }
+
+    protected ConditionFactory getAwaiter() {
+        return Awaitility.await("TestableListener")
+                .atMost(30, TimeUnit.SECONDS)//TODO constant
+                .pollInterval(100, TimeUnit.MILLISECONDS);
+    }
+
+    void awaitForData(LogicalDatastoreType dsType, InstanceIdentifier<? extends DataObject> iid) {
+        getAwaiter().until(() -> MDSALUtil.read(dataBroker, dsType, iid).isPresent());
+    }
+
+    void awaitForDataDelete(LogicalDatastoreType dsType, InstanceIdentifier<? extends DataObject> iid) {
+        getAwaiter().until(() -> !MDSALUtil.read(dataBroker, dsType, iid).isPresent());
+    }
+
+    Flow getFlowWithoutCookie(Flow flow) {
+        FlowBuilder flowBuilder = new FlowBuilder(flow);
+        return flowBuilder.setCookie(null).build();
+    }
+
+    Flow getSortedActions(Flow flow) {
+        FlowBuilder flowBuilder = new FlowBuilder(flow);
+        Instructions instructions = flowBuilder.getInstructions();
+        InstructionsBuilder builder = new InstructionsBuilder();
+        InstructionBuilder instructionBuilder = new InstructionBuilder(instructions.getInstruction().get(0));
+        instructionBuilder.setInstruction(sortActions(instructionBuilder.getInstruction()));
+        builder.setInstruction(Lists.newArrayList(instructionBuilder.build()));
+        return flowBuilder.setInstructions(builder.build()).build();
+    }
+
+    org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction
+        sortActions(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.Instruction input) {
+        if (input instanceof  ApplyActionsCase) {
+            List<Action> action = new ArrayList<>(((ApplyActionsCase)input).getApplyActions().getAction());
+            Collections.sort(action, new Comparator<Action>() {
+                @Override
+                public int compare(Action o1, Action o2) {
+                    return o1.getOrder().compareTo(o2.getOrder());
+                }
+            });
+
+            ApplyActions actions = new ApplyActionsBuilder().setAction(action).build();
+            return new ApplyActionsCaseBuilder().setApplyActions(actions).build();
+        }
+        return null;
+    }
+
+    protected void setupItm() throws TransactionCommitFailedException {
+        /*Add tap port and tunnel ports in DPN1 and DPN2*/
+        interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN1MAC1).getLeft());
+        interfaceMgr.addInterfaceInfo(ELAN_INTERFACES.get(ELAN1 + ":" + DPN2MAC1).getLeft());
+        interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN2_ID_STR));
+        interfaceMgr.addTunnelInterface(EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN1_ID_STR));
+
+        /*Add DPN1 and DPN2 TEPs*/
+        itmRpc.addDpn(DPN1_ID, DPN1_TEPIP);
+        itmRpc.addDpn(DPN2_ID, DPN2_TEPIP);
+
+        /*add external interface*/
+        itmRpc.addInterface(DPN1_ID,
+                DPN2_TEPIP, EXTN_INTFS.get(DPN1_ID_STR + ":" + DPN2_ID_STR).getInterfaceInfo().getInterfaceName());
+        itmRpc.addInterface(DPN2_ID,
+                DPN1_TEPIP, EXTN_INTFS.get(DPN2_ID_STR + ":" + DPN1_ID_STR).getInterfaceInfo().getInterfaceName());
+    }
+
+    protected InstanceIdentifier<Flow> getFlowIid(short tableId, FlowId flowid, BigInteger dpnId) {
+
+        FlowKey flowKey = new FlowKey(new FlowId(flowid));
+        NodeId nodeId =
+                new NodeId("openflow:" + dpnId);
+        Node nodeDpn =
+                new NodeBuilder().setId(nodeId).setKey(new NodeKey(nodeId)).build();
+        return InstanceIdentifier.builder(Nodes.class)
+                .child(Node.class,
+                        nodeDpn.getKey()).augmentation(FlowCapableNode.class)
+                .child(Table.class, new TableKey(tableId)).child(Flow.class, flowKey).build();
+    }
+
+
+    protected void createElanInstance(String elan1, Long elan1SegmentId) {
+        ElanInstance elanInstance = ExpectedObjects.createElanInstance(elan1, elan1SegmentId);
+        MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                ElanHelper.getElanInstanceConfigurationDataPath(elan1), elanInstance);
+    }
+
+    public void addElanInterface(String elanInstanceName, InterfaceInfo interfaceInfo) {
+        ElanInstance existingElanInstance = elanInstanceManager.getElanInstanceByName(elanInstanceName);
+        String interfaceName = interfaceInfo.getInterfaceName();
+
+        if (existingElanInstance != null) {
+            ElanInterfaceBuilder elanInterfaceBuilder = new ElanInterfaceBuilder()
+                    .setElanInstanceName(elanInstanceName)
+                    .setName(interfaceName)
+                    .setKey(new ElanInterfaceKey(interfaceName));
+
+            StaticMacEntriesBuilder staticMacEntriesBuilder = new StaticMacEntriesBuilder();
+            List<StaticMacEntries> staticMacEntries = new ArrayList<>();
+            List<PhysAddress> physAddressList = Collections.singletonList(
+                    new PhysAddress(interfaceInfo.getMacAddress()));
+            for (PhysAddress physAddress : physAddressList) {
+                staticMacEntries.add(staticMacEntriesBuilder.setMacAddress(physAddress)
+                        /*.setIpPrefix(new IpAddress(new Ipv4Address(interfaceDetails.getPrefix())))*/.build());
+            }
+            elanInterfaceBuilder.setStaticMacEntries(staticMacEntries);
+            ElanInterface elanInterface = elanInterfaceBuilder.build();
+
+            MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                    ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName), elanInterface);
+        }
+    }
+}
index 14017c4987e8ed5e04d5fbcac89fd9d397e60d5c..1a3df5684e216c24c9a239c3a5e168fb98b386c1 100644 (file)
@@ -7,23 +7,28 @@
  */
 package org.opendaylight.netvirt.elanmanager.tests;
 
+import static org.mockito.Mockito.CALLS_REAL_METHODS;
+
 import org.mockito.Mockito;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.test.DataBrokerTestModule;
 import org.opendaylight.daexim.DataImportBootReady;
-import org.opendaylight.genius.idmanager.IdManager;
+import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
+import org.opendaylight.genius.interfacemanager.commons.InterfaceMetaUtils;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
-import org.opendaylight.genius.interfacemanager.rpcservice.InterfaceManagerRpcService;
+import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.BatchingUtils;
 import org.opendaylight.genius.lockmanager.impl.LockManagerServiceImpl;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
-import org.opendaylight.genius.mdsalutil.interfaces.testutils.TestIMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.internal.MDSALManager;
 import org.opendaylight.genius.testutils.TestInterfaceManager;
+import org.opendaylight.genius.testutils.itm.ItmRpcTestImpl;
 import org.opendaylight.infrautils.inject.guice.testutils.AbstractGuiceJsr250Module;
 import org.opendaylight.mdsal.eos.binding.api.EntityOwnershipService;
-import org.opendaylight.netvirt.elan.evpn.utils.EvpnUtils;
 import org.opendaylight.netvirt.elan.internal.ElanServiceProvider;
 import org.opendaylight.netvirt.elan.statusanddiag.ElanStatusMonitor;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.netvirt.elanmanager.tests.utils.ElanEgressActionsHelper;
+import org.opendaylight.netvirt.elanmanager.tests.utils.IdHelper;
 import org.opendaylight.netvirt.neutronvpn.NeutronvpnManagerImpl;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
@@ -32,6 +37,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.I
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.config.rev150710.ElanConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
+
 
 /**
  * Equivalent of src/main/resources/org/opendaylight/blueprint/elanmanager.xml,
@@ -43,13 +50,16 @@ public class ElanServiceTestModule extends AbstractGuiceJsr250Module {
 
     @Override
     protected void configureBindings() {
-        // Bindings for services from this project
-        bind(IElanService.class).to(ElanServiceProvider.class);
+        DataBroker dataBroker = DataBrokerTestModule.dataBroker();
+        bind(EntityOwnershipService.class).toInstance(Mockito.mock(EntityOwnershipService.class));
+        bind(ElanStatusMonitor.class).toInstance(Mockito.mock(ElanStatusMonitor.class));
+        bind(INeutronVpnManager.class).toInstance(Mockito.mock(NeutronvpnManagerImpl.class));
+        //IVpnManager ivpnManager = Mockito.mock(VpnManagerTestImpl.class, CALLS_REAL_METHODS);
+        bind(IMdsalApiManager.class).toInstance(new MDSALManager(dataBroker,
+                Mockito.mock(PacketProcessingService.class)));
 
         // Bindings for external services to "real" implementations
-        bind(IdManagerService.class).to(IdManager.class);
         bind(LockManagerService.class).to(LockManagerServiceImpl.class);
-        bind(OdlInterfaceRpcService.class).to(InterfaceManagerRpcService.class);
         bind(ElanConfig.class).toInstance(new ElanConfigBuilder().setIntBridgeGenMac(true)
                         .setTempSmacLearnTimeout(10).build());
 
@@ -62,15 +72,33 @@ public class ElanServiceTestModule extends AbstractGuiceJsr250Module {
         // TODO complete this list!!! after Gerrit which adds @Inject to all listeners
 
         // Bindings to test infra (fakes & mocks)
-        bind(DataBroker.class).toInstance(DataBrokerTestModule.dataBroker());
-        bind(IMdsalApiManager.class).toInstance(TestIMdsalApiManager.newInstance());
-        bindTypesToInstance(IInterfaceManager.class, TestInterfaceManager.class, TestInterfaceManager.newInstance());
-        bind(ItmRpcService.class).toInstance(Mockito.mock(ItmRpcService.class)); // new ItmManagerRpcService();
-        bind(ElanStatusMonitor.class).toInstance(Mockito.mock(ElanStatusMonitor.class));
-        bind(EvpnUtils.class).toInstance(Mockito.mock(EvpnUtils.class));
-        bind(EntityOwnershipService.class).toInstance(Mockito.mock(EntityOwnershipService.class));
-        bind(INeutronVpnManager.class).toInstance(Mockito.mock(NeutronvpnManagerImpl.class));
+
+        TestInterfaceManager obj = TestInterfaceManager.newInstance(dataBroker);
+        ItmRpcService itmRpcService = new ItmRpcTestImpl();
+        //IBgpManager ibgpManager = BgpManagerTestImpl.newInstance(dataBroker);
+        bind(DataBroker.class).toInstance(dataBroker);
+        bind(IdManagerService.class).toInstance(Mockito.mock(IdHelper.class,  CALLS_REAL_METHODS));
+        bind(IInterfaceManager.class).toInstance(obj);
+        bind(TestInterfaceManager.class).toInstance(obj);
+        InterfaceMetaUtils interfaceMetaUtils = new InterfaceMetaUtils(dataBroker,
+                Mockito.mock(IdHelper.class,  CALLS_REAL_METHODS),
+                Mockito.mock(BatchingUtils.class));
+
+        InterfaceManagerCommonUtils interfaceManagerCommonUtils = new InterfaceManagerCommonUtils(
+                dataBroker,
+                new MDSALManager(dataBroker, Mockito.mock(PacketProcessingService.class)),
+                Mockito.mock(IdHelper.class,  CALLS_REAL_METHODS),
+                interfaceMetaUtils,
+                Mockito.mock(BatchingUtils.class));
+
+        bind(OdlInterfaceRpcService.class).toInstance(ElanEgressActionsHelper.newInstance(dataBroker,
+                interfaceManagerCommonUtils));
+        bind(ItmRpcService.class).toInstance(itmRpcService);
+        bind(ItmRpcTestImpl.class).toInstance((ItmRpcTestImpl)itmRpcService);
+        //bind(IVpnManager.class).toInstance(ivpnManager);
+        //bind(IBgpManager.class).toInstance(ibgpManager);
         bind(DataImportBootReady.class).toInstance(new DataImportBootReady() {});
+        bind(IElanService.class).to(ElanServiceProvider.class);
     }
 
 }
index 71821d07f0a107eea2f8a8866155789a643d1a7f..76e6d121b7f77571ae9141cf9599cd506642d87a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Red Hat, Inc. and others. All rights reserved.
+ * Copyright (c) 2016, 2017 Red Hat, Inc. and others. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -10,12 +10,186 @@ package org.opendaylight.netvirt.elanmanager.tests
 import org.opendaylight.mdsal.binding.testutils.AssertDataObjects
 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.netvirt.elan.rev150602.ElanInstancesBuilder
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInterfacesBuilder
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceBuilder
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterfaceBuilder
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.elan._interface.StaticMacEntriesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.forwarding.entries.MacEntryKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanForwardingTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+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.InterfaceType;
 
+import java.math.BigInteger
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.SegmentTypeVxlan;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import static extension org.opendaylight.mdsal.binding.testutils.XtendBuilderExtensions.operator_doubleGreaterThan
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+
+import java.math.BigInteger;
+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 javax.inject.Inject;
+import javax.inject.Singleton;
+
+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.controller.md.sal.common.api.data.OptimisticLockFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.genius.mdsalutil.ActionInfo;
+import org.opendaylight.genius.mdsalutil.FlowEntity;
+import org.opendaylight.genius.mdsalutil.FlowInfoKey;
+import org.opendaylight.genius.mdsalutil.GroupEntity;
+import org.opendaylight.genius.mdsalutil.GroupInfoKey;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.mdsalutil.actions.ActionGroup;
+import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.infrautils.inject.AbstractLifecycle;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
+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.genius.mdsalutil.ActionInfo;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.match.rev140421.NxmNxReg6
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionRegLoadNodesNodeGroupBucketsBucketActionsCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nodes.node.group.buckets.bucket.action.action.NxActionResubmitNodesNodeGroupBucketsBucketActionsCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.dst.choice.grouping.dst.choice.DstNxRegCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.NxRegLoadBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.Dst;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nx.action.reg.load.grouping.nx.reg.load.DstBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActions;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.actions._case.WriteActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.^extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.mdsalutil.MatchInfo;
+import org.opendaylight.genius.mdsalutil.instructions.InstructionApplyActions;
+import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
+import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.mdsalutil.matches.MatchEthernetDestination;
+import org.opendaylight.genius.mdsalutil.matches.MatchEthernetSource;
+import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
+import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
+import org.opendaylight.netvirt.elan.utils.ElanUtils;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternalBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan.L2vlanMode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
+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.InterfaceType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternalBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan.L2vlanMode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
+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.InterfaceType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
+import org.opendaylight.netvirt.elanmanager.api.ElanHelper;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Networks;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksKey;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.BgpControlPlaneType;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.EncapType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
+import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
+import org.opendaylight.genius.testutils.interfacemanager.TunnelInterfaceDetails;
+
 
 /**
  * Definitions of complex objects expected in tests.
@@ -24,6 +198,24 @@ import static extension org.opendaylight.mdsal.binding.testutils.XtendBuilderExt
  */
 class ExpectedObjects {
 
+    public static String ELAN1 = "34701c04-1118-4c65-9425-78a80d49a211"
+    public static Long ELAN1_SEGMENT_ID = 100L
+
+
+    static def newInterfaceConfig(String interfaceName, String parentName) {
+        new InterfaceBuilder >> [
+            description = interfaceName
+            name = interfaceName
+            type = L2vlan
+            addAugmentation(ParentRefs, new ParentRefsBuilder >> [
+                parentInterface = parentName
+            ])addAugmentation(IfL2vlan, new IfL2vlanBuilder >> [
+                l2vlanMode = L2vlanMode.Trunk
+                vlanId = new VlanId(0)
+            ])
+        ]
+    }
+
     def static createElanInstance() {
         new ElanInstancesBuilder >> [
             elanInstance = #[
@@ -37,20 +229,190 @@ class ExpectedObjects {
         ]
     }
 
-    def static addElanInterface() {
-        new ElanInterfacesBuilder >> [
-            elanInterface = #[
-                new ElanInterfaceBuilder >> [
-                    description = "..."
-                    elanInstanceName = "TestElanName"
-                    name = "TestElanInterfaceName"
-                    staticMacEntries = #[
-                        new StaticMacEntriesBuilder >> [
-                            macAddress = new PhysAddress("11:22:33:44:55:66")
+    def static createElanInstance(String elan, Long segmentId) {
+        new ElanInstanceBuilder >> [
+                    elanInstanceName = elan
+                    description = ELAN1
+                    segmentType = SegmentTypeVxlan
+                    segmentationId = segmentId
+                    macTimeout = 12345L
+        ]
+    }
+
+    def static createElanInstance(String elan, Long segmentId, Long tag) {
+        new ElanInstanceBuilder >> [
+                    elanInstanceName = elan
+                    description = ELAN1
+                    elanTag = tag
+                    segmentationId = segmentId
+                    segmentType = SegmentTypeVxlan
+                    macTimeout = 12345L
+        ]
+    }
+
+    def static Flow checkSmac(String flowId, InterfaceInfo interfaceInfo, ElanInstance elanInstance) {
+        new FlowBuilder >> [
+            flowName = ELAN1
+            hardTimeout = 0
+            id = new FlowId(flowId)
+            idleTimeout = 0
+            instructions = new InstructionsBuilder >> [
+                instruction = #[
+                    new InstructionBuilder >> [
+                        instruction = new GoToTableCaseBuilder >> [
+                            goToTable = new GoToTableBuilder >> [
+                                tableId = 51 as short
+                            ]
                         ]
+                        order = 0
                     ]
                 ]
             ]
+            match = new MatchBuilder >> [
+                ethernetMatch = new EthernetMatchBuilder >> [
+                    ethernetSource = new EthernetSourceBuilder >> [
+                        address = new MacAddress(interfaceInfo.macAddress)
+                    ]
+                ]
+                metadata = new MetadataBuilder >> [
+                    metadata = ElanHelper.getElanMetadataLabel(elanInstance.getElanTag(), interfaceInfo.interfaceTag)
+                    metadataMask = ElanHelper.getElanMetadataMask()
+                ]
+            ]
+            priority = 20
+            tableId = 50 as short
+        ]
+    }
+
+    def static Flow checkDmacOfSameDpn(String flowId, InterfaceInfo interfaceInfo, ElanInstance elanInstance) {
+    val regvalue = MetaDataUtil.getReg6ValueForLPortDispatcher(interfaceInfo.getInterfaceTag(), NwConstants.DEFAULT_SERVICE_INDEX);
+        new FlowBuilder >> [
+            flowName = ELAN1
+            hardTimeout = 0
+            id = new FlowId(flowId)
+            idleTimeout = 0
+            instructions = new InstructionsBuilder >> [
+                instruction = #[
+                    new InstructionBuilder >> [
+                        instruction = new ApplyActionsCaseBuilder >> [
+                            applyActions = new ApplyActionsBuilder >> [
+                                action = #[
+                                    new ActionBuilder >> [
+                                        action = new NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder >> [
+                                            nxResubmit = new NxResubmitBuilder >> [
+                                                inPort = 65528
+                                                table = 220 as short
+                                            ]
+                                        ]
+                                        order = 1
+                                    ],
+                                    new ActionBuilder >> [
+                                        action = new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder >> [
+                                            nxRegLoad = new NxRegLoadBuilder >> [
+                                                dst = new DstBuilder >> [
+                                                    dstChoice = new DstNxRegCaseBuilder >> [
+                                                        nxReg = NxmNxReg6
+                                                    ]
+                                                    end = 31
+                                                    start = 0
+                                                ]
+                                                value = new BigInteger(""+regvalue)
+                                            ]
+                                        ]
+                                        order = 0
+                                    ]
+                                ]
+                            ]
+                        ]
+                        order = 0
+                    ]
+                ]
+            ]
+            match = new MatchBuilder >> [
+                ethernetMatch = new EthernetMatchBuilder >> [
+                    ethernetDestination = new EthernetDestinationBuilder >> [
+                        address = new MacAddress(interfaceInfo.getMacAddress())
+                    ]
+                ]
+                metadata = new MetadataBuilder >> [
+                    metadata = ElanHelper.getElanMetadataLabel(elanInstance.getElanTag())
+                    metadataMask = MetaDataUtil.METADATA_MASK_SERVICE
+                ]
+            ]
+            priority = 20
+            tableId = 51 as short
+        ]
+    }
+
+    def static Flow checkDmacOfOtherDPN(String flowId, InterfaceInfo interfaceInfo, TunnelInterfaceDetails tepDetails, ElanInstance elanInstance) {
+        val regvalue = MetaDataUtil.getReg6ValueForLPortDispatcher(tepDetails.getInterfaceInfo().getInterfaceTag(), NwConstants.DEFAULT_SERVICE_INDEX);
+        val tnlId = new BigInteger(""+interfaceInfo.getInterfaceTag())
+        new FlowBuilder >> [
+            flowName = ELAN1
+            hardTimeout = 0
+            id = new FlowId(flowId)
+            idleTimeout = 0
+            instructions = new InstructionsBuilder >> [
+                instruction = #[
+                    new InstructionBuilder >> [
+                        instruction = new ApplyActionsCaseBuilder >> [
+                            applyActions = new ApplyActionsBuilder >> [
+                                action = #[
+                                    new ActionBuilder >> [
+                                        action = new SetFieldCaseBuilder >> [
+                                            setField = new SetFieldBuilder >> [
+                                                tunnel = new TunnelBuilder >> [
+                                                    tunnelId = tnlId
+                                                ]
+                                            ]
+                                        ]
+                                        order = 0
+                                    ],
+                                    new ActionBuilder >> [
+                                        action = new NxActionRegLoadNodesNodeTableFlowApplyActionsCaseBuilder >> [
+                                            nxRegLoad = new NxRegLoadBuilder >> [
+                                                dst = new DstBuilder >> [
+                                                    dstChoice = new DstNxRegCaseBuilder >> [
+                                                        nxReg = NxmNxReg6
+                                                    ]
+                                                    end = 31
+                                                    start = 0
+                                                ]
+                                                value = new BigInteger(""+regvalue)
+                                            ]
+                                        ]
+                                        order = 1
+                                    ],
+                                    new ActionBuilder >> [
+                                        action = new NxActionResubmitNodesNodeTableFlowApplyActionsCaseBuilder >> [
+                                            nxResubmit = new NxResubmitBuilder >> [
+                                                inPort = 65528
+                                                table = 220 as short
+                                            ]
+                                        ]
+                                        order = 2
+                                    ]
+                                ]
+                            ]
+                        ]
+                        order = 0
+                    ]
+                ]
+            ]
+            match = new MatchBuilder >> [
+                ethernetMatch = new EthernetMatchBuilder >> [
+                    ethernetDestination = new EthernetDestinationBuilder >> [
+                        address = new MacAddress(interfaceInfo.getMacAddress())
+                    ]
+                ]
+                metadata = new MetadataBuilder >> [
+                         metadata = ElanHelper.getElanMetadataLabel(elanInstance.getElanTag())
+                         metadataMask = MetaDataUtil.METADATA_MASK_SERVICE
+                ]
+            ]
+            priority = 20
+            tableId = 51 as short
         ]
     }
 }
+
diff --git a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/ElanEgressActionsHelper.java b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/ElanEgressActionsHelper.java
new file mode 100644 (file)
index 0000000..ce525ef
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright © 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.elanmanager.tests.utils;
+
+import static org.opendaylight.yangtools.testutils.mockito.MoreAnswers.realOrException;
+
+import java.util.List;
+import java.util.concurrent.Future;
+
+import org.mockito.Mockito;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.genius.infra.FutureRpcResults;
+import org.opendaylight.genius.interfacemanager.IfmUtil;
+import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEgressActionsForInterfaceInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEgressActionsForInterfaceOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.GetEgressActionsForInterfaceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public abstract class ElanEgressActionsHelper implements OdlInterfaceRpcService {
+    private static final Logger LOG = LoggerFactory.getLogger(ElanEgressActionsHelper.class);
+    private InterfaceManagerCommonUtils interfaceManagerCommonUtils;
+
+    public static ElanEgressActionsHelper newInstance(DataBroker dataBroker,
+                                                      InterfaceManagerCommonUtils interfaceManagerCommonUtils) {
+        ElanEgressActionsHelper instance = Mockito.mock(ElanEgressActionsHelper.class, realOrException());
+        instance.interfaceManagerCommonUtils = interfaceManagerCommonUtils;
+        return instance;
+    }
+
+    @Override
+    public Future<RpcResult<GetEgressActionsForInterfaceOutput>> getEgressActionsForInterface(
+            GetEgressActionsForInterfaceInput input) {
+        return FutureRpcResults.fromBuilder(LOG, input, () -> {
+            List<Action> actionsList = IfmUtil.getEgressActionsForInterface(input.getIntfName(), input.getTunnelKey(),
+                    input.getActionKey(), interfaceManagerCommonUtils, false);
+            return new GetEgressActionsForInterfaceOutputBuilder().setAction(actionsList);
+        }).build();
+    }
+}
diff --git a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/IdHelper.java b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/IdHelper.java
new file mode 100644 (file)
index 0000000..9b7d05d
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.netvirt.elanmanager.tests.utils;
+
+import static org.opendaylight.netvirt.elanmanager.tests.ElanServiceTestBase.ELAN1;
+
+import com.google.common.util.concurrent.Futures;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Future;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutputBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+public abstract class IdHelper implements
+        org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService {
+    static Map<String, Long> ids = new HashMap<>();
+
+    static {
+        ids.put(ELAN1, 5001L);
+    }
+
+    @Override
+    public Future<RpcResult<AllocateIdOutput>> allocateId(AllocateIdInput allocateIdInput) {
+        Long id = ids.get(allocateIdInput.getIdKey());
+        return Futures.immediateFuture(RpcResultBuilder.success(
+                new AllocateIdOutputBuilder().setIdValue(id).build()).build());
+    }
+}
diff --git a/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/InterfaceHelper.java b/vpnservice/elanmanager/elanmanager-impl/src/test/java/org/opendaylight/netvirt/elanmanager/tests/utils/InterfaceHelper.java
new file mode 100644 (file)
index 0000000..b042e68
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.elanmanager.tests.utils;
+
+import java.math.BigInteger;
+
+import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
+
+public final class InterfaceHelper {
+
+    private InterfaceHelper() {
+
+    }
+
+    public static InterfaceInfo buildVlanInterfaceInfo(final String interfaceName,
+                                                       final BigInteger dpId,
+                                                       final int portNo,
+                                                       final int lportTag,
+                                                       final String mac) {
+        return InterfaceHelper.buildInterfaceInfo(interfaceName, dpId, portNo, lportTag, mac,
+                InterfaceInfo.InterfaceType.VLAN_INTERFACE);
+    }
+
+    public static InterfaceInfo buildVxlanInterfaceInfo(final String interfaceName,
+                                                        final BigInteger dpId,
+                                                        final int portNo,
+                                                        final int lportTag,
+                                                        final String mac) {
+        return InterfaceHelper.buildInterfaceInfo(interfaceName, dpId, portNo, lportTag, mac,
+                InterfaceInfo.InterfaceType.VXLAN_TRUNK_INTERFACE);
+    }
+
+    public static InterfaceInfo buildInterfaceInfo(final String interfaceName,
+                                                   final BigInteger dpId,
+                                                   final int portNo,
+                                                   final int lportTag,
+                                                   final String mac,
+                                                   final InterfaceInfo.InterfaceType interfaceType) {
+        InterfaceInfo interfaceInfo = new InterfaceInfo(interfaceName);
+        interfaceInfo.setInterfaceName(interfaceName);
+        interfaceInfo.setDpId(dpId);
+        interfaceInfo.setPortNo(portNo);
+        interfaceInfo.setAdminState(InterfaceInfo.InterfaceAdminState.ENABLED);
+        interfaceInfo.setOpState(InterfaceInfo.InterfaceOpState.UP);
+        interfaceInfo.setInterfaceTag(lportTag);
+        interfaceInfo.setInterfaceType(interfaceType);
+        interfaceInfo.setGroupId(0);
+        interfaceInfo.setMacAddress(mac);
+        return interfaceInfo;
+    }
+}