From 2a3863aa673deb9e355266baadb612cada7c18ec Mon Sep 17 00:00:00 2001 From: Suraj Ranjan Date: Wed, 13 Jul 2016 11:55:47 +0530 Subject: [PATCH] Multiple fix in different module 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 --- .../fibmanager-api/src/main/yang/odl-fib.yang | 7 ++ .../netvirt/fibmanager/FibManager.java | 83 ++++++-------- .../vpnmanager/VpnInterfaceManager.java | 24 ++++ .../vpnmanager/VpnSubnetRouteHandler.java | 106 +++++++++--------- .../netvirt/vpnmanager/VpnUtil.java | 20 ++++ .../test/VpnSubnetRouteHandlerTest.java | 3 +- 6 files changed, 141 insertions(+), 102 deletions(-) diff --git a/vpnservice/fibmanager/fibmanager-api/src/main/yang/odl-fib.yang b/vpnservice/fibmanager/fibmanager-api/src/main/yang/odl-fib.yang index 7b2bf3209a..7e5213a77b 100644 --- a/vpnservice/fibmanager/fibmanager-api/src/main/yang/odl-fib.yang +++ b/vpnservice/fibmanager/fibmanager-api/src/main/yang/odl-fib.yang @@ -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{ diff --git a/vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManager.java b/vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManager.java index fa73c921a3..9fdec88be1 100644 --- a/vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManager.java +++ b/vpnservice/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManager.java @@ -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 implements @Override protected void update(InstanceIdentifier 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 implements Collection 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 implements } } - private void installSubnetRouteInFib(BigInteger dpnId, RdToElanOpEntry rdToElanOpEntry, + private void installSubnetRouteInFib(BigInteger dpnId, long elanTag, String rd, long vpnId, VrfEntry vrfEntry){ List 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 actionsInfos = new ArrayList<>(); // reinitialize instructions list for LFIB Table @@ -239,19 +242,6 @@ public class FibManager extends AbstractDataChangeListener implements // TODO makeTunnelTableEntry(); } - private RdToElanOpEntry getRdToElanOpEntry(DataBroker broker, String rd, String subnetIp) { - InstanceIdentifier id = getRdToElanOpEntryDataPath(rd,subnetIp); - Optional sn = read(broker, LogicalDatastoreType.OPERATIONAL, id); - if(sn.isPresent()) { - return sn.get(); - } - return null; - } - - private InstanceIdentifier getRdToElanOpEntryDataPath(String rd, String subnetIp) { - return InstanceIdentifier.builder(RdToElanOp.class).child(RdToElanOpEntry.class, - new RdToElanOpEntryKey(rd,subnetIp)).build(); - } private Optional read(DataBroker broker, LogicalDatastoreType datastoreType, InstanceIdentifier path) { @@ -606,24 +596,20 @@ public class FibManager extends AbstractDataChangeListener implements return; } Collection 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 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 implements Optional 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 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 diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java index d371f462ed..0ae06e8e52 100644 --- a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java +++ b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java @@ -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 vrfEntryList = new ArrayList(); + vrfEntryList.add(vrfEntry); + + InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)); + InstanceIdentifier 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); diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java index e7e384c6ff..877b5200ea 100644 --- a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java +++ b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java @@ -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 rdIdentifier = InstanceIdentifier.builder(RdToElanOp.class). - child(RdToElanOpEntry.class, new RdToElanOpEntryKey(rd, subnetIp)).build(); - Optional 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) { diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java index d871e7cf57..1b0cdaf871 100644 --- a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java +++ b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java @@ -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 idBuilder = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)); + InstanceIdentifier id = idBuilder.build(); + + Optional vrfTable = read(broker, LogicalDatastoreType.CONFIGURATION, id); + if (vrfTable.isPresent()) { + InstanceIdentifier vrfEntryId = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)). + child(VrfEntry.class, new VrfEntryKey(ipPrefix)).build(); + Optional vrfEntry = read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId); + if (vrfEntry.isPresent()) { + return ((VrfEntry)vrfEntry.get()); + } + } + return null; + } + static InstanceIdentifier getVpnInterfacesIdentifier() { return InstanceIdentifier.builder(VpnInterfaces.class).build(); } diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java b/vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java index ad0e91771f..b2dc3f7354 100644 --- a/vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java +++ b/vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java @@ -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); } -- 2.36.6