Bug 8953 - IllegalArgumentException: vrfEntry is missing mandatory 86/62186/5
authoreupakir <kiran.n.upadhyaya@ericsson.com>
Wed, 23 Aug 2017 08:20:05 +0000 (13:50 +0530)
committereupakir <kiran.n.upadhyaya@ericsson.com>
Wed, 30 Aug 2017 13:54:11 +0000 (19:24 +0530)
descendant origin

The PNF deletion use cases were missing a few fixes in VPN and FIB
Engines.
1) Even though FIB was created using the external subnetId as the rd, the
external network id was being used to delete the FIB entries.
2) There was a fix in the PNF FIB add cycle to get vpn operational data
using the external network id instead of external subnet id. This was
missing in the deletion cycle.

Change-Id: Ida3125bf45beed1470ab699241988bd56a791a80
Signed-off-by: eupakir <kiran.n.upadhyaya@ericsson.com>
Signed-off-by: Vivekanandan Narasimhan <n.vivekanandan@ericsson.com>
vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java

index 4e65bd9e2a281335555fd3fe93a52e43107aa41c..f26517fad3eef1b54183f58af3ba39ec0e79a2a7 100755 (executable)
@@ -325,9 +325,12 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         final Collection<VpnToDpnList> vpnToDpnList;
         if (vrfEntry.getParentVpnRd() != null
                 && FibHelper.isControllerManagedNonSelfImportedRoute(RouteOrigin.value(vrfEntry.getOrigin()))) {
+            // This block MUST BE HIT only for PNF (Physical Network Function) FIB Entries.
             VpnInstanceOpDataEntry parentVpnInstance = FibUtil.getVpnInstance(dataBroker, vrfEntry.getParentVpnRd());
             vpnToDpnList = parentVpnInstance != null ? parentVpnInstance.getVpnToDpnList() :
                 vpnInstance.getVpnToDpnList();
+            LOG.info("createFibEntries: Processing creation of PNF FIB entry with rd {} prefix {}",
+                    vrfEntry.getParentVpnRd(), vrfEntry.getDestPrefix());
         } else {
             vpnToDpnList = vpnInstance.getVpnToDpnList();
         }
@@ -767,8 +770,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             long localGroupId;
             final BigInteger dpnId = localNextHopInfo.getDpnId();
             if (Boolean.TRUE.equals(localNextHopInfo.isNatPrefix())) {
-                LOG.debug("NAT Prefix {} with vpnId {} rd {}. Skip local dpn {} FIB processing",
-                        vrfEntry.getDestPrefix(), vpnId, rd, dpnId);
+                LOG.debug("checkCreateLocalFibEntry: NAT Prefix {} with vpnId {} rd {}. Skip local dpn {}"
+                        + " FIB processing", vrfEntry.getDestPrefix(), vpnId, rd, dpnId);
                 return dpnId;
             }
             String jobKey = FibUtil.getCreateLocalNextHopJobKey(vpnId, dpnId, vrfEntry.getDestPrefix());
@@ -1037,6 +1040,11 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                                 boolean isExtraroute, final Long parentVpnId) {
         if (localNextHopInfo != null) {
             final BigInteger dpnId = localNextHopInfo.getDpnId();
+            if (Boolean.TRUE.equals(localNextHopInfo.isNatPrefix())) {
+                LOG.debug("checkDeleteLocalFibEntry: NAT Prefix {} with vpnId {} rd {}. Skip local dpn {}"
+                        + " FIB processing", vrfEntry.getDestPrefix(), vpnId, rd, dpnId);
+                return dpnId;
+            }
             DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
             dataStoreCoordinator.enqueueJob(FibUtil.getCreateLocalNextHopJobKey(vpnId, dpnId,
                     vrfEntry.getDestPrefix()), () -> {
@@ -1314,7 +1322,18 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             LOG.error("VPN Instance for rd {} is not available from VPN Op Instance Datastore", rd);
             return;
         }
-        final Collection<VpnToDpnList> vpnToDpnList = vpnInstance.getVpnToDpnList();
+        final Collection<VpnToDpnList> vpnToDpnList;
+        if (vrfEntry.getParentVpnRd() != null
+                && FibHelper.isControllerManagedNonSelfImportedRoute(RouteOrigin.value(vrfEntry.getOrigin()))) {
+            // This block MUST BE HIT only for PNF (Physical Network Function) FIB Entries.
+            VpnInstanceOpDataEntry parentVpnInstance = FibUtil.getVpnInstance(dataBroker, vrfEntry.getParentVpnRd());
+            vpnToDpnList = parentVpnInstance != null ? parentVpnInstance.getVpnToDpnList() :
+                    vpnInstance.getVpnToDpnList();
+            LOG.info("deleteFibEntries: Processing deletion of PNF FIB entry with rd {} prefix {}",
+                    vrfEntry.getParentVpnRd(), vrfEntry.getDestPrefix());
+        } else {
+            vpnToDpnList = vpnInstance.getVpnToDpnList();
+        }
         long elanTag = 0L;
         SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
         final java.util.Optional<Long> optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry);
index 3e0ab21d8da10c1a599c98f9880c27a039ee2f54..d78cf40892a8f7ac6fcec4acee420cc0a305a591 100755 (executable)
@@ -1323,6 +1323,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                             }
                         }
                     } else {
+                        primaryRd = nextHop.isPhysNetworkFunc() ? nextHop.getSubnetId().getValue() : primaryRd;
                         fibManager.removeFibEntry(dataBroker, primaryRd, nextHop.getIpAddress(), writeConfigTxn);
                     }
 
@@ -1807,6 +1808,11 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                     deleteExtraRouteFromCurrentAndImportingVpns(currVpnIntf.getVpnInstanceName(),
                                             adj.getIpAddress(), nh, rd, currVpnIntf.getName(), writeConfigTxn);
                                 }
+                            } else if (adj.isPhysNetworkFunc()) {
+                                LOG.info("delAdjFromVpnInterface: deleting PNF adjacency prefix {} subnet [}",
+                                        adj.getIpAddress(), adj.getSubnetId());
+                                fibManager.removeFibEntry(dataBroker, adj.getSubnetId().getValue(), adj.getIpAddress(),
+                                        writeConfigTxn);
                             }
                             break;
                         }