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.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
15 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
16 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
17 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
18 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
19 import org.opendaylight.ovsdb.lib.notation.UUID;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
24 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
25 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
26 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
27 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
28 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
29 import org.opendaylight.yangtools.concepts.ListenerRegistration;
30 import org.opendaylight.yangtools.yang.binding.ChildOf;
31 import org.opendaylight.yangtools.yang.binding.DataObject;
32 import org.opendaylight.yangtools.yang.binding.Identifiable;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 public class HwvtepOperationalDataChangeListener implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
39 private static final Logger LOG = LoggerFactory.getLogger(HwvtepOperationalDataChangeListener.class);
41 private final ListenerRegistration<HwvtepOperationalDataChangeListener> registration;
42 private final HwvtepConnectionManager hcm;
43 private final DataBroker db;
44 private final HwvtepConnectionInstance connectionInstance;
46 HwvtepOperationalDataChangeListener(DataBroker db, HwvtepConnectionManager hcm,
47 HwvtepConnectionInstance connectionInstance) {
50 this.connectionInstance = connectionInstance;
51 DataTreeIdentifier<Node> treeId = new DataTreeIdentifier<>(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);
72 if (aug != null && getModificationType(aug) != null) {
73 Collection<DataObjectModification<? extends DataObject>> children = aug.getModifiedChildren();
74 for (DataObjectModification<? extends DataObject> child : children) {
75 updateDeviceOpData(key, child);
81 private void updateDeviceOpData(InstanceIdentifier<Node> key, DataObjectModification<? extends DataObject> mod) {
82 ModificationType type = getModificationType(mod);
86 Class<? extends Identifiable> childClass = (Class<? extends Identifiable>) mod.getDataType();
87 InstanceIdentifier instanceIdentifier = getKey(key, mod, mod.getDataAfter());
90 connectionInstance.getDeviceInfo().updateDeviceOperData(childClass, instanceIdentifier,
91 new UUID("uuid"), mod.getDataAfter());
94 connectionInstance.getDeviceInfo().clearDeviceOperData(childClass, instanceIdentifier);
96 case SUBTREE_MODIFIED:
103 private ModificationType getModificationType(DataObjectModification<? extends DataObject> mod) {
105 return mod.getModificationType();
106 } catch (IllegalStateException e) {
107 LOG.debug("Failed to get the modification type ", e);
112 private InstanceIdentifier getKey(InstanceIdentifier<Node> key, DataObjectModification<? extends DataObject> child,
114 Class<? extends DataObject> childClass = child.getDataType();
115 InstanceIdentifier instanceIdentifier = null;
116 if (LogicalSwitches.class == childClass) {
117 LogicalSwitches ls = (LogicalSwitches)data;
118 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(LogicalSwitches.class,
120 } else if (org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology
121 .topology.node.TerminationPoint.class == childClass) {
122 TerminationPoint tp = (TerminationPoint)data;
123 instanceIdentifier = key.child(TerminationPoint.class, tp.getKey());
124 } else if (RemoteUcastMacs.class == childClass) {
125 RemoteUcastMacs mac = (RemoteUcastMacs)data;
126 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteUcastMacs.class,
128 } else if (RemoteMcastMacs.class == childClass) {
129 RemoteMcastMacs mac = (RemoteMcastMacs)data;
130 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteMcastMacs.class,
133 return instanceIdentifier;
136 Class<? extends ChildOf<? super HwvtepGlobalAugmentation>> getClass(Class<? extends DataObject> cls) {
137 return (Class<? extends ChildOf<? super HwvtepGlobalAugmentation>>) cls;
140 private InstanceIdentifier<Node> getWildcardPath() {
141 InstanceIdentifier<Node> path = InstanceIdentifier
142 .create(NetworkTopology.class)
143 .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))