TSC-101: Fixup Augmentable and Identifiable methods change
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / main / java / org / opendaylight / ovsdb / hwvtepsouthbound / transact / HwvtepOperationalState.java
1 /*
2  * Copyright (c) 2015, 2017 China Telecom Beijing Research Institute 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.ovsdb.hwvtepsouthbound.transact;
10
11 import com.google.common.base.Optional;
12 import com.google.common.base.Preconditions;
13 import java.util.Collection;
14 import java.util.Collections;
15 import java.util.HashMap;
16 import java.util.List;
17 import java.util.Map;
18 import java.util.Map.Entry;
19 import java.util.Set;
20 import java.util.concurrent.ConcurrentHashMap;
21 import org.apache.commons.lang3.tuple.Pair;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
24 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
25 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
26 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepConnectionInstance;
27 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepDeviceInfo;
28 import org.opendaylight.ovsdb.hwvtepsouthbound.HwvtepSouthboundUtil;
29 import org.opendaylight.ovsdb.lib.notation.UUID;
30 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.EncapsulationTypeBase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepNodeName;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalLocatorAugmentation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepPhysicalPortAugmentation;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Acls;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacs;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacsKey;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacsKey;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRouters;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalRoutersKey;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitchesKey;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacsKey;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacsKey;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.Switches;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.TunnelsKey;
54 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
55 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
56 import org.opendaylight.yangtools.yang.binding.Identifiable;
57 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
58 import org.slf4j.Logger;
59 import org.slf4j.LoggerFactory;
60
61 //TODO: need to be optimized, get entry by iid not name
62 public class HwvtepOperationalState {
63
64     private static final Logger LOG = LoggerFactory.getLogger(HwvtepOperationalState.class);
65
66     private final Map<InstanceIdentifier<Node>, Node> operationalNodes = new HashMap<>();
67     private ReadWriteTransaction transaction;
68     HashMap<InstanceIdentifier<TerminationPoint>, UUID> inflightLocators = new HashMap<>();
69     private final HwvtepDeviceInfo deviceInfo;
70     private final HwvtepConnectionInstance connectionInstance;
71     private final Map<Class<? extends Identifiable>, Map<InstanceIdentifier, UUID>> currentTxUUIDs =
72             new ConcurrentHashMap<>();
73     private final Map<Class<? extends Identifiable>, Map<InstanceIdentifier, Boolean>> currentTxDeletedKeys =
74             new ConcurrentHashMap<>();
75
76     /* stores the modified and deleted data for each child type of each node id
77        Map<nodeid , Pair < updated, deleted >
78        each updated/ deleted contains Map < child type, List<ChildData>>
79        child type is the child of hwvtep Global augmentation
80      */
81     private Map<InstanceIdentifier<Node>,
82             Pair<Map<Class<? extends Identifiable>, List<Identifiable>>,
83                     Map<Class<? extends Identifiable>, List<Identifiable>>>> modifiedData = new HashMap<>();
84     private boolean inReconciliation = false;
85     private final DataBroker db;
86     private final Collection<DataTreeModification<Node>> changes;
87
88     public HwvtepOperationalState(DataBroker db, HwvtepConnectionInstance connectionInstance,
89                                   Collection<DataTreeModification<Node>> changes) {
90         this.connectionInstance = connectionInstance;
91         this.deviceInfo = connectionInstance.getDeviceInfo();
92         this.db = db;
93         this.changes = changes;
94         this.transaction = db.newReadWriteTransaction();
95     }
96
97     public HwvtepOperationalState(HwvtepConnectionInstance connectionInstance) {
98         this.connectionInstance = connectionInstance;
99         this.deviceInfo = connectionInstance.getDeviceInfo();
100         this.db = connectionInstance.getDataBroker();
101         this.changes = null;
102         transaction = connectionInstance.getDataBroker().newReadWriteTransaction();
103         Optional<Node> readNode = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL,
104                 connectionInstance.getInstanceIdentifier());
105         if (readNode.isPresent()) {
106             operationalNodes.put(connectionInstance.getInstanceIdentifier(), readNode.get());
107         }
108     }
109
110     public HwvtepOperationalState(final DataBroker db,
111                                   final HwvtepConnectionInstance connectionInstance,
112                                   final Collection<DataTreeModification<Node>> changes,
113                                   final Node globalOperNode,
114                                   final Node psNode) {
115         this(db, connectionInstance, changes);
116         operationalNodes.put(connectionInstance.getInstanceIdentifier(), globalOperNode);
117         HwvtepGlobalAugmentation globalAugmentation = globalOperNode.augmentation(HwvtepGlobalAugmentation.class);
118         if (globalAugmentation != null) {
119             if (!HwvtepSouthboundUtil.isEmpty(globalAugmentation.getSwitches())) {
120                 operationalNodes.put((InstanceIdentifier<Node>)
121                         globalAugmentation.getSwitches().get(0).getSwitchRef().getValue(), psNode);
122             }
123         }
124     }
125
126     public void readOperationalNodes() {
127         if (inReconciliation) {
128             return;
129         }
130         if (changes == null) {
131             LOG.warn("Could not read operational nodes for {} as changes is",
132                     connectionInstance.getNodeId().getValue());
133             return;
134         }
135         Map<InstanceIdentifier<Node>, Node> nodeCreateOrUpdate =
136                 TransactUtils.extractCreatedOrUpdatedOrRemoved(changes, Node.class);
137         if (nodeCreateOrUpdate != null) {
138             transaction = db.newReadWriteTransaction();
139             for (Entry<InstanceIdentifier<Node>, Node> entry: nodeCreateOrUpdate.entrySet()) {
140                 Optional<Node> readNode = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL,
141                         entry.getKey());
142                 //add related globalNode or physicalSwitchNode to operationalNodes map
143                 //for example, when creating physical port, logical switch is needed
144                 //but logical switch is in HwvtepGlobalAugmentation rather than PhysicalSwitchAugmentation
145                 if (readNode.isPresent()) {
146                     operationalNodes.put(entry.getKey(), readNode.get());
147                     HwvtepGlobalAugmentation hgAugmentation =
148                             readNode.get().augmentation(HwvtepGlobalAugmentation.class);
149                     PhysicalSwitchAugmentation psAugmentation =
150                             readNode.get().augmentation(PhysicalSwitchAugmentation.class);
151                     if (hgAugmentation != null && hgAugmentation.getSwitches() != null) {
152                         for (Switches pswitch : hgAugmentation.getSwitches()) {
153                             @SuppressWarnings("unchecked")
154                             InstanceIdentifier<Node> psNodeIid =
155                                     (InstanceIdentifier<Node>) pswitch.getSwitchRef().getValue();
156                             Optional<Node> psNode = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL,
157                                     psNodeIid);
158                             if (psNode.isPresent()) {
159                                 operationalNodes.put(psNodeIid, psNode.get());
160                             }
161                         }
162                     }
163                     if (psAugmentation != null) {
164                         @SuppressWarnings("unchecked")
165                         InstanceIdentifier<Node> hgNodeIid =
166                                 (InstanceIdentifier<Node>) psAugmentation.getManagedBy().getValue();
167                         Optional<Node> hgNode = new MdsalUtils(db).readOptional(
168                                 LogicalDatastoreType.OPERATIONAL, hgNodeIid);
169                         if (hgNode.isPresent()) {
170                             operationalNodes.put(hgNodeIid, hgNode.get());
171                         }
172                     }
173                 }
174             }
175         }
176     }
177
178     public Optional<Node> getGlobalNode(InstanceIdentifier<?> iid) {
179         InstanceIdentifier<Node> nodeIid = iid.firstIdentifierOf(Node.class);
180         return Optional.fromNullable(operationalNodes.get(nodeIid));
181     }
182
183     public Optional<HwvtepGlobalAugmentation> getHwvtepGlobalAugmentation(InstanceIdentifier<?> iid) {
184         Preconditions.checkNotNull(iid);
185         Optional<Node> nodeOptional = getGlobalNode(iid);
186         if (nodeOptional.isPresent()) {
187             return Optional.fromNullable(nodeOptional.get().augmentation(HwvtepGlobalAugmentation.class));
188         }
189         return Optional.absent();
190     }
191
192     public Optional<PhysicalSwitchAugmentation> getPhysicalSwitchAugmentation(InstanceIdentifier<?> iid) {
193         Preconditions.checkNotNull(iid);
194         Optional<Node> nodeOptional = getGlobalNode(iid);
195         if (nodeOptional.isPresent()) {
196             return Optional.fromNullable(nodeOptional.get().augmentation(PhysicalSwitchAugmentation.class));
197         }
198         return Optional.absent();
199     }
200
201     public Optional<List<TerminationPoint>> getTerminationPointList(InstanceIdentifier<?> iid) {
202         Preconditions.checkNotNull(iid);
203         Optional<Node> nodeOptional = getGlobalNode(iid);
204         if (nodeOptional.isPresent() && nodeOptional.get().getTerminationPoint() != null) {
205             return Optional.fromNullable(nodeOptional.get().getTerminationPoint());
206         }
207         return Optional.absent();
208     }
209
210     public Optional<LogicalSwitches> getLogicalSwitches(InstanceIdentifier<?> iid,
211             LogicalSwitchesKey logicalSwitchesKey) {
212         Preconditions.checkNotNull(iid);
213         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
214         if (nodeOptional.isPresent()) {
215             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
216             List<LogicalSwitches> lswitchList = null;
217             if (hgAugmentation != null) {
218                 lswitchList = hgAugmentation.getLogicalSwitches();
219             }
220             if (lswitchList != null) {
221                 for (LogicalSwitches lswitch: lswitchList) {
222                     if (lswitch.key().equals(logicalSwitchesKey)) {
223                         return Optional.fromNullable(lswitch);
224                     }
225                 }
226             }
227         }
228         return Optional.absent();
229     }
230
231     public Optional<LogicalSwitches> getLogicalSwitches(InstanceIdentifier<LogicalSwitches> iid) {
232         Optional<LogicalSwitches> lswitch = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL, iid);
233         return lswitch;
234     }
235
236     public Optional<Tunnels> getTunnels(InstanceIdentifier<?> iid, TunnelsKey tunnelsKey) {
237         Preconditions.checkNotNull(iid);
238         Optional<PhysicalSwitchAugmentation> psOptional = getPhysicalSwitchAugmentation(iid);
239         if (psOptional.isPresent()) {
240             PhysicalSwitchAugmentation psAugmentation = psOptional.get();
241             List<Tunnels> tunnelList = null;
242             if (psAugmentation != null) {
243                 tunnelList = psAugmentation.getTunnels();
244             }
245             if (tunnelList != null) {
246                 for (Tunnels tunnel: tunnelList) {
247                     if (tunnel.key().equals(tunnelsKey)) {
248                         return Optional.fromNullable(tunnel);
249                     }
250                 }
251             }
252         }
253         return Optional.absent();
254     }
255
256     public Optional<Tunnels> getTunnels(InstanceIdentifier<Tunnels> iid) {
257         Optional<Tunnels> tunnels = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL, iid);
258         return tunnels;
259     }
260
261     public Optional<HwvtepPhysicalPortAugmentation> getPhysicalPortAugmentation(InstanceIdentifier<?> iid,
262             HwvtepNodeName hwvtepNodeName) {
263         Preconditions.checkNotNull(iid);
264         Optional<List<TerminationPoint>> nodeOptional = getTerminationPointList(iid);
265         if (nodeOptional.isPresent()) {
266             List<TerminationPoint> tpList = nodeOptional.get();
267             for (TerminationPoint tp : tpList) {
268                 HwvtepPhysicalPortAugmentation hppAugmentation =
269                         tp.augmentation(HwvtepPhysicalPortAugmentation.class);
270                 if (hppAugmentation != null && hppAugmentation.getHwvtepNodeName().equals(hwvtepNodeName)) {
271                     return Optional.fromNullable(hppAugmentation);
272                 }
273             }
274         }
275         return Optional.absent();
276     }
277
278     public Optional<HwvtepPhysicalLocatorAugmentation> getPhysicalLocatorAugmentation(InstanceIdentifier<?> iid,
279             IpAddress dstIp, Class<? extends EncapsulationTypeBase> encapType) {
280         Preconditions.checkNotNull(iid);
281         Optional<List<TerminationPoint>> nodeOptional = getTerminationPointList(iid);
282         if (nodeOptional.isPresent()) {
283             List<TerminationPoint> tpList = nodeOptional.get();
284             for (TerminationPoint tp : tpList) {
285                 HwvtepPhysicalLocatorAugmentation hppAugmentation =
286                         tp.augmentation(HwvtepPhysicalLocatorAugmentation.class);
287                 if (hppAugmentation != null && hppAugmentation.getDstIp().equals(dstIp)
288                         && hppAugmentation.getEncapsulationType().equals(encapType)) {
289                     return Optional.fromNullable(hppAugmentation);
290                 }
291             }
292         }
293         return Optional.absent();
294     }
295
296     public Optional<HwvtepPhysicalLocatorAugmentation>
297             getPhysicalLocatorAugmentation(InstanceIdentifier<TerminationPoint> iid) {
298         Optional<TerminationPoint> tp = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL, iid);
299         if (tp.isPresent()) {
300             return Optional.fromNullable(tp.get().augmentation(HwvtepPhysicalLocatorAugmentation.class));
301         }
302         return Optional.absent();
303     }
304
305     public Optional<LocalMcastMacs> getLocalMcastMacs(InstanceIdentifier<?> iid, LocalMcastMacsKey key) {
306         Preconditions.checkNotNull(iid);
307         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
308         if (nodeOptional.isPresent()) {
309             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
310             List<LocalMcastMacs> macList = null;
311             if (hgAugmentation != null) {
312                 macList = hgAugmentation.getLocalMcastMacs();
313             }
314             if (macList != null) {
315                 for (LocalMcastMacs mac: macList) {
316                     if (mac.key().equals(key)) {
317                         return Optional.fromNullable(mac);
318                     }
319                 }
320             }
321         }
322         return Optional.absent();
323     }
324
325     public Optional<RemoteMcastMacs> getRemoteMcastMacs(InstanceIdentifier<?> iid, RemoteMcastMacsKey key) {
326         Preconditions.checkNotNull(iid);
327         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
328         if (nodeOptional.isPresent()) {
329             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
330             List<RemoteMcastMacs> macList = null;
331             if (hgAugmentation != null) {
332                 macList = hgAugmentation.getRemoteMcastMacs();
333             }
334             if (macList != null) {
335                 for (RemoteMcastMacs mac: macList) {
336                     if (mac.key().equals(key)) {
337                         return Optional.fromNullable(mac);
338                     }
339                 }
340             }
341         }
342         return Optional.absent();
343     }
344
345     public Optional<LocalUcastMacs> getLocalUcastMacs(InstanceIdentifier<?> iid, LocalUcastMacsKey key) {
346         Preconditions.checkNotNull(iid);
347         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
348         if (nodeOptional.isPresent()) {
349             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
350             List<LocalUcastMacs> macList = null;
351             if (hgAugmentation != null) {
352                 macList = hgAugmentation.getLocalUcastMacs();
353             }
354             if (macList != null) {
355                 for (LocalUcastMacs mac: macList) {
356                     if (mac.key().equals(key)) {
357                         return Optional.fromNullable(mac);
358                     }
359                 }
360             }
361         }
362         return Optional.absent();
363     }
364
365     public Optional<RemoteUcastMacs> getRemoteUcastMacs(InstanceIdentifier<?> iid, RemoteUcastMacsKey key) {
366         Preconditions.checkNotNull(iid);
367         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
368         if (nodeOptional.isPresent()) {
369             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
370             List<RemoteUcastMacs> macList = null;
371             if (hgAugmentation != null) {
372                 macList = hgAugmentation.getRemoteUcastMacs();
373             }
374             if (macList != null) {
375                 for (RemoteUcastMacs mac: macList) {
376                     if (mac.key().equals(key)) {
377                         return Optional.fromNullable(mac);
378                     }
379                 }
380             }
381         }
382         return Optional.absent();
383     }
384
385     public Optional<LogicalRouters> getLogicalRouters(final InstanceIdentifier<?> iid,
386             final LogicalRoutersKey logicalRoutersKey) {
387         Preconditions.checkNotNull(iid);
388         Optional<HwvtepGlobalAugmentation> nodeOptional = getHwvtepGlobalAugmentation(iid);
389         if (nodeOptional.isPresent()) {
390             HwvtepGlobalAugmentation hgAugmentation = nodeOptional.get();
391             if (hgAugmentation != null && hgAugmentation.getLogicalRouters() != null) {
392                 for (LogicalRouters lrouter: hgAugmentation.getLogicalRouters()) {
393                     if (lrouter.key().equals(logicalRoutersKey)) {
394                         return Optional.fromNullable(lrouter);
395                     }
396                 }
397             }
398         }
399         return Optional.absent();
400     }
401
402     public Optional<Acls> getAcls(InstanceIdentifier<Acls> iid) {
403         Optional<Acls> acl = new MdsalUtils(db).readOptional(LogicalDatastoreType.OPERATIONAL, iid);
404         return acl;
405     }
406
407     public ReadWriteTransaction getReadWriteTransaction() {
408         return transaction;
409     }
410
411     public void setPhysicalLocatorInFlight(InstanceIdentifier<TerminationPoint> iid,
412                                            UUID uuid) {
413         inflightLocators.put(iid, uuid);
414     }
415
416     public UUID getPhysicalLocatorInFlight(InstanceIdentifier<TerminationPoint> iid) {
417         return inflightLocators.get(iid);
418     }
419
420     public HwvtepConnectionInstance getConnectionInstance() {
421         return connectionInstance;
422     }
423
424     public HwvtepDeviceInfo getDeviceInfo() {
425         return deviceInfo;
426     }
427
428     public void updateCurrentTxData(Class<? extends Identifiable> cls, InstanceIdentifier key, UUID uuid) {
429         HwvtepSouthboundUtil.updateData(currentTxUUIDs, cls, key, uuid);
430     }
431
432     public void updateCurrentTxDeleteData(Class<? extends Identifiable> cls, InstanceIdentifier key) {
433         HwvtepSouthboundUtil.updateData(currentTxDeletedKeys, cls, key, Boolean.TRUE);
434     }
435
436     public UUID getUUIDFromCurrentTx(Class<? extends Identifiable> cls, InstanceIdentifier key) {
437         return HwvtepSouthboundUtil.getData(currentTxUUIDs, cls, key);
438     }
439
440     public boolean isKeyPartOfCurrentTx(Class<? extends Identifiable> cls, InstanceIdentifier key) {
441         return HwvtepSouthboundUtil.containsKey(currentTxUUIDs, cls, key);
442     }
443
444     public Set<InstanceIdentifier> getDeletedKeysInCurrentTx(Class<? extends Identifiable> cls) {
445         if (currentTxDeletedKeys.containsKey(cls)) {
446             return currentTxDeletedKeys.get(cls).keySet();
447         }
448         return Collections.EMPTY_SET;
449     }
450
451     public List<? extends Identifiable> getUpdatedData(final InstanceIdentifier<Node> key,
452                                                        final Class<? extends Identifiable> cls) {
453         List<Identifiable> result = null;
454         if (modifiedData.get(key) != null && modifiedData.get(key).getLeft() != null) {
455             result = modifiedData.get(key).getLeft().get(cls);
456         }
457         if (result == null) {
458             result = Collections.EMPTY_LIST;
459         }
460         return result;
461     }
462
463     public List<? extends Identifiable> getDeletedData(final InstanceIdentifier<Node> key,
464                                                        final Class<? extends Identifiable> cls) {
465         List<Identifiable> result = null;
466         if (modifiedData.get(key) != null && modifiedData.get(key).getRight() != null) {
467             result = modifiedData.get(key).getRight().get(cls);
468         }
469         if (result == null) {
470             result = Collections.EMPTY_LIST;
471         }
472         return result;
473     }
474
475     public void setModifiedData(final Map<InstanceIdentifier<Node>,
476             Pair<Map<Class<? extends Identifiable>, List<Identifiable>>,
477                     Map<Class<? extends Identifiable>, List<Identifiable>>>> modifiedData) {
478         this.modifiedData = modifiedData;
479     }
480
481     public boolean isInReconciliation() {
482         return inReconciliation;
483     }
484
485     public void setInReconciliation(boolean inReconciliation) {
486         this.inReconciliation = inReconciliation;
487     }
488
489     public DataBroker getDataBroker() {
490         return db;
491     }
492
493
494     public void clearIntransitKeys() {
495         currentTxUUIDs.forEach((cls, map) -> {
496             map.forEach((iid, uuid) -> deviceInfo.clearInTransit(cls, iid));
497         });
498         currentTxDeletedKeys.forEach((cls, map) -> {
499             map.forEach((iid, val) -> deviceInfo.clearInTransit(cls, iid));
500         });
501         currentTxUUIDs.clear();
502         currentTxDeletedKeys.clear();
503         deviceInfo.onOperDataAvailable();
504     }
505 }