MRI version bumpup for Aluminium
[netvirt.git] / natservice / impl / src / main / java / org / opendaylight / netvirt / natservice / internal / NatTepChangeListener.java
index a00f74470986462df9ea5a7a403b0cbfb706bd43..13e243b9e0d396d6f216d02550ef24eafcbf6d29 100644 (file)
@@ -9,33 +9,32 @@ package org.opendaylight.netvirt.natservice.internal;
 
 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.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
-
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.Executors;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
+import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
@@ -54,7 +53,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev16011
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.RouterPorts;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.PortsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.ports.InternalToExternalPortMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.floating.ip.info.router.ports.ports.InternalToExternalPortMapKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -63,8 +64,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @Singleton
-public class NatTepChangeListener extends
-    AsyncDataTreeChangeListenerBase<TunnelEndPoints, NatTepChangeListener> {
+public class NatTepChangeListener extends AbstractAsyncDataTreeChangeListener<TunnelEndPoints> {
 
     private static final Logger LOG = LoggerFactory
         .getLogger(NatTepChangeListener.class);
@@ -98,7 +98,9 @@ public class NatTepChangeListener extends
         final SnatServiceManager natServiceManager,
         final JobCoordinator coordinator,
         final NatOverVxlanUtil natOverVxlanUtil) {
-        super(TunnelEndPoints.class, NatTepChangeListener.class);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(DpnEndpoints.class)
+                .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build(),
+                Executors.newListeningSingleThreadExecutor("NatTepChangeListener", LOG));
         this.dataBroker = dataBroker;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.defaultRouteProgrammer = defaultRouteProgrammer;
@@ -120,21 +122,19 @@ public class NatTepChangeListener extends
         }
     }
 
-    @Override
-    @PostConstruct
     public void init() {
         LOG.info("{} init", getClass().getSimpleName());
-        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
     }
 
     @Override
-    protected InstanceIdentifier<TunnelEndPoints> getWildCardPath() {
-        return InstanceIdentifier.builder(DpnEndpoints.class)
-            .child(DPNTEPsInfo.class).child(TunnelEndPoints.class).build();
+    @PreDestroy
+    public void close() {
+        super.close();
+        Executors.shutdownAndAwaitTermination(getExecutorService());
     }
 
     @Override
-    protected void remove(InstanceIdentifier<TunnelEndPoints> key,
+    public void remove(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints tep) {
         /*
          * Whenever the TEP on a given DPNID is removed, this API take care
@@ -153,14 +153,14 @@ public class NatTepChangeListener extends
     }
 
     @Override
-    protected void update(InstanceIdentifier<TunnelEndPoints> key,
+    public void update(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints origTep, TunnelEndPoints updatedTep) {
         // Will be handled in NatTunnelInterfaceStateListener.add()
         LOG.debug("NO ACTION duing update event : {}", updatedTep.key());
     }
 
     @Override
-    protected void add(InstanceIdentifier<TunnelEndPoints> key,
+    public void add(InstanceIdentifier<TunnelEndPoints> key,
         TunnelEndPoints tep) {
         LOG.debug("NO ACTION duing add event : {}", tep.key());
     }
@@ -178,7 +178,7 @@ public class NatTepChangeListener extends
                 .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                     LogicalDatastoreType.OPERATIONAL, dpnRoutersListId);
         if (optionalRouterDpnList.isPresent()) {
-            routersList = optionalRouterDpnList.get().getRoutersList();
+            routersList = new ArrayList<RoutersList>(optionalRouterDpnList.get().getRoutersList().values());
         } else {
             LOG.debug(
                 "NAT Service : RouterDpnList is empty for DPN {}. Hence ignoring TEP DEL event",
@@ -238,8 +238,15 @@ public class NatTepChangeListener extends
             + "associated to the router {}", routerName);
 
         InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerName);
-        Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType
-            .CONFIGURATION, routerPortsId);
+        Optional<RouterPorts> optRouterPorts;
+        try {
+            optRouterPorts = SingleTransactionDataBroker.syncReadOptional(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, routerPortsId);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.error("hndlTepDelForDnatInEachRtr: Exception while reading RouterPorts DS for the router {}",
+                    routerName, e);
+            return isFipExists;
+        }
         if (!optRouterPorts.isPresent()) {
             LOG.debug(
                 "hndlTepDelForDnatInEachRtr : DNAT -> Could not read Router Ports data object with id: {} "
@@ -271,8 +278,8 @@ public class NatTepChangeListener extends
                 l3Vni = natOverVxlanUtil.getInternetVpnVni(vpnName, routerId);
             }
         }
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        Map<PortsKey, Ports> interfacesMap = routerPorts.getPorts();
+        for (Ports port : interfacesMap.values()) {
             //Get the DPN on which this interface resides
             String interfaceName = port.getPortName();
             Uint64 fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
@@ -290,8 +297,9 @@ public class NatTepChangeListener extends
                 continue;
             }
             isFipExists = Boolean.TRUE;
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            Map<InternalToExternalPortMapKey, InternalToExternalPortMap> keyInternalToExternalPortMapMap
+                    = port.getInternalToExternalPortMap();
+            for (InternalToExternalPortMap intExtPortMap : keyInternalToExternalPortMapMap.values()) {
                 String internalIp = intExtPortMap.getInternalIp();
                 String externalIp = intExtPortMap.getExternalIp();
                 externalIp = NatUtil.validateAndAddNetworkMask(externalIp);
@@ -366,7 +374,7 @@ public class NatTepChangeListener extends
 
         // Check if this is externalRouter else ignore
         InstanceIdentifier<Routers> extRoutersId = NatUtil.buildRouterIdentifier(routerName);
-        Optional<Routers> routerData = Optional.absent();
+        Optional<Routers> routerData = Optional.empty();
         try {
             routerData = confTx.read(extRoutersId).get();
         } catch (InterruptedException | ExecutionException e) {
@@ -447,9 +455,10 @@ public class NatTepChangeListener extends
                             + "associated to the router {}", routerVpnId, routerName);
                 }
                 //Re-elect the other available switch as the NAPT switch and program the NAT flows.
-                NatUtil
-                    .removeSNATFromDPN(dataBroker, mdsalManager, idManager, naptSwitchHA, dpnId,
-                        routerName, routerId, routerVpnId, networkId, extNwProvType, confTx);
+                String externalVpnName = NatUtil.getAssociatedVPN(dataBroker,
+                        routerData.get().getNetworkId());
+                NatUtil.removeSNATFromDPN(dataBroker, mdsalManager, idManager, naptSwitchHA, dpnId,
+                        routerData.get(), routerId, routerVpnId, externalVpnName, extNwProvType, confTx);
             } else {
                 LOG.info(
                     "hndlTepDelForSnatInEachRtr : SNAT is not enabled for router {} to handle addDPN event {}",
@@ -457,9 +466,4 @@ public class NatTepChangeListener extends
             }
         }
     }
-
-    @Override
-    protected NatTepChangeListener getDataTreeChangeListener() {
-        return this;
-    }
 }