GENIUS-243: Timing issues in tunnel mesh creation 82/76982/16
authorEdw7n <n.edwin.anthony@ericsson.com>
Fri, 23 Nov 2018 05:58:36 +0000 (11:28 +0530)
committerFaseela K <faseela.k@ericsson.com>
Tue, 27 Nov 2018 08:30:48 +0000 (08:30 +0000)
- takes care of timing issues during mesh creation in a scaled setup
- introduction of a new immutable to synchronize between event processing
  of dpnTepsState & dpnTepsInfo

Change-Id: Iceed44605c84a73398d020a387f52e210e008bd1
Signed-off-by: Edw7n <n.edwin.anthony@ericsson.com>
17 files changed:
itm/itm-api/src/main/java/org/opendaylight/genius/itm/utils/TunnelStateInfo.java [new file with mode: 0644]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DPNTEPsInfoCache.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/DpnTepStateCache.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/UnprocessedNodeConnectorCache.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/cache/UnprocessedNodeConnectorEndPointCache.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/AbstractTunnelListenerBase.java [deleted file]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepStateListener.java [deleted file]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepsInfoListener.java [deleted file]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/TunnelInventoryStateListener.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/TunnelListenerCreator.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/TunnelTopologyStateListener.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/renderer/ovs/utilities/DirectTunnelUtils.java
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorker.java [new file with mode: 0644]
itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorkerForNodeConnector.java [new file with mode: 0644]
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/impl/ItmExternalTunnelAddTest.java
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/impl/ItmInternalTunnelDeleteTest.java
itm/itm-impl/src/test/java/org/opendaylight/genius/itm/impl/ItmManagerRpcServiceTest.java

diff --git a/itm/itm-api/src/main/java/org/opendaylight/genius/itm/utils/TunnelStateInfo.java b/itm/itm-api/src/main/java/org/opendaylight/genius/itm/utils/TunnelStateInfo.java
new file mode 100644 (file)
index 0000000..11a7a72
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.utils;
+
+import org.eclipse.jdt.annotation.Nullable;
+import org.immutables.value.Value;
+import org.opendaylight.genius.infra.OpenDaylightImmutableStyle;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
+
+@Value.Immutable
+@OpenDaylightImmutableStyle
+public interface TunnelStateInfo {
+
+    NodeConnectorInfo getNodeConnectorInfo();
+
+    @Nullable
+    TunnelEndPointInfo getTunnelEndPointInfo();
+
+    @Nullable
+    DpnTepInterfaceInfo getDpnTepInterfaceInfo();
+
+    @Nullable
+    DPNTEPsInfo getSrcDpnTepsInfo();
+
+    @Nullable
+    DPNTEPsInfo getDstDpnTepsInfo();
+}
\ No newline at end of file
index 77c3a602460755dfddffe370b68f8bc890b622b7..858017c49aa6e70b99a23602e9930c2eb57b7533 100644 (file)
@@ -16,11 +16,23 @@ 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.infra.ManagedNewTransactionRunner;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorker;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorkerForNodeConnector;
+import org.opendaylight.genius.itm.utils.TunnelEndPointInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfoBuilder;
 import org.opendaylight.genius.mdsalutil.cache.InstanceIdDataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Caches DPNTEPsInfo objects.
@@ -31,10 +43,108 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 @Singleton
 public class DPNTEPsInfoCache extends InstanceIdDataObjectCache<DPNTEPsInfo> {
 
+    private static final Logger LOG = LoggerFactory.getLogger(DPNTEPsInfoCache.class);
+
+    private final DirectTunnelUtils directTunnelUtils;
+    private final JobCoordinator coordinator;
+    private final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
+    private final ManagedNewTransactionRunner txRunner;
+
     @Inject
-    public DPNTEPsInfoCache(DataBroker dataBroker, CacheProvider cacheProvider) {
+    public DPNTEPsInfoCache(final DataBroker dataBroker, final CacheProvider cacheProvider,
+                            final DirectTunnelUtils directTunnelUtils, final JobCoordinator coordinator,
+                            final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache) {
         super(DPNTEPsInfo.class, dataBroker, LogicalDatastoreType.CONFIGURATION,
                 InstanceIdentifier.builder(DpnEndpoints.class).child(DPNTEPsInfo.class).build(), cacheProvider);
+        this.directTunnelUtils = directTunnelUtils;
+        this.coordinator = coordinator;
+        this.unprocessedNodeConnectorEndPointCache = unprocessedNodeConnectorEndPointCache;
+        this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
+    }
+
+    @Override
+    protected void added(InstanceIdentifier<DPNTEPsInfo> path, DPNTEPsInfo dpnTepsInfo) {
+        LOG.info("DPNTepsInfo Add Received for {}", dpnTepsInfo.getDPNID());
+        String dpnId = dpnTepsInfo.getDPNID().toString();
+        directTunnelUtils.getTunnelLocks().lock(dpnId);
+        Collection<TunnelStateInfo> tunnelStateInfoList = unprocessedNodeConnectorEndPointCache.remove(dpnId);
+        directTunnelUtils.getTunnelLocks().unlock(dpnId);
+
+        if (tunnelStateInfoList != null) {
+            for (TunnelStateInfo tsInfo : tunnelStateInfoList) {
+                String interfaceName = tsInfo.getDpnTepInterfaceInfo().getTunnelName();
+                DPNTEPsInfo srcDpnTepsInfo = null;
+                DPNTEPsInfo dstDpnTepsInfo = null;
+                LOG.debug("Processing the Unprocessed NodeConnector EndPoint Cache for DPN {}", dpnTepsInfo.getDPNID());
+                TunnelEndPointInfo tunnelEndPointInfo = tsInfo.getTunnelEndPointInfo();
+                if (dpnId.equals(tunnelEndPointInfo.getSrcEndPointInfo())) {
+                    srcDpnTepsInfo = dpnTepsInfo;
+                    dstDpnTepsInfo = tsInfo.getDstDpnTepsInfo();
+                    if (dstDpnTepsInfo == null) {
+                        // Check if the destination End Point has come
+                        try {
+                            directTunnelUtils.getTunnelLocks().lock(tunnelEndPointInfo.getDstEndPointInfo());
+                            Optional<DPNTEPsInfo> dstInfoOpt = getDPNTepFromDPNId(
+                                    new BigInteger(tunnelEndPointInfo.getDstEndPointInfo()));
+                            if (dstInfoOpt.isPresent()) {
+                                dstDpnTepsInfo = dstInfoOpt.get();
+                            } else {
+                                TunnelStateInfo tunnelStateInfoNew = new TunnelStateInfoBuilder()
+                                    .setNodeConnectorInfo(tsInfo.getNodeConnectorInfo())
+                                    .setDpnTepInterfaceInfo(tsInfo.getDpnTepInterfaceInfo())
+                                    .setTunnelEndPointInfo(tsInfo.getTunnelEndPointInfo())
+                                    .setSrcDpnTepsInfo(srcDpnTepsInfo).build();
+                                LOG.trace("Destination DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                                        interfaceName, tunnelEndPointInfo.getDstEndPointInfo());
+                                unprocessedNodeConnectorEndPointCache.add(tunnelEndPointInfo
+                                        .getDstEndPointInfo(), tunnelStateInfoNew);
+                            }
+                        } finally {
+                            directTunnelUtils.getTunnelLocks().unlock(tunnelEndPointInfo.getDstEndPointInfo());
+                        }
+                    }
+                } else if (dpnId.equals(tunnelEndPointInfo.getDstEndPointInfo())) {
+                    dstDpnTepsInfo = dpnTepsInfo;
+                    srcDpnTepsInfo = tsInfo.getSrcDpnTepsInfo();
+                    // Check if the destination End Point has come
+                    if (srcDpnTepsInfo == null) {
+                        try {
+                            directTunnelUtils.getTunnelLocks().lock(tunnelEndPointInfo.getSrcEndPointInfo());
+                            Optional<DPNTEPsInfo> srcInfoOpt = getDPNTepFromDPNId(
+                                    new BigInteger(tunnelEndPointInfo.getSrcEndPointInfo()));
+                            if (srcInfoOpt.isPresent()) {
+                                srcDpnTepsInfo = srcInfoOpt.get();
+                            } else {
+                                TunnelStateInfo tunnelStateInfoNew = new TunnelStateInfoBuilder().setNodeConnectorInfo(
+                                    tsInfo.getNodeConnectorInfo())
+                                    .setDpnTepInterfaceInfo(tsInfo.getDpnTepInterfaceInfo())
+                                    .setTunnelEndPointInfo(tsInfo.getTunnelEndPointInfo())
+                                    .setDstDpnTepsInfo(dstDpnTepsInfo).build();
+                                LOG.trace("Source DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                                        interfaceName,
+                                        tsInfo.getTunnelEndPointInfo().getSrcEndPointInfo());
+                                unprocessedNodeConnectorEndPointCache.add(tunnelEndPointInfo.getSrcEndPointInfo(),
+                                        tunnelStateInfoNew);
+                            }
+                        } finally {
+                            directTunnelUtils.getTunnelLocks().unlock(tunnelEndPointInfo.getSrcEndPointInfo());
+                        }
+                    }
+                }
+
+                if (srcDpnTepsInfo != null && dstDpnTepsInfo != null && directTunnelUtils.isEntityOwner()) {
+                    TunnelStateInfo tunnelStateInfoNew = new TunnelStateInfoBuilder()
+                        .setNodeConnectorInfo(tsInfo.getNodeConnectorInfo())
+                        .setDpnTepInterfaceInfo(tsInfo.getDpnTepInterfaceInfo())
+                        .setTunnelEndPointInfo(tsInfo.getTunnelEndPointInfo())
+                        .setSrcDpnTepsInfo(srcDpnTepsInfo).setDstDpnTepsInfo(dstDpnTepsInfo).build();
+                    LOG.debug("Queueing TunnelStateAddWorker to DJC for tunnel {}", interfaceName);
+                    coordinator.enqueueJob(interfaceName,
+                        new TunnelStateAddWorkerForNodeConnector(new TunnelStateAddWorker(directTunnelUtils, txRunner),
+                            tunnelStateInfoNew), ITMConstants.JOB_MAX_RETRIES);
+                }
+            }
+        }
     }
 
     public List<DPNTEPsInfo> getDPNTepListFromDPNId(List<BigInteger> dpnIds) {
index 10db60625b4d8d612fcb42447533310eba1e5f69..91387b969b5386756819ec1ce7e91e6e3080a26a 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.genius.itm.cache;
 
 import static org.opendaylight.genius.itm.impl.ItmUtils.nullToEmpty;
 
-import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.Collection;
 import java.util.Collections;
@@ -24,13 +23,22 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
+import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.itm.impl.ItmUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorker;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorkerForNodeConnector;
 import org.opendaylight.genius.itm.utils.DpnTepInterfaceInfo;
 import org.opendaylight.genius.itm.utils.DpnTepInterfaceInfoBuilder;
 import org.opendaylight.genius.itm.utils.TunnelEndPointInfo;
 import org.opendaylight.genius.itm.utils.TunnelEndPointInfoBuilder;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfoBuilder;
 import org.opendaylight.genius.mdsalutil.cache.DataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelMonitoringTypeBfd;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnTepsState;
@@ -49,19 +57,33 @@ public class DpnTepStateCache extends DataObjectCache<BigInteger, DpnsTeps> {
     private static final Logger LOG = LoggerFactory.getLogger(DpnTepStateCache.class);
 
     private final DataBroker dataBroker;
+    private final JobCoordinator coordinator;
+    private final DirectTunnelUtils directTunnelUtils;
     private final DPNTEPsInfoCache dpnTepsInfoCache;
+    private final UnprocessedNodeConnectorCache unprocessedNCCache;
+    private final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
+    private final ManagedNewTransactionRunner txRunner;
     private final ConcurrentMap<String, DpnTepInterfaceInfo> dpnTepInterfaceMap = new ConcurrentHashMap<>();
     private final ConcurrentMap<String, TunnelEndPointInfo> tunnelEndpointMap = new ConcurrentHashMap<>();
 
     @Inject
-    public DpnTepStateCache(DataBroker dataBroker, CacheProvider cacheProvider, DPNTEPsInfoCache dpnTepsInfoCache) {
+    public DpnTepStateCache(DataBroker dataBroker, JobCoordinator coordinator,
+                            CacheProvider cacheProvider, DirectTunnelUtils directTunnelUtils,
+                            DPNTEPsInfoCache dpnTepsInfoCache,
+                            UnprocessedNodeConnectorCache unprocessedNCCache,
+                            UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache) {
         super(DpnsTeps.class, dataBroker, LogicalDatastoreType.CONFIGURATION,
             InstanceIdentifier.builder(DpnTepsState.class).child(DpnsTeps.class).build(), cacheProvider,
             (iid, dpnsTeps) -> dpnsTeps.getSourceDpnId(),
             sourceDpnId -> InstanceIdentifier.builder(DpnTepsState.class)
                     .child(DpnsTeps.class, new DpnsTepsKey(sourceDpnId)).build());
         this.dataBroker = dataBroker;
+        this.coordinator = coordinator;
+        this.directTunnelUtils = directTunnelUtils;
         this.dpnTepsInfoCache = dpnTepsInfoCache;
+        this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
+        this.unprocessedNCCache = unprocessedNCCache;
+        this.unprocessedNodeConnectorEndPointCache = unprocessedNodeConnectorEndPointCache;
     }
 
     @Override
@@ -69,13 +91,62 @@ public class DpnTepStateCache extends DataObjectCache<BigInteger, DpnsTeps> {
         for (RemoteDpns remoteDpns : nullToEmpty(dpnsTeps.getRemoteDpns())) {
             final String dpn = getDpnId(dpnsTeps.getSourceDpnId(), remoteDpns.getDestinationDpnId());
             DpnTepInterfaceInfo value = new DpnTepInterfaceInfoBuilder()
-                    .setTunnelName(remoteDpns.getTunnelName())
-                    .setIsMonitoringEnabled(remoteDpns.isMonitoringEnabled())
-                    .setIsInternal(remoteDpns.isInternal())
-                    .setTunnelType(dpnsTeps.getTunnelType()).build();
+                .setTunnelName(remoteDpns.getTunnelName())
+                .setIsMonitoringEnabled(remoteDpns.isMonitoringEnabled())
+                .setIsInternal(remoteDpns.isInternal())
+                .setTunnelType(dpnsTeps.getTunnelType()).build();
             dpnTepInterfaceMap.put(dpn, value);
             addTunnelEndPointInfoToCache(remoteDpns.getTunnelName(),
                     dpnsTeps.getSourceDpnId().toString(), remoteDpns.getDestinationDpnId().toString());
+
+            //Process the unprocessed NodeConnector for the Tunnel, if present in the UnprocessedNodeConnectorCache
+
+            TunnelStateInfo tunnelStateInfoNew = null;
+
+            directTunnelUtils.getTunnelLocks().lock(remoteDpns.getTunnelName());
+            TunnelStateInfo tunnelStateInfo = unprocessedNCCache.remove(remoteDpns.getTunnelName());
+            directTunnelUtils.getTunnelLocks().unlock(remoteDpns.getTunnelName());
+
+            if (tunnelStateInfo != null) {
+                LOG.debug("Processing the Unprocessed NodeConnector for Tunnel {}", remoteDpns.getTunnelName());
+
+                TunnelEndPointInfo tunnelEndPtInfo = getTunnelEndPointInfo(dpnsTeps.getSourceDpnId().toString(),
+                        remoteDpns.getDestinationDpnId().toString());
+                TunnelStateInfoBuilder builder = new TunnelStateInfoBuilder()
+                    .setNodeConnectorInfo(tunnelStateInfo.getNodeConnectorInfo()).setDpnTepInterfaceInfo(value)
+                    .setTunnelEndPointInfo(tunnelEndPtInfo);
+
+                dpnTepsInfoCache.getDPNTepFromDPNId(dpnsTeps.getSourceDpnId()).ifPresent(builder::setSrcDpnTepsInfo);
+                dpnTepsInfoCache.getDPNTepFromDPNId(remoteDpns.getDestinationDpnId())
+                    .ifPresent(builder::setDstDpnTepsInfo);
+
+                tunnelStateInfoNew = builder.build();
+                if (tunnelStateInfoNew.getSrcDpnTepsInfo() == null) {
+                    String srcDpnId = tunnelStateInfoNew.getTunnelEndPointInfo().getSrcEndPointInfo();
+                    directTunnelUtils.getTunnelLocks().lock(srcDpnId);
+                    LOG.debug("Source DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                        remoteDpns.getTunnelName(), srcDpnId);
+                    unprocessedNodeConnectorEndPointCache.add(srcDpnId, tunnelStateInfoNew);
+                    directTunnelUtils.getTunnelLocks().unlock(srcDpnId);
+                }
+
+                if (tunnelStateInfoNew.getDstDpnTepsInfo() == null) {
+                    String dstDpnId = tunnelStateInfo.getTunnelEndPointInfo().getDstEndPointInfo();
+                    directTunnelUtils.getTunnelLocks().lock(dstDpnId);
+                    LOG.debug("Destination DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                        remoteDpns.getTunnelName(), dstDpnId);
+                    unprocessedNodeConnectorEndPointCache.add(dstDpnId, tunnelStateInfoNew);
+                    directTunnelUtils.getTunnelLocks().unlock(dstDpnId);
+                }
+            }
+
+            if (tunnelStateInfoNew != null && tunnelStateInfoNew.getSrcDpnTepsInfo() != null
+                && tunnelStateInfoNew.getDstDpnTepsInfo() != null && directTunnelUtils.isEntityOwner()) {
+                TunnelStateAddWorkerForNodeConnector ifStateAddWorker =
+                    new TunnelStateAddWorkerForNodeConnector(new TunnelStateAddWorker(directTunnelUtils, txRunner),
+                        tunnelStateInfoNew);
+                coordinator.enqueueJob(remoteDpns.getTunnelName(), ifStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
+            }
         }
     }
 
@@ -95,7 +166,7 @@ public class DpnTepStateCache extends DataObjectCache<BigInteger, DpnsTeps> {
         DpnTepInterfaceInfo  dpnTepInterfaceInfo = dpnTepInterfaceMap.get(getDpnId(srcDpnId, dstDpnId));
         if (dpnTepInterfaceInfo == null) {
             try {
-                Optional<DpnsTeps> dpnsTeps = super.get(srcDpnId);
+                com.google.common.base.Optional<DpnsTeps> dpnsTeps = super.get(srcDpnId);
                 if (dpnsTeps.isPresent()) {
                     DpnsTeps teps = dpnsTeps.get();
                     nullToEmpty(teps.getRemoteDpns()).forEach(remoteDpns -> {
@@ -210,9 +281,12 @@ public class DpnTepStateCache extends DataObjectCache<BigInteger, DpnsTeps> {
 
     //Start: TunnelEndPoint Cache accessors
     private void addTunnelEndPointInfoToCache(String tunnelName, String srcEndPtInfo, String dstEndPtInfo) {
-        TunnelEndPointInfo tunnelEndPointInfo = new TunnelEndPointInfoBuilder().setSrcEndPointInfo(srcEndPtInfo)
-                .setDstEndPointInfo(dstEndPtInfo).build();
-        tunnelEndpointMap.put(tunnelName, tunnelEndPointInfo);
+        tunnelEndpointMap.put(tunnelName, getTunnelEndPointInfo(srcEndPtInfo,dstEndPtInfo));
+    }
+
+    private TunnelEndPointInfo getTunnelEndPointInfo(String srcEndPtInfo, String dstEndPtInfo) {
+        return
+            new TunnelEndPointInfoBuilder().setSrcEndPointInfo(srcEndPtInfo).setDstEndPointInfo(dstEndPtInfo).build();
     }
 
     public TunnelEndPointInfo getTunnelEndPointInfoFromCache(String tunnelName) {
index 80a360b343b076ea89622a0de1f66cdbcd5bde0e..9f99b88a27035de5f35c34d92657fdca8332075a 100644 (file)
@@ -10,22 +10,22 @@ package org.opendaylight.genius.itm.cache;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.inject.Singleton;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
 
 @Singleton
 public class UnprocessedNodeConnectorCache {
 
-    private final ConcurrentMap<String, NodeConnectorInfo> unprocessedNodeConnectorMap = new ConcurrentHashMap<>();
+    private final ConcurrentMap<String, TunnelStateInfo> unprocessedNodeConnectorMap = new ConcurrentHashMap<>();
 
-    public void add(String tunnelName, NodeConnectorInfo ncInfo) {
-        unprocessedNodeConnectorMap.put(tunnelName, ncInfo);
+    public void add(String tunnelName, TunnelStateInfo tunnelStateInfo) {
+        unprocessedNodeConnectorMap.put(tunnelName, tunnelStateInfo);
     }
 
-    public NodeConnectorInfo get(String tunnelName) {
+    public TunnelStateInfo get(String tunnelName) {
         return unprocessedNodeConnectorMap.get(tunnelName);
     }
 
-    public NodeConnectorInfo remove(String tunnelName) {
+    public TunnelStateInfo remove(String tunnelName) {
         return unprocessedNodeConnectorMap.remove(tunnelName);
     }
 }
index e06afe6c09f9449a09dd60b21c73fd9c1040d9db..573d89538029516887397bf89a37339fe268f46b 100644 (file)
@@ -12,7 +12,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import javax.inject.Singleton;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,31 +21,32 @@ public class UnprocessedNodeConnectorEndPointCache {
 
     private static final Logger LOG = LoggerFactory.getLogger(UnprocessedNodeConnectorEndPointCache.class);
 
-    private final ConcurrentMap<String, Set<NodeConnectorInfo>> unProcessedNodeConnectorEndPtMap =
+    private final ConcurrentMap<String, Set<TunnelStateInfo>> unProcessedNodeConnectorEndPtMap =
             new ConcurrentHashMap<>();
 
-    public void add(String dpnId, Collection<NodeConnectorInfo> ncList) {
+    public void add(String dpnId, Collection<TunnelStateInfo> ncList) {
         unProcessedNodeConnectorEndPtMap.computeIfAbsent(dpnId, key -> ConcurrentHashMap.newKeySet()).addAll(ncList);
     }
 
-    public void add(String dpnId, NodeConnectorInfo ncInfo) {
-        unProcessedNodeConnectorEndPtMap.computeIfAbsent(dpnId, key -> ConcurrentHashMap.newKeySet()).add(ncInfo);
+    public void add(String dpnId, TunnelStateInfo tunnelStateInfo) {
+        unProcessedNodeConnectorEndPtMap.computeIfAbsent(dpnId, key -> ConcurrentHashMap.newKeySet())
+                .add(tunnelStateInfo);
     }
 
-    public void remove(String dpnId) {
-        unProcessedNodeConnectorEndPtMap.remove(dpnId);
+    public Collection<TunnelStateInfo> remove(String dpnId) {
+        return unProcessedNodeConnectorEndPtMap.remove(dpnId);
     }
 
-    public void remove(String dpnId, NodeConnectorInfo ncInfo) {
-        Collection<NodeConnectorInfo> ncList = get(dpnId);
-        if (ncList != null) {
-            ncList.remove(ncInfo);
+    public void remove(String dpnId, TunnelStateInfo ncInfo) {
+        Collection<TunnelStateInfo> tunnelStateInfoList = get(dpnId);
+        if (tunnelStateInfoList != null) {
+            tunnelStateInfoList.remove(ncInfo);
         } else {
-            LOG.debug("NodeConnectorInfo List for DPN Id {} is null", dpnId);
+            LOG.debug("TunnelStateInfo List for DPN Id {} is null", dpnId);
         }
     }
 
-    public Collection<NodeConnectorInfo> get(String dpnId) {
+    public Collection<TunnelStateInfo> get(String dpnId) {
         return unProcessedNodeConnectorEndPtMap.get(dpnId);
     }
 }
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/AbstractTunnelListenerBase.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/AbstractTunnelListenerBase.java
deleted file mode 100644 (file)
index 338bed4..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.genius.itm.itmdirecttunnels.listeners;
-
-import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.infra.Datastore;
-import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
-import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.infra.TypedWriteTransaction;
-import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
-import org.opendaylight.genius.itm.cache.DpnTepStateCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
-import org.opendaylight.genius.itm.globals.ITMConstants;
-import org.opendaylight.genius.itm.impl.ITMBatchingUtils;
-import org.opendaylight.genius.itm.impl.ItmUtils;
-import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
-import org.opendaylight.genius.itm.utils.DpnTepInterfaceInfo;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfoBuilder;
-import org.opendaylight.genius.itm.utils.TunnelEndPointInfo;
-import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
-import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredSyncDataTreeChangeListener;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.IfIndexesTunnelMap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnel;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnelBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnelKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelOperStatus;
-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.tunnels_state.StateTunnelList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelListBuilder;
-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.op.rev160406.tunnels_state.state.tunnel.list.DstInfoBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.state.tunnel.list.SrcInfoBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.OperationFailedException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-abstract class AbstractTunnelListenerBase<T extends DataObject> extends AbstractClusteredSyncDataTreeChangeListener<T> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(AbstractTunnelListenerBase.class);
-
-    protected final DpnTepStateCache dpnTepStateCache;
-    protected final DPNTEPsInfoCache dpntePsInfoCache;
-    protected final UnprocessedNodeConnectorCache unprocessedNCCache;
-    protected final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
-    protected final DirectTunnelUtils directTunnelUtils;
-    protected final ManagedNewTransactionRunner txRunner;
-
-    private final EntityOwnershipUtils entityOwnershipUtils;
-
-    AbstractTunnelListenerBase(final DataBroker dataBroker,
-                               final LogicalDatastoreType logicalDatastoreType,
-                               final InstanceIdentifier<T> instanceIdentifier,
-                               final DpnTepStateCache dpnTepStateCache,
-                               final DPNTEPsInfoCache dpntePsInfoCache,
-                               final UnprocessedNodeConnectorCache unprocessedNodeConnectorCache,
-                               final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache,
-                               final EntityOwnershipUtils entityOwnershipUtils,
-                               final DirectTunnelUtils directTunnelUtils) {
-        super(dataBroker, logicalDatastoreType, instanceIdentifier);
-        this.dpnTepStateCache = dpnTepStateCache;
-        this.dpntePsInfoCache = dpntePsInfoCache;
-        this.unprocessedNCCache = unprocessedNodeConnectorCache;
-        this.unprocessedNodeConnectorEndPointCache = unprocessedNodeConnectorEndPointCache;
-        this.entityOwnershipUtils = entityOwnershipUtils;
-        this.directTunnelUtils = directTunnelUtils;
-        this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
-    }
-
-    public boolean entityOwner() {
-        return entityOwnershipUtils.isEntityOwner(ITMConstants.ITM_CONFIG_ENTITY, ITMConstants.ITM_CONFIG_ENTITY);
-    }
-
-    public List<ListenableFuture<Void>> addState(InstanceIdentifier<FlowCapableNodeConnector> key,
-                                                 String interfaceName, FlowCapableNodeConnector fcNodeConnectorNew)
-            throws ExecutionException, InterruptedException, OperationFailedException {
-        NodeConnectorInfo nodeConnectorInfo = new NodeConnectorInfoBuilder().setNodeConnectorId(key)
-                .setNodeConnector(fcNodeConnectorNew).build();
-        // Retrieve Port No from nodeConnectorId
-        NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
-        long portNo = DirectTunnelUtils.getPortNumberFromNodeConnectorId(nodeConnectorId);
-        if (portNo == ITMConstants.INVALID_PORT_NO) {
-            LOG.error("Cannot derive port number, not proceeding with Interface State "
-                    + "addition for interface: {}", interfaceName);
-            return Collections.emptyList();
-        }
-
-        LOG.info("adding interface state to Oper DS for interface: {}", interfaceName);
-
-        Interface.OperStatus operStatus = Interface.OperStatus.Up;
-        Interface.AdminStatus adminStatus = Interface.AdminStatus.Up;
-
-        TunnelEndPointInfo tunnelEndPointInfo;
-        DpnTepInterfaceInfo dpnTepConfigInfo = null;
-        List<ListenableFuture<Void>> futures = new ArrayList<>();
-
-        // Fetch the interface/Tunnel from config DS if exists
-        // If it doesnt exists then "park" the processing and comeback to it when the data is available and
-        // this will be triggered by the corres. listener. Caching and de-caching has to be synchronized.
-        try {
-            directTunnelUtils.getTunnelLocks().lock(interfaceName);
-            tunnelEndPointInfo = dpnTepStateCache.getTunnelEndPointInfoFromCache(interfaceName);
-
-            if (tunnelEndPointInfo != null) {
-                BigInteger srcDpnId = new BigInteger(tunnelEndPointInfo.getSrcEndPointInfo());
-                BigInteger dpnId = DirectTunnelUtils.getDpnFromNodeConnectorId(nodeConnectorId);
-                if (srcDpnId.compareTo(dpnId) != 0) {
-                    //This is a preventive measure to check if the node connector is coming from the switch
-                    // to which the tunnel was pushed. If it came from wrong switch due to duplicate tunnel
-                    // then drop the node connector event.
-                    LOG.error("The Source DPN ID {} from ITM Config does not match with the DPN ID {},"
-                                    + "fetched from NodeConnector Add event. Returning here.",
-                            srcDpnId, dpnId);
-                    return Collections.emptyList();
-                }
-                dpnTepConfigInfo = dpnTepStateCache.getDpnTepInterface(
-                        new BigInteger(tunnelEndPointInfo.getSrcEndPointInfo()),
-                        new BigInteger(tunnelEndPointInfo.getDstEndPointInfo()));
-            }
-            if (tunnelEndPointInfo == null || dpnTepConfigInfo == null) {
-                LOG.info("Unable to process the NodeConnector ADD event for {} as Config not available."
-                        + "Hence parking it", interfaceName);
-                unprocessedNCCache.add(interfaceName, nodeConnectorInfo);
-                return Collections.emptyList();
-            }
-        } finally {
-            directTunnelUtils.getTunnelLocks().unlock(interfaceName);
-        }
-        StateTunnelList stateTnl = addStateEntry(tunnelEndPointInfo, interfaceName,
-                operStatus, adminStatus, nodeConnectorInfo);
-
-        // This will be only tunnel If so not required
-        // If this interface is a tunnel interface, create the tunnel ingress flow,
-        // and start tunnel monitoring
-        if (stateTnl != null) {
-            futures.add(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
-                tx -> handleTunnelMonitoringAddition(tx, nodeConnectorId, stateTnl.getIfIndex(), interfaceName,
-                            portNo)));
-        }
-        return futures;
-    }
-
-    private StateTunnelList addStateEntry(TunnelEndPointInfo tunnelEndPointInfo, String interfaceName,
-                                          Interface.OperStatus operStatus, Interface.AdminStatus adminStatus,
-                                          NodeConnectorInfo nodeConnectorInfo)
-            throws ExecutionException, InterruptedException, OperationFailedException {
-        LOG.debug("Start addStateEntry adding interface state for {}", interfaceName);
-        final StateTunnelListBuilder stlBuilder = new StateTunnelListBuilder();
-        Class<? extends TunnelTypeBase> tunnelType;
-        java.util.Optional<DPNTEPsInfo> srcDpnTepsInfo;
-        java.util.Optional<DPNTEPsInfo> dstDpnTePsInfo;
-
-        // Retrieve Port No from nodeConnectorId
-        InstanceIdentifier<FlowCapableNodeConnector> key = nodeConnectorInfo.getNodeConnectorId();
-        NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
-
-        final long portNo = DirectTunnelUtils.getPortNumberFromNodeConnectorId(nodeConnectorId);
-        DpnTepInterfaceInfo dpnTepInfo = dpnTepStateCache.getDpnTepInterface(
-                new BigInteger(tunnelEndPointInfo.getSrcEndPointInfo()),
-                new BigInteger(tunnelEndPointInfo.getDstEndPointInfo()));
-        LOG.debug("Source Dpn TEP Interface Info {}", dpnTepInfo);
-        tunnelType = dpnTepInfo.getTunnelType();
-
-        try {
-            directTunnelUtils.getTunnelLocks().lock(tunnelEndPointInfo.getSrcEndPointInfo());
-            srcDpnTepsInfo = dpntePsInfoCache
-                    .getDPNTepFromDPNId(new BigInteger(tunnelEndPointInfo.getSrcEndPointInfo()));
-            if (!srcDpnTepsInfo.isPresent()) {
-                LOG.info("Unable to add State for tunnel {}. Hence Parking with key {}",
-                        interfaceName, tunnelEndPointInfo.getSrcEndPointInfo());
-                unprocessedNodeConnectorEndPointCache.add(tunnelEndPointInfo.getSrcEndPointInfo(), nodeConnectorInfo);
-            }
-        } finally {
-            directTunnelUtils.getTunnelLocks().unlock(tunnelEndPointInfo.getSrcEndPointInfo());
-        }
-
-        try {
-            directTunnelUtils.getTunnelLocks().lock(tunnelEndPointInfo.getDstEndPointInfo());
-            dstDpnTePsInfo = dpntePsInfoCache
-                    .getDPNTepFromDPNId(new BigInteger(tunnelEndPointInfo.getDstEndPointInfo()));
-            if (!dstDpnTePsInfo.isPresent()) {
-                LOG.info("Unable to add State for tunnel {}. Hence Parking with key {}",
-                        interfaceName, tunnelEndPointInfo.getDstEndPointInfo());
-                unprocessedNodeConnectorEndPointCache.add(tunnelEndPointInfo.getDstEndPointInfo(), nodeConnectorInfo);
-            }
-        } finally {
-            directTunnelUtils.getTunnelLocks().unlock(tunnelEndPointInfo.getDstEndPointInfo());
-        }
-
-        if (!(srcDpnTepsInfo.isPresent() && dstDpnTePsInfo.isPresent())) {
-            return null;
-        }
-        // Now do the entity owner check as all data to process the event is available
-        if (!entityOwner()) {
-            return null;
-        }
-
-        final SrcInfoBuilder srcInfoBuilder =
-                new SrcInfoBuilder().setTepDeviceId(tunnelEndPointInfo.getSrcEndPointInfo());
-        final DstInfoBuilder dstInfoBuilder =
-                new DstInfoBuilder().setTepDeviceId(tunnelEndPointInfo.getDstEndPointInfo());
-        LOG.debug("Source Dpn TEP Info {}", srcDpnTepsInfo);
-        TunnelEndPoints srcEndPtInfo = srcDpnTepsInfo.get().getTunnelEndPoints().get(0);
-        srcInfoBuilder.setTepIp(srcEndPtInfo.getIpAddress());
-        // As ITM Direct Tunnels deals with only Internal Tunnels.
-        // Relook at this when it deals with external as well
-        srcInfoBuilder.setTepDeviceType(TepTypeInternal.class);
-
-        LOG.debug("Dest Dpn TEP Info {}", dstDpnTePsInfo);
-        TunnelEndPoints dstEndPtInfo = dstDpnTePsInfo.get().getTunnelEndPoints().get(0);
-        dstInfoBuilder.setTepIp(dstEndPtInfo.getIpAddress());
-        // As ITM Direct Tunnels deals with only Internal Tunnels.
-        // Relook at this when it deals with external as well
-        dstInfoBuilder.setTepDeviceType(TepTypeInternal.class);
-
-        // ITM Direct Tunnels NOT SETTING THE TEP TYPe coz its not available. CHECK IF REQUIRED
-        TunnelOperStatus tunnelOperStatus = DirectTunnelUtils.convertInterfaceToTunnelOperState(operStatus);
-        boolean tunnelState = operStatus.equals(Interface.OperStatus.Up);
-
-        StateTunnelListKey tlKey = new StateTunnelListKey(interfaceName);
-        stlBuilder.withKey(tlKey)
-                .setOperState(tunnelOperStatus).setTunnelState(tunnelState)
-                .setDstInfo(dstInfoBuilder.build()).setSrcInfo(srcInfoBuilder.build()).setTransportType(tunnelType)
-                .setPortNumber(String.valueOf(portNo));
-        int ifIndex;
-        ifIndex = directTunnelUtils.allocateId(ITMConstants.ITM_IDPOOL_NAME, interfaceName);
-        createLportTagInterfaceMap(interfaceName, ifIndex);
-        stlBuilder.setIfIndex(ifIndex);
-        InstanceIdentifier<StateTunnelList> stListId = ItmUtils.buildStateTunnelListId(tlKey);
-        LOG.trace("Batching the Creation of tunnel_state: {} for Id: {}", stlBuilder.build(), stListId);
-        ITMBatchingUtils.write(stListId, stlBuilder.build(), ITMBatchingUtils.EntityType.DEFAULT_OPERATIONAL);
-        return stlBuilder.build();
-    }
-
-    private void handleTunnelMonitoringAddition(TypedWriteTransaction<Datastore.Configuration> tx,
-        NodeConnectorId nodeConnectorId, Integer ifindex, String interfaceName, long portNo) {
-        BigInteger dpId = DirectTunnelUtils.getDpnFromNodeConnectorId(nodeConnectorId);
-        directTunnelUtils.addTunnelIngressFlow(tx, dpId, portNo, interfaceName,
-                ifindex);
-    }
-
-    private void createLportTagInterfaceMap(String infName, Integer ifIndex) {
-        LOG.debug("creating lport tag to interface map for {}", infName);
-        InstanceIdentifier<IfIndexTunnel> id = InstanceIdentifier.builder(IfIndexesTunnelMap.class)
-                .child(IfIndexTunnel.class, new IfIndexTunnelKey(ifIndex)).build();
-        IfIndexTunnel ifIndexInterface = new IfIndexTunnelBuilder().setIfIndex(ifIndex)
-                .withKey(new IfIndexTunnelKey(ifIndex)).setInterfaceName(infName).build();
-        ITMBatchingUtils.write(id, ifIndexInterface, ITMBatchingUtils.EntityType.DEFAULT_OPERATIONAL);
-    }
-
-    protected class InterfaceStateAddWorkerForUnprocessedNC implements Callable<List<ListenableFuture<Void>>> {
-        private final InstanceIdentifier<FlowCapableNodeConnector> key;
-        private final FlowCapableNodeConnector fcNodeConnectorNew;
-        private final String interfaceName;
-
-        InterfaceStateAddWorkerForUnprocessedNC(InstanceIdentifier<FlowCapableNodeConnector> key,
-                                                FlowCapableNodeConnector fcNodeConnectorNew, String portName) {
-            this.key = key;
-            this.fcNodeConnectorNew = fcNodeConnectorNew;
-            this.interfaceName = portName;
-        }
-
-        @Override
-        public List<ListenableFuture<Void>> call() throws Exception {
-            // If another renderer(for eg : OVS) needs to be supported, check can be performed here
-            // to call the respective helpers.
-            return addState(key, interfaceName, fcNodeConnectorNew);
-        }
-
-        @Override
-        public String toString() {
-            return "InterfaceStateAddWorkerForUnprocessedNC{"
-                    + "fcNodeConnectorIdentifier=" + key
-                    + ", fcNodeConnectorNew=" + fcNodeConnectorNew
-                    + ", interfaceName='" + interfaceName + '\''
-                    + '}';
-        }
-    }
-}
\ No newline at end of file
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepStateListener.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepStateListener.java
deleted file mode 100644 (file)
index 40b3926..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.genius.itm.itmdirecttunnels.listeners;
-
-import static org.opendaylight.genius.itm.impl.ItmUtils.nullToEmpty;
-
-import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
-import org.opendaylight.genius.itm.cache.DpnTepStateCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
-import org.opendaylight.genius.itm.globals.ITMConstants;
-import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
-import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
-import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnTepsState;
-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.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DpnTepStateListener extends AbstractTunnelListenerBase<DpnsTeps> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(DpnTepStateListener.class);
-
-    private final JobCoordinator coordinator;
-
-    public DpnTepStateListener(final DataBroker dataBroker,
-                               final JobCoordinator coordinator,
-                               final EntityOwnershipUtils entityOwnershipUtils,
-                               final DpnTepStateCache dpnTepStateCache,
-                               final DPNTEPsInfoCache dpntePsInfoCache,
-                               final UnprocessedNodeConnectorCache unprocessedNodeConnectorCache,
-                               final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache,
-                               final DirectTunnelUtils directTunnelUtils) {
-        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                InstanceIdentifier.create(DpnTepsState.class).child(DpnsTeps.class),
-                dpnTepStateCache, dpntePsInfoCache, unprocessedNodeConnectorCache,
-                unprocessedNodeConnectorEndPointCache, entityOwnershipUtils,
-                directTunnelUtils);
-        this.coordinator = coordinator;
-        super.register();
-    }
-
-    @Override
-    public void add(@Nonnull InstanceIdentifier<DpnsTeps> instanceIdentifier, @Nonnull DpnsTeps dpnsTeps) {
-        if (!entityOwner()) {
-            return;
-        }
-        for (RemoteDpns remoteDpns : nullToEmpty(dpnsTeps.getRemoteDpns())) {
-            //Process the unprocessed NodeConnector for the Tunnel, if present in the UnprocessedNodeConnectorCache
-            // This may run in all node as its ClusteredDTCN but cache will be populated in only the Entity owner
-            String tunnelName = remoteDpns.getTunnelName();
-            try {
-                directTunnelUtils.getTunnelLocks().lock(tunnelName);
-                NodeConnectorInfo nodeConnectorInfo = unprocessedNCCache.remove(tunnelName);
-                if (nodeConnectorInfo != null) {
-                    LOG.info("Processing the Unprocessed NodeConnector for Tunnel {}", tunnelName);
-                    // Queue the IntefaceAddWorkerForUnprocessNC in DJC
-                    String portName = nodeConnectorInfo.getNodeConnector().getName();
-                    InterfaceStateAddWorkerForUnprocessedNC ifStateAddWorker =
-                            new InterfaceStateAddWorkerForUnprocessedNC(nodeConnectorInfo.getNodeConnectorId(),
-                                    nodeConnectorInfo.getNodeConnector(), portName);
-                    coordinator.enqueueJob(portName, ifStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
-                }
-            } finally {
-                directTunnelUtils.getTunnelLocks().unlock(tunnelName);
-            }
-        }
-    }
-}
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepsInfoListener.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/listeners/DpnTepsInfoListener.java
deleted file mode 100644 (file)
index 103836e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.genius.itm.itmdirecttunnels.listeners;
-
-import java.util.Collection;
-import javax.annotation.Nonnull;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
-import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
-import org.opendaylight.genius.itm.cache.DpnTepStateCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
-import org.opendaylight.genius.itm.globals.ITMConstants;
-import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
-import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
-import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
-import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnEndpoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.endpoints.DPNTEPsInfo;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DpnTepsInfoListener extends AbstractTunnelListenerBase<DPNTEPsInfo> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(DpnTepsInfoListener.class);
-
-    private final JobCoordinator coordinator;
-    private final IInterfaceManager interfaceManager;
-
-    public DpnTepsInfoListener(final DataBroker dataBroker,
-                               final JobCoordinator coordinator,
-                               final EntityOwnershipUtils entityOwnershipUtils,
-                               final DpnTepStateCache dpnTepStateCache,
-                               final DPNTEPsInfoCache dpntePsInfoCache,
-                               final UnprocessedNodeConnectorCache unprocessedNodeConnectorCache,
-                               final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache,
-                               final IInterfaceManager interfaceManager,
-                               final DirectTunnelUtils directTunnelUtils) {
-        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
-                InstanceIdentifier.create(DpnEndpoints.class).child(DPNTEPsInfo.class),
-                dpnTepStateCache, dpntePsInfoCache, unprocessedNodeConnectorCache,
-                unprocessedNodeConnectorEndPointCache, entityOwnershipUtils,
-                directTunnelUtils);
-        this.coordinator = coordinator;
-        this.interfaceManager = interfaceManager;
-        super.register();
-    }
-
-    @Override
-    public void add(@Nonnull InstanceIdentifier<DPNTEPsInfo> instanceIdentifier, @Nonnull DPNTEPsInfo dpnTepsInfo) {
-        LOG.trace("DPN Teps Info Add {}", dpnTepsInfo);
-        if (interfaceManager.isItmDirectTunnelsEnabled()) {
-            //Process the unprocessed NodeConnector for the Tunnel, if present in the UnprocessedNodeConnectorEndPtCache
-            // This may run in all node as its ClusteredDTCN but cache will be populated in only the Entity owner
-            String dpnId = dpnTepsInfo.getDPNID().toString();
-            try {
-                directTunnelUtils.getTunnelLocks().lock(dpnId);
-                Collection<NodeConnectorInfo> nodeConnectorInfoList = unprocessedNodeConnectorEndPointCache.get(dpnId);
-                if (nodeConnectorInfoList != null) {
-                    for (NodeConnectorInfo ncInfo : nodeConnectorInfoList) {
-                        LOG.info("Processing the Unprocessed NodeConnector for Tunnel {}", ncInfo
-                                .getNodeConnector().getName());
-                        // Queue the InterfaceStateAddWorker in DJC
-
-                        String portName = ncInfo.getNodeConnector().getName();
-                        InterfaceStateAddWorkerForUnprocessedNC ifStateAddWorker =
-                                new InterfaceStateAddWorkerForUnprocessedNC(ncInfo.getNodeConnectorId(),
-                                        ncInfo.getNodeConnector(), portName);
-                        coordinator.enqueueJob(portName, ifStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
-                        // Remove the NodeConnector Entry from UnprocessedNodeConnectorEndPt Map
-                        unprocessedNodeConnectorEndPointCache.remove(dpnId, ncInfo);
-                    }
-                }
-            } finally {
-                directTunnelUtils.getTunnelLocks().unlock(dpnId);
-            }
-        }
-    }
-}
index 4148dc71b6573d8bbb2ce9ef3b866980e01fafae..8dfab117740edcced8cbfa03806428d4658beaf8 100644 (file)
@@ -33,11 +33,16 @@ import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
 import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.itm.impl.ItmUtils;
 import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorker;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.TunnelStateAddWorkerForNodeConnector;
 import org.opendaylight.genius.itm.utils.DpnTepInterfaceInfo;
 import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
 import org.opendaylight.genius.itm.utils.NodeConnectorInfoBuilder;
-import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
+import org.opendaylight.genius.itm.utils.TunnelEndPointInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfoBuilder;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredSyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
@@ -57,31 +62,39 @@ import org.slf4j.LoggerFactory;
  * This Class is a Data Change Listener for FlowCapableNodeConnector updates.
  * This creates an entry in the tunnels-state OperDS for every node-connector used.
  */
-public class TunnelInventoryStateListener extends AbstractTunnelListenerBase<FlowCapableNodeConnector> {
+public class TunnelInventoryStateListener extends
+    AbstractClusteredSyncDataTreeChangeListener<FlowCapableNodeConnector> {
 
     private static final Logger LOG = LoggerFactory.getLogger(TunnelInventoryStateListener.class);
 
     private final JobCoordinator coordinator;
     private final ManagedNewTransactionRunner txRunner;
     private final TunnelStateCache tunnelStateCache;
+    private final DpnTepStateCache dpnTepStateCache;
+    private final DPNTEPsInfoCache dpntePsInfoCache;
+    private final UnprocessedNodeConnectorCache unprocessedNCCache;
+    private final UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
+    private final DirectTunnelUtils directTunnelUtils;
 
     public TunnelInventoryStateListener(final DataBroker dataBroker,
                                         final JobCoordinator coordinator,
-                                        final EntityOwnershipUtils entityOwnershipUtils,
                                         final TunnelStateCache tunnelStateCache,
                                         final DpnTepStateCache dpnTepStateCache,
                                         final DPNTEPsInfoCache dpntePsInfoCache,
                                         final UnprocessedNodeConnectorCache unprocessedNCCache,
                                         final UnprocessedNodeConnectorEndPointCache
-                                                unprocessedNodeConnectorEndPointCache,
+                                            unprocessedNodeConnectorEndPointCache,
                                         final DirectTunnelUtils directTunnelUtils) {
         super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class).child(Node.class)
-                .child(NodeConnector.class).augmentation(FlowCapableNodeConnector.class), dpnTepStateCache,
-                dpntePsInfoCache, unprocessedNCCache,
-                unprocessedNodeConnectorEndPointCache, entityOwnershipUtils, directTunnelUtils);
+            .child(NodeConnector.class).augmentation(FlowCapableNodeConnector.class));
         this.coordinator = coordinator;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.tunnelStateCache = tunnelStateCache;
+        this.dpnTepStateCache = dpnTepStateCache;
+        this.dpntePsInfoCache = dpntePsInfoCache;
+        this.unprocessedNCCache = unprocessedNCCache;
+        this.unprocessedNodeConnectorEndPointCache = unprocessedNodeConnectorEndPointCache;
+        this.directTunnelUtils = directTunnelUtils;
         super.register();
     }
 
@@ -105,7 +118,7 @@ public class TunnelInventoryStateListener extends AbstractTunnelListenerBase<Flo
                 return;
             }
         }
-        if (!entityOwner()) {
+        if (!directTunnelUtils.isEntityOwner()) {
             return;
         }
         LOG.debug("Received NodeConnector Remove Event: {}, {}", key, flowCapableNodeConnector);
@@ -133,7 +146,7 @@ public class TunnelInventoryStateListener extends AbstractTunnelListenerBase<Flo
             LOG.debug("Node Connector Update {} Interface is not a internal tunnel I/f, so no-op", portName);
             return;
         }
-        if (fcNodeConnectorNew.getReason() == PortReason.Delete || !entityOwner()) {
+        if (fcNodeConnectorNew.getReason() == PortReason.Delete || !directTunnelUtils.isEntityOwner()) {
             return;
         }
         LOG.debug("Received NodeConnector Update Event: {}, {}, {}", key, fcNodeConnectorOld, fcNodeConnectorNew);
@@ -146,32 +159,65 @@ public class TunnelInventoryStateListener extends AbstractTunnelListenerBase<Flo
     @Override
     public void add(@Nonnull InstanceIdentifier<FlowCapableNodeConnector> key,
                     @Nonnull FlowCapableNodeConnector fcNodeConnectorNew) {
+        LOG.info("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
         String portName = fcNodeConnectorNew.getName();
-        LOG.debug("InterfaceInventoryState ADD for {}", portName);
         // Return if its not tunnel port and if its not Internal
         if (!DirectTunnelUtils.TUNNEL_PORT_PREDICATE.test(portName)) {
             LOG.debug("Node Connector Add {} Interface is not a tunnel I/f, so no-op", portName);
             return;
         }
-        if (!dpnTepStateCache.isConfigAvailable(portName)) {
-            // Park the notification
-            LOG.debug("Unable to process the NodeConnector ADD event for {} as Config not available."
+        NodeConnectorInfo nodeConnectorInfo =
+            new NodeConnectorInfoBuilder().setNodeConnectorId(key).setNodeConnector(fcNodeConnectorNew).build();
+        TunnelStateInfo tunnelStateInfo = null;
+        TunnelEndPointInfo tunnelEndPtInfo = null;
+        try {
+            directTunnelUtils.getTunnelLocks().lock(portName);
+            if (!dpnTepStateCache.isConfigAvailable(portName)) {
+                // Park the notification
+                LOG.debug("Unable to process the NodeConnector ADD event for {} as Config not available."
                     + "Hence parking it", portName);
-            NodeConnectorInfo nodeConnectorInfo = new NodeConnectorInfoBuilder().setNodeConnectorId(key)
-                    .setNodeConnector(fcNodeConnectorNew).build();
-            unprocessedNCCache.add(portName, nodeConnectorInfo);
-            return;
-        } else if (!dpnTepStateCache.isInternal(portName)) {
-            LOG.debug("{} Interface is not a internal tunnel I/f, so no-op", portName);
-            return;
+                unprocessedNCCache.add(portName,
+                    new TunnelStateInfoBuilder().setNodeConnectorInfo(nodeConnectorInfo).build());
+                return;
+            } else if (!dpnTepStateCache.isInternal(portName)) {
+                LOG.debug("{} Interface is not a internal tunnel I/f, so no-op", portName);
+                return;
+            }
+        } finally {
+            directTunnelUtils.getTunnelLocks().unlock(portName);
         }
 
-        LOG.debug("Received NodeConnector Add Event: {}, {}", key, fcNodeConnectorNew);
-        // NodeConnectorId nodeConnectorId =
-        // InstanceIdentifier.keyOf(key.firstIdentifierOf(NodeConnector.class)).getId();
-        TunnelInterfaceStateAddWorker ifStateAddWorker =
-                new TunnelInterfaceStateAddWorker(key, fcNodeConnectorNew, portName);
-        coordinator.enqueueJob(portName, ifStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
+        if (DirectTunnelUtils.TUNNEL_PORT_PREDICATE.test(portName) && dpnTepStateCache.isInternal(portName)) {
+            tunnelEndPtInfo = dpnTepStateCache.getTunnelEndPointInfoFromCache(portName);
+            TunnelStateInfoBuilder builder = new TunnelStateInfoBuilder().setNodeConnectorInfo(nodeConnectorInfo);
+            dpntePsInfoCache.getDPNTepFromDPNId(new BigInteger(tunnelEndPtInfo.getSrcEndPointInfo()))
+                .ifPresent(builder::setSrcDpnTepsInfo);
+            dpntePsInfoCache.getDPNTepFromDPNId(new BigInteger(tunnelEndPtInfo.getDstEndPointInfo()))
+                .ifPresent(builder::setDstDpnTepsInfo);
+            tunnelStateInfo = builder.setTunnelEndPointInfo(tunnelEndPtInfo)
+                .setDpnTepInterfaceInfo(dpnTepStateCache.getTunnelFromCache(portName)).build();
+            if (tunnelStateInfo.getSrcDpnTepsInfo() == null) {
+                directTunnelUtils.getTunnelLocks().lock(tunnelEndPtInfo.getSrcEndPointInfo());
+                LOG.debug("Source DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                        portName, tunnelEndPtInfo.getSrcEndPointInfo());
+                unprocessedNodeConnectorEndPointCache.add(tunnelEndPtInfo.getSrcEndPointInfo(), tunnelStateInfo);
+                directTunnelUtils.getTunnelLocks().unlock(tunnelEndPtInfo.getSrcEndPointInfo());
+            }
+            if (tunnelStateInfo.getDstDpnTepsInfo() == null) {
+                directTunnelUtils.getTunnelLocks().lock(tunnelEndPtInfo.getDstEndPointInfo());
+                LOG.debug("Destination DPNTepsInfo is null for tunnel {}. Hence Parking with key {}",
+                        portName, tunnelEndPtInfo.getDstEndPointInfo());
+                unprocessedNodeConnectorEndPointCache.add(tunnelEndPtInfo.getDstEndPointInfo(), tunnelStateInfo);
+                directTunnelUtils.getTunnelLocks().unlock(tunnelEndPtInfo.getDstEndPointInfo());
+            }
+        }
+
+        if (tunnelEndPtInfo != null && tunnelStateInfo.getSrcDpnTepsInfo() != null
+            && tunnelStateInfo.getDstDpnTepsInfo() != null && directTunnelUtils.isEntityOwner()) {
+            coordinator.enqueueJob(portName,
+                new TunnelStateAddWorkerForNodeConnector(new TunnelStateAddWorker(directTunnelUtils, txRunner),
+                    tunnelStateInfo), ITMConstants.JOB_MAX_RETRIES);
+        }
     }
 
     private List<ListenableFuture<Void>> updateState(String interfaceName,
@@ -305,32 +351,6 @@ public class TunnelInventoryStateListener extends AbstractTunnelListenerBase<Flo
         return futures;
     }
 
-    private class TunnelInterfaceStateAddWorker implements Callable {
-        private final InstanceIdentifier<FlowCapableNodeConnector> key;
-        private final FlowCapableNodeConnector fcNodeConnectorNew;
-        private final String interfaceName;
-
-        TunnelInterfaceStateAddWorker(InstanceIdentifier<FlowCapableNodeConnector> key,
-                                      FlowCapableNodeConnector fcNodeConnectorNew, String portName) {
-            this.key = key;
-            this.fcNodeConnectorNew = fcNodeConnectorNew;
-            this.interfaceName = portName;
-        }
-
-        @Override
-        public Object call() throws Exception {
-            // If another renderer(for eg : OVS) needs to be supported, check can be performed here
-            // to call the respective helpers.
-            return addState(key, interfaceName, fcNodeConnectorNew);
-        }
-
-        @Override
-        public String toString() {
-            return "TunnelInterfaceStateAddWorker{fcNodeConnectorIdentifier=" + key + ", fcNodeConnectorNew="
-                    + fcNodeConnectorNew + ", interfaceName='" + interfaceName + '\'' + '}';
-        }
-    }
-
     private class TunnelInterfaceStateUpdateWorker implements Callable {
         private final InstanceIdentifier<FlowCapableNodeConnector> key;
         private final FlowCapableNodeConnector fcNodeConnectorOld;
index 8c3d42a7a5723e0479b8a26ac7a3df2b560cebc0..2f3745cddd12dca6d3a5a80b2eb725546ce85ffc 100644 (file)
@@ -29,8 +29,6 @@ public class TunnelListenerCreator implements AutoCloseable {
 
     private static final Logger LOG = LoggerFactory.getLogger(TunnelListenerCreator.class);
 
-    private final DpnTepStateListener dpnTepStateListener;
-    private final DpnTepsInfoListener dpnTepsInfoListener;
     private final TunnelTopologyStateListener tunnelTopologyStateListener;
     private final TunnelInventoryStateListener tunnelInventoryStateListener;
     private final TerminationPointStateListener terminationPointStateListener;
@@ -50,29 +48,20 @@ public class TunnelListenerCreator implements AutoCloseable {
                                  final TunnelStateCache tunnelStateCache,
                                  final UnprocessedNodeConnectorCache unprocessedNodeConnectorCache,
                                  final UnprocessedNodeConnectorEndPointCache
-                                 unprocessedNodeConnectorEndPointCache) {
+                                    unprocessedNodeConnectorEndPointCache) {
         if (interfaceManager.isItmDirectTunnelsEnabled()) {
-            LOG.trace("ITM Direct Tunnels is enabled. Initializing the listeners");
-            this.dpnTepStateListener = new DpnTepStateListener(dataBroker, coordinator, entityOwnershipUtils,
-                    dpnTepStateCache, dpntePsInfoCache, unprocessedNodeConnectorCache,
-                    unprocessedNodeConnectorEndPointCache, directTunnelUtils);
-            this.dpnTepsInfoListener = new DpnTepsInfoListener(dataBroker, coordinator, entityOwnershipUtils,
-                    dpnTepStateCache, dpntePsInfoCache, unprocessedNodeConnectorCache,
-                    unprocessedNodeConnectorEndPointCache, interfaceManager, directTunnelUtils);
+            LOG.debug("ITM Direct Tunnels is enabled. Initializing the listeners");
             this.tunnelTopologyStateListener = new TunnelTopologyStateListener(dataBroker, coordinator,
-                    entityOwnershipUtils, directTunnelUtils, dpnTepStateCache, dpntePsInfoCache, ovsBridgeEntryCache,
-                    unprocessedNodeConnectorCache, unprocessedNodeConnectorEndPointCache);
+                directTunnelUtils, dpnTepStateCache, ovsBridgeEntryCache);
             this.tunnelInventoryStateListener = new TunnelInventoryStateListener(dataBroker, coordinator,
-                    entityOwnershipUtils, tunnelStateCache, dpnTepStateCache, dpntePsInfoCache,
-                    unprocessedNodeConnectorCache, unprocessedNodeConnectorEndPointCache, directTunnelUtils);
+                tunnelStateCache, dpnTepStateCache, dpntePsInfoCache, unprocessedNodeConnectorCache,
+                unprocessedNodeConnectorEndPointCache, directTunnelUtils);
             this.terminationPointStateListener = new TerminationPointStateListener(dataBroker, entityOwnershipUtils,
-                    coordinator, bfdStateCache, dpnTepStateCache,tunnelStateCache);
+                coordinator, bfdStateCache, dpnTepStateCache,tunnelStateCache);
             this.interfaceConfigListener = new InterfaceConfigListener(dataBroker, coordinator);
             this.internalTunnelListener = new InternalTunnelListener(dataBroker, coordinator);
         } else {
-            LOG.trace("ITM Direct Tunnels is disabled. Listeners are not registered");
-            this.dpnTepStateListener = null;
-            this.dpnTepsInfoListener = null;
+            LOG.debug("ITM Direct Tunnels is disabled. Listeners are not registered");
             this.tunnelTopologyStateListener = null;
             this.tunnelInventoryStateListener = null;
             this.terminationPointStateListener = null;
@@ -83,9 +72,6 @@ public class TunnelListenerCreator implements AutoCloseable {
 
     @Override
     public void close() throws Exception {
-        if (dpnTepStateListener != null) {
-            this.dpnTepStateListener.close();
-        }
         if (tunnelTopologyStateListener != null) {
             this.tunnelTopologyStateListener.close();
         }
index 13ddf7cede15b7e006dc123dd81aa1b5b992e522..bd812b905b58a8033e67e39f0b696735890e3fed 100644 (file)
@@ -19,15 +19,12 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
-import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
 import org.opendaylight.genius.itm.cache.DpnTepStateCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
-import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
 import org.opendaylight.genius.itm.globals.ITMConstants;
 import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
-import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredSyncDataTreeChangeListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.bridge.tunnel.info.OvsBridgeEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.bridge.tunnel.info.OvsBridgeEntryBuilder;
@@ -46,7 +43,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TunnelTopologyStateListener extends AbstractTunnelListenerBase<OvsdbBridgeAugmentation> {
+public class TunnelTopologyStateListener extends AbstractClusteredSyncDataTreeChangeListener<OvsdbBridgeAugmentation> {
 
     private static final Logger LOG = LoggerFactory.getLogger(TunnelTopologyStateListener.class);
 
@@ -54,23 +51,18 @@ public class TunnelTopologyStateListener extends AbstractTunnelListenerBase<Ovsd
     private final ManagedNewTransactionRunner txRunner;
     private final DirectTunnelUtils directTunnelUtils;
     private final OvsBridgeEntryCache ovsBridgeEntryCache;
+    protected final DpnTepStateCache dpnTepStateCache;
 
     public TunnelTopologyStateListener(final DataBroker dataBroker,
                                        final JobCoordinator coordinator,
-                                       final EntityOwnershipUtils entityOwnershipUtils,
                                        final DirectTunnelUtils directTunnelUtils,
                                        final DpnTepStateCache dpnTepStateCache,
-                                       final DPNTEPsInfoCache dpntePsInfoCache,
-                                       final OvsBridgeEntryCache ovsBridgeEntryCache,
-                                       final UnprocessedNodeConnectorCache unprocessedNodeConnectorCache,
-                                       final UnprocessedNodeConnectorEndPointCache
-                                               unprocessedNodeConnectorEndPointCache)  {
+                                       final OvsBridgeEntryCache ovsBridgeEntryCache)  {
         super(dataBroker, LogicalDatastoreType.OPERATIONAL,
                 InstanceIdentifier.create(NetworkTopology.class).child(Topology.class).child(Node.class)
-                        .augmentation(OvsdbBridgeAugmentation.class), dpnTepStateCache, dpntePsInfoCache,
-                unprocessedNodeConnectorCache, unprocessedNodeConnectorEndPointCache,
-                entityOwnershipUtils, directTunnelUtils);
+                        .augmentation(OvsdbBridgeAugmentation.class));
         this.coordinator = coordinator;
+        this.dpnTepStateCache = dpnTepStateCache;
         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
         this.directTunnelUtils = directTunnelUtils;
         this.ovsBridgeEntryCache = ovsBridgeEntryCache;
@@ -80,7 +72,7 @@ public class TunnelTopologyStateListener extends AbstractTunnelListenerBase<Ovsd
     @Override
     public void remove(@Nonnull InstanceIdentifier<OvsdbBridgeAugmentation> identifier,
                        @Nonnull OvsdbBridgeAugmentation bridgeOld) {
-        if (entityOwner()) {
+        if (directTunnelUtils.isEntityOwner()) {
             LOG.debug("Received Remove DataChange Notification for identifier: {}, ovsdbBridgeAugmentation: {}",
                     identifier, bridgeOld);
             TunnelRendererStateRemoveWorker rendererStateRemoveWorker =
@@ -94,7 +86,7 @@ public class TunnelTopologyStateListener extends AbstractTunnelListenerBase<Ovsd
     public void update(@Nonnull InstanceIdentifier<OvsdbBridgeAugmentation> identifier,
                        @Nonnull OvsdbBridgeAugmentation bridgeOld, @Nonnull OvsdbBridgeAugmentation bridgeNew) {
 
-        if (!entityOwner()) {
+        if (!directTunnelUtils.isEntityOwner()) {
             return;
         }
         LOG.debug("Received Update DataChange Notification for identifier: {}, + ovsdbBridgeAugmentation old: {},"
@@ -118,7 +110,7 @@ public class TunnelTopologyStateListener extends AbstractTunnelListenerBase<Ovsd
     @Override
     public void add(@Nonnull InstanceIdentifier<OvsdbBridgeAugmentation> identifier,
                     @Nonnull OvsdbBridgeAugmentation bridgeNew) {
-        if (entityOwner()) {
+        if (directTunnelUtils.isEntityOwner()) {
             LOG.debug("Received Add DataChange Notification for identifier: {}, ovsdbBridgeAugmentation: {}",
                     identifier, bridgeNew);
             TunnelRendererStateAddWorker rendererStateAddWorker =
index f74ed8a570d8e699b7ba2ac531ecb4741aed23fb..30e6a03ca71eba199863bf570dd1bd3cbcebcf48 100644 (file)
@@ -21,7 +21,6 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
@@ -39,6 +38,7 @@ import org.opendaylight.genius.mdsalutil.instructions.InstructionGotoTable;
 import org.opendaylight.genius.mdsalutil.instructions.InstructionWriteMetadata;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.genius.mdsalutil.matches.MatchInPort;
+import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.utils.concurrent.KeyedLocks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
@@ -169,11 +169,14 @@ public final class DirectTunnelUtils {
 
     private final IdManagerService idManagerService;
     private final IMdsalApiManager mdsalApiManager;
+    private final EntityOwnershipUtils entityOwnershipUtils;
 
     @Inject
-    public DirectTunnelUtils(final IdManagerService idManagerService, final IMdsalApiManager mdsalApiManager) {
+    public DirectTunnelUtils(final IdManagerService idManagerService, final IMdsalApiManager mdsalApiManager,
+                             final EntityOwnershipUtils entityOwnershipUtils) {
         this.idManagerService = idManagerService;
         this.mdsalApiManager = mdsalApiManager;
+        this.entityOwnershipUtils = entityOwnershipUtils;
     }
 
     public KeyedLocks<String> getTunnelLocks() {
@@ -522,4 +525,8 @@ public final class DirectTunnelUtils {
         tpBuilder.addAugmentation(OvsdbTerminationPointAugmentation.class, tpAugmentationBuilder.build());
         ITMBatchingUtils.update(tpIid, tpBuilder.build(), ITMBatchingUtils.EntityType.TOPOLOGY_CONFIG);
     }
-}
+
+    public boolean isEntityOwner() {
+        return entityOwnershipUtils.isEntityOwner(ITMConstants.ITM_CONFIG_ENTITY, ITMConstants.ITM_CONFIG_ENTITY);
+    }
+}
\ No newline at end of file
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorker.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorker.java
new file mode 100644 (file)
index 0000000..274fc38
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.itmdirecttunnels.workers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.genius.infra.Datastore;
+import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
+import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
+import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.impl.ITMBatchingUtils;
+import org.opendaylight.genius.itm.impl.ItmUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.itm.utils.DpnTepInterfaceInfo;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210.IfIndexesTunnelMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnel;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnelBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.meta.rev171210._if.indexes.tunnel.map.IfIndexTunnelKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelOperStatus;
+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.tunnels_state.StateTunnelList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelListBuilder;
+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.op.rev160406.tunnels_state.state.tunnel.list.DstInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.state.tunnel.list.SrcInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnector;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.OperationFailedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class TunnelStateAddWorker {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TunnelStateAddWorker.class);
+
+    private final DirectTunnelUtils directTunnelUtils;
+    private final ManagedNewTransactionRunner txRunner;
+
+    public TunnelStateAddWorker(final DirectTunnelUtils directTunnelUtils, final ManagedNewTransactionRunner txRunner) {
+        this.directTunnelUtils = directTunnelUtils;
+        this.txRunner = txRunner;
+    }
+
+    public List<ListenableFuture<Void>> addState(TunnelStateInfo tunnelStateInfo)
+            throws ExecutionException, InterruptedException, OperationFailedException {
+
+        // When this method is invoked, all parameters necessary should be available
+        // Retrieve Port No from nodeConnectorId
+        NodeConnectorId nodeConnectorId = InstanceIdentifier.keyOf(tunnelStateInfo.getNodeConnectorInfo()
+                .getNodeConnectorId().firstIdentifierOf(NodeConnector.class)).getId();
+        String interfaceName = tunnelStateInfo.getNodeConnectorInfo().getNodeConnector().getName();
+        long portNo = DirectTunnelUtils.getPortNumberFromNodeConnectorId(nodeConnectorId);
+        if (portNo == ITMConstants.INVALID_PORT_NO) {
+            LOG.error("Cannot derive port number, not proceeding with Interface State addition for interface: {}",
+                interfaceName);
+            return Collections.emptyList();
+        }
+
+        LOG.info("adding interface state to Oper DS for interface: {}", interfaceName);
+
+        // Fetch the interface/Tunnel from config DS if exists
+        // If it doesnt exists then "park" the processing and comeback to it when the data is available and
+        // this will be triggered by the corres. listener. Caching and de-caching has to be synchronized.
+        StateTunnelList stateTnl = addStateEntry(interfaceName, portNo, tunnelStateInfo);
+
+        // This will be only tunnel If so not required
+        // If this interface is a tunnel interface, create the tunnel ingress flow,
+        // and start tunnel monitoring
+        if (stateTnl != null) {
+            return Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(Datastore.CONFIGURATION,
+                tx -> directTunnelUtils.addTunnelIngressFlow(tx,
+                    DirectTunnelUtils.getDpnFromNodeConnectorId(nodeConnectorId), portNo, interfaceName,
+                    stateTnl.getIfIndex())));
+        }
+        return Collections.emptyList();
+    }
+
+    private StateTunnelList addStateEntry(String interfaceName, long portNo, TunnelStateInfo tunnelStateInfo)
+            throws ExecutionException, InterruptedException, OperationFailedException {
+        LOG.debug("Start addStateEntry adding interface state for {}", interfaceName);
+        final StateTunnelListBuilder stlBuilder = new StateTunnelListBuilder();
+        Class<? extends TunnelTypeBase> tunnelType;
+        DPNTEPsInfo srcDpnTepsInfo = tunnelStateInfo.getSrcDpnTepsInfo();
+
+        DpnTepInterfaceInfo dpnTepInfo = tunnelStateInfo.getDpnTepInterfaceInfo();
+        LOG.debug("Source Dpn TEP Interface Info {}", dpnTepInfo);
+        tunnelType = dpnTepInfo.getTunnelType();
+
+        final SrcInfoBuilder srcInfoBuilder =
+                new SrcInfoBuilder().setTepDeviceId(tunnelStateInfo.getTunnelEndPointInfo().getSrcEndPointInfo());
+        final DstInfoBuilder dstInfoBuilder =
+                new DstInfoBuilder().setTepDeviceId(tunnelStateInfo.getTunnelEndPointInfo().getDstEndPointInfo());
+        LOG.trace("Source Dpn TEP Info {}",srcDpnTepsInfo);
+        TunnelEndPoints srcEndPtInfo = srcDpnTepsInfo.getTunnelEndPoints().get(0);
+        srcInfoBuilder.setTepIp(srcEndPtInfo.getIpAddress());
+        // As ITM Direct Tunnels deals with only Internal Tunnels.
+        // Relook at this when it deals with external as well
+        srcInfoBuilder.setTepDeviceType(TepTypeInternal.class);
+
+        DPNTEPsInfo dstDpnTePsInfo = tunnelStateInfo.getDstDpnTepsInfo();
+        LOG.trace("Dest Dpn TEP Info {}", dstDpnTePsInfo);
+        TunnelEndPoints dstEndPtInfo = dstDpnTePsInfo.getTunnelEndPoints().get(0);
+        dstInfoBuilder.setTepIp(dstEndPtInfo.getIpAddress());
+        // As ITM Direct Tunnels deals with only Internal Tunnels.
+        // Relook at this when it deals with external as well
+        dstInfoBuilder.setTepDeviceType(TepTypeInternal.class);
+
+        Interface.OperStatus operStatus = Interface.OperStatus.Up;
+
+        // ITM Direct Tunnels NOT SETTING THE TEP TYPe coz its not available. CHECK IF REQUIRED
+        TunnelOperStatus tunnelOperStatus = DirectTunnelUtils.convertInterfaceToTunnelOperState(operStatus);
+        boolean tunnelState = operStatus.equals(Interface.OperStatus.Up);
+
+        StateTunnelListKey tlKey = new StateTunnelListKey(interfaceName);
+        stlBuilder.withKey(tlKey).setOperState(tunnelOperStatus).setTunnelState(tunnelState)
+        .setDstInfo(dstInfoBuilder.build()).setSrcInfo(srcInfoBuilder.build()).setTransportType(tunnelType)
+        .setPortNumber(String.valueOf(portNo));
+        int ifIndex = directTunnelUtils.allocateId(IfmConstants.IFM_IDPOOL_NAME, interfaceName);
+        createLportTagInterfaceMap(interfaceName, ifIndex);
+        stlBuilder.setIfIndex(ifIndex);
+        InstanceIdentifier<StateTunnelList> stListId = ItmUtils.buildStateTunnelListId(tlKey);
+        LOG.info("Batching the Creation of tunnel_state: {} for Id: {}", stlBuilder.build(), stListId);
+        ITMBatchingUtils.write(stListId, stlBuilder.build(), ITMBatchingUtils.EntityType.DEFAULT_OPERATIONAL);
+        return stlBuilder.build();
+    }
+
+    private void createLportTagInterfaceMap(String infName, Integer ifIndex) {
+        LOG.debug("creating lport tag to interface map for {}", infName);
+        InstanceIdentifier<IfIndexTunnel> id = InstanceIdentifier.builder(IfIndexesTunnelMap.class)
+                .child(IfIndexTunnel.class, new IfIndexTunnelKey(ifIndex)).build();
+        IfIndexTunnel ifIndexInterface = new IfIndexTunnelBuilder().setIfIndex(ifIndex)
+            .withKey(new IfIndexTunnelKey(ifIndex)).setInterfaceName(infName).build();
+        ITMBatchingUtils.write(id, ifIndexInterface, ITMBatchingUtils.EntityType.DEFAULT_OPERATIONAL);
+    }
+}
diff --git a/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorkerForNodeConnector.java b/itm/itm-impl/src/main/java/org/opendaylight/genius/itm/itmdirecttunnels/workers/TunnelStateAddWorkerForNodeConnector.java
new file mode 100644 (file)
index 0000000..4485ced
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.genius.itm.itmdirecttunnels.workers;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.opendaylight.genius.itm.utils.TunnelStateInfo;
+
+public class TunnelStateAddWorkerForNodeConnector implements Callable<List<ListenableFuture<Void>>> {
+    private final TunnelStateAddWorker tunnelStateAddWorker;
+    private final TunnelStateInfo tunnelStateInfo;
+
+    public TunnelStateAddWorkerForNodeConnector(TunnelStateAddWorker tunnelStateAddWorker,
+                                                TunnelStateInfo tunnelStateInfo) {
+        this.tunnelStateAddWorker = tunnelStateAddWorker;
+        this.tunnelStateInfo = tunnelStateInfo;
+    }
+
+    @Override
+    public List<ListenableFuture<Void>> call() throws Exception {
+        // If another renderer(for eg : OVS) needs to be supported, check can be performed here
+        // to call the respective helpers.
+        return tunnelStateAddWorker.addState(tunnelStateInfo);
+    }
+
+    @Override
+    public String toString() {
+        return "TunnelStateAddWorkerForNodeConnector{tunnelStateInfo=" + tunnelStateInfo + '}';
+    }
+}
\ No newline at end of file
index be84e6e7ff7dc1a65fe07e67a9e43c6820ed70a6..d9ca45207a0ca17bd0ce47ed73be99a9f80882c2 100644 (file)
@@ -30,11 +30,15 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
+import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
 import org.opendaylight.genius.itm.confighelpers.HwVtep;
 import org.opendaylight.genius.itm.confighelpers.ItmExternalTunnelAddWorker;
 import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.caches.baseimpl.internal.CacheManagersRegistryImpl;
 import org.opendaylight.infrautils.caches.guava.internal.GuavaCacheProvider;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
@@ -159,12 +163,16 @@ public class ItmExternalTunnelAddTest {
     Optional<TunnelMonitorInterval> tunnelMonitorIntervalOptional ;
 
     @Mock DataBroker dataBroker;
+    @Mock JobCoordinator jobCoordinator;
     @Mock ReadOnlyTransaction mockReadTx;
     @Mock WriteTransaction mockWriteTx;
     @Mock IdManagerService idManagerService;
     @Mock ItmConfig itmConfig;
+    @Mock EntityOwnershipUtils entityOwnershipUtils;
 
     private ItmExternalTunnelAddWorker externalTunnelAddWorker;
+    DirectTunnelUtils directTunnelUtils;
+    UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
 
     @Before
     public void setUp() {
@@ -182,7 +190,8 @@ public class ItmExternalTunnelAddTest {
                 .when(mockReadTx).read(LogicalDatastoreType.CONFIGURATION, tunnelMonitorIntervalIdentifier);
 
         externalTunnelAddWorker = new ItmExternalTunnelAddWorker(dataBroker, itmConfig,
-                new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())));
+            new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()),
+                directTunnelUtils, jobCoordinator, unprocessedNodeConnectorEndPointCache));
 
     }
 
index decb7d1a1c44153fd6a75ec92ae8385ca4e1c6e1..f27e0b7b658cab16f8e19663e33ff2cd2fc32528 100644 (file)
@@ -32,6 +32,8 @@ import org.opendaylight.genius.itm.cache.DpnTepStateCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeEntryCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.cache.TunnelStateCache;
+import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
+import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
 import org.opendaylight.genius.itm.confighelpers.ItmInternalTunnelDeleteWorker;
 import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
@@ -116,10 +118,13 @@ public class ItmInternalTunnelDeleteTest {
     @Mock IMdsalApiManager mdsalApiManager;
     @Mock JobCoordinator jobCoordinator;
     @Mock IInterfaceManager interfaceManager;
-    DirectTunnelUtils directTunnelUtils;
     @Mock ItmConfig itmConfig;
     @Mock TunnelMonitoringConfig tunnelMonitoringConfig;
+    DirectTunnelUtils directTunnelUtils;
     ItmInternalTunnelDeleteWorker itmInternalTunnelDeleteWorker;
+    UnprocessedNodeConnectorCache unprocessedNodeConnectorCache;
+    UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
+
 
     Optional<TunnelMonitorParams> tunnelMonitorParamsOptional;
     Optional<TunnelMonitorInterval> tunnelMonitorIntervalOptional ;
@@ -150,15 +155,19 @@ public class ItmInternalTunnelDeleteTest {
         doReturn(Futures.immediateCheckedFuture(internalTunnelOptional)).when(mockReadWriteTx)
                 .read(LogicalDatastoreType.CONFIGURATION, internalTunnelIdentifier);
 
+        DPNTEPsInfoCache dpntePsInfoCache =
+                new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()),
+                        directTunnelUtils, jobCoordinator, unprocessedNodeConnectorEndPointCache);
+
         itmInternalTunnelDeleteWorker = new ItmInternalTunnelDeleteWorker(dataBroker, jobCoordinator,
-                new TunnelMonitoringConfig(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
-                interfaceManager,
-                new DpnTepStateCache(dataBroker,new GuavaCacheProvider(new CacheManagersRegistryImpl()),
-                        new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()))),
-                new OvsBridgeEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
-                new OvsBridgeRefEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
-                new TunnelStateCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
-                directTunnelUtils);
+            new TunnelMonitoringConfig(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
+            interfaceManager, new DpnTepStateCache(dataBroker, jobCoordinator,
+            new GuavaCacheProvider(new CacheManagersRegistryImpl()), directTunnelUtils, dpntePsInfoCache,
+                unprocessedNodeConnectorCache, unprocessedNodeConnectorEndPointCache),
+            new OvsBridgeEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
+            new OvsBridgeRefEntryCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
+            new TunnelStateCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl())),
+            directTunnelUtils);
     }
 
     @After
index 36ffd6154394f6daf8d58ee5bf87d293d9439132..c91bcce01c5999fc8986fe4d3aa00d9611eddf06 100644 (file)
@@ -33,11 +33,16 @@ import org.opendaylight.genius.itm.cache.DPNTEPsInfoCache;
 import org.opendaylight.genius.itm.cache.DpnTepStateCache;
 import org.opendaylight.genius.itm.cache.OvsBridgeRefEntryCache;
 import org.opendaylight.genius.itm.cache.TunnelStateCache;
+import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorCache;
+import org.opendaylight.genius.itm.cache.UnprocessedNodeConnectorEndPointCache;
 import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
 import org.opendaylight.genius.itm.rpc.ItmManagerRpcService;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
 import org.opendaylight.infrautils.caches.baseimpl.internal.CacheManagersRegistryImpl;
 import org.opendaylight.infrautils.caches.guava.internal.GuavaCacheProvider;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
@@ -175,14 +180,19 @@ public class ItmManagerRpcServiceTest {
             .child(Subnets.class, new SubnetsKey(ipPrefixTest)).child(DeviceVteps.class, deviceVtepKey).build();
 
     @Mock DataBroker dataBroker;
+    @Mock JobCoordinator jobCoordinator;
     @Mock ReadOnlyTransaction mockReadTx;
     @Mock WriteTransaction mockWriteTx;
     @Mock IMdsalApiManager mdsalApiManager;
     @Mock ItmConfig itmConfig;
     @Mock IInterfaceManager interfaceManager;
     @Mock InterfaceManagerService interfaceManagerService;
+    @Mock EntityOwnershipUtils entityOwnershipUtils;
 
     ItmManagerRpcService itmManagerRpcService ;
+    DirectTunnelUtils directTunnelUtils;
+    UnprocessedNodeConnectorCache unprocessedNodeConnectorCache;
+    UnprocessedNodeConnectorEndPointCache unprocessedNodeConnectorEndPointCache;
 
     Optional<ExternalTunnel> externalTunnelOptional ;
     Optional<InternalTunnel> internalTunnelOptional;
@@ -212,10 +222,11 @@ public class ItmManagerRpcServiceTest {
                 .CONFIGURATION,transportZonesIdentifier);
 
         DPNTEPsInfoCache dpntePsInfoCache =
-                new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()));
+            new DPNTEPsInfoCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()),
+            directTunnelUtils, jobCoordinator, unprocessedNodeConnectorEndPointCache);
         DpnTepStateCache dpnTepStateCache =
-                new DpnTepStateCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()),
-                        dpntePsInfoCache);
+            new DpnTepStateCache(dataBroker, jobCoordinator, new GuavaCacheProvider(new CacheManagersRegistryImpl()),
+            directTunnelUtils, dpntePsInfoCache, unprocessedNodeConnectorCache, unprocessedNodeConnectorEndPointCache);
         TunnelStateCache tunnelStateCache =
                 new TunnelStateCache(dataBroker, new GuavaCacheProvider(new CacheManagersRegistryImpl()));
         OvsBridgeRefEntryCache ovsBridgeRefEntryCache =
@@ -223,7 +234,7 @@ public class ItmManagerRpcServiceTest {
 
         itmManagerRpcService = new ItmManagerRpcService(dataBroker, mdsalApiManager, itmConfig,
             dpntePsInfoCache, interfaceManager, dpnTepStateCache, tunnelStateCache, interfaceManagerService,
-            ovsBridgeRefEntryCache, null);
+            ovsBridgeRefEntryCache, directTunnelUtils);
     }
 
     @After