Bump versions by x.(y+1).z
[ovsdb.git] / hwvtepsouthbound / hwvtepsouthbound-impl / src / test / java / org / opendaylight / ovsdb / hwvtepsouthbound / HwvtepOperationalDataChangeListener.java
1 /*
2  * Copyright (c) 2016, 2017 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.ovsdb.hwvtepsouthbound;
9
10 import java.util.List;
11 import org.opendaylight.mdsal.binding.api.DataBroker;
12 import org.opendaylight.mdsal.binding.api.DataObjectModification;
13 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
14 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
15 import org.opendaylight.mdsal.binding.api.DataTreeModification;
16 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
17 import org.opendaylight.ovsdb.lib.notation.UUID;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
22 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
23 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
27 import org.opendaylight.yangtools.concepts.Registration;
28 import org.opendaylight.yangtools.yang.binding.ChildOf;
29 import org.opendaylight.yangtools.yang.binding.DataObject;
30 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
31 import org.opendaylight.yangtools.yang.binding.KeyAware;
32
33 public class HwvtepOperationalDataChangeListener implements DataTreeChangeListener<Node>, AutoCloseable {
34     private final Registration registration;
35     private final HwvtepConnectionManager hcm;
36     private final DataBroker db;
37     private final HwvtepConnectionInstance connectionInstance;
38
39     HwvtepOperationalDataChangeListener(DataBroker db, HwvtepConnectionManager hcm,
40             HwvtepConnectionInstance connectionInstance) {
41         this.db = db;
42         this.hcm = hcm;
43         this.connectionInstance = connectionInstance;
44         DataTreeIdentifier<Node> treeId = DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, getWildcardPath());
45         registration = db.registerTreeChangeListener(treeId, this);
46     }
47
48     @Override
49     public void close() throws Exception {
50         if (registration != null) {
51             registration.close();
52         }
53     }
54
55     @Override
56     public void onDataTreeChanged(List<DataTreeModification<Node>> changes) {
57         for (DataTreeModification<Node> change : changes) {
58             final InstanceIdentifier<Node> key = change.getRootPath().path();
59             final DataObjectModification<Node> mod = change.getRootNode();
60             for (DataObjectModification<? extends DataObject> child : mod.modifiedChildren()) {
61                 updateDeviceOpData(key, child);
62             }
63             DataObjectModification<HwvtepGlobalAugmentation> aug =
64                     mod.getModifiedAugmentation(HwvtepGlobalAugmentation.class);
65             if (aug != null) {
66                 for (DataObjectModification<? extends DataObject> child : aug.modifiedChildren()) {
67                     updateDeviceOpData(key, child);
68                 }
69             }
70         }
71     }
72
73     private void updateDeviceOpData(InstanceIdentifier<Node> key, DataObjectModification<? extends DataObject> mod) {
74         Class<? extends KeyAware> childClass = (Class<? extends KeyAware>) mod.dataType();
75         InstanceIdentifier instanceIdentifier = getKey(key, mod, mod.dataAfter());
76         switch (mod.modificationType()) {
77             case WRITE:
78                 connectionInstance.getDeviceInfo().updateDeviceOperData(childClass, instanceIdentifier,
79                         new UUID("uuid"), mod.dataAfter());
80                 break;
81             case DELETE:
82                 connectionInstance.getDeviceInfo().clearDeviceOperData(childClass, instanceIdentifier);
83                 break;
84             case SUBTREE_MODIFIED:
85                 break;
86             default:
87                 break;
88         }
89     }
90
91     private static InstanceIdentifier getKey(InstanceIdentifier<Node> key,
92                                              DataObjectModification<? extends DataObject> child, DataObject data) {
93         Class<? extends DataObject> childClass = child.dataType();
94         InstanceIdentifier instanceIdentifier = null;
95         if (LogicalSwitches.class == childClass) {
96             LogicalSwitches ls = (LogicalSwitches)data;
97             instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(LogicalSwitches.class,
98                     ls.key());
99         } else if (org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology
100                 .topology.node.TerminationPoint.class == childClass) {
101             TerminationPoint tp = (TerminationPoint)data;
102             instanceIdentifier = key.child(TerminationPoint.class, tp.key());
103         } else if (RemoteUcastMacs.class == childClass) {
104             RemoteUcastMacs mac = (RemoteUcastMacs)data;
105             instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteUcastMacs.class,
106                     mac.key());
107         } else if (RemoteMcastMacs.class ==  childClass) {
108             RemoteMcastMacs mac = (RemoteMcastMacs)data;
109             instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteMcastMacs.class,
110                     mac.key());
111         }
112         return instanceIdentifier;
113     }
114
115     Class<? extends ChildOf<? super HwvtepGlobalAugmentation>> getClass(Class<? extends DataObject> cls) {
116         return (Class<? extends ChildOf<? super HwvtepGlobalAugmentation>>) cls;
117     }
118
119     private static InstanceIdentifier<Node> getWildcardPath() {
120         return InstanceIdentifier.create(NetworkTopology.class)
121                         .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))
122                         .child(Node.class);
123     }
124 }