X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=natservice%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fnatservice%2Finternal%2FExternalRoutersListener.java;h=1aaac13b3f0c0b9742e4e29c13af83503881d1eb;hb=c5feb74a4580de68ded46d381a2c91fff87a91df;hp=46755841fd90bc6f4c119e79c5b0680be2baee73;hpb=4b9b5cf1cc8a44c347af60fd24082b9f16d5d1d5;p=netvirt.git diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java index 46755841fd..1aaac13b3f 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java @@ -13,8 +13,10 @@ import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import com.google.common.base.Optional; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.JdkFutureAdapters; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; + import java.math.BigInteger; import java.net.Inet6Address; import java.net.InetAddress; @@ -1013,6 +1015,24 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase externalSubnetList = NatUtil.getExternalSubnetIdsFromExternalIps(router.getExternalIps()); + // FLAT/VLAN case having external-subnet as VPN + String externalSubnetVpn = null; + if (externalSubnetList != null && !externalSubnetList.isEmpty()) { + for (Uuid externalSubnetId : externalSubnetList) { + Optional externalSubnet = NatUtil + .getOptionalExternalSubnets(dataBroker, externalSubnetId); + // externalSubnet data model will exist for FLAT/VLAN external netowrk UCs. + if (externalSubnet.isPresent()) { + externalSubnetVpn = externalSubnetId.getValue(); + advToBgpAndInstallFibAndTsFlows(dpnId, NwConstants.INBOUND_NAPT_TABLE, + externalSubnetVpn, routerId, routerName, + externalIp, networkId, router, confTx); + } + } + return; + } + // VXVLAN/GRE case having Internet-VPN final String vpnName = NatUtil.getAssociatedVPN(dataBroker, networkId); if (vpnName == null) { LOG.error("handleSnatReverseTraffic : No VPN associated with ext nw {} to handle add external ip " @@ -2333,6 +2353,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase> future = fibService.removeFibEntry(input); removeTunnelTableEntry(dpnId, label, removeFlowInvTx); @@ -2362,11 +2393,20 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase> labelFuture = Futures.transformAsync(future, result -> { //Release label - if (result.isSuccessful()) { + if (result.isSuccessful() && label != null && label.toJava() > 0) { NatUtil.removePreDnatToSnatTableEntry(removeFlowInvTx, mdsalManager, dpnId); RemoveVpnLabelInput labelInput = new RemoveVpnLabelInputBuilder() .setVpnName(externalVpn).setIpPrefix(externalIp).build(); - return vpnService.removeVpnLabel(labelInput); + Future> labelFuture1 = vpnService.removeVpnLabel(labelInput); + if (labelFuture1.get() == null || !labelFuture1.get().isSuccessful()) { + String errMsg = String.format( + "ExternalRoutersListener: RPC call to remove VPN label " + + "on dpn %s for prefix %s failed for vpn %s - %s", + dpnId, externalIp, result.getErrors()); + LOG.error(errMsg); + return Futures.immediateFailedFuture(new RuntimeException(errMsg)); + } + return JdkFutureAdapters.listenInPoolThread(labelFuture1); } else { String errMsg = String.format("RPC call to remove custom FIB entries on dpn %s for " @@ -2470,7 +2510,17 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase> labelFuture1 = vpnService + .removeVpnLabel(labelInput); + if (labelFuture1.get() == null || !labelFuture1.get().isSuccessful()) { + String errMsg = String.format( + "RPC call to remove VPN label on dpn %s for prefix %s " + + "failed for vpn %s - %s", dpnId, externalIp, vpnName, + result.getErrors()); + LOG.error(errMsg); + return Futures.immediateFailedFuture(new RuntimeException(errMsg)); + } + return JdkFutureAdapters.listenInPoolThread(labelFuture1); } else { String errMsg = String.format("RPC call to remove custom FIB entries on dpn %s for " @@ -2546,6 +2596,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase