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