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;
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;
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;
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;
57 protected InstanceIdentifier<Interface> getWildCardPath() {
58 return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
62 public void remove(InstanceIdentifier<Interface> key, Interface interfaceStateOld) {
63 interfaceManagerCommonUtils.removeFromInterfaceStateCache(interfaceStateOld);
67 public void update(InstanceIdentifier<Interface> key, Interface interfaceStateOld, Interface interfaceStateNew) {
68 interfaceManagerCommonUtils.addInterfaceStateToCache(interfaceStateNew);
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)) {
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)));
91 return Collections.emptyList();
96 protected InterfaceStateListener getDataTreeChangeListener() {
97 return InterfaceStateListener.this;