Convert interfacemanager to use mdsal-binding-util
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / commons / InterfaceMetaUtils.java
1 /*
2  * Copyright (c) 2016 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 package org.opendaylight.genius.interfacemanager.commons;
9
10 import java.util.Collections;
11 import java.util.Map;
12 import java.util.Optional;
13 import java.util.concurrent.ConcurrentHashMap;
14 import java.util.concurrent.ConcurrentMap;
15 import java.util.concurrent.ExecutionException;
16 import javax.inject.Inject;
17 import javax.inject.Singleton;
18 import org.apache.aries.blueprint.annotation.service.Reference;
19 import org.opendaylight.genius.interfacemanager.IfmConstants;
20 import org.opendaylight.genius.interfacemanager.IfmUtil;
21 import org.opendaylight.genius.interfacemanager.renderer.ovs.utilities.BatchingUtils;
22 import org.opendaylight.mdsal.binding.api.DataBroker;
23 import org.opendaylight.mdsal.binding.api.ReadTransaction;
24 import org.opendaylight.mdsal.binding.api.WriteTransaction;
25 import org.opendaylight.mdsal.binding.util.Datastore.Configuration;
26 import org.opendaylight.mdsal.binding.util.Datastore.Operational;
27 import org.opendaylight.mdsal.binding.util.TypedReadTransaction;
28 import org.opendaylight.mdsal.binding.util.TypedWriteTransaction;
29 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeInterfaceInfo;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.BridgeRefInfo;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.IfIndexesInterfaceMap;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.InterfaceChildInfo;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.TunnelInstanceInterfaceMap;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterface;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._if.indexes._interface.map.IfIndexInterfaceKey;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntry;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info.InterfaceParentEntryKey;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntry;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406._interface.child.info._interface.parent.entry.InterfaceChildEntryKey;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntry;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.BridgeEntryKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntry;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge._interface.info.bridge.entry.BridgeInterfaceEntryKey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntry;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.bridge.ref.info.BridgeRefEntryKey;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterface;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterfaceBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.meta.rev160406.tunnel.instance._interface.map.TunnelInstanceInterfaceKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfTunnel;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeRef;
61 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
62 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
63 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
64 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
65 import org.opendaylight.yangtools.yang.common.Uint64;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 @Singleton
70 public final class InterfaceMetaUtils {
71     private static final Logger LOG = LoggerFactory.getLogger(InterfaceMetaUtils.class);
72
73     private final DataBroker dataBroker;
74     private final IdManagerService idManager;
75     private final BatchingUtils batchingUtils;
76     private final ConcurrentMap<Uint64, BridgeEntry> bridgeEntryMap = new ConcurrentHashMap<>();
77     private final ConcurrentMap<Uint64, BridgeRefEntry> bridgeRefEntryMap = new ConcurrentHashMap<>();
78
79     @Inject
80     public InterfaceMetaUtils(@Reference DataBroker dataBroker,
81                               IdManagerService idManager,
82                               BatchingUtils batchingUtils) {
83         this.dataBroker = dataBroker;
84         this.idManager = idManager;
85         this.batchingUtils = batchingUtils;
86     }
87
88     public static InstanceIdentifier<BridgeRefEntry> getBridgeRefEntryIdentifier(BridgeRefEntryKey bridgeRefEntryKey) {
89         InstanceIdentifier.InstanceIdentifierBuilder<BridgeRefEntry> bridgeRefEntryInstanceIdentifierBuilder =
90                 InstanceIdentifier.builder(BridgeRefInfo.class)
91                         .child(BridgeRefEntry.class, bridgeRefEntryKey);
92         return bridgeRefEntryInstanceIdentifierBuilder.build();
93     }
94
95     public BridgeRefEntry getBridgeRefEntryFromOperationalDS(Uint64 dpId) {
96         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpId);
97         InstanceIdentifier<BridgeRefEntry> bridgeRefEntryIid = InterfaceMetaUtils
98                 .getBridgeRefEntryIdentifier(bridgeRefEntryKey);
99         BridgeRefEntry bridgeRefEntry = IfmUtil.read(LogicalDatastoreType.OPERATIONAL,
100                 bridgeRefEntryIid, dataBroker).orElse(null);
101         if (bridgeRefEntry != null) {
102             addBridgeRefEntryToCache(dpId, bridgeRefEntry);
103         }
104         return bridgeRefEntry;
105     }
106
107     public BridgeRefEntry getBridgeRefEntryFromOperDS(Uint64 dpId) {
108         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromCache(dpId);
109         if (bridgeRefEntry != null) {
110             return bridgeRefEntry;
111         }
112         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpId);
113         InstanceIdentifier<BridgeRefEntry> bridgeRefEntryIid = InterfaceMetaUtils
114                 .getBridgeRefEntryIdentifier(bridgeRefEntryKey);
115         bridgeRefEntry = IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeRefEntryIid, dataBroker).orElse(null);
116         if (bridgeRefEntry != null) {
117             addBridgeRefEntryToCache(dpId, bridgeRefEntry);
118         }
119         return bridgeRefEntry;
120     }
121
122     public OvsdbBridgeRef getOvsdbBridgeRef(Uint64 dpId) {
123
124         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpId);
125
126         if (bridgeRefEntry == null) {
127             // bridge ref entry will be null if the bridge is disconnected from controller.
128             // In that case, fetch bridge reference from bridge interface entry config DS
129             BridgeEntry bridgeEntry = getBridgeEntryFromConfigDS(dpId);
130             if (bridgeEntry == null) {
131                 return null;
132             }
133             return  bridgeEntry.getBridgeReference();
134         }
135         return bridgeRefEntry.getBridgeReference();
136     }
137
138     public BridgeRefEntry getBridgeReferenceForInterface(Interface interfaceInfo) {
139         ParentRefs parentRefs = interfaceInfo.augmentation(ParentRefs.class);
140         Uint64 dpn = parentRefs.getDatapathNodeIdentifier();
141         return getBridgeRefEntryFromOperDS(dpn);
142     }
143
144     public boolean bridgeExists(BridgeRefEntry bridgeRefEntry) {
145         if (bridgeRefEntry != null && bridgeRefEntry.getBridgeReference() != null) {
146             InstanceIdentifier<OvsdbBridgeAugmentation> bridgeIid =
147                     (InstanceIdentifier<OvsdbBridgeAugmentation>) bridgeRefEntry.getBridgeReference().getValue();
148             return IfmUtil.read(LogicalDatastoreType.OPERATIONAL, bridgeIid, dataBroker).isPresent();
149         }
150         return false;
151     }
152
153     public static InstanceIdentifier<BridgeEntry> getBridgeEntryIdentifier(BridgeEntryKey bridgeEntryKey) {
154         InstanceIdentifier.InstanceIdentifierBuilder<BridgeEntry> bridgeEntryIdBuilder =
155                 InstanceIdentifier.builder(BridgeInterfaceInfo.class).child(BridgeEntry.class, bridgeEntryKey);
156         return bridgeEntryIdBuilder.build();
157     }
158
159     public BridgeEntry getBridgeEntryFromConfigDS(Uint64 dpnId) {
160         BridgeEntry bridgeEntry = getBridgeEntryFromCache(dpnId);
161         if (bridgeEntry != null) {
162             return bridgeEntry;
163         }
164         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpnId);
165         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier =
166                 InterfaceMetaUtils.getBridgeEntryIdentifier(bridgeEntryKey);
167         LOG.debug("Trying to retrieve bridge entry from config for Id: {}", bridgeEntryInstanceIdentifier);
168         bridgeEntry = readBridgeEntryFromConfigDS(bridgeEntryInstanceIdentifier);
169         if (bridgeEntry != null) {
170             addBridgeEntryToCache(dpnId, bridgeEntry);
171         }
172         return bridgeEntry;
173     }
174
175     public BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier) {
176         Uint64 dpnId = bridgeEntryInstanceIdentifier.firstKeyOf(BridgeEntry.class).getDpid();
177         return getBridgeEntryFromConfigDS(dpnId);
178     }
179
180     private BridgeEntry readBridgeEntryFromConfigDS(
181             InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier) {
182         return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker).orElse(null);
183     }
184
185     public static InstanceIdentifier<BridgeInterfaceEntry> getBridgeInterfaceEntryIdentifier(
186             BridgeEntryKey bridgeEntryKey, BridgeInterfaceEntryKey bridgeInterfaceEntryKey) {
187         return InstanceIdentifier.builder(BridgeInterfaceInfo.class)
188                 .child(BridgeEntry.class, bridgeEntryKey)
189                 .child(BridgeInterfaceEntry.class, bridgeInterfaceEntryKey).build();
190
191     }
192
193     public void createBridgeInterfaceEntryInConfigDS(Uint64 dpId, String childInterface) {
194         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
195         BridgeInterfaceEntryKey bridgeInterfaceEntryKey = new BridgeInterfaceEntryKey(childInterface);
196         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
197                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey, bridgeInterfaceEntryKey);
198         BridgeInterfaceEntryBuilder entryBuilder = new BridgeInterfaceEntryBuilder().withKey(bridgeInterfaceEntryKey)
199                 .setInterfaceName(childInterface);
200         batchingUtils.write(bridgeInterfaceEntryIid, entryBuilder.build(), BatchingUtils.EntityType.DEFAULT_CONFIG);
201     }
202
203     public static InstanceIdentifier<InterfaceParentEntry> getInterfaceParentEntryIdentifier(
204             InterfaceParentEntryKey interfaceParentEntryKey) {
205         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceParentEntry> intfIdBuilder =
206                 InstanceIdentifier.builder(InterfaceChildInfo.class)
207                         .child(InterfaceParentEntry.class, interfaceParentEntryKey);
208         return intfIdBuilder.build();
209     }
210
211     public static InstanceIdentifier<InterfaceChildEntry> getInterfaceChildEntryIdentifier(
212             InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) {
213         InstanceIdentifier.InstanceIdentifierBuilder<InterfaceChildEntry> intfIdBuilder =
214                 InstanceIdentifier.builder(InterfaceChildInfo.class)
215                         .child(InterfaceParentEntry.class, interfaceParentEntryKey)
216                         .child(InterfaceChildEntry.class, interfaceChildEntryKey);
217         return intfIdBuilder.build();
218     }
219
220     @Deprecated
221     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(String interfaceName) {
222         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName);
223         InterfaceParentEntry interfaceParentEntry = getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey);
224         return interfaceParentEntry;
225     }
226
227     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(ReadTransaction tx, String interfaceName)
228             throws ExecutionException, InterruptedException {
229         InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName);
230         InterfaceParentEntry interfaceParentEntry = getInterfaceParentEntryFromConfigDS(tx, interfaceParentEntryKey);
231         return interfaceParentEntry;
232     }
233
234     @Deprecated
235     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(InterfaceParentEntryKey interfaceParentEntryKey) {
236         InstanceIdentifier<InterfaceParentEntry> intfParentIid =
237                 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
238
239         return getInterfaceParentEntryFromConfigDS(intfParentIid);
240     }
241
242     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(ReadTransaction tx,
243             InterfaceParentEntryKey interfaceParentEntryKey) throws ExecutionException, InterruptedException {
244         InstanceIdentifier<InterfaceParentEntry> intfParentIid =
245                 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
246
247         return getInterfaceParentEntryFromConfigDS(tx, intfParentIid);
248     }
249
250     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(InstanceIdentifier<InterfaceParentEntry> intfId) {
251         return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfId, dataBroker).orElse(null);
252     }
253
254     public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(ReadTransaction tx,
255             InstanceIdentifier<InterfaceParentEntry> intfId) throws ExecutionException, InterruptedException {
256         return tx.read(LogicalDatastoreType.CONFIGURATION, intfId).get().orElse(null);
257     }
258
259     public InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
260             InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) {
261         InstanceIdentifier<InterfaceChildEntry> intfChildIid =
262                 getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
263
264         return getInterfaceChildEntryFromConfigDS(intfChildIid);
265     }
266
267     public InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
268             InstanceIdentifier<InterfaceChildEntry> intfChildIid) {
269         return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfChildIid, dataBroker).orElse(null);
270     }
271
272     public void createLportTagInterfaceMap(String infName, Integer ifIndex) {
273         LOG.debug("creating lport tag to interface map for {} ifIndex {}",infName, ifIndex);
274         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class)
275                 .child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
276         IfIndexInterface ifIndexInterface = new IfIndexInterfaceBuilder().setIfIndex(ifIndex)
277                 .withKey(new IfIndexInterfaceKey(ifIndex)).setInterfaceName(infName).build();
278         batchingUtils.write(id, ifIndexInterface, BatchingUtils.EntityType.DEFAULT_OPERATIONAL);
279     }
280
281     public int removeLportTagInterfaceMap(WriteTransaction tx, String infName) {
282         // workaround to get the id to remove from lport tag interface map
283         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
284         IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
285         LOG.debug("removing lport tag to interface map for {}",infName);
286         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class)
287                 .child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
288         tx.delete(LogicalDatastoreType.OPERATIONAL, id);
289         return ifIndex;
290     }
291
292     public int removeLportTagInterfaceMap(TypedWriteTransaction<Operational> tx, String infName) {
293         // workaround to get the id to remove from lport tag interface map
294         Integer ifIndex = IfmUtil.allocateId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
295         IfmUtil.releaseId(idManager, IfmConstants.IFM_IDPOOL_NAME, infName);
296         LOG.debug("removing lport tag to interface map for {}",infName);
297         InstanceIdentifier<IfIndexInterface> id = InstanceIdentifier.builder(IfIndexesInterfaceMap.class)
298             .child(IfIndexInterface.class, new IfIndexInterfaceKey(ifIndex)).build();
299         tx.delete(id);
300         return ifIndex;
301     }
302
303     public static void addBridgeRefToBridgeInterfaceEntry(Uint64 dpId, OvsdbBridgeRef ovsdbBridgeRef,
304             TypedWriteTransaction<Configuration> tx) {
305         BridgeEntryKey bridgeEntryKey = new BridgeEntryKey(dpId);
306         InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier = getBridgeEntryIdentifier(bridgeEntryKey);
307
308         BridgeEntryBuilder bridgeEntryBuilder =
309                 new BridgeEntryBuilder().withKey(bridgeEntryKey).setBridgeReference(ovsdbBridgeRef);
310         tx.mergeParentStructureMerge(bridgeEntryInstanceIdentifier, bridgeEntryBuilder.build());
311     }
312
313     public static void createBridgeRefEntry(Uint64 dpnId, InstanceIdentifier<?> bridgeIid,
314                                             TypedWriteTransaction<Operational> tx) {
315         LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}",
316                 dpnId, bridgeIid);
317         BridgeRefEntryKey bridgeRefEntryKey = new BridgeRefEntryKey(dpnId);
318         InstanceIdentifier<BridgeRefEntry> bridgeEntryId =
319                 InterfaceMetaUtils.getBridgeRefEntryIdentifier(bridgeRefEntryKey);
320         BridgeRefEntryBuilder tunnelDpnBridgeEntryBuilder =
321                 new BridgeRefEntryBuilder().withKey(bridgeRefEntryKey).setDpid(dpnId)
322                         .setBridgeReference(new OvsdbBridgeRef(bridgeIid));
323         tx.mergeParentStructurePut(bridgeEntryId, tunnelDpnBridgeEntryBuilder.build());
324     }
325
326     public static void deleteBridgeRefEntry(Uint64 dpnId, TypedWriteTransaction<Operational> tx) {
327         LOG.debug("Deleting bridge ref entry for dpn: {}", dpnId);
328         tx.delete(InterfaceMetaUtils.getBridgeRefEntryIdentifier(new BridgeRefEntryKey(dpnId)));
329     }
330
331     public static void createTunnelToInterfaceMap(String tunnelInstanceId,
332                                                   String infName,
333                                                   TypedWriteTransaction<Operational> transaction) {
334         LOG.debug("creating tunnel instance identifier to interface map for {}",infName);
335         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class)
336                 .child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
337         TunnelInstanceInterface tunnelInstanceInterface = new TunnelInstanceInterfaceBuilder()
338                 .setTunnelInstanceIdentifier(tunnelInstanceId).withKey(new TunnelInstanceInterfaceKey(tunnelInstanceId))
339                 .setInterfaceName(infName).build();
340         transaction.mergeParentStructurePut(id, tunnelInstanceInterface);
341
342     }
343
344     public static void createTunnelToInterfaceMap(String infName,InstanceIdentifier<Node> nodeId,
345                                                   TypedWriteTransaction<Operational> transaction,
346                                                   IfTunnel ifTunnel) {
347         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer
348                 .hwvtep.utilities.SouthboundUtils.createTunnelsInstanceIdentifier(nodeId,
349                         ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
350         createTunnelToInterfaceMap(tunnelsInstanceIdentifier.toString(), infName, transaction);
351     }
352
353     public static void removeTunnelToInterfaceMap(InstanceIdentifier<Node> nodeId,
354                                                   TypedWriteTransaction<Operational> transaction,
355                                                   IfTunnel ifTunnel) {
356         InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer
357                 .hwvtep.utilities.SouthboundUtils.createTunnelsInstanceIdentifier(
358                         nodeId, ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
359         transaction.delete(tunnelsInstanceIdentifier);
360     }
361
362     public static String getInterfaceForTunnelInstanceIdentifier(String tunnelInstanceId,
363                                                                  TypedReadTransaction<Operational> tx)
364         throws ExecutionException, InterruptedException {
365         InstanceIdentifier<TunnelInstanceInterface> id = InstanceIdentifier.builder(TunnelInstanceInterfaceMap.class)
366                 .child(TunnelInstanceInterface.class, new TunnelInstanceInterfaceKey(tunnelInstanceId)).build();
367         return tx.read(id).get().map(TunnelInstanceInterface::getInterfaceName).orElse(null);
368     }
369
370     public void deleteBridgeInterfaceEntry(BridgeEntryKey bridgeEntryKey,
371             Map<BridgeInterfaceEntryKey, BridgeInterfaceEntry> bridgeInterfaceEntries,
372                                            InstanceIdentifier<BridgeEntry> bridgeEntryIid, String interfaceName) {
373         BridgeInterfaceEntryKey bridgeInterfaceEntryKey =
374                 new BridgeInterfaceEntryKey(interfaceName);
375         InstanceIdentifier<BridgeInterfaceEntry> bridgeInterfaceEntryIid =
376                 InterfaceMetaUtils.getBridgeInterfaceEntryIdentifier(bridgeEntryKey,
377                         bridgeInterfaceEntryKey);
378
379         if (bridgeInterfaceEntries.size() <= 1) {
380             LOG.debug("{} is last bridge-interface entry for DPN : {}", interfaceName, bridgeEntryKey.getDpid());
381             batchingUtils.delete(bridgeEntryIid, BatchingUtils.EntityType.DEFAULT_CONFIG);
382         } else {
383             // No point deleting interface individually if bridge entry is being deleted
384             // Note: Will this cause issue in listener code? Does it expect separate notifications for two?
385             LOG.debug("deleting bridge-interface entry {} for DPN : {}", interfaceName, bridgeEntryKey.getDpid());
386             batchingUtils.delete(bridgeInterfaceEntryIid, BatchingUtils.EntityType.DEFAULT_CONFIG);
387         }
388     }
389
390     public Map<TerminationPointKey, TerminationPoint> getTerminationPointsOnBridge(Uint64 dpnId) {
391         BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpnId);
392         if (bridgeRefEntry == null || bridgeRefEntry.getBridgeReference() == null) {
393             LOG.debug("BridgeRefEntry for DPNID {} not found", dpnId);
394             return Collections.emptyMap();
395         }
396         InstanceIdentifier<Node> nodeIid =
397                         bridgeRefEntry.getBridgeReference().getValue().firstIdentifierOf(Node.class);
398         Optional<Node> optNode =
399             IfmUtil.read(LogicalDatastoreType.OPERATIONAL, nodeIid,  dataBroker);
400         if (optNode.isPresent()) {
401             return optNode.get().getTerminationPoint();
402         }
403         return Collections.emptyMap();
404     }
405
406     // Cache Util methods
407
408     // Start: BridgeEntryCache
409     public void addBridgeEntryToCache(Uint64 dpnId, BridgeEntry bridgeEntry) {
410         bridgeEntryMap.put(dpnId, bridgeEntry);
411     }
412
413     public void addBridgeEntryToCache(BridgeEntry bridgeEntry) {
414         addBridgeEntryToCache(bridgeEntry.key().getDpid(), bridgeEntry);
415     }
416
417     public void removeFromBridgeEntryCache(Uint64 dpnId) {
418         bridgeEntryMap.remove(dpnId);
419     }
420
421     public void removeFromBridgeEntryCache(BridgeEntry bridgeEntry) {
422         removeFromBridgeEntryCache(bridgeEntry.key().getDpid());
423     }
424
425     public BridgeEntry getBridgeEntryFromCache(Uint64 dpnId) {
426         return bridgeEntryMap.get(dpnId);
427     }
428     // End: Bridge Entry Cache
429
430     //Start: BridgeRefEntry Cache
431     public void addBridgeRefEntryToCache(Uint64 dpnId, BridgeRefEntry bridgeRefEntry) {
432         bridgeRefEntryMap.put(dpnId, bridgeRefEntry);
433     }
434
435     public void addBridgeRefEntryToCache(BridgeRefEntry bridgeRefEntry) {
436         addBridgeRefEntryToCache(bridgeRefEntry.key().getDpid(), bridgeRefEntry);
437     }
438
439     public void removeFromBridgeRefEntryCache(Uint64 dpnId) {
440         bridgeRefEntryMap.remove(dpnId);
441     }
442
443     public void removeFromBridgeRefEntryCache(BridgeRefEntry bridgeRefEntry) {
444         removeFromBridgeRefEntryCache(bridgeRefEntry.key().getDpid());
445     }
446
447     public BridgeRefEntry getBridgeRefEntryFromCache(Uint64 dpnId) {
448         return bridgeRefEntryMap.get(dpnId);
449     }
450
451     public Map getBridgeRefEntryMap() {
452         return Collections.unmodifiableMap(bridgeRefEntryMap);
453     }
454 }