Use DataTreeChangeListener instead of DataChangeListener
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / ovsdb / transact / BridgeOperationalState.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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.southbound.ovsdb.transact;
10
11 import java.util.Collection;
12 import java.util.HashMap;
13 import java.util.Map;
14 import java.util.Map.Entry;
15 import java.util.concurrent.ExecutionException;
16
17 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
18 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
19 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
21 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
22 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntry;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ControllerEntryKey;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntry;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.ProtocolEntryKey;
29 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 import com.google.common.base.Optional;
38 import com.google.common.util.concurrent.CheckedFuture;
39
40 public class BridgeOperationalState {
41     private static final Logger LOG = LoggerFactory.getLogger(BridgeOperationalState.class);
42     private Map<InstanceIdentifier<Node>, Node> operationalNodes = new HashMap<>();
43
44     public BridgeOperationalState(DataBroker db, AsyncDataChangeEvent<InstanceIdentifier<?>,
45             DataObject> changes) {
46         ReadOnlyTransaction transaction = db.newReadOnlyTransaction();
47         Map<InstanceIdentifier<Node>, Node> nodeCreateOrUpdate =
48                 TransactUtils.extractCreatedOrUpdatedOrRemoved(changes, Node.class);
49         if (nodeCreateOrUpdate != null) {
50             for (Entry<InstanceIdentifier<Node>, Node> entry: nodeCreateOrUpdate.entrySet()) {
51                 CheckedFuture<Optional<Node>, ReadFailedException> nodeFuture =
52                         transaction.read(LogicalDatastoreType.OPERATIONAL, entry.getKey());
53                 try {
54                     Optional<Node> nodeOptional = nodeFuture.get();
55                     if (nodeOptional.isPresent()) {
56                         operationalNodes.put(entry.getKey(), nodeOptional.get());
57                     }
58                 } catch (InterruptedException | ExecutionException e) {
59                     LOG.warn("Error reading from datastore",e);
60                 }
61             }
62         }
63         transaction.close();
64     }
65
66     public BridgeOperationalState(DataBroker db, Collection<DataTreeModification<Node>> changes) {
67         ReadOnlyTransaction transaction = db.newReadOnlyTransaction();
68         Map<InstanceIdentifier<Node>, Node> nodeCreateOrUpdateOrRemove =
69                 TransactUtils.extractCreatedOrUpdatedOrRemoved(changes, Node.class);
70         for (Entry<InstanceIdentifier<Node>, Node> entry : nodeCreateOrUpdateOrRemove.entrySet()) {
71             try {
72                 Optional<Node> nodeOptional = transaction.read(LogicalDatastoreType.OPERATIONAL, entry.getKey())
73                             .checkedGet();
74                 if (nodeOptional.isPresent()) {
75                     operationalNodes.put(entry.getKey(), nodeOptional.get());
76                 }
77             } catch (ReadFailedException e) {
78                 LOG.warn("Error reading from datastore", e);
79             }
80         }
81     }
82
83     public Optional<Node> getBridgeNode(InstanceIdentifier<?> iid) {
84         InstanceIdentifier<Node> nodeIid = iid.firstIdentifierOf(Node.class);
85         return Optional.fromNullable(operationalNodes.get(nodeIid));
86     }
87
88     public Optional<OvsdbBridgeAugmentation> getOvsdbBridgeAugmentation(InstanceIdentifier<?> iid) {
89         Optional<Node> nodeOptional = getBridgeNode(iid);
90         if (nodeOptional.isPresent()) {
91             return Optional.fromNullable(nodeOptional.get().getAugmentation(OvsdbBridgeAugmentation.class));
92         }
93         return Optional.absent();
94     }
95
96     public Optional<TerminationPoint> getBridgeTerminationPoint(InstanceIdentifier<?> iid) {
97         if (iid != null) {
98             Optional<Node> nodeOptional = getBridgeNode(iid);
99             if (nodeOptional.isPresent() && nodeOptional.get().getTerminationPoint() != null) {
100                 TerminationPointKey key = iid.firstKeyOf(TerminationPoint.class, TerminationPointKey.class);
101                 if (key != null) {
102                     for (TerminationPoint tp:nodeOptional.get().getTerminationPoint()) {
103                         if (tp.getKey().equals(key)) {
104                             return Optional.of(tp);
105                         }
106                     }
107                 }
108             }
109         }
110         return Optional.absent();
111     }
112
113     public Optional<OvsdbTerminationPointAugmentation> getOvsdbTerminationPointAugmentation(InstanceIdentifier<?> iid) {
114         Optional<TerminationPoint> tpOptional = getBridgeTerminationPoint(iid);
115         if (tpOptional.isPresent()) {
116             return Optional.fromNullable(tpOptional.get().getAugmentation(OvsdbTerminationPointAugmentation.class));
117         }
118         return Optional.absent();
119     }
120
121     public Optional<ControllerEntry> getControllerEntry(InstanceIdentifier<?> iid) {
122         if (iid != null) {
123             Optional<OvsdbBridgeAugmentation> ovsdbBridgeOptional = getOvsdbBridgeAugmentation(iid);
124             if (ovsdbBridgeOptional.isPresent() && ovsdbBridgeOptional.get().getControllerEntry() != null) {
125                 ControllerEntryKey key = iid.firstKeyOf(ControllerEntry.class, ControllerEntryKey.class);
126                 if (key != null) {
127                     for (ControllerEntry entry: ovsdbBridgeOptional.get().getControllerEntry()) {
128                         if (entry.getKey().equals(key)) {
129                             return Optional.of(entry);
130                         }
131                     }
132                 }
133             }
134         }
135         return Optional.absent();
136     }
137
138     public Optional<ProtocolEntry> getProtocolEntry(InstanceIdentifier<ProtocolEntry> iid) {
139         if (iid != null) {
140             Optional<OvsdbBridgeAugmentation> ovsdbBridgeOptional = getOvsdbBridgeAugmentation(iid);
141             if (ovsdbBridgeOptional.isPresent() && ovsdbBridgeOptional.get().getProtocolEntry() != null) {
142                 ProtocolEntryKey key = iid.firstKeyOf(ProtocolEntry.class, ProtocolEntryKey.class);
143                 if (key != null) {
144                     for (ProtocolEntry entry: ovsdbBridgeOptional.get().getProtocolEntry()) {
145                         if (entry.getKey().equals(key)) {
146                             return Optional.of(entry);
147                         }
148                     }
149                 }
150             }
151         }
152         return Optional.absent();
153     }
154
155 }