Of Tunnel creation Oper Implementation
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / cache / OfDpnTepConfigCache.java
index 81bb64c8da80f4fbfe9073eddb8ba1ecf9699cef..ef5fa3539a11f383e8a902acdd365fee5f8396e5 100644 (file)
@@ -11,25 +11,72 @@ package org.opendaylight.genius.itm.cache;
 import java.math.BigInteger;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import org.opendaylight.genius.itm.globals.ITMConstants;
+import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.OfPortStateAddWorker;
+import org.opendaylight.genius.itm.itmdirecttunnels.workers.OfPortStateAddWorkerForNodeConnector;
+import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
 import org.opendaylight.genius.mdsalutil.cache.DataObjectCache;
 import org.opendaylight.infrautils.caches.CacheProvider;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
+import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnTepConfig;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.tep.config.OfDpnTep;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.tep.config.OfDpnTepKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 public class OfDpnTepConfigCache extends DataObjectCache<BigInteger, OfDpnTep> {
 
+    private static final Logger LOG = LoggerFactory.getLogger(OfDpnTepConfigCache.class);
+    private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("GeniusEventLogger");
+    private final DirectTunnelUtils directTunnelUtils;
+    private final UnprocessedOFNodeConnectorCache unprocessedOFNCCache;
+    private final ManagedNewTransactionRunner txRunner;
+    private final JobCoordinator coordinator;
+
     @Inject
-    public OfDpnTepConfigCache(DataBroker dataBroker, CacheProvider cacheProvider) {
+    public OfDpnTepConfigCache(DataBroker dataBroker, JobCoordinator coordinator,
+                               CacheProvider cacheProvider,
+                               DirectTunnelUtils directTunnelUtils,
+                               UnprocessedOFNodeConnectorCache unprocessedOFNCCache) {
         super(OfDpnTep.class, dataBroker, LogicalDatastoreType.CONFIGURATION,
             InstanceIdentifier.builder(DpnTepConfig.class).child(OfDpnTep.class).build(), cacheProvider,
             (iid, dpnsTeps) -> dpnsTeps.getSourceDpnId().toJava(),
             sourceDpnId -> InstanceIdentifier.builder(DpnTepConfig.class)
                     .child(OfDpnTep.class, new OfDpnTepKey(Uint64.valueOf(sourceDpnId))).build());
+        this.directTunnelUtils = directTunnelUtils;
+        this.unprocessedOFNCCache = unprocessedOFNCCache;
+        this.coordinator = coordinator;
+        this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
+    }
+
+    @Override
+    protected void added(InstanceIdentifier<OfDpnTep> path, OfDpnTep ofDpnTep) {
+        NodeConnectorInfo nodeConnectorInfo = null;
+        try (Acquired lock = directTunnelUtils.lockTunnel(ofDpnTep.getOfPortName())) {
+            if (unprocessedOFNCCache.get(ofDpnTep.getOfPortName()) != null) {
+                nodeConnectorInfo = unprocessedOFNCCache.remove(ofDpnTep.getOfPortName());
+            }
+        }
+
+        if (nodeConnectorInfo != null && directTunnelUtils.isEntityOwner()) {
+
+            OfPortStateAddWorkerForNodeConnector ifOfStateAddWorker =
+                    new OfPortStateAddWorkerForNodeConnector(new OfPortStateAddWorker(directTunnelUtils,
+                            ofDpnTep, txRunner), nodeConnectorInfo);
+            LOG.debug("ITM-Of-tepInventoryState Entity Owner,ADD {} {}",
+                    ofDpnTep.getSourceDpnId(), ofDpnTep.getOfPortName());
+            EVENT_LOGGER.debug("ITM-Of-tepInventoryState Entity Owner,ADD {} {}",
+                    ofDpnTep.getSourceDpnId(), ofDpnTep.getOfPortName());
+            coordinator.enqueueJob(ofDpnTep.getOfPortName(), ifOfStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
+        }
     }
 }