2 * Copyright (c) 2016 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.vpnservice.elan.internal;
11 import java.math.BigInteger;
12 import java.util.List;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.vpnservice.datastoreutils.DataStoreJobCoordinator;
19 import org.opendaylight.vpnservice.elan.utils.ElanConstants;
20 import org.opendaylight.vpnservice.elan.utils.ElanUtils;
21 import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo;
22 import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager;
23 import org.opendaylight.vpnservice.mdsalutil.AbstractDataChangeListener;
24 import org.opendaylight.vpnservice.mdsalutil.MDSALUtil;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.instances.ElanInstance;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.interfaces.ElanInterface;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.TunnelList;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.op.rev150701.tunnel.list.InternalTunnel;
33 import org.opendaylight.yangtools.concepts.ListenerRegistration;
34 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 public class ElanInterfaceStateChangeListener extends AbstractDataChangeListener<Interface> implements AutoCloseable {
39 private DataBroker broker;
40 private IInterfaceManager interfaceManager;
41 private ElanInterfaceManager elanInterfaceManager;
42 private ListenerRegistration<DataChangeListener> listenerRegistration;
43 private static final Logger logger = LoggerFactory.getLogger(ElanInterfaceStateChangeListener.class);
45 public ElanInterfaceStateChangeListener(final DataBroker db, final ElanInterfaceManager ifManager) {
46 super(Interface.class);
48 elanInterfaceManager = ifManager;
52 private void registerListener(final DataBroker db) {
54 listenerRegistration = broker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
55 getWildCardPath(), ElanInterfaceStateChangeListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
56 } catch (final Exception e) {
57 logger.error("Elan Interfaces DataChange listener registration fail!", e);
58 throw new IllegalStateException("ElanInterface registration Listener failed.", e);
62 private InstanceIdentifier<Interface> getWildCardPath() {
63 return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
66 public void setInterfaceManager(IInterfaceManager interfaceManager) {
67 this.interfaceManager = interfaceManager;
71 protected void remove(InstanceIdentifier<Interface> identifier, Interface delIf) {
72 logger.trace("Received interface {} Down event", delIf);
73 String interfaceName = delIf.getName();
74 ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
75 if(elanInterface == null) {
76 logger.debug("No Elan Interface is created for the interface:{} ", interfaceName);
79 NodeConnectorId nodeConnectorId = new NodeConnectorId(delIf.getLowerLayerIf().get(0));
80 BigInteger dpId = BigInteger.valueOf(MDSALUtil.getDpnIdFromPortName(nodeConnectorId));
81 InterfaceInfo interfaceInfo = new InterfaceInfo(dpId, nodeConnectorId.getValue());
82 interfaceInfo.setInterfaceName(interfaceName);
83 interfaceInfo.setInterfaceType(InterfaceInfo.InterfaceType.VLAN_INTERFACE);
84 interfaceInfo.setInterfaceTag(delIf.getIfIndex());
85 String elanInstanceName = elanInterface.getElanInstanceName();
86 ElanInstance elanInstance = ElanUtils.getElanInstanceByName(elanInstanceName);
87 DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
88 ElanInterfaceRemoveWorker removeWorker = new ElanInterfaceRemoveWorker(elanInstanceName, elanInstance,
89 interfaceName, interfaceInfo, elanInterfaceManager);
90 coordinator.enqueueJob(elanInstanceName, removeWorker, ElanConstants.JOB_MAX_RETRIES);
94 protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
95 logger.trace("Operation Interface update event - Old: {}, New: {}", original, update);
96 String interfaceName = update.getName();
97 if (update.getType() == null) {
98 logger.trace("Interface type for interface {} is null", interfaceName);
101 if(update.getType().equals(Tunnel.class)) {
102 if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
103 InternalTunnel internalTunnel = getTunnelState(interfaceName);
104 if (internalTunnel != null) {
105 elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(), internalTunnel.getDestinationDPN());
112 protected void add(InstanceIdentifier<Interface> identifier, Interface intrf) {
113 logger.trace("Received interface {} up event", intrf);
114 String interfaceName = intrf.getName();
115 ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(interfaceName);
116 if(elanInterface == null) {
117 if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
118 if(intrf.getOperStatus().equals(Interface.OperStatus.Up)) {
119 InternalTunnel internalTunnel = getTunnelState(interfaceName);
120 if (internalTunnel != null) {
121 elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(),
122 internalTunnel.getDestinationDPN());
128 InstanceIdentifier<ElanInterface> elanInterfaceId = ElanUtils.getElanInterfaceConfigurationDataPathId(interfaceName);
129 elanInterfaceManager.add(elanInterfaceId, elanInterface);
133 public void close() throws Exception {
137 public InternalTunnel getTunnelState(String interfaceName) {
138 InternalTunnel internalTunnel = null;
139 TunnelList tunnelList = ElanUtils.buildInternalTunnel(broker);
140 if (tunnelList != null && tunnelList.getInternalTunnel() != null) {
141 List<InternalTunnel> internalTunnels = tunnelList.getInternalTunnel();
142 for (InternalTunnel tunnel : internalTunnels) {
143 if (tunnel.getTunnelInterfaceName().equalsIgnoreCase(interfaceName)) {
144 internalTunnel = tunnel;
149 return internalTunnel;