From b989ead4bbfaecfa768355ec1343a6528bfb6529 Mon Sep 17 00:00:00 2001 From: vasudha_yenuganti Date: Wed, 10 Jul 2019 17:41:55 +0530 Subject: [PATCH] Fix for cluster reboot This fix makes sure that after cluster reboot, the vpnInstanceOpData comes up correctly for a vpn. Primarily, the focus of this fix is to not have importing VPNs create issues in building assets for exporting VPNs. Change-Id: I0e321904e067117d077fba4284420274c051f1a5 Signed-off-by: vasudha_yenuganti --- .../vpnmanager/VpnInstanceListener.java | 5 ++- .../vpnmanager/VpnInterfaceManager.java | 19 ++++++--- .../netvirt/vpnmanager/VpnUtil.java | 39 ++++++++++++++----- 3 files changed, 45 insertions(+), 18 deletions(-) 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 38ebd0326f..753610386d 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 @@ -215,8 +215,9 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase { ListenableFuture future = txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, operTx -> addVpnInstance(vpnInstance, confTx, operTx)); - ListenableFutures.addErrorLogging(future, LOG, "{} call: error creating VPN {}", LOGGING_PREFIX_ADD, - vpnInstance.getVpnInstanceName()); + ListenableFutures.addErrorLogging(future, LOG, "{} call: error creating VPN {} rd {}", + LOGGING_PREFIX_ADD, vpnInstance.getVpnInstanceName(), + vpnInstance.getIpv4Family().getRouteDistinguisher()); futures.add(future); })); Futures.addCallback(Futures.allAsList(futures), diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java index 6c4f6e45cd..0c7722063e 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java @@ -1144,17 +1144,24 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase getVpnsExportingMyRoute(final String vpnName) { List vpnsToExportRoute = new ArrayList<>(); - + final VpnInstanceOpDataEntry vpnInstanceOpDataEntry; String vpnRd = vpnUtil.getVpnRd(vpnName); - final VpnInstanceOpDataEntry vpnInstanceOpDataEntry = vpnUtil.getVpnInstanceOpData(vpnRd); - if (vpnInstanceOpDataEntry == null) { - LOG.debug("getVpnsExportingMyRoute: Could not retrieve vpn instance op data for {}" - + " to check for vpns exporting the routes", vpnName); + try { + VpnInstanceOpDataEntry opDataEntry = vpnUtil.getVpnInstanceOpData(vpnRd); + if (opDataEntry == null) { + LOG.error("getVpnsExportingMyRoute: Null vpn instance op data for vpn {} rd {}" + + " when check for vpns exporting the routes", vpnName, vpnRd); + return vpnsToExportRoute; + } + vpnInstanceOpDataEntry = opDataEntry; + } catch (Exception re) { + LOG.error("getVpnsExportingMyRoute: DSexception when retrieving vpn instance op data for vpn {} rd {}" + + " to check for vpns exporting the routes", vpnName, vpnRd, re); return vpnsToExportRoute; } - Predicate excludeVpn = input -> { if (input.getVpnInstanceName() == null) { LOG.error("getVpnsExportingMyRoute.excludeVpn: Received vpn instance with rd {} without a name", diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java index d233511a3a..ed3f6ca2fc 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java @@ -437,13 +437,19 @@ public final class VpnUtil { } @NonNull + @SuppressWarnings("checkstyle:IllegalCatch") List getAllVpnInstanceOpData() { - InstanceIdentifier id = InstanceIdentifier.builder(VpnInstanceOpData.class).build(); - Optional vpnInstanceOpDataOptional = read(LogicalDatastoreType.OPERATIONAL, id); - return - vpnInstanceOpDataOptional.isPresent() && vpnInstanceOpDataOptional.get().getVpnInstanceOpDataEntry() != null - ? vpnInstanceOpDataOptional.get().getVpnInstanceOpDataEntry() - : emptyList(); + try { + InstanceIdentifier id = InstanceIdentifier.builder(VpnInstanceOpData.class).build(); + Optional vpnInstanceOpDataOptional = read(LogicalDatastoreType.OPERATIONAL, id); + return + vpnInstanceOpDataOptional.isPresent() && vpnInstanceOpDataOptional.get() + .getVpnInstanceOpDataEntry() != null ? vpnInstanceOpDataOptional.get() + .getVpnInstanceOpDataEntry() : emptyList(); + } catch (Exception e) { + LOG.error("getAllVpnInstanceOpData: Could not retrieve all vpn instance op data subtree...", e); + return emptyList(); + } } @NonNull @@ -1757,17 +1763,30 @@ public final class VpnUtil { return isVpnPendingDelete; } + @SuppressWarnings("checkstyle:IllegalCatch") public List getVpnsImportingMyRoute(final String vpnName) { List vpnsToImportRoute = new ArrayList<>(); + final VpnInstanceOpDataEntry vpnInstanceOpDataEntry; final String vpnRd = getVpnRd(vpnName); if (vpnRd == null) { LOG.error("getVpnsImportingMyRoute: vpn {} not present in config DS.", vpnName); return vpnsToImportRoute; } - final VpnInstanceOpDataEntry vpnInstanceOpDataEntry = getVpnInstanceOpData(vpnRd); - if (vpnInstanceOpDataEntry == null) { - LOG.error("getVpnsImportingMyRoute: Could not retrieve vpn instance op data for {}" - + " to check for vpns importing the routes", vpnName); + if (vpnRd.equals(vpnName)) { + LOG.error("getVpnsImportingMyRoute: Internal vpn {} do not export/import routes", vpnName); + return vpnsToImportRoute; + } + try { + final VpnInstanceOpDataEntry opDataEntry = getVpnInstanceOpData(vpnRd); + if (opDataEntry == null) { + LOG.error("getVpnsImportingMyRoute: Could not retrieve vpn instance op data for vpn {} rd {}" + + " to check for vpns importing the routes", vpnName, vpnRd); + return vpnsToImportRoute; + } + vpnInstanceOpDataEntry = opDataEntry; + } catch (Exception e) { + LOG.error("getVpnsImportingMyRoute: DSException when retrieving vpn instance op data for vpn {} rd {}" + + " to check for vpns importing the routes", vpnName, vpnRd); return vpnsToImportRoute; } Predicate excludeVpn = input -> { -- 2.36.6