Bug 3248: Fix for remoteNextHop 99/20699/2
authorAnuradha Raju <anuradha.raju@ericsson.com>
Tue, 19 May 2015 08:09:53 +0000 (13:39 +0530)
committerAnuradha Raju <anuradha.raju@ericsson.com>
Tue, 19 May 2015 08:30:24 +0000 (14:00 +0530)
1. set OF portNo in makeRemoteFlow
2. Added JUnit tests for fib-manager

Change-Id: Ifb2f5336e32abb1660d0b41d27e655e7c980c564
Signed-off-by: Anuradha Raju <anuradha.raju@ericsson.com>
fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java
fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/FibManagerTest.java [new file with mode: 0644]
fibmanager/fibmanager-impl/src/test/java/org/opendaylight/vpnservice/fibmanager/test/MockDataChangedEvent.java [new file with mode: 0644]
nexthopmgr/nexthopmgr-impl/src/main/java/org/opendaylight/vpnservice/nexthopmgr/NexthopManager.java

index 2ff2bd8233d5ab8b43a46edfdd8e6dcd573186e5..bfb69d6306e9f8c7621d0295cdc078b5f8454c4a 100644 (file)
@@ -408,7 +408,7 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> 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<VrfEntry> implements
     return adjacency;
   }
 
-  private Long getVpnId(String rd) {
+  protected Long getVpnId(String rd) {
     Long vpnId = null;
     InstanceIdentifier<VpnInstances> id = InstanceIdentifier.create(VpnInstances.class);
     Optional<VpnInstances> 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 (file)
index 0000000..6af4c43
--- /dev/null
@@ -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<DataChangeListener> 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<VrfEntry> identifier;
+  VrfEntryBuilder vrfbuilder;
+  String rd = "routeDis";
+  String prefix = "0.1.2.3";
+  String nexthop = "1.1.1.1";
+  int label = 10;
+  List<Long> Dpns;
+
+  private void SetupMocks() {
+    Dpns = new ArrayList<Long>();
+    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<VrfTables> buildVrfTableId(String rd) {
+    InstanceIdentifierBuilder<VrfTables> idBuilder =
+        InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
+    InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
+    return vrfTableId;
+  }
+
+  public static InstanceIdentifier<VrfEntry> buildVrfEntryId(String rd, String prefix) {
+    InstanceIdentifierBuilder<VrfEntry> idBuilder =
+        InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd))
+            .child(VrfEntry.class, new VrfEntryKey(prefix));
+    InstanceIdentifier<VrfEntry> 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 (file)
index 0000000..9fe9bf4
--- /dev/null
@@ -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<InstanceIdentifier<?>, DataObject> {
+  Map<InstanceIdentifier<?>,DataObject> created = new HashMap<>();
+  Map<InstanceIdentifier<?>,DataObject> updated = new HashMap<>();
+  Map<InstanceIdentifier<?>,DataObject> original = new HashMap<>();
+  Set<InstanceIdentifier<?>> removed = new HashSet<>();
+
+  @Override
+  public Map<InstanceIdentifier<?>, DataObject> getCreatedData() {
+      return created;
+  }
+
+  @Override
+  public Map<InstanceIdentifier<?>, DataObject> getUpdatedData() {
+      return updated;
+  }
+
+  @Override
+  public Set<InstanceIdentifier<?>> getRemovedPaths() {
+      return removed;
+  }
+
+  @Override
+  public Map<InstanceIdentifier<?>, 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");
+  }
+}
index 5c0184eba734fc3ab6e19738b04c5f0629e3cb1b..450f59c6fd3d049ccc3049a3c82866735b53dad2 100644 (file)
@@ -226,7 +226,7 @@ public class NexthopManager implements L3nexthopService, AutoCloseable {
         List<MatchInfo> matches = new ArrayList<MatchInfo>();
         List<InstructionInfo> mkInstructions = new ArrayList<InstructionInfo>();
         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}));