+ private BigInteger getPrimaryNaptSwitch(String routerName, long segmentId) {
+ // Allocate Primary Napt Switch for this router
+ BigInteger primarySwitchId = NatUtil.getPrimaryNaptfromRouterName(dataBroker, routerName);
+ if (primarySwitchId != null && !primarySwitchId.equals(BigInteger.ZERO)) {
+ LOG.debug("NAT Service : Primary NAPT switch with DPN ID {} is already elected for router",primarySwitchId,routerName);
+ return primarySwitchId;
+ }
+
+ primarySwitchId = naptSwitchSelector.selectNewNAPTSwitch(routerName);
+ LOG.debug("NAT Service : Primary NAPT switch DPN ID {}", primarySwitchId);
+ if(primarySwitchId == null || primarySwitchId.equals(BigInteger.ZERO)){
+ LOG.error("NAT Service : Unable to to select the primary NAPT switch");
+ }
+
+ return primarySwitchId;
+ }
+
+ private void installNaptPfibExternalOutputFlow(Routers routers, BigInteger dpnId) {
+ Long extVpnId = NatUtil.getVpnId(dataBroker, routers.getNetworkId().getValue());
+ List<String> extIps = routers.getExternalIps();
+ installNaptPfibExternalOutputFlow(dpnId, extVpnId, extIps);
+ }
+
+ protected void installNaptPfibExternalOutputFlow(String routerName, Long routerId, BigInteger dpnId) {
+ Long extVpnId = NatUtil.getVpnId(dataBroker, routerId);
+ if (extVpnId == null || extVpnId == NatConstants.INVALID_ID) {
+ LOG.debug("installNaptPfibExternalOutputFlow - not found extVpnId for router {}", routerId);
+ extVpnId = routerId;
+ }
+ List<String> externalIps = NatUtil.getExternalIpsFromRouter(dataBroker, routerName);
+ installNaptPfibExternalOutputFlow(dpnId, extVpnId, externalIps);
+ }
+
+ private void installNaptPfibExternalOutputFlow(BigInteger dpnId, Long extVpnId, List<String> externalIps) {
+ if (externalIps == null || externalIps.isEmpty()) {
+ LOG.debug("installNaptPfibExternalOutputFlow - empty external Ips list for dpnId {} extVpnId {}",
+ dpnId, extVpnId);
+ return;
+ }
+ for (String ip : externalIps) {
+ Uuid subnetId = getSubnetIdForFixedIp(ip);
+ if (subnetId != null) {
+ LOG.debug("installNaptPfibExternalOutputFlow - dpnId {} extVpnId {} subnetId {} ip {}",
+ dpnId, extVpnId, subnetId, ip);
+ FlowEntity postNaptFlowEntity = buildNaptFibExternalOutputFlowEntity(dpnId, extVpnId, subnetId, ip);
+ mdsalManager.installFlow(postNaptFlowEntity);
+ }
+ }
+ }
+
+ private Uuid getSubnetIdForFixedIp(String ip) {
+ if (ip != null) {
+ IpAddress externalIpv4Address = new IpAddress(new Ipv4Address(ip));
+ Port port = NatUtil.getNeutronPortForRouterGetewayIp(dataBroker, externalIpv4Address);
+ Uuid subnetId = NatUtil.getSubnetIdForFloatingIp(port, externalIpv4Address);
+ return subnetId;
+ }
+ return null;
+ }
+
+ protected void subnetRegisterMapping(Routers routerEntry,Long segmentId) {