+ coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + dpnInfo.getKey(), () -> {
+ WriteTransaction writeFlowInvTx = dataBroker.newWriteOnlyTransaction();
+ WriteTransaction removeFlowInvTx = dataBroker.newWriteOnlyTransaction();
+ LOG.debug("add : Router {} is associated with ext nw {}", routerUuid, networkId);
+ Uuid vpnName = NatUtil.getVpnForRouter(dataBroker, routerUuid);
+ Long routerId = NatUtil.getVpnId(dataBroker, routerUuid);
+ List<ListenableFuture<Void>> futures = new ArrayList<>();
+ if (routerId == NatConstants.INVALID_ID) {
+ LOG.error("add : Invalid routerId returned for routerName {}", routerUuid);
+ writeFlowInvTx.cancel();
+ removeFlowInvTx.cancel();
+ return futures;
+ }
+ extNetGroupInstaller.installExtNetGroupEntries(networkId, dpnId);
+ Long vpnId;
+ if (vpnName == null) {
+ LOG.debug("add : Internal vpn associated to router {}", routerUuid);
+ vpnId = routerId;
+ if (vpnId == NatConstants.INVALID_ID) {
+ LOG.error("add : Invalid vpnId returned for routerName {}", routerUuid);
+ writeFlowInvTx.cancel();
+ removeFlowInvTx.cancel();
+ return futures;
+ }
+ LOG.debug("add : Retrieved vpnId {} for router {}", vpnId, routerUuid);
+ //Install default entry in FIB to SNAT table
+ LOG.info("add : Installing default route in FIB on dpn {} for router {} with vpn {}",
+ dpnId, routerUuid, vpnId);
+ installDefaultNatRouteForRouterExternalSubnets(dpnId,
+ NatUtil.getExternalSubnetIdsFromExternalIps(router.getExternalIps()));
+ snatDefaultRouteProgrammer.installDefNATRouteInDPN(dpnId, vpnId, writeFlowInvTx);
+ } else {
+ LOG.debug("add : External BGP vpn associated to router {}", routerUuid);
+ vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
+ if (vpnId == NatConstants.INVALID_ID) {
+ LOG.error("add : Invalid vpnId returned for routerName {}", routerUuid);
+ writeFlowInvTx.cancel();
+ removeFlowInvTx.cancel();
+ return futures;
+ }
+
+ LOG.debug("add : Retrieved vpnId {} for router {}", vpnId, routerUuid);
+ //Install default entry in FIB to SNAT table
+ LOG.debug("add : Installing default route in FIB on dpn {} for routerId {} with "
+ + "vpnId {}...", dpnId, routerUuid, vpnId);
+ installDefaultNatRouteForRouterExternalSubnets(dpnId,
+ NatUtil.getExternalSubnetIdsFromExternalIps(router.getExternalIps()));
+ snatDefaultRouteProgrammer.installDefNATRouteInDPN(dpnId, vpnId, routerId, writeFlowInvTx);
+ }
+
+
+ if (router.isEnableSnat()) {
+ LOG.info("add : SNAT enabled for router {}", routerUuid);
+ ProviderTypes extNwProvType = NatEvpnUtil.getExtNwProvTypeFromRouterName(dataBroker,
+ routerUuid, networkId);
+ if (extNwProvType == null) {
+ LOG.error("add : External Network Provider Type missing");
+ writeFlowInvTx.cancel();
+ removeFlowInvTx.cancel();
+ return futures;
+ }
+ handleSNATForDPN(dpnId, routerUuid, routerId, vpnId, writeFlowInvTx, removeFlowInvTx,
+ extNwProvType);
+ } else {
+ LOG.info("add : SNAT is not enabled for router {} to handle addDPN event {}",
+ routerUuid, dpnId);
+ }
+ futures.add(NatUtil.waitForTransactionToComplete(writeFlowInvTx));
+ futures.add(NatUtil.waitForTransactionToComplete(removeFlowInvTx));
+ return futures;
+ }, NatConstants.NAT_DJC_MAX_RETRIES);
+ } // end of controller based SNAT