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