From 49a5bcd8f91f546eef0cc465a5692224f26b877c Mon Sep 17 00:00:00 2001 From: Anuradha Raju Date: Tue, 19 May 2015 13:39:53 +0530 Subject: [PATCH] Bug 3248: Fix for remoteNextHop 1. set OF portNo in makeRemoteFlow 2. Added JUnit tests for fib-manager Change-Id: Ifb2f5336e32abb1660d0b41d27e655e7c980c564 Signed-off-by: Anuradha Raju --- .../vpnservice/fibmanager/FibManager.java | 4 +- .../fibmanager/test/FibManagerTest.java | 158 ++++++++++++++++++ .../fibmanager/test/MockDataChangedEvent.java | 53 ++++++ .../vpnservice/nexthopmgr/NexthopManager.java | 2 +- 4 files changed, 214 insertions(+), 3 deletions(-) create mode 100644 fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/FibManagerTest.java create mode 100644 fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/MockDataChangedEvent.java diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java index 2ff2bd82..bfb69d63 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java @@ -408,7 +408,7 @@ public class FibManager extends AbstractDataChangeListener implements .append(destPrefix.getHostAddress()).toString(); } - private GetEgressPointerOutput resolveAdjacency(final long dpId, final long vpnId, + protected GetEgressPointerOutput resolveAdjacency(final long dpId, final long vpnId, final VrfEntry vrfEntry) { GetEgressPointerOutput adjacency = null; LOG.trace("resolveAdjacency called with dpid {}, vpnId{}, VrfEntry {}",dpId, vpnId, vrfEntry);; @@ -431,7 +431,7 @@ public class FibManager extends AbstractDataChangeListener implements return adjacency; } - private Long getVpnId(String rd) { + protected Long getVpnId(String rd) { Long vpnId = null; InstanceIdentifier id = InstanceIdentifier.create(VpnInstances.class); Optional vpnInstances = read(LogicalDatastoreType.OPERATIONAL, id); diff --git a/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/FibManagerTest.java b/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/FibManagerTest.java new file mode 100644 index 00000000..6af4c433 --- /dev/null +++ b/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/FibManagerTest.java @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2015 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.vpnservice.fibmanager.test; + +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.when; + +import com.google.common.base.Optional; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.vpnmanager.api.IVpnManager; +import org.opendaylight.vpnservice.fibmanager.FibManager; +import org.opendaylight.vpnservice.fibmanager.test.MockDataChangedEvent; +import org.opendaylight.vpnservice.mdsalutil.FlowEntity; +import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntryKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService; +import org.opendaylight.yangtools.concepts.ListenerRegistration; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.binding.RpcService; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; + +@RunWith(MockitoJUnitRunner.class) +public class FibManagerTest { + + @Mock + DataBroker dataBroker; + @Mock + ListenerRegistration dataChangeListenerRegistration; + @Mock + ReadOnlyTransaction mockReadTx; + @Mock + WriteTransaction mockWriteTx; + @Mock + L3nexthopService l3nexthopService; + @Mock + IMdsalApiManager mdsalManager; + @Mock + IVpnManager vpnmanager; + @Mock + GetEgressPointerOutput adjacency; + @Mock + VrfTablesKey vrfTableKey; + + MockDataChangedEvent dataChangeEvent; + FibManager fibmgr; + Long EgressPointer = 11L; + VrfEntry vrfEntry; + InstanceIdentifier identifier; + VrfEntryBuilder vrfbuilder; + String rd = "routeDis"; + String prefix = "0.1.2.3"; + String nexthop = "1.1.1.1"; + int label = 10; + List Dpns; + + private void SetupMocks() { + Dpns = new ArrayList(); + Dpns.add(100000L); + identifier = buildVrfEntryId(rd, prefix); + vrfEntry = buildVrfEntry(rd, prefix, nexthop, label); + fibmgr.setMdsalManager(mdsalManager); + fibmgr.setVpnmanager(vpnmanager); + when(adjacency.getEgressPointer()).thenReturn(EgressPointer); + when(adjacency.isLocalDestination()).thenReturn(true); + when(vrfTableKey.getRouteDistinguisher()).thenReturn(rd); + when(vpnmanager.getDpnsForVpn(any(Long.class))).thenReturn(Dpns); + } + + @Before + public void setUp() throws Exception { + when( + dataBroker.registerDataChangeListener(any(LogicalDatastoreType.class), + any(InstanceIdentifier.class), any(DataChangeListener.class), + any(DataChangeScope.class))).thenReturn(dataChangeListenerRegistration); + dataChangeEvent = new MockDataChangedEvent(); + vrfbuilder = new VrfEntryBuilder(); + fibmgr = new FibManager(dataBroker, l3nexthopService) { + protected GetEgressPointerOutput resolveAdjacency(final long dpId, final long vpnId, + final VrfEntry vrfEntry) { + return adjacency; + } + + protected Long getVpnId(String rd) { + return 101L; + } + }; + SetupMocks(); + } + + @Test + public void testAdd() { + dataChangeEvent.created.put(identifier, vrfEntry); + fibmgr.onDataChanged(dataChangeEvent); + Mockito.verify(mdsalManager, Mockito.times(2)).installFlow(any(FlowEntity.class)); + } + + private VrfEntry buildVrfEntry(String rd, String prefix, String nexthop, int label) { + return new VrfEntryBuilder().setDestPrefix(prefix).setNextHopAddress(nexthop) + .setLabel((long) label).build(); + } + + public static InstanceIdentifier buildVrfTableId(String rd) { + InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)); + InstanceIdentifier vrfTableId = idBuilder.build(); + return vrfTableId; + } + + public static InstanceIdentifier buildVrfEntryId(String rd, String prefix) { + InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)) + .child(VrfEntry.class, new VrfEntryKey(prefix)); + InstanceIdentifier vrfEntryId = idBuilder.build(); + return vrfEntryId; + } +} diff --git a/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/MockDataChangedEvent.java b/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/MockDataChangedEvent.java new file mode 100644 index 00000000..9fe9bf45 --- /dev/null +++ b/fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/MockDataChangedEvent.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2015 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.vpnservice.fibmanager.test; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +class MockDataChangedEvent implements AsyncDataChangeEvent, DataObject> { + Map,DataObject> created = new HashMap<>(); + Map,DataObject> updated = new HashMap<>(); + Map,DataObject> original = new HashMap<>(); + Set> removed = new HashSet<>(); + + @Override + public Map, DataObject> getCreatedData() { + return created; + } + + @Override + public Map, DataObject> getUpdatedData() { + return updated; + } + + @Override + public Set> getRemovedPaths() { + return removed; + } + + @Override + public Map, DataObject> getOriginalData() { + return original; + } + + @Override + public DataObject getOriginalSubtree() { + throw new UnsupportedOperationException("Not implemented by mock"); + } + + @Override + public DataObject getUpdatedSubtree() { + throw new UnsupportedOperationException("Not implemented by mock"); + } +} diff --git a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java index 5c0184eb..450f59c6 100644 --- a/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java +++ b/nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java @@ -226,7 +226,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable { List matches = new ArrayList(); List mkInstructions = new ArrayList(); if (NwConstants.ADD_FLOW == addOrRemoveFlow) { - interfaceManager.getPortForInterface(ifName); + portNo = interfaceManager.getPortForInterface(ifName); matches.add(new MatchInfo(MatchFieldType.in_port, new long[] { dpId, portNo })); mkInstructions.add(new InstructionInfo(InstructionType.goto_table, new long[] {LFIB_TABLE})); -- 2.36.6