Bump version odlparent->6.0.0,mdsal->5.0.3
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / recovery / impl / ItmTepInstanceRecoveryHandler.java
index 9ed83d0511e1bca18d96a152baf307597bfce38e..8a9cdf236c3dc1ce021c419389644f68ae8104f9 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.genius.itm.recovery.impl;
 
 import java.time.Duration;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -45,12 +46,13 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.config.rev160406
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.TunnelEndPoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.dpn.teps.info.tunnel.end.points.TzMembership;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.DpnsTeps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.teps.state.dpns.teps.RemoteDpns;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnel.list.InternalTunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelListKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.TransportZone;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Subnets;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.subnets.Vteps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rev160406.transport.zones.transport.zone.Vteps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.serviceutils.srm.types.rev180626.GeniusItmTep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
@@ -72,6 +74,8 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
     private final IMdsalApiManager imdsalApiManager;
     private final DataTreeEventCallbackRegistrar eventCallbacks;
     private final ManagedNewTransactionRunner txRunner;
+    private final IInterfaceManager interfaceManager;
+    private final DpnTepStateCache dpnTepStateCache;
 
     @Inject
     public ItmTepInstanceRecoveryHandler(DataBroker dataBroker,
@@ -98,13 +102,15 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.itmInternalTunnelAddWorker = new ItmInternalTunnelAddWorker(dataBroker, jobCoordinator,
                 tunnelMonitoringConfig, itmConfig, directTunnelUtils, interfaceManager,
-                ovsBridgeRefEntryCache, ofEndPointCache);
+                ovsBridgeRefEntryCache, ofEndPointCache, eventCallbacks);
         this.itmExternalTunnelAddWorker = new ItmExternalTunnelAddWorker(itmConfig,
                 dpntePsInfoCache);
         this.itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
                 tunnelMonitoringConfig, interfaceManager, dpnTepStateCache, ovsBridgeEntryCache,
-                ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils);
+                ovsBridgeRefEntryCache, tunnelStateCache, directTunnelUtils, ofEndPointCache, itmConfig);
         serviceRecoveryRegistry.registerServiceRecoveryRegistry(getServiceRegistryKey(), this);
+        this.interfaceManager = interfaceManager;
+        this.dpnTepStateCache = dpnTepStateCache;
     }
 
     private String getServiceRegistryKey() {
@@ -149,15 +155,31 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
             if (oldTz != null) {
                 LOG.trace("Deleting transportzone {}", tzName);
                 ItmTepRemoveWorker tepRemoveWorker = new ItmTepRemoveWorker(tepsToRecover, null, oldTz,
-                    imdsalApiManager, itmInternalTunnelDeleteWorker, dpntePsInfoCache, txRunner);
+                        imdsalApiManager, itmInternalTunnelDeleteWorker, dpntePsInfoCache, txRunner, itmConfig);
                 jobCoordinator.enqueueJob(tzName, tepRemoveWorker);
                 AtomicInteger eventCallbackCount = new AtomicInteger(0);
                 AtomicInteger eventRegistrationCount = new AtomicInteger(0);
-                tunnelList.stream().filter(internalTunnel -> Objects.equals(internalTunnel
-                        .getDestinationDPN(), dpnTepsToRecover.getDPNID()) || Objects.equals(
-                        internalTunnel.getSourceDPN(), dpnTepsToRecover.getDPNID())).forEach(internalTunnel -> {
-                            eventRegistrationCount.incrementAndGet();
-                            interfaceListToRecover.add(String.valueOf(internalTunnel.getTunnelInterfaceNames())); });
+                if (interfaceManager.isItmDirectTunnelsEnabled()) {
+                    Collection<DpnsTeps> dpnsTeps = dpnTepStateCache.getAllPresent();
+                    for (DpnsTeps dpnTep : dpnsTeps) {
+                        List<RemoteDpns> rmtdpns = dpnTep.getRemoteDpns();
+                        for (RemoteDpns remoteDpn : rmtdpns) {
+                            if (remoteDpn.getDestinationDpnId().equals(dpnTepsToRecover.getDPNID())
+                                    || dpnTep.getSourceDpnId().equals(dpnTepsToRecover.getDPNID())) {
+                                eventRegistrationCount.incrementAndGet();
+                                interfaceListToRecover.add(remoteDpn.getTunnelName());
+                            }
+                        }
+                    }
+                    LOG.trace("List of tunnels to be recovered : {}", interfaceListToRecover);
+                } else {
+                    tunnelList.stream().filter(internalTunnel -> Objects.equals(internalTunnel
+                            .getDestinationDPN(), dpnTepsToRecover.getDPNID()) || Objects.equals(
+                            internalTunnel.getSourceDPN(), dpnTepsToRecover.getDPNID())).forEach(internalTunnel -> {
+                                eventRegistrationCount.incrementAndGet();
+                                interfaceListToRecover.add(String.valueOf(internalTunnel.getTunnelInterfaceNames()));
+                            });
+                }
 
                 if (!interfaceListToRecover.isEmpty()) {
                     interfaceListToRecover.forEach(interfaceName -> {
@@ -181,7 +203,6 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
         }
     }
 
-
     private void recreateTEP(String tzName, List tepts, AtomicInteger eventCallbackCount, int registeredEventSize) {
         eventCallbackCount.incrementAndGet();
         if (eventCallbackCount.intValue() == registeredEventSize || registeredEventSize == 0) {
@@ -189,9 +210,6 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
             ItmTepAddWorker tepAddWorker = new ItmTepAddWorker(tepts, null, dataBroker, imdsalApiManager,
                     itmInternalTunnelAddWorker, itmExternalTunnelAddWorker);
             jobCoordinator.enqueueJob(tzName, tepAddWorker);
-        } else {
-            LOG.trace("{} call back events registered for {} tunnel interfaces",
-                    registeredEventSize, eventCallbackCount);
         }
     }
 
@@ -202,29 +220,27 @@ public class ItmTepInstanceRecoveryHandler implements ServiceRecoveryInterface {
             return null;
         }
 
-        for (Subnets sub : transportZone.nonnullSubnets()) {
-            if (sub.getVteps() == null || sub.getVteps().isEmpty()) {
-                LOG.error("Transport Zone {} subnet {} has no vteps", transportZone.getZoneName(), sub.getPrefix());
-            }
-            for (Vteps vtep : sub.nonnullVteps()) {
-                if (ipAddress.equals(vtep.getIpAddress().stringValue())) {
-
-                    List<TzMembership> zones = ItmUtils.createTransportZoneMembership(tzName);
-                    LOG.trace("Transportzone {} found match for tep {} to be recovered", transportZone.getZoneName(),
-                            ipAddress);
-
-                    //OfTunnels is false byDefault
-                    TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(vtep.getDpnId(),
-                        IpAddressBuilder.getDefaultInstance(ipAddress), vtep.getPortname(), false, sub.getVlanId(),
-                            sub.getPrefix(), sub.getGatewayIp(), zones,transportZone.getTunnelType(),
-                            itmConfig.getDefaultTunnelTos());
-
-                    List<TunnelEndPoints> teps = new ArrayList<>();
-                    teps.add(tunnelEndPoints);
-                    return ItmUtils.createDPNTepInfo(vtep.getDpnId(), teps);
-                }
+        String portName = itmConfig.getPortname() == null ? ITMConstants.DUMMY_PORT : itmConfig.getPortname();
+        int vlanId = itmConfig.getVlanId() != null ? itmConfig.getVlanId().toJava() : ITMConstants.DUMMY_VLANID;
+
+        for (Vteps vtep : transportZone.getVteps()) {
+            if (ipAddress.equals(vtep.getIpAddress().stringValue())) {
+
+                List<TzMembership> zones = ItmUtils.createTransportZoneMembership(tzName);
+                LOG.trace("Transportzone {} found match for tep {} to be recovered", transportZone.getZoneName(),
+                        ipAddress);
+
+                //OfTunnels is false byDefault
+                TunnelEndPoints tunnelEndPoints = ItmUtils.createTunnelEndPoints(vtep.getDpnId(),
+                        IpAddressBuilder.getDefaultInstance(ipAddress), portName, false,
+                        vlanId, zones, transportZone.getTunnelType(),
+                        itmConfig.getDefaultTunnelTos());
+
+                List<TunnelEndPoints> teps = new ArrayList<>();
+                teps.add(tunnelEndPoints);
+                return ItmUtils.createDPNTepInfo(vtep.getDpnId(), teps);
             }
         }
         return null;
     }
-}
\ No newline at end of file
+}