2 * Copyright (c) 2016, 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
9 package org.opendaylight.ovsdb.hwvtepsouthbound;
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;
36 public class HwvtepOperationalDataChangeListener implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
38 private static final Logger LOG = LoggerFactory.getLogger(HwvtepOperationalDataChangeListener.class);
40 private final ListenerRegistration<HwvtepOperationalDataChangeListener> registration;
41 private final HwvtepConnectionManager hcm;
42 private final DataBroker db;
43 private final HwvtepConnectionInstance connectionInstance;
45 HwvtepOperationalDataChangeListener(DataBroker db, HwvtepConnectionManager hcm,
46 HwvtepConnectionInstance connectionInstance) {
49 this.connectionInstance = connectionInstance;
50 DataTreeIdentifier<Node> treeId = DataTreeIdentifier
51 .create(LogicalDatastoreType.OPERATIONAL, getWildcardPath());
52 registration = db.registerDataTreeChangeListener(treeId, HwvtepOperationalDataChangeListener.this);
56 public void close() throws Exception {
57 if (registration != null) {
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);
70 DataObjectModification<HwvtepGlobalAugmentation> aug =
71 mod.getModifiedAugmentation(HwvtepGlobalAugmentation.class);
73 for (DataObjectModification<? extends DataObject> child : aug.getModifiedChildren()) {
74 updateDeviceOpData(key, child);
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()) {
85 connectionInstance.getDeviceInfo().updateDeviceOperData(childClass, instanceIdentifier,
86 new UUID("uuid"), mod.getDataAfter());
89 connectionInstance.getDeviceInfo().clearDeviceOperData(childClass, instanceIdentifier);
91 case SUBTREE_MODIFIED:
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,
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,
114 } else if (RemoteMcastMacs.class == childClass) {
115 RemoteMcastMacs mac = (RemoteMcastMacs)data;
116 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteMcastMacs.class,
119 return instanceIdentifier;
122 Class<? extends ChildOf<? super HwvtepGlobalAugmentation>> getClass(Class<? extends DataObject> cls) {
123 return (Class<? extends ChildOf<? super HwvtepGlobalAugmentation>>) cls;
126 private static InstanceIdentifier<Node> getWildcardPath() {
127 return InstanceIdentifier.create(NetworkTopology.class)
128 .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))