2 * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
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
8 package org.opendaylight.genius.interfacemanager.listeners;
10 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
12 import java.util.Collections;
13 import javax.inject.Inject;
14 import javax.inject.Singleton;
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;
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;
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;
58 protected InstanceIdentifier<Interface> getWildCardPath() {
59 return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
63 public void remove(InstanceIdentifier<Interface> key, Interface interfaceStateOld) {
64 interfaceManagerCommonUtils.removeFromInterfaceStateCache(interfaceStateOld);
68 public void update(InstanceIdentifier<Interface> key, Interface interfaceStateOld, Interface interfaceStateNew) {
69 interfaceManagerCommonUtils.addInterfaceStateToCache(interfaceStateNew);
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)) {
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)));
92 return Collections.emptyList();
97 protected InterfaceStateListener getDataTreeChangeListener() {
98 return InterfaceStateListener.this;