650be5126ba772dabd72e9bd19e3d573ce0fed7c
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / listeners / HwVTEPTunnelsStateListener.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 package org.opendaylight.genius.interfacemanager.listeners;
9
10 import com.google.common.util.concurrent.ListenableFuture;
11 import java.util.List;
12 import java.util.concurrent.Callable;
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.datastoreutils.hwvtep.HwvtepAbstractDataTreeChangeListener;
18 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
19 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
20 import org.opendaylight.genius.interfacemanager.IfmConstants;
21 import org.opendaylight.genius.interfacemanager.recovery.impl.InterfaceServiceRecoveryHandler;
22 import org.opendaylight.genius.interfacemanager.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateRemoveHelper;
23 import org.opendaylight.genius.interfacemanager.renderer.hwvtep.statehelpers.HwVTEPInterfaceStateUpdateHelper;
24 import org.opendaylight.genius.srm.RecoverableListener;
25 import org.opendaylight.genius.srm.ServiceRecoveryRegistry;
26 import org.opendaylight.genius.utils.hwvtep.HwvtepNodeHACache;
27 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.PhysicalSwitchAugmentation;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.hwvtep.rev150901.hwvtep.physical._switch.attributes.Tunnels;
30 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
31 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
32 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
33 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 @Singleton
38 public class HwVTEPTunnelsStateListener
39         extends HwvtepAbstractDataTreeChangeListener<Tunnels, HwVTEPTunnelsStateListener>
40         implements RecoverableListener {
41     private static final Logger LOG = LoggerFactory.getLogger(HwVTEPTunnelsStateListener.class);
42
43     private final ManagedNewTransactionRunner txRunner;
44     private final JobCoordinator coordinator;
45     private final DataBroker dataBroker;
46
47     @Inject
48     public HwVTEPTunnelsStateListener(final DataBroker dataBroker, final JobCoordinator coordinator,
49                                       final InterfaceServiceRecoveryHandler interfaceServiceRecoveryHandler,
50                                       final ServiceRecoveryRegistry serviceRecoveryRegistry,
51                                       final HwvtepNodeHACache hwvtepNodeHACache) {
52         super(Tunnels.class, HwVTEPTunnelsStateListener.class, hwvtepNodeHACache);
53         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
54         this.coordinator = coordinator;
55         this.dataBroker = dataBroker;
56         registerListener();
57         serviceRecoveryRegistry.addRecoverableListener(interfaceServiceRecoveryHandler.buildServiceRegistryKey(),
58                 this);
59     }
60
61     @Override
62     public void registerListener() {
63         this.registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
64     }
65
66     @Override
67     protected InstanceIdentifier<Tunnels> getWildCardPath() {
68         return InstanceIdentifier.builder(NetworkTopology.class).child(Topology.class).child(Node.class)
69                 .augmentation(PhysicalSwitchAugmentation.class).child(Tunnels.class).build();
70     }
71
72     @Override
73     protected HwVTEPTunnelsStateListener getDataTreeChangeListener() {
74         return HwVTEPTunnelsStateListener.this;
75     }
76
77     @Override
78     protected void removed(InstanceIdentifier<Tunnels> identifier, Tunnels tunnel) {
79         LOG.debug("Received Remove DataChange Notification for identifier: {}, physicalSwitchAugmentation: {}",
80                 identifier, tunnel);
81         RendererStateRemoveWorker rendererStateRemoveWorker = new RendererStateRemoveWorker(identifier);
82         coordinator.enqueueJob(tunnel.getTunnelUuid().getValue(), rendererStateRemoveWorker,
83                 IfmConstants.JOB_MAX_RETRIES);
84     }
85
86     @Override
87     protected void updated(InstanceIdentifier<Tunnels> identifier, Tunnels tunnelOld,
88                            Tunnels tunnelNew) {
89         LOG.debug("Received Update Tunnel Update Notification for identifier: {}", identifier);
90         RendererStateUpdateWorker rendererStateUpdateWorker =
91                 new RendererStateUpdateWorker(identifier, tunnelOld);
92         coordinator.enqueueJob(tunnelNew.getTunnelUuid().getValue(), rendererStateUpdateWorker,
93                 IfmConstants.JOB_MAX_RETRIES);
94     }
95
96     @Override
97     protected void added(InstanceIdentifier<Tunnels> identifier, Tunnels tunnelNew) {
98         LOG.debug("Received Add DataChange Notification for identifier: {}, tunnels: {}", identifier, tunnelNew);
99         RendererStateAddWorker rendererStateAddWorker = new RendererStateAddWorker(identifier, tunnelNew);
100         coordinator.enqueueJob(tunnelNew.getTunnelUuid().getValue(), rendererStateAddWorker,
101                 IfmConstants.JOB_MAX_RETRIES);
102     }
103
104     private class RendererStateUpdateWorker implements Callable<List<ListenableFuture<Void>>> {
105         InstanceIdentifier<Tunnels> instanceIdentifier;
106         Tunnels tunnelsOld;
107
108         RendererStateUpdateWorker(InstanceIdentifier<Tunnels> instanceIdentifier, Tunnels tunnelsOld) {
109             this.instanceIdentifier = instanceIdentifier;
110             this.tunnelsOld = tunnelsOld;
111         }
112
113         @Override
114         public List<ListenableFuture<Void>> call() {
115             return HwVTEPInterfaceStateUpdateHelper.updatePhysicalSwitch(txRunner, instanceIdentifier, tunnelsOld);
116         }
117     }
118
119     private class RendererStateAddWorker implements Callable<List<ListenableFuture<Void>>> {
120         InstanceIdentifier<Tunnels> instanceIdentifier;
121         Tunnels tunnelsNew;
122
123         RendererStateAddWorker(InstanceIdentifier<Tunnels> instanceIdentifier, Tunnels tunnelsNew) {
124             this.instanceIdentifier = instanceIdentifier;
125             this.tunnelsNew = tunnelsNew;
126         }
127
128         @Override
129         public List<ListenableFuture<Void>> call() {
130             return HwVTEPInterfaceStateUpdateHelper.startBfdMonitoring(txRunner, instanceIdentifier, tunnelsNew);
131         }
132     }
133
134     private class RendererStateRemoveWorker implements Callable<List<ListenableFuture<Void>>> {
135         InstanceIdentifier<Tunnels> instanceIdentifier;
136
137         RendererStateRemoveWorker(InstanceIdentifier<Tunnels> instanceIdentifier) {
138             this.instanceIdentifier = instanceIdentifier;
139         }
140
141         @Override
142         public List<ListenableFuture<Void>> call() {
143             return HwVTEPInterfaceStateRemoveHelper.removeExternalTunnel(txRunner, instanceIdentifier);
144         }
145     }
146 }