NETVIRT-1630 migrate to md-sal APIs
[netvirt.git] / elanmanager / impl / src / main / java / org / opendaylight / netvirt / elan / internal / ElanInterfaceStateClusteredListener.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.netvirt.elan.internal;
9
10 import javax.annotation.PreDestroy;
11 import javax.inject.Inject;
12 import javax.inject.Singleton;
13 import org.opendaylight.infrautils.utils.concurrent.Executors;
14 import org.opendaylight.mdsal.binding.api.DataBroker;
15 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
16 import org.opendaylight.netvirt.elan.utils.ElanClusterUtils;
17 import org.opendaylight.netvirt.elan.utils.ElanUtils;
18 import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel;
23 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
24 import org.slf4j.Logger;
25 import org.slf4j.LoggerFactory;
26
27 @Singleton
28 public class ElanInterfaceStateClusteredListener extends
29         AbstractClusteredAsyncDataTreeChangeListener<Interface> {
30
31     private static final Logger LOG = LoggerFactory.getLogger(ElanInterfaceStateClusteredListener.class);
32
33     private final DataBroker broker;
34     private final ElanInterfaceManager elanInterfaceManager;
35     private final ElanUtils elanUtils;
36     private final ElanClusterUtils elanClusterUtils;
37
38     /* FIXME:
39      * Why do we have ElanInterfaceStateChangeListener and ElanInterfaceStateClusteredListener
40      * both within same module? Refactor this code into single listener.
41      */
42     @Inject
43     public ElanInterfaceStateClusteredListener(DataBroker broker, ElanInterfaceManager elanInterfaceManager,
44                                                ElanUtils elanUtils, ElanClusterUtils elanClusterUtils) {
45         super(broker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)
46                 .child(Interface.class),
47                 Executors.newListeningSingleThreadExecutor("ElanInterfaceStateClusteredListener", LOG));
48         this.broker = broker;
49         this.elanInterfaceManager = elanInterfaceManager;
50         this.elanUtils = elanUtils;
51         this.elanClusterUtils = elanClusterUtils;
52     }
53
54     public void init() {
55         LOG.info("{} registered", getClass().getSimpleName());
56     }
57
58     @Override
59     @PreDestroy
60     public void close() {
61         super.close();
62         Executors.shutdownAndAwaitTermination(getExecutorService());
63     }
64
65     @Override
66     public void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
67     }
68
69     @Override
70     public void update(InstanceIdentifier<Interface> identifier, Interface original, final Interface update) {
71         add(identifier, update);
72     }
73
74     @Override
75     public void add(InstanceIdentifier<Interface> identifier, final Interface intrf) {
76         if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
77             if (Interface.OperStatus.Up.equals(intrf.getOperStatus())) {
78                 final String interfaceName = intrf.getName();
79
80                 elanClusterUtils.runOnlyInOwnerNode("external tunnel update", () -> {
81                     LOG.debug("running external tunnel update job for interface {} added", interfaceName);
82                     handleExternalTunnelUpdate(interfaceName, intrf);
83                 });
84             }
85         }
86     }
87
88     private void handleExternalTunnelUpdate(String interfaceName, Interface update) {
89         ExternalTunnel externalTunnel = elanUtils.getExternalTunnel(interfaceName, LogicalDatastoreType.CONFIGURATION);
90         if (externalTunnel != null) {
91             LOG.debug("handling external tunnel update event for ext device dst {}  src {} ",
92                 externalTunnel.getDestinationDevice(), externalTunnel.getSourceDevice());
93             elanInterfaceManager.handleExternalTunnelStateEvent(externalTunnel, update);
94         } else {
95             LOG.trace("External tunnel not found with interfaceName: {}", interfaceName);
96         }
97     }
98
99     /* (non-Javadoc)
100      * @see org.opendaylight.genius.datastoreutils.AsyncClusteredDataTreeChangeListenerBase#getDataTreeChangeListener()
101      */
102 }