2 * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.genius.interfacemanager.commons;
10 import java.util.Collections;
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;
70 public final class InterfaceMetaUtils {
71 private static final Logger LOG = LoggerFactory.getLogger(InterfaceMetaUtils.class);
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<>();
80 public InterfaceMetaUtils(@Reference DataBroker dataBroker,
81 IdManagerService idManager,
82 BatchingUtils batchingUtils) {
83 this.dataBroker = dataBroker;
84 this.idManager = idManager;
85 this.batchingUtils = batchingUtils;
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();
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);
104 return bridgeRefEntry;
107 public BridgeRefEntry getBridgeRefEntryFromOperDS(Uint64 dpId) {
108 BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromCache(dpId);
109 if (bridgeRefEntry != null) {
110 return bridgeRefEntry;
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);
119 return bridgeRefEntry;
122 public OvsdbBridgeRef getOvsdbBridgeRef(Uint64 dpId) {
124 BridgeRefEntry bridgeRefEntry = getBridgeRefEntryFromOperDS(dpId);
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) {
133 return bridgeEntry.getBridgeReference();
135 return bridgeRefEntry.getBridgeReference();
138 public BridgeRefEntry getBridgeReferenceForInterface(Interface interfaceInfo) {
139 ParentRefs parentRefs = interfaceInfo.augmentation(ParentRefs.class);
140 Uint64 dpn = parentRefs.getDatapathNodeIdentifier();
141 return getBridgeRefEntryFromOperDS(dpn);
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();
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();
159 public BridgeEntry getBridgeEntryFromConfigDS(Uint64 dpnId) {
160 BridgeEntry bridgeEntry = getBridgeEntryFromCache(dpnId);
161 if (bridgeEntry != null) {
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);
175 public BridgeEntry getBridgeEntryFromConfigDS(InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier) {
176 Uint64 dpnId = bridgeEntryInstanceIdentifier.firstKeyOf(BridgeEntry.class).getDpid();
177 return getBridgeEntryFromConfigDS(dpnId);
180 private BridgeEntry readBridgeEntryFromConfigDS(
181 InstanceIdentifier<BridgeEntry> bridgeEntryInstanceIdentifier) {
182 return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, bridgeEntryInstanceIdentifier, dataBroker).orElse(null);
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();
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);
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();
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();
221 public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(String interfaceName) {
222 InterfaceParentEntryKey interfaceParentEntryKey = new InterfaceParentEntryKey(interfaceName);
223 InterfaceParentEntry interfaceParentEntry = getInterfaceParentEntryFromConfigDS(interfaceParentEntryKey);
224 return interfaceParentEntry;
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;
235 public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(InterfaceParentEntryKey interfaceParentEntryKey) {
236 InstanceIdentifier<InterfaceParentEntry> intfParentIid =
237 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
239 return getInterfaceParentEntryFromConfigDS(intfParentIid);
242 public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(ReadTransaction tx,
243 InterfaceParentEntryKey interfaceParentEntryKey) throws ExecutionException, InterruptedException {
244 InstanceIdentifier<InterfaceParentEntry> intfParentIid =
245 getInterfaceParentEntryIdentifier(interfaceParentEntryKey);
247 return getInterfaceParentEntryFromConfigDS(tx, intfParentIid);
250 public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(InstanceIdentifier<InterfaceParentEntry> intfId) {
251 return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfId, dataBroker).orElse(null);
254 public InterfaceParentEntry getInterfaceParentEntryFromConfigDS(ReadTransaction tx,
255 InstanceIdentifier<InterfaceParentEntry> intfId) throws ExecutionException, InterruptedException {
256 return tx.read(LogicalDatastoreType.CONFIGURATION, intfId).get().orElse(null);
259 public InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
260 InterfaceParentEntryKey interfaceParentEntryKey, InterfaceChildEntryKey interfaceChildEntryKey) {
261 InstanceIdentifier<InterfaceChildEntry> intfChildIid =
262 getInterfaceChildEntryIdentifier(interfaceParentEntryKey, interfaceChildEntryKey);
264 return getInterfaceChildEntryFromConfigDS(intfChildIid);
267 public InterfaceChildEntry getInterfaceChildEntryFromConfigDS(
268 InstanceIdentifier<InterfaceChildEntry> intfChildIid) {
269 return IfmUtil.read(LogicalDatastoreType.CONFIGURATION, intfChildIid, dataBroker).orElse(null);
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);
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);
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();
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);
308 BridgeEntryBuilder bridgeEntryBuilder =
309 new BridgeEntryBuilder().withKey(bridgeEntryKey).setBridgeReference(ovsdbBridgeRef);
310 tx.mergeParentStructureMerge(bridgeEntryInstanceIdentifier, bridgeEntryBuilder.build());
313 public static void createBridgeRefEntry(Uint64 dpnId, InstanceIdentifier<?> bridgeIid,
314 TypedWriteTransaction<Operational> tx) {
315 LOG.debug("Creating bridge ref entry for dpn: {} bridge: {}",
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());
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)));
331 public static void createTunnelToInterfaceMap(String tunnelInstanceId,
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);
344 public static void createTunnelToInterfaceMap(String infName,InstanceIdentifier<Node> nodeId,
345 TypedWriteTransaction<Operational> transaction,
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);
353 public static void removeTunnelToInterfaceMap(InstanceIdentifier<Node> nodeId,
354 TypedWriteTransaction<Operational> transaction,
356 InstanceIdentifier<Tunnels> tunnelsInstanceIdentifier = org.opendaylight.genius.interfacemanager.renderer
357 .hwvtep.utilities.SouthboundUtils.createTunnelsInstanceIdentifier(
358 nodeId, ifTunnel.getTunnelSource(), ifTunnel.getTunnelDestination());
359 transaction.delete(tunnelsInstanceIdentifier);
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);
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);
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);
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);
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();
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();
403 return Collections.emptyMap();
406 // Cache Util methods
408 // Start: BridgeEntryCache
409 public void addBridgeEntryToCache(Uint64 dpnId, BridgeEntry bridgeEntry) {
410 bridgeEntryMap.put(dpnId, bridgeEntry);
413 public void addBridgeEntryToCache(BridgeEntry bridgeEntry) {
414 addBridgeEntryToCache(bridgeEntry.key().getDpid(), bridgeEntry);
417 public void removeFromBridgeEntryCache(Uint64 dpnId) {
418 bridgeEntryMap.remove(dpnId);
421 public void removeFromBridgeEntryCache(BridgeEntry bridgeEntry) {
422 removeFromBridgeEntryCache(bridgeEntry.key().getDpid());
425 public BridgeEntry getBridgeEntryFromCache(Uint64 dpnId) {
426 return bridgeEntryMap.get(dpnId);
428 // End: Bridge Entry Cache
430 //Start: BridgeRefEntry Cache
431 public void addBridgeRefEntryToCache(Uint64 dpnId, BridgeRefEntry bridgeRefEntry) {
432 bridgeRefEntryMap.put(dpnId, bridgeRefEntry);
435 public void addBridgeRefEntryToCache(BridgeRefEntry bridgeRefEntry) {
436 addBridgeRefEntryToCache(bridgeRefEntry.key().getDpid(), bridgeRefEntry);
439 public void removeFromBridgeRefEntryCache(Uint64 dpnId) {
440 bridgeRefEntryMap.remove(dpnId);
443 public void removeFromBridgeRefEntryCache(BridgeRefEntry bridgeRefEntry) {
444 removeFromBridgeRefEntryCache(bridgeRefEntry.key().getDpid());
447 public BridgeRefEntry getBridgeRefEntryFromCache(Uint64 dpnId) {
448 return bridgeRefEntryMap.get(dpnId);
451 public Map getBridgeRefEntryMap() {
452 return Collections.unmodifiableMap(bridgeRefEntryMap);