Migrate NAT to genius/vniutils
[netvirt.git] / natservice / impl / src / main / java / org / opendaylight / netvirt / natservice / internal / NatTunnelInterfaceStateListener.java
index 915eaa095059700f7fdbec7f461188da53b226ae..5bb6675fea6b7ecce23693057f64523cb1e4db91 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
@@ -19,6 +20,7 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
@@ -104,6 +106,7 @@ public class NatTunnelInterfaceStateListener
     private final FibRpcService fibRpcService;
     private final IElanService elanManager;
     private final IInterfaceManager interfaceManager;
+    private final NatOverVxlanUtil natOverVxlanUtil;
     private final NatMode natMode;
 
     protected enum TunnelAction {
@@ -130,6 +133,7 @@ public class NatTunnelInterfaceStateListener
      * @param config                 - Nat Service Config
      * @param elanManager            - Elan Manager
      * @param interfaceManager       - Interface Manager
+     * @param natOverVxlanUtils      - Nat Over Vxlan Utility
      */
     @Inject
     public NatTunnelInterfaceStateListener(final DataBroker dataBroker,
@@ -146,7 +150,8 @@ public class NatTunnelInterfaceStateListener
                                            final FibRpcService fibRpcService,
                                            final NatserviceConfig config,
                                            final IElanService elanManager,
-                                           final IInterfaceManager interfaceManager) {
+                                           final IInterfaceManager interfaceManager,
+                                           final NatOverVxlanUtil natOverVxlanUtils) {
         super(StateTunnelList.class, NatTunnelInterfaceStateListener.class);
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
@@ -163,6 +168,7 @@ public class NatTunnelInterfaceStateListener
         this.fibRpcService = fibRpcService;
         this.elanManager = elanManager;
         this.interfaceManager = interfaceManager;
+        this.natOverVxlanUtil = natOverVxlanUtils;
         if (config != null) {
             this.natMode = config.getNatMode();
         } else {
@@ -443,7 +449,6 @@ public class NatTunnelInterfaceStateListener
         } catch (Exception e) {
                 /* this dpn does not have the VTEP */
             LOG.error("handleTepDelForAllRtrs : DPN {} does not have the VTEP", srcDpnId);
-            endpointIpForDPN = null;
         }
 
         if (endpointIpForDPN != null) {
@@ -529,8 +534,13 @@ public class NatTunnelInterfaceStateListener
             return;
         }
         if (natMode == NatMode.Conntrack) {
-            natServiceManager.notify(writeFlowInvTx, routerData.get(), naptId, srcDpnId,
-                    SnatServiceManager.Action.SNAT_ROUTER_ENBL);
+            Routers extRouter = routerData.get();
+            natServiceManager.notify(writeFlowInvTx, extRouter, null, naptId, srcDpnId,
+                    SnatServiceManager.Action.CNT_ROUTER_ALL_SWITCH_ENBL);
+            if (extRouter.isEnableSnat()) {
+                natServiceManager.notify(writeFlowInvTx, extRouter, null, naptId, srcDpnId,
+                        SnatServiceManager.Action.SNAT_ROUTER_ENBL);
+            }
         } else {
             Uuid bgpVpnUuId = NatUtil.getVpnForRouter(dataBroker, routerName);
             //Check if the DPN having the router is the NAPT switch
@@ -658,7 +668,7 @@ public class NatTunnelInterfaceStateListener
         } else {
             LOG.debug("hndlTepAddOnNaptSwitch : SNAT -> Private BGP VPN associated to router {}", routerId);
             vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
-            if (vpnId == null || vpnId == NatConstants.INVALID_ID) {
+            if (vpnId == NatConstants.INVALID_ID) {
                 LOG.error("hndlTepAddOnNaptSwitch : Invalid vpnId returned for routerName {}", routerName);
                 return false;
             }
@@ -718,7 +728,7 @@ public class NatTunnelInterfaceStateListener
                 LOG.debug("hndlTepAddOnNaptSwitch : L3VNI value is not configured in Internet VPN {} and RD {} "
                         + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
                         + "NAT flows", vpnName, rd);
-                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, routerId).longValue();
+                l3Vni = natOverVxlanUtil.getInternetVpnVni(externalVpnName, routerId).longValue();
             }
         }
 
@@ -745,11 +755,10 @@ public class NatTunnelInterfaceStateListener
                         + "having nextHopIp {}", externalIp, nextHopIp);
                 long l3vni = 0;
                 if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
-                    l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, l3vni).longValue();
+                    l3vni = natOverVxlanUtil.getInternetVpnVni(externalVpnName, l3vni).longValue();
                 }
-                Uuid externalSubnetId = NatUtil.getExternalSubnetForRouterExternalIp(externalIp, router);
-                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd, externalSubnetId,
-                        fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
+                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd,
+                    fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
                         RouteOrigin.STATIC, srcDpnId);
                 serviceId = label;
             }
@@ -846,11 +855,10 @@ public class NatTunnelInterfaceStateListener
                 LOG.debug("hndlTepAddForDnatInEachRtr : L3VNI value is not configured in Internet VPN {} and RD {} "
                         + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
                         + "NAT flows", vpnName, rd);
-                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+                l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId).longValue();
             }
         }
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
             //Get the DPN on which this interface resides
             final String interfaceName = port.getPortName();
             final BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
@@ -865,8 +873,8 @@ public class NatTunnelInterfaceStateListener
                     tepAddedDpnId, fipCfgdDpnId, interfaceName);
                 continue;
             }
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 final String internalIp = intExtPortMap.getInternalIp();
                 final String externalIp = intExtPortMap.getExternalIp();
                 LOG.debug("hndlTepAddForDnatInEachRtr : DNAT -> Advertising the FIB route to the floating IP {} "
@@ -892,10 +900,10 @@ public class NatTunnelInterfaceStateListener
                             + "having nextHopIp {}", externalIp, nextHopIp);
                     long l3vni = 0;
                     if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
-                        l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, l3vni).longValue();
+                        l3vni = natOverVxlanUtil.getInternetVpnVni(vpnName, l3vni).longValue();
                     }
-                    NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd, null,
-                            fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
+                    NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd,
+                        fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
                             fipCfgdDpnId);
                     serviceId = label;
                 }
@@ -971,8 +979,13 @@ public class NatTunnelInterfaceStateListener
             return;
         }
         if (natMode == NatMode.Conntrack) {
-            natServiceManager.notify(confTx, routerData.get(), naptId, dpnId,
-                SnatServiceManager.Action.SNAT_ROUTER_DISBL);
+            Routers extRouter = routerData.get();
+            natServiceManager.notify(confTx, extRouter, null, naptId, dpnId,
+                    SnatServiceManager.Action.CNT_ROUTER_DISBL);
+            if (extRouter.isEnableSnat()) {
+                natServiceManager.notify(confTx,extRouter, null, naptId, dpnId,
+                        SnatServiceManager.Action.SNAT_ROUTER_DISBL);
+            }
         } else {
 
 
@@ -1069,11 +1082,10 @@ public class NatTunnelInterfaceStateListener
                 LOG.debug("hndlTepDelForDnatInEachRtr : L3VNI value is not configured in Internet VPN {} and RD {} "
                         + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
                         + "NAT flows", vpnName, rd);
-                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+                l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId).longValue();
             }
         }
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
             //Get the DPN on which this interface resides
             String interfaceName = port.getPortName();
             BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
@@ -1088,8 +1100,8 @@ public class NatTunnelInterfaceStateListener
                     tepDeletedDpnId, fipCfgdDpnId, interfaceName);
                 continue;
             }
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 String internalIp = intExtPortMap.getInternalIp();
                 String externalIp = intExtPortMap.getExternalIp();
                 externalIp = NatUtil.validateAndAddNetworkMask(externalIp);