2 * Copyright (c) 2015 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 org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
14 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
15 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
16 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
17 import org.opendaylight.controller.md.sal.common.api.data.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.network.topology.topology.node.TerminationPoint;
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.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 import java.util.Collection;
38 public class HwvtepOperationalDataChangeListener implements ClusteredDataTreeChangeListener<Node>, AutoCloseable {
40 private static final Logger LOG = LoggerFactory.getLogger(HwvtepOperationalDataChangeListener.class);
42 private final ListenerRegistration<HwvtepOperationalDataChangeListener> registration;
43 private final HwvtepConnectionManager hcm;
44 private final DataBroker db;
45 private final HwvtepConnectionInstance connectionInstance;
47 HwvtepOperationalDataChangeListener(DataBroker db, HwvtepConnectionManager hcm, HwvtepConnectionInstance connectionInstance) {
50 this.connectionInstance = connectionInstance;
51 DataTreeIdentifier<Node> treeId =
52 new DataTreeIdentifier<Node>(LogicalDatastoreType.OPERATIONAL, getWildcardPath());
53 registration = db.registerDataTreeChangeListener(treeId, HwvtepOperationalDataChangeListener.this);
57 public void close() throws Exception {
58 if(registration != null) {
64 public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) {
65 for (DataTreeModification<Node> change : changes) {
66 final InstanceIdentifier<Node> key = change.getRootPath().getRootIdentifier();
67 final DataObjectModification<Node> mod = change.getRootNode();
68 for (DataObjectModification<? extends DataObject> child : mod.getModifiedChildren()) {
69 updateDeviceOpData(key, child);
71 DataObjectModification<HwvtepGlobalAugmentation> aug = 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().updateDeviceOpData(childClass, instanceIdentifier,
91 new UUID("uuid"), mod.getDataAfter());
94 connectionInstance.getDeviceInfo().clearDeviceOpData(childClass, instanceIdentifier);
96 case SUBTREE_MODIFIED:
100 private ModificationType getModificationType(DataObjectModification<? extends DataObject> mod) {
102 return mod.getModificationType();
103 } catch (IllegalStateException e) {
104 LOG.debug("Failed to get the modification type ", e);
109 private InstanceIdentifier getKey(InstanceIdentifier<Node> key, DataObjectModification<? extends DataObject> child,
111 Class<? extends DataObject> childClass = child.getDataType();
112 InstanceIdentifier instanceIdentifier = null;
113 if (LogicalSwitches.class == childClass) {
114 LogicalSwitches ls = (LogicalSwitches)data;
115 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(LogicalSwitches.class, ls.getKey());
116 } else if (org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint.class == childClass) {
117 TerminationPoint tp = (TerminationPoint)data;
118 instanceIdentifier = key.child(TerminationPoint.class, tp.getKey());
119 } else if (RemoteUcastMacs.class == childClass) {
120 RemoteUcastMacs mac = (RemoteUcastMacs)data;
121 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteUcastMacs.class, mac.getKey());
122 } else if (RemoteMcastMacs.class == childClass) {
123 RemoteMcastMacs mac = (RemoteMcastMacs)data;
124 instanceIdentifier = key.augmentation(HwvtepGlobalAugmentation.class).child(RemoteMcastMacs.class, mac.getKey());
126 return instanceIdentifier;
129 Class<? extends ChildOf<? super HwvtepGlobalAugmentation>> getClass(Class<? extends DataObject> cls) {
130 return (Class<? extends ChildOf<? super HwvtepGlobalAugmentation>>) cls;
133 private InstanceIdentifier<Node> getWildcardPath() {
134 InstanceIdentifier<Node> path = InstanceIdentifier
135 .create(NetworkTopology.class)
136 .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))