From: Karthikeyan Krishnan Date: Mon, 3 Sep 2018 13:36:11 +0000 (+0530) Subject: BGP-VPN Instance update with additional RD Support X-Git-Tag: release/fluorine-sr1~23 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=6fe983561739c2168c1cda94362227485faaa3c4;p=netvirt.git BGP-VPN Instance update with additional RD Support Issue: ====== For Extra route use cases, user can update the existing BGP-VPN instance with additional RDs which are required for extra/static routes. Currently RD list update is not getting updated in VPN Instance DS. As a result newly added RD is not getting advertised to BGP. Solution: ========== This fix is addressing the existing BGP-VPN instance is getting update with new RDs.Also if extra routes are used this newly added RD will advertise this VRF into external BGP Update. Note: Removing the existing RD is not supported by NeutronVPN Issue: NETVIRT-1416 Change-Id: Iedcdba88084934670c7ba7e8fcf66e0bd91f875b Signed-off-by: Karthikeyan Krishnan --- diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java index caafeb9b92..a8b6ec3379 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java @@ -157,8 +157,15 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase identifier, VpnInstance original, VpnInstance update) { - LOG.trace("VPN-UPDATE: update: VPN event key: {}, value: {}. Ignoring", identifier, update); + LOG.trace("VPN-UPDATE: update: VPN event key: {}, value: {}.", identifier, update); String vpnName = update.getVpnInstanceName(); + if ((original.getIpv4Family() != null && update.getIpv4Family() != null) + && original.getIpv4Family().getRouteDistinguisher().size() + != update.getIpv4Family().getRouteDistinguisher().size()) { + LOG.debug("VPN-UPDATE: VpnInstance:{} updated with new RDs: {} from old RDs: {}", vpnName, + update.getIpv4Family().getRouteDistinguisher(), original.getIpv4Family().getRouteDistinguisher()); + vpnUtil.updateVpnInstanceWithRdList(vpnName, update.getIpv4Family().getRouteDistinguisher()); + } vpnInterfaceManager.updateVpnInterfacesForUnProcessAdjancencies(vpnName); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java index aa447b67ea..bacf5a9e03 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnOpStatusListener.java @@ -204,7 +204,6 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase rds = update.getRd(); String primaryRd = update.getVrfId(); if (!VpnUtil.isBgpVpn(vpnName, primaryRd)) { return; @@ -241,6 +240,12 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase { + //RD update case get only updated RD list + List rds = update.getRd(); + if (original.getRd().size() != update.getRd().size()) { + List oldRds = original.getRd(); + rds.removeAll(oldRds); + } rds.parallelStream().forEach(rd -> { try { List importRTList = rd.equals(primaryRd) ? irtList : Collections.emptyList(); @@ -260,6 +265,17 @@ public class VpnOpStatusListener extends AsyncDataTreeChangeListenerBase updatedRdList) { + String primaryRd = getVpnRd(vpnName); + if (primaryRd == null) { + LOG.warn("updateVpnInstanceWithRdList: Unable to retrieve primary RD for the VPN {}. Skip to process " + + "the updated RD list {} ", vpnName, updatedRdList); + return; + } + jobCoordinator.enqueueJob("VPN-" + vpnName, () -> { + VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder(); + builder.setRd(updatedRdList); + return Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit( + OPERATIONAL, tx -> { + InstanceIdentifier id = InstanceIdentifier + .builder(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class, + new VpnInstanceOpDataEntryKey(primaryRd)).build(); + tx.merge(id, builder.build(), false); + LOG.debug("updateVpnInstanceWithRdList: Successfully updated the VPN {} with list of RDs {}", + vpnName, updatedRdList); + })); + }); + } }