<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>
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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
+
+@Singleton
public class EvpnUtils {
private static final Logger LOG = LoggerFactory.getLogger(EvpnUtils.class);
private volatile IBgpManager bgpManager;
private volatile IVpnManager vpnManager;
+ @Inject
public EvpnUtils(DataBroker broker, IInterfaceManager interfaceManager,
ElanUtils elanUtils, ItmRpcService itmRpcService) {
this.broker = broker;
}
@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);
}
public final Boolean isOpenStackVniSemanticsEnforced() {
- return elanConfig.isOpenstackVniSemanticsEnforced();
+ return elanConfig.isOpenstackVniSemanticsEnforced() != null
+ ? elanConfig.isOpenstackVniSemanticsEnforced() : false;
}
public static void addElanInstanceIntoCache(String elanInstanceName, ElanInstance elanInstance) {
/*
- * 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,
*/
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
// 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;
+ });
+ }
}
--- /dev/null
+/*
+ * 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);
+ }
+ }
+}
*/
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;
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,
@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());
// 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);
}
}
/*
- * 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,
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.
*/
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 = #[
]
}
- 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
]
}
}
+
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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());
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+}