MRI version bump for Aluminium
[genius.git] / interfacemanager / interfacemanager-impl / src / main / java / org / opendaylight / genius / interfacemanager / listeners / InterfaceStateListener.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.genius.interfacemanager.listeners;
9
10 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
11
12 import java.util.Collections;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
15 import org.apache.aries.blueprint.annotation.service.Reference;
16 import org.opendaylight.genius.infra.ManagedNewTransactionRunner;
17 import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
18 import org.opendaylight.genius.interfacemanager.IfmConstants;
19 import org.opendaylight.genius.interfacemanager.commons.InterfaceManagerCommonUtils;
20 import org.opendaylight.genius.utils.clustering.EntityOwnershipUtils;
21 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
22 import org.opendaylight.infrautils.utils.concurrent.Executors;
23 import org.opendaylight.mdsal.binding.api.DataBroker;
24 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
25 import org.opendaylight.serviceutils.tools.listener.AbstractClusteredAsyncDataTreeChangeListener;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.Tunnel;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
29 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33 @Singleton
34 public class InterfaceStateListener
35         extends AbstractClusteredAsyncDataTreeChangeListener<Interface> {
36     private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateListener.class);
37     private final ManagedNewTransactionRunner txRunner;
38     private final EntityOwnershipUtils entityOwnershipUtils;
39     private final JobCoordinator coordinator;
40     private final InterfaceManagerCommonUtils interfaceManagerCommonUtils;
41
42     @Inject
43     public InterfaceStateListener(@Reference DataBroker dataBroker,
44                                   final EntityOwnershipUtils entityOwnershipUtils,
45                                   @Reference final JobCoordinator coordinator,
46                                   final InterfaceManagerCommonUtils interfaceManagerCommonUtils) {
47         super(dataBroker, LogicalDatastoreType.OPERATIONAL,
48                 InstanceIdentifier.create(InterfacesState.class).child(Interface.class),
49                 Executors.newSingleThreadExecutor("NodeConnectorStatsImpl", LOG));
50         this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker);
51         this.entityOwnershipUtils = entityOwnershipUtils;
52         this.coordinator = coordinator;
53         this.interfaceManagerCommonUtils = interfaceManagerCommonUtils;
54     }
55
56     /*@Override
57     protected InstanceIdentifier<Interface> getWildCardPath() {
58         return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
59     }*/
60
61     @Override
62     public void remove(InstanceIdentifier<Interface> key, Interface interfaceStateOld) {
63         interfaceManagerCommonUtils.removeFromInterfaceStateCache(interfaceStateOld);
64     }
65
66     @Override
67     public void update(InstanceIdentifier<Interface> key, Interface interfaceStateOld, Interface interfaceStateNew) {
68         interfaceManagerCommonUtils.addInterfaceStateToCache(interfaceStateNew);
69     }
70
71     @Override
72     public void add(InstanceIdentifier<Interface> key, Interface interfaceStateNew) {
73         interfaceManagerCommonUtils.addInterfaceStateToCache(interfaceStateNew);
74         if (!Tunnel.class.equals(interfaceStateNew.getType())
75             || !entityOwnershipUtils.isEntityOwner(IfmConstants.INTERFACE_CONFIG_ENTITY,
76                     IfmConstants.INTERFACE_CONFIG_ENTITY)) {
77             return;
78         }
79         LOG.debug("Received Tunnel state add event for {}", interfaceStateNew.getName());
80         coordinator.enqueueJob(interfaceStateNew.getName(), () -> {
81             Interface.OperStatus bfdState = interfaceManagerCommonUtils
82                     .getBfdStateFromCache(interfaceStateNew.getName());
83             if (bfdState != null && bfdState != interfaceStateNew.getOperStatus()
84                     && interfaceStateNew.getOperStatus() != Interface.OperStatus.Unknown) {
85                 // update opstate of interface if TEP has gone down/up as a
86                 // result of BFD monitoring
87                 LOG.debug("updating tunnel state for interface {}", interfaceStateNew.getName());
88                 return Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL,
89                     tx -> InterfaceManagerCommonUtils.updateOpState(tx, interfaceStateNew.getName(), bfdState)));
90             }
91             return Collections.emptyList();
92         });
93     }
94
95     /*@Override
96     protected InterfaceStateListener getDataTreeChangeListener() {
97         return InterfaceStateListener.this;
98     }*/
99 }