Migrate HwvtepHACache users to HwvtepNodeHACache
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / l2gw / ha / listeners / HAListeners.java
1 /*
2  * Copyright (c) 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.netvirt.elan.l2gw.ha.listeners;
9
10 import java.util.ArrayList;
11 import java.util.List;
12 import javax.annotation.PreDestroy;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
18 import org.opendaylight.genius.utils.hwvtep.HwvtepSouthboundConstants;
19 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalMcastCmd;
20 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LocalUcastCmd;
21 import org.opendaylight.netvirt.elan.l2gw.ha.commands.LogicalSwitchesCmd;
22 import org.opendaylight.netvirt.elan.l2gw.ha.commands.MergeCommand;
23 import org.opendaylight.netvirt.elan.l2gw.ha.commands.PhysicalLocatorCmd;
24 import org.opendaylight.netvirt.elan.l2gw.ha.commands.RemoteMcastCmd;
25 import org.opendaylight.netvirt.elan.l2gw.ha.commands.RemoteUcastCmd;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAttributes;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.HwvtepGlobalAugmentation;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalMcastMacs;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LocalUcastMacs;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.LogicalSwitches;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteMcastMacs;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.global.attributes.RemoteUcastMacs;
33 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
35 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
36 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
37 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;
38 import org.opendaylight.yangtools.yang.binding.ChildOf;
39 import org.opendaylight.yangtools.yang.binding.DataObject;
40 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
41
42 @Singleton
43 public class HAListeners implements AutoCloseable {
44     private static final InstanceIdentifier<TerminationPoint> PHYSICAL_PORT_IID =
45         InstanceIdentifier.create(NetworkTopology.class)
46             .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))
47             .child(Node.class).child(TerminationPoint.class);
48
49     private final DataBroker broker;
50     private final List<HwvtepNodeDataListener<?>> listeners = new ArrayList<>();
51
52     @Inject
53     public HAListeners(DataBroker broker, HwvtepNodeHACache hwvtepNodeHACache) {
54         this.broker = broker;
55         registerListener(LocalMcastMacs.class, new LocalMcastCmd(), hwvtepNodeHACache);
56         registerListener(RemoteMcastMacs.class, new RemoteMcastCmd(), hwvtepNodeHACache);
57         registerListener(LocalUcastMacs.class, new LocalUcastCmd(), hwvtepNodeHACache);
58         registerListener(RemoteUcastMacs.class, new RemoteUcastCmd(), hwvtepNodeHACache);
59         registerListener(LogicalSwitches.class, new LogicalSwitchesCmd(), hwvtepNodeHACache);
60
61         PhysicalLocatorCmd physicalLocatorCmd = new PhysicalLocatorCmd();
62         listeners.add(new PhysicalLocatorListener(broker, hwvtepNodeHACache, physicalLocatorCmd,
63                 LogicalDatastoreType.CONFIGURATION));
64         listeners.add(new PhysicalLocatorListener(broker, hwvtepNodeHACache, physicalLocatorCmd,
65                 LogicalDatastoreType.OPERATIONAL));
66     }
67
68     @Override
69     @PreDestroy
70     public void close() {
71         for (HwvtepNodeDataListener listener : listeners) {
72             listener.close();
73         }
74     }
75
76     private <T extends ChildOf<HwvtepGlobalAttributes>> void registerListener(Class<T> clazz,
77             MergeCommand<T, ?, ?> mergeCommand, HwvtepNodeHACache hwvtepNodeHACache) {
78         listeners.add(new GlobalAugmentationListener(broker, hwvtepNodeHACache, clazz, HwvtepNodeDataListener.class,
79                 mergeCommand, LogicalDatastoreType.CONFIGURATION));
80         listeners.add(new GlobalAugmentationListener(broker, hwvtepNodeHACache, clazz, HwvtepNodeDataListener.class,
81                 mergeCommand, LogicalDatastoreType.OPERATIONAL));
82     }
83
84     private static class GlobalAugmentationListener<T extends DataObject
85             & ChildOf<HwvtepGlobalAttributes>> extends HwvtepNodeDataListener<T> {
86
87         GlobalAugmentationListener(DataBroker broker, HwvtepNodeHACache hwvtepNodeHACache,
88                                    Class<T> clazz, Class<HwvtepNodeDataListener<T>> eventClazz,
89                                    MergeCommand<T, ?, ?> mergeCommand,
90                                    LogicalDatastoreType datastoreType) {
91             super(broker, hwvtepNodeHACache, clazz, eventClazz, mergeCommand, datastoreType);
92         }
93
94         @Override
95         protected InstanceIdentifier<T> getWildCardPath() {
96             return InstanceIdentifier.create(NetworkTopology.class)
97                     .child(Topology.class, new TopologyKey(HwvtepSouthboundConstants.HWVTEP_TOPOLOGY_ID))
98                     .child(Node.class).augmentation(HwvtepGlobalAugmentation.class).child(clazz);
99         }
100     }
101
102     private static class PhysicalLocatorListener extends HwvtepNodeDataListener<TerminationPoint> {
103
104         PhysicalLocatorListener(DataBroker broker, HwvtepNodeHACache hwvtepNodeHACache,
105                 MergeCommand<TerminationPoint, ?, ?> mergeCommand, LogicalDatastoreType datastoreType) {
106             super(broker, hwvtepNodeHACache, TerminationPoint.class, (Class)PhysicalLocatorListener.class,
107                     mergeCommand, datastoreType);
108         }
109
110         @Override
111         protected InstanceIdentifier<TerminationPoint> getWildCardPath() {
112             return PHYSICAL_PORT_IID;
113         }
114
115         @Override
116         protected void remove(InstanceIdentifier<TerminationPoint> identifier, TerminationPoint dataRemoved) {
117             if (!isGlobalNode(identifier)) {
118                 return;
119             }
120             super.remove(identifier, dataRemoved);
121         }
122
123         @Override
124         protected void update(InstanceIdentifier<TerminationPoint> identifier, TerminationPoint before,
125                               TerminationPoint after) {
126             if (!isGlobalNode(identifier)) {
127                 return;
128             }
129             super.update(identifier, before, after);
130         }
131
132         @Override
133         protected void add(InstanceIdentifier<TerminationPoint> identifier, TerminationPoint added) {
134             if (!isGlobalNode(identifier)) {
135                 return;
136             }
137             super.add(identifier, added);
138         }
139
140         boolean isGlobalNode(InstanceIdentifier<TerminationPoint> identifier) {
141             return !identifier.firstKeyOf(Node.class).getNodeId().getValue()
142                     .contains(HwvtepSouthboundConstants.PSWITCH_URI_PREFIX);
143         }
144     }
145 }