Multiple fix in different module 47/41747/3
authorSuraj Ranjan <suraj.ranjan@ericsson.com>
Wed, 13 Jul 2016 06:25:47 +0000 (11:55 +0530)
committerSuraj Ranjan <suraj.ranjan@ericsson.com>
Wed, 13 Jul 2016 09:43:03 +0000 (15:13 +0530)
This commit deals with following:

  - Modified VrfEntry yang model to support augmentation for elantag
  - Removed the rdtoElanOpData references from FibManager
  - Addressed review comments and removed rdToElanreferences
  - Fix for SubnetRoute handler

Change-Id: I6352315fb5cc05e802e71bf553e8b86f9eadc460
Signed-off-by: Suraj Ranjan <suraj.ranjan@ericsson.com>
vpnservice/fibmanager/fibmanager-api/src/main/yang/odl-fib.yang
vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManager.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java
vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java

index 7b2bf3209acdca9cac3b079b3ec2fc5298509a7c..7e5213a77b6ce59b7992de7695fce7adaa885952 100644 (file)
@@ -2,6 +2,8 @@ module odl-fib {
     namespace "urn:opendaylight:netvirt:fibmanager";
     prefix odl-fib;
 
+    import yang-ext {prefix ext; revision-date "2013-07-09";}
+
     revision "2015-03-30" {
         description "FIB Manager module";
     }
@@ -31,6 +33,11 @@ module odl-fib {
         }
     }
 
+    augment "/odl-fib:fibEntries/odl-fib:vrfTables/odl-fib:vrfEntry" {
+            ext:augment-identifier "subnetRoute";
+            leaf elantag {type uint32;}
+    }
+
     container fibEntries {
         config true;
         list vrfTables{
index fa73c921a30c7ac3ac9db2352d7a0815f95579aa..9fdec88be115c10e3dc0e0ab620d993828e9ec63 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.genius.mdsalutil.MatchInfo;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.SubnetRoute;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.PrefixToInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RdToElanOp;
@@ -177,6 +178,8 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
   @Override
   protected void update(InstanceIdentifier<VrfEntry> identifier, VrfEntry original, VrfEntry update) {
     LOG.trace("Update key: " + identifier + ", original=" + original + ", update=" + update );
+    if (original.getAugmentation(SubnetRoute.class) != null && update.getAugmentation(SubnetRoute.class) == null)
+        return;
     createFibEntries(identifier, update);
   }
 
@@ -193,12 +196,14 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
     Collection<VpnToDpnList> vpnToDpnList = vpnInstance.getVpnToDpnList();
     Long vpnId = vpnInstance.getVpnId();
     String rd = vrfTableKey.getRouteDistinguisher();
-    RdToElanOpEntry rdToElanOpEntry = getRdToElanOpEntry(broker, rd,
-            vrfEntry.getDestPrefix());
-    if (rdToElanOpEntry!=null) {
-        if (vpnToDpnList!=null) {
-            for (VpnToDpnList curDpn :  vpnToDpnList) {
-                installSubnetRouteInFib(curDpn.getDpnId(), rdToElanOpEntry, vpnId.longValue(), vrfEntry);
+    SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
+    if (subnetRoute != null) {
+        LOG.trace("SubnetRoute augmented vrfentry found for rd {} prefix {} with elantag {}",
+                rd, vrfEntry.getDestPrefix(), subnetRoute.getElantag());
+        long elanTag = subnetRoute.getElantag();
+        if (vpnToDpnList != null) {
+            for (VpnToDpnList curDpn : vpnToDpnList) {
+                installSubnetRouteInFib(curDpn.getDpnId(),elanTag, rd, vpnId.longValue(), vrfEntry);
             }
         }
         return;
@@ -215,15 +220,13 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
     }
   }
 
-  private void installSubnetRouteInFib(BigInteger dpnId, RdToElanOpEntry rdToElanOpEntry,
+  private void installSubnetRouteInFib(BigInteger dpnId, long elanTag, String rd,
                                        long vpnId, VrfEntry vrfEntry){
       List<InstructionInfo> instructions = new ArrayList<>();
-      Long elanTag = rdToElanOpEntry.getElanTag();
 
       instructions.add(new InstructionInfo(InstructionType.write_metadata,  new BigInteger[] { (BigInteger.valueOf(elanTag)).shiftLeft(24), MetaDataUtil.METADATA_MASK_SERVICE }));
       instructions.add(new InstructionInfo(InstructionType.goto_table, new long[] { NwConstants.L3_SUBNET_ROUTE_TABLE }));
-      makeConnectedRoute(dpnId,vpnId,vrfEntry,rdToElanOpEntry.getRd(),
-              instructions,NwConstants.ADD_FLOW);
+      makeConnectedRoute(dpnId,vpnId,vrfEntry,rd,instructions,NwConstants.ADD_FLOW);
 
       List<ActionInfo> actionsInfos = new ArrayList<>();
       // reinitialize instructions list for LFIB Table
@@ -239,19 +242,6 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
       // TODO makeTunnelTableEntry();
   }
 
-  private RdToElanOpEntry getRdToElanOpEntry(DataBroker broker, String rd, String subnetIp) {
-      InstanceIdentifier<RdToElanOpEntry> id = getRdToElanOpEntryDataPath(rd,subnetIp);
-      Optional<RdToElanOpEntry> sn = read(broker, LogicalDatastoreType.OPERATIONAL, id);
-      if(sn.isPresent()) {
-          return sn.get();
-      }
-      return null;
-  }
-
-  private InstanceIdentifier<RdToElanOpEntry> getRdToElanOpEntryDataPath(String rd, String subnetIp) {
-      return InstanceIdentifier.builder(RdToElanOp.class).child(RdToElanOpEntry.class,
-              new RdToElanOpEntryKey(rd,subnetIp)).build();
-  }
   private  <T extends DataObject> Optional<T> read(DataBroker broker, LogicalDatastoreType datastoreType,
                                                   InstanceIdentifier<T> path) {
 
@@ -606,24 +596,20 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
         return;
     }
     Collection<VpnToDpnList> vpnToDpnList = vpnInstance.getVpnToDpnList();
-    RdToElanOpEntry rdToElanOpEntry= getRdToElanOpEntry(broker,vrfTableKey.getRouteDistinguisher(),
-            vrfEntry.getDestPrefix());
-    if (rdToElanOpEntry != null) {
-        if (vpnToDpnList!=null) {
-            for(VpnToDpnList curDpn :  vpnToDpnList) {
-                makeConnectedRoute(curDpn.getDpnId(),vpnInstance.getVpnId(),vrfEntry,vrfTableKey
-                        .getRouteDistinguisher(), null,NwConstants.DEL_FLOW);
-                makeLFibTableEntry(curDpn.getDpnId(),vrfEntry.getLabel(),null,
-                        vrfEntry.getNextHopAddress(),NwConstants.DEL_FLOW);
-                // TODO DeleteTunnelTableEntry();
+    SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
+    if (subnetRoute != null) {
+        if (vpnToDpnList != null) {
+            for (VpnToDpnList curDpn : vpnToDpnList) {
+                makeConnectedRoute(curDpn.getDpnId(), vpnInstance.getVpnId(), vrfEntry, vrfTableKey
+                        .getRouteDistinguisher(), null, NwConstants.DEL_FLOW);
+                makeLFibTableEntry(curDpn.getDpnId(), vrfEntry.getLabel(), null,
+                        vrfEntry.getNextHopAddress(), NwConstants.DEL_FLOW);
             }
         }
-        //Delete rd-to-elan-op-entry
-        InstanceIdentifier<RdToElanOpEntry> id = getRdToElanOpEntryDataPath(vrfTableKey.getRouteDistinguisher(),
+        FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
+              FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
+        LOG.trace("deleteFibEntries: Released subnetroute label {} for rd {} prefix {}", vrfEntry.getLabel(), rd,
                 vrfEntry.getDestPrefix());
-        MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL,id);
-        FibUtil.releaseId(idManager,FibConstants.VPN_IDPOOL_NAME,
-                FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
         return;
     }
     BigInteger localDpnId = deleteLocalFibEntry(vpnInstance.getVpnId(),
@@ -767,12 +753,12 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
       Optional<VrfTables> vrfTable = FibUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
       if (vrfTable.isPresent()) {
         for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
-            RdToElanOpEntry rdToElanOpEntry = getRdToElanOpEntry(broker, rd,
-                    vrfEntry.getDestPrefix());
-            if (rdToElanOpEntry!= null) {
-                installSubnetRouteInFib(dpnId, rdToElanOpEntry, vpnId, vrfEntry);
-                continue;
-            }
+          SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
+          if (subnetRoute != null){
+              long elanTag= subnetRoute.getElantag();
+              installSubnetRouteInFib(dpnId, elanTag, rd, vpnId, vrfEntry);
+              continue;
+          }
           // Passing null as we don't know the dpn
           // to which prefix is attached at this point
           createRemoteFibEntry(null, dpnId, vpnId, vrfTable.get().getKey(), vrfEntry);
@@ -808,14 +794,17 @@ public class FibManager extends AbstractDataChangeListener<VrfEntry> implements
       if (vrfTable.isPresent()) {
         for (VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
                         /* Handle subnet routes here */
-            RdToElanOpEntry rdToElanOpEntry= getRdToElanOpEntry(broker, rd,
-                    vrfEntry.getDestPrefix());
-            if (rdToElanOpEntry != null) {
+            SubnetRoute subnetRoute = vrfEntry.getAugmentation(SubnetRoute.class);
+            if (subnetRoute != null){
                 LOG.trace("Cleaning subnetroute {} on dpn {} for vpn {} : cleanUpDpnForVpn", vrfEntry.getDestPrefix(),
                         dpnId, rd);
                 makeConnectedRoute(dpnId, vpnId, vrfEntry, rd, null, NwConstants.DEL_FLOW);
                 makeLFibTableEntry(dpnId, vrfEntry.getLabel(), null,
                         vrfEntry.getNextHopAddress(),NwConstants.DEL_FLOW);
+                FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME,
+                        FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix()));
+                LOG.trace("cleanUpDpnForVpn: Released subnetroute label {} for rd {} prefix {}", vrfEntry.getLabel(), rd,
+                        vrfEntry.getDestPrefix());
                 continue;
             }
           // Passing null as we don't know the dpn
index d371f462ed91603f6d9edb80eec3efbf167c71e3..0ae06e8e52476a4a042589cc3e0c9d1365f8b3af 100644 (file)
@@ -20,6 +20,8 @@ import org.opendaylight.controller.md.sal.binding.api.*;
 import org.opendaylight.genius.mdsalutil.*;
 import org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.SubnetRoute;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.SubnetRouteBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.NeutronRouterDpns;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
@@ -680,6 +682,28 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
     }
 
+    public synchronized void addSubnetRouteFibEntryToDS(String rd, String prefix,
+                                                        String nexthop, int label,long elantag) {
+
+        SubnetRoute route = new SubnetRouteBuilder().setElantag(elantag).build();
+
+        VrfEntry vrfEntry = new VrfEntryBuilder().setDestPrefix(prefix).
+                setNextHopAddress(nexthop).setLabel((long)label).addAugmentation(SubnetRoute.class,route).build();
+        LOG.debug("Created vrfEntry for {} nexthop {} label {} and elantag {}", prefix, nexthop, label, elantag);
+
+        List<VrfEntry> vrfEntryList = new ArrayList<VrfEntry>();
+        vrfEntryList.add(vrfEntry);
+
+        InstanceIdentifierBuilder<VrfTables> idBuilder =
+                InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
+        InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
+
+        VrfTables vrfTableNew = new VrfTablesBuilder().setRouteDistinguisher(rd).
+                setVrfEntry(vrfEntryList).build();
+
+        VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
+    }
+
     public synchronized void removeFibEntryFromDS(String rd, String prefix) {
 
         LOG.debug("Removing fib entry with destination prefix {} from vrf table for rd {}", prefix, rd);
index e7e384c6ff12e2e909821f9f8d19ba1b055de6b4..877b5200ea313c15600b0896b0b5d73f93985e17 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.port.op.data.PortOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.port.op.data.PortOpDataEntryKey;
@@ -167,8 +168,9 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                         Write the subnet route entry to the FIB.
                         And also advertise the subnet route entry via BGP.
                         */
-                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag);
-                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag);
+                        int label = getLabel(rd, subnetIp);
+                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
+                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
                         subOpBuilder.setRouteAdvState(TaskState.Done);
                     } catch (Exception ex) {
                         logger.error("onSubnetAddedToVpn: FIB rules and Advertising nhDpnId " + nhDpnId +
@@ -181,7 +183,8 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                         Write the subnet route entry to the FIB.
                         NOTE: Will not advertise to BGP as NextHopDPN is not available yet.
                         */
-                        addSubnetRouteToFib(rd, subnetIp, null, vpnName, elanTag);
+                        int label = getLabel(rd, subnetIp);
+                        addSubnetRouteToFib(rd, subnetIp, null, vpnName, elanTag, label);
                     } catch (Exception ex) {
                         logger.error("onSubnetAddedToVpn: FIB rules writing for subnet {} with exception {} " +
                                 subnetId.getValue(), ex);
@@ -268,8 +271,8 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 try {
                     //Withdraw the routes for all the interfaces on this subnet
                     //Remove subnet route entry from FIB
-                    withdrawSubnetRoutefromBgp(rd, subnetIp);
                     deleteSubnetRouteFromFib(rd, subnetIp);
+                    withdrawSubnetRoutefromBgp(rd, subnetIp);
                 } catch (Exception ex) {
                     logger.error("onSubnetAddedToVpn: Withdrawing routes from BGP for subnet " +
                             subnetId.getValue() + " failed {}" + ex);
@@ -373,8 +376,15 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     try {
                         // Write the Subnet Route Entry to FIB
                         // Advertise BGP Route here and set route_adv_state to DONE
-                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag);
-                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag);
+                        int label = 0;
+                        VrfEntry vrf = VpnUtil.getVrfEntry(broker, rd, subnetIp);
+                        if (vrf != null) {
+                            label = (vrf.getLabel()).intValue();
+                        } else {
+                            label = getLabel(rd, subnetIp);
+                        }
+                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
+                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
                         subOpBuilder.setRouteAdvState(TaskState.Done);
                     } catch (Exception ex) {
                         logger.error("onPortAddedToSubnet: Advertising NextHopDPN "+ nhDpnId +
@@ -455,9 +465,16 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                             try {
                                 // Best effort Withdrawal of route from BGP for this subnet
                                 // Advertise the new NexthopIP to BGP for this subnet
-                                withdrawSubnetRoutefromBgp(rd, subnetIp);
-                                addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag);
-                                advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag);
+                                //withdrawSubnetRoutefromBgp(rd, subnetIp);
+                                int label = 0;
+                                VrfEntry vrf = VpnUtil.getVrfEntry(broker, rd, subnetIp);
+                                if (vrf != null) {
+                                    label = (vrf.getLabel()).intValue();
+                                } else {
+                                    label = getLabel(rd, subnetIp);
+                                }
+                                addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
+                                advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
                                 subOpBuilder.setRouteAdvState(TaskState.Done);
                             } catch (Exception ex) {
                                 logger.error("onPortRemovedFromSubnet: Swapping Withdrawing NextHopDPN " + dpnId +
@@ -533,8 +550,15 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     try {
                         // Write the Subnet Route Entry to FIB
                         // Advertise BGP Route here and set route_adv_state to DONE
-                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag);
-                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag);
+                        int label = 0;
+                        VrfEntry vrf = VpnUtil.getVrfEntry(broker, rd, subnetIp);
+                        if (vrf != null) {
+                            label = (vrf.getLabel()).intValue();
+                        } else {
+                            label = getLabel(rd, subnetIp);
+                        }
+                        addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
+                        advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
                         subOpBuilder.setRouteAdvState(TaskState.Done);
                     } catch (Exception ex) {
                         logger.error("onInterfaceUp: Advertising NextHopDPN " + nhDpnId + " information for subnet " +
@@ -616,9 +640,16 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                             logger.debug("onInterfaceDown: Swapping the Designated DPN to " + nhDpnId + " for subnet " + subnetId.getValue());
                             try {
                                 // Best effort Withdrawal of route from BGP for this subnet
-                                withdrawSubnetRoutefromBgp(rd, subnetIp);
-                                addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag);
-                                advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag);
+                                //withdrawSubnetRoutefromBgp(rd, subnetIp);
+                                int label = 0;
+                                VrfEntry vrf = VpnUtil.getVrfEntry(broker, rd, subnetIp);
+                                if (vrf != null) {
+                                    label = (vrf.getLabel()).intValue();
+                                } else {
+                                    label = getLabel(rd, subnetIp);
+                                }
+                                addSubnetRouteToFib(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
+                                advertiseSubnetRouteToBgp(rd, subnetIp, nhDpnId, vpnName, elanTag, label);
                                 subOpBuilder.setRouteAdvState(TaskState.Done);
                             } catch (Exception ex) {
                                 logger.error("onInterfaceDown: Swapping Withdrawing NextHopDPN " + dpnId + " information for subnet " +
@@ -639,40 +670,8 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
         }
     }
 
-    private static void setRdToElanOpEntry(DataBroker broker,
-                                           String rd, String subnetIp, String nextHopIp, String vpnName,
-                                           Long elanTag) {
-        RdToElanOpEntryBuilder rdElanBuilder = null;
-        RdToElanOpEntry rdElan = null;
-
-        try {
-            InstanceIdentifier<RdToElanOpEntry> rdIdentifier = InstanceIdentifier.builder(RdToElanOp.class).
-                    child(RdToElanOpEntry.class, new RdToElanOpEntryKey(rd, subnetIp)).build();
-            Optional<RdToElanOpEntry> optionalRd = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, rdIdentifier);
-            if (!optionalRd.isPresent()) {
-                // Create PortOpDataEntry only if not present
-                rdElanBuilder = new RdToElanOpEntryBuilder().setKey(new RdToElanOpEntryKey(rd,subnetIp));
-                rdElanBuilder.setRd(rd).setSubnetIp(subnetIp).setNextHopIp(nextHopIp);
-                rdElanBuilder.setElanTag(elanTag);
-                rdElanBuilder.setVpnName(vpnName);
-                rdElan = rdElanBuilder.build();
-            } else {
-                rdElanBuilder = new RdToElanOpEntryBuilder(optionalRd.get());
-                rdElanBuilder.setRd(rd).setSubnetIp(subnetIp).setNextHopIp(nextHopIp);
-                rdElanBuilder.setElanTag(elanTag);
-                rdElanBuilder.setVpnName(vpnName);
-                rdElan = rdElanBuilder.build();
-            }
-            MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, rdIdentifier, rdElan);
-            logger.info("Creating RdToElan entry Rd {} SubnetIp {} NextHopIp {} Elan {} " ,rd, subnetIp, nextHopIp, elanTag);
-        } catch (Exception ex) {
-            logger.error("Exception when creating RdToElan entry {}" + ex);
-        } finally {
-        }
-    }
-
     private void addSubnetRouteToFib(String rd, String subnetIp, BigInteger nhDpnId, String vpnName,
-                                     Long elanTag) {
+                                     Long elanTag, int label) {
         Preconditions.checkNotNull(rd, "RouteDistinguisher cannot be null or empty!");
         Preconditions.checkNotNull(subnetIp, "SubnetRouteIp cannot be null or empty!");
         Preconditions.checkNotNull(vpnName, "vpnName cannot be null or empty!");
@@ -681,10 +680,14 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
         if (nhDpnId != null) {
             nexthopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, nhDpnId);
         }
+        vpnInterfaceManager.addSubnetRouteFibEntryToDS(rd, subnetIp, nexthopIp, label, elanTag);
+    }
+
+    private int getLabel(String rd, String subnetIp) {
         int label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                 VpnUtil.getNextHopLabelKey(rd, subnetIp));
-        setRdToElanOpEntry(broker, rd, subnetIp, nexthopIp, vpnName, elanTag);
-        vpnInterfaceManager.addFibEntryToDS(rd, subnetIp, nexthopIp, label);
+        logger.trace("Allocated subnetroute label {} for rd {} prefix {}", label, rd, subnetIp);
+        return label;
     }
 
     private void deleteSubnetRouteFromFib(String rd, String subnetIp) {
@@ -694,7 +697,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
     }
 
     private void advertiseSubnetRouteToBgp(String rd, String subnetIp, BigInteger nhDpnId, String vpnName,
-                                           Long elanTag) throws Exception {
+                                           Long elanTag, int label) throws Exception {
         Preconditions.checkNotNull(rd, "RouteDistinguisher cannot be null or empty!");
         Preconditions.checkNotNull(subnetIp, "SubnetRouteIp cannot be null or empty!");
         Preconditions.checkNotNull(elanTag, "elanTag cannot be null or empty!");
@@ -706,9 +709,6 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
             logger.error("createSubnetRouteInVpn: Unable to obtain endpointIp address for DPNId " + nhDpnId);
             throw new Exception("Unable to obtain endpointIp address for DPNId " + nhDpnId);
         }
-        int label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
-                VpnUtil.getNextHopLabelKey(rd, subnetIp));
-        setRdToElanOpEntry(broker, rd, subnetIp, nexthopIp, vpnName, elanTag);
         try {
             bgpManager.advertisePrefix(rd, subnetIp, nexthopIp, label);
         } catch (Exception e) {
index d871e7cf57c855c027daf9ca97a29a4b3e781eda..1b0cdaf8714f7d58679ed82c0a86e1d6f1bcc543 100644 (file)
@@ -37,6 +37,8 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.*;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
@@ -147,6 +149,24 @@ public class VpnUtil {
         return id;
     }
 
+    static VrfEntry getVrfEntry(DataBroker broker, String rd, String ipPrefix) {
+        InstanceIdentifier.InstanceIdentifierBuilder<VrfTables> idBuilder =
+                InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
+        InstanceIdentifier<VrfTables> id = idBuilder.build();
+
+        Optional<VrfTables> vrfTable = read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        if (vrfTable.isPresent()) {
+            InstanceIdentifier<VrfEntry> vrfEntryId =
+                    InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).
+                            child(VrfEntry.class, new VrfEntryKey(ipPrefix)).build();
+            Optional<VrfEntry> vrfEntry = read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+            if (vrfEntry.isPresent())  {
+                return ((VrfEntry)vrfEntry.get());
+            }
+        }
+        return null;
+    }
+
     static InstanceIdentifier<VpnInterfaces> getVpnInterfacesIdentifier() {
         return InstanceIdentifier.builder(VpnInterfaces.class).build();
     }
index ad0e91771f5d09031a4369e4da36f9f6a236a561..b2dc3f7354a08461c7c86fcad069fe71a64a9be9 100644 (file)
@@ -290,7 +290,7 @@ public class VpnSubnetRouteHandlerTest {
                 .setSubnetIp(subnetIp).setVpnName(interfaceName).setElanTag(elanTag).build();
         subnetOp = new SubnetOpDataEntryBuilder().setElanTag(elanTag).setNhDpnId(dpId).setSubnetCidr(subnetIp)
                 .setSubnetId(subnetId).setKey(new SubnetOpDataEntryKey(subnetId)).setVpnName(interfaceName)
-                .setVrfId(routeDistinguisher).setSubnetToDpn(subToDpn).setRouteAdvState(TaskState.Done).build();
+                .setVrfId(routeDistinguisher).setSubnetToDpn(subToDpn).setRouteAdvState(TaskState.Pending).build();
         vpnInstance = new VpnInstanceBuilder().setVpnId(elanTag).setVpnInstanceName(interfaceName).setVrfId
                 (interfaceName).setKey(new VpnInstanceKey(interfaceName)).build();
         subnetmap = new SubnetmapBuilder().setSubnetIp(subnetIp).setId(subnetId).setNetworkId(portId).setKey(new
@@ -367,7 +367,6 @@ public class VpnSubnetRouteHandlerTest {
 
         verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, dpnOpId, subnetToDpn, true);
         verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, portOpIdentifier, portOp, true);
-        verify(mockWriteTx).put(LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subnetOp, true);
 
 
     }