Merge "Added support for bridge other-config."
[ovsdb.git] / southbound / southbound-impl / src / main / java / org / opendaylight / ovsdb / southbound / ovsdb / transact / BridgeOperationalState.java
1 package org.opendaylight.ovsdb.southbound.ovsdb.transact;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.Map.Entry;
6 import java.util.concurrent.ExecutionException;
7
8 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
9 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
10 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
11 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
12 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
15 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
16 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
17 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointKey;
18 import org.opendaylight.yangtools.yang.binding.DataObject;
19 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
22
23 import com.google.common.base.Optional;
24 import com.google.common.util.concurrent.CheckedFuture;
25
26 public class BridgeOperationalState {
27     private static final Logger LOG = LoggerFactory.getLogger(BridgeOperationalState.class);
28     private DataBroker db;
29     private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changes;
30     private Map<InstanceIdentifier<Node>, Node> operationalNodes = new HashMap<InstanceIdentifier<Node>, Node>();
31
32     public BridgeOperationalState(DataBroker db, AsyncDataChangeEvent<InstanceIdentifier<?>,
33             DataObject> changes) {
34         this.db = db;
35         this.changes = changes;
36         ReadOnlyTransaction transaction = db.newReadOnlyTransaction();
37         Map<InstanceIdentifier<Node>, Node> nodeCreateOrUpdate =
38                 TransactUtils.extractCreatedOrUpdatedOrRemoved(changes, Node.class);
39         if (nodeCreateOrUpdate != null) {
40             for (Entry<InstanceIdentifier<Node>, Node> entry: nodeCreateOrUpdate.entrySet()) {
41                 CheckedFuture<Optional<Node>, ReadFailedException> nodeFuture =
42                         transaction.read(LogicalDatastoreType.OPERATIONAL, entry.getKey());
43                 try {
44                     Optional<Node> nodeOptional = nodeFuture.get();
45                     if (nodeOptional.isPresent()) {
46                         operationalNodes.put(entry.getKey(), nodeOptional.get());
47                     }
48                 } catch (InterruptedException e) {
49                     LOG.warn("Error reading from datastore",e);
50                 } catch (ExecutionException e) {
51                     LOG.warn("Error reading from datastore",e);
52                 }
53             }
54         }
55         transaction.close();
56     }
57
58     public Optional<Node> getBridgeNode(InstanceIdentifier<?> iid) {
59         InstanceIdentifier<Node> nodeIid = iid.firstIdentifierOf(Node.class);
60         if (operationalNodes.containsKey(nodeIid)) {
61             return Optional.of(operationalNodes.get(nodeIid));
62         }
63         return Optional.absent();
64     }
65
66     public Optional<OvsdbBridgeAugmentation> getOvsdbBridgeAugmentation(InstanceIdentifier<?> iid) {
67         Optional<Node> nodeOptional = getBridgeNode(iid);
68         if (nodeOptional.isPresent() && nodeOptional.get().getAugmentation(OvsdbBridgeAugmentation.class) != null) {
69             return Optional.of(nodeOptional.get().getAugmentation(OvsdbBridgeAugmentation.class));
70         }
71         return Optional.absent();
72     }
73
74     public Optional<TerminationPoint> getBrideTermiationPoint(InstanceIdentifier<?> iid) {
75         Optional<Node> nodeOptional = getBridgeNode(iid);
76         if (nodeOptional.isPresent()) {
77             TerminationPointKey key = iid.firstKeyOf(TerminationPoint.class, TerminationPointKey.class);
78             if (key != null) {
79                 for (TerminationPoint tp:nodeOptional.get().getTerminationPoint()) {
80                     if (tp.getKey().equals(key)) {
81                         return Optional.of(tp);
82                     }
83                 }
84             }
85         }
86         return Optional.absent();
87     }
88
89     public Optional<OvsdbTerminationPointAugmentation> getOvsdbTerminationPointAugmentation(InstanceIdentifier<?> iid) {
90         Optional<TerminationPoint> tpOptional = getBrideTermiationPoint(iid);
91         if (tpOptional.isPresent()
92                 && tpOptional.get().getAugmentation(OvsdbTerminationPointAugmentation.class) != null) {
93             return Optional.of(tpOptional.get().getAugmentation(OvsdbTerminationPointAugmentation.class));
94         }
95         return Optional.absent();
96     }
97
98 }