Of Tunnel creation Oper Implementation
[genius.git] / itm / itm-impl / src / main / java / org / opendaylight / genius / itm / cache / OfDpnTepConfigCache.java
1 /*
2  * Copyright (c) 2020 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.genius.itm.cache;
10
11 import java.math.BigInteger;
12 import javax.inject.Inject;
13 import javax.inject.Singleton;
14 import org.opendaylight.genius.itm.globals.ITMConstants;
15 import org.opendaylight.genius.itm.itmdirecttunnels.renderer.ovs.utilities.DirectTunnelUtils;
16 import org.opendaylight.genius.itm.itmdirecttunnels.workers.OfPortStateAddWorker;
17 import org.opendaylight.genius.itm.itmdirecttunnels.workers.OfPortStateAddWorkerForNodeConnector;
18 import org.opendaylight.genius.itm.utils.NodeConnectorInfo;
19 import org.opendaylight.genius.mdsalutil.cache.DataObjectCache;
20 import org.opendaylight.infrautils.caches.CacheProvider;
21 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
22 import org.opendaylight.infrautils.utils.concurrent.NamedSimpleReentrantLock.Acquired;
23 import org.opendaylight.mdsal.binding.api.DataBroker;
24 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunner;
25 import org.opendaylight.mdsal.binding.util.ManagedNewTransactionRunnerImpl;
26 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.DpnTepConfig;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.tep.config.OfDpnTep;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.dpn.tep.config.OfDpnTepKey;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.common.Uint64;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 @Singleton
36 public class OfDpnTepConfigCache extends DataObjectCache<BigInteger, OfDpnTep> {
37
38     private static final Logger LOG = LoggerFactory.getLogger(OfDpnTepConfigCache.class);
39     private static final Logger EVENT_LOGGER = LoggerFactory.getLogger("GeniusEventLogger");
40     private final DirectTunnelUtils directTunnelUtils;
41     private final UnprocessedOFNodeConnectorCache unprocessedOFNCCache;
42     private final ManagedNewTransactionRunner txRunner;
43     private final JobCoordinator coordinator;
44
45     @Inject
46     public OfDpnTepConfigCache(DataBroker dataBroker, JobCoordinator coordinator,
47                                CacheProvider cacheProvider,
48                                DirectTunnelUtils directTunnelUtils,
49                                UnprocessedOFNodeConnectorCache unprocessedOFNCCache) {
50         super(OfDpnTep.class, dataBroker, LogicalDatastoreType.CONFIGURATION,
51             InstanceIdentifier.builder(DpnTepConfig.class).child(OfDpnTep.class).build(), cacheProvider,
52             (iid, dpnsTeps) -> dpnsTeps.getSourceDpnId().toJava(),
53             sourceDpnId -> InstanceIdentifier.builder(DpnTepConfig.class)
54                     .child(OfDpnTep.class, new OfDpnTepKey(Uint64.valueOf(sourceDpnId))).build());
55         this.directTunnelUtils = directTunnelUtils;
56         this.unprocessedOFNCCache = unprocessedOFNCCache;
57         this.coordinator = coordinator;
58         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
59     }
60
61     @Override
62     protected void added(InstanceIdentifier<OfDpnTep> path, OfDpnTep ofDpnTep) {
63         NodeConnectorInfo nodeConnectorInfo = null;
64         try (Acquired lock = directTunnelUtils.lockTunnel(ofDpnTep.getOfPortName())) {
65             if (unprocessedOFNCCache.get(ofDpnTep.getOfPortName()) != null) {
66                 nodeConnectorInfo = unprocessedOFNCCache.remove(ofDpnTep.getOfPortName());
67             }
68         }
69
70         if (nodeConnectorInfo != null && directTunnelUtils.isEntityOwner()) {
71
72             OfPortStateAddWorkerForNodeConnector ifOfStateAddWorker =
73                     new OfPortStateAddWorkerForNodeConnector(new OfPortStateAddWorker(directTunnelUtils,
74                             ofDpnTep, txRunner), nodeConnectorInfo);
75             LOG.debug("ITM-Of-tepInventoryState Entity Owner,ADD {} {}",
76                     ofDpnTep.getSourceDpnId(), ofDpnTep.getOfPortName());
77             EVENT_LOGGER.debug("ITM-Of-tepInventoryState Entity Owner,ADD {} {}",
78                     ofDpnTep.getSourceDpnId(), ofDpnTep.getOfPortName());
79             coordinator.enqueueJob(ofDpnTep.getOfPortName(), ifOfStateAddWorker, ITMConstants.JOB_MAX_RETRIES);
80         }
81     }
82 }