import java.math.BigInteger;
-import java.util.Collections;
-import java.util.List;
+
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo;
import org.opendaylight.genius.mdsalutil.MDSALUtil;
-import org.opendaylight.netvirt.elan.ElanException;
import org.opendaylight.netvirt.elan.utils.ElanConstants;
import org.opendaylight.netvirt.elan.utils.ElanUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnel.list.InternalTunnel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.interfaces.ElanInterface;
@Override
protected void update(InstanceIdentifier<Interface> identifier, Interface original, Interface update) {
LOG.trace("Operation Interface update event - Old: {}, New: {}", original, update);
- String interfaceName = update.getName();
- if (update.getType() == null) {
- LOG.trace("Interface type for interface {} is null", interfaceName);
- return;
- }
- if (update.getType().equals(Tunnel.class)) {
- DataStoreJobCoordinator.getInstance().enqueueJob(interfaceName, () -> {
- if (!original.getOperStatus().equals(Interface.OperStatus.Unknown)
- && !update.getOperStatus().equals(Interface.OperStatus.Unknown)) {
- if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
- InternalTunnel internalTunnel = getTunnelState(interfaceName);
- if (internalTunnel != null) {
- try {
- LOG.debug("ITM Tunnel Update event between source DPN {} and destination DPN {} ",
- internalTunnel.getSourceDPN(), internalTunnel.getDestinationDPN());
- elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(),
- internalTunnel.getDestinationDPN());
- } catch (ElanException e) {
- LOG.error("Failed to update interface: " + identifier.toString(), e);
- }
- }
- }
- }
- return Collections.emptyList();
- }, ElanConstants.JOB_MAX_RETRIES);
- }
}
@Override
String interfaceName = intrf.getName();
ElanInterface elanInterface = ElanUtils.getElanInterfaceByElanInterfaceName(broker, interfaceName);
if (elanInterface == null) {
- if (intrf.getType() != null && intrf.getType().equals(Tunnel.class)) {
- DataStoreJobCoordinator.getInstance().enqueueJob(interfaceName,
- () -> {
- if (intrf.getOperStatus().equals(Interface.OperStatus.Up)) {
- InternalTunnel internalTunnel = getTunnelState(interfaceName);
- if (internalTunnel != null) {
- try {
- LOG.debug("ITM Tunnel Add event between source DPN {} and destination DPN {} ",
- internalTunnel.getSourceDPN(), internalTunnel.getDestinationDPN());
- elanInterfaceManager.handleInternalTunnelStateEvent(internalTunnel.getSourceDPN(),
- internalTunnel.getDestinationDPN());
- } catch (ElanException e) {
- LOG.error("Failed to add interface: " + identifier.toString(), e);
- }
- }
- }
- return Collections.emptyList();
- }, ElanConstants.JOB_MAX_RETRIES);
- }
return;
}
InstanceIdentifier<ElanInterface> elanInterfaceId = ElanUtils
}
- public InternalTunnel getTunnelState(String interfaceName) {
- InternalTunnel internalTunnel = null;
- TunnelList tunnelList = ElanUtils.buildInternalTunnel(broker);
- if (tunnelList != null && tunnelList.getInternalTunnel() != null) {
- List<InternalTunnel> internalTunnels = tunnelList.getInternalTunnel();
- for (InternalTunnel tunnel : internalTunnels) {
- if (tunnel.getTunnelInterfaceName().equalsIgnoreCase(interfaceName)) {
- internalTunnel = tunnel;
- break;
- }
- }
- }
- return internalTunnel;
- }
-
@Override
protected InstanceIdentifier<Interface> getWildCardPath() {
return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
--- /dev/null
+/*
+ * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.elan.internal;
+
+import java.math.BigInteger;
+import java.util.Collections;
+
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
+import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.netvirt.elan.ElanException;
+import org.opendaylight.netvirt.elan.utils.ElanConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelOperStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ElanTunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBase<StateTunnelList,
+ ElanTunnelInterfaceStateListener> implements AutoCloseable {
+ private static final Logger LOG = LoggerFactory.getLogger(ElanTunnelInterfaceStateListener.class);
+ private final DataBroker dataBroker;
+ private final ElanInterfaceManager elanInterfaceManager;
+
+ public ElanTunnelInterfaceStateListener(final DataBroker dataBroker,
+ final ElanInterfaceManager elanInterfaceManager) {
+ super(StateTunnelList.class, ElanTunnelInterfaceStateListener.class);
+ this.dataBroker = dataBroker;
+ this.elanInterfaceManager = elanInterfaceManager;
+ }
+
+ @Override
+ public void init() {
+ registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
+ }
+
+ @Override
+ protected InstanceIdentifier<StateTunnelList> getWildCardPath() {
+ return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
+ }
+
+ @Override
+ protected void remove(InstanceIdentifier<StateTunnelList> key, StateTunnelList delete) {
+ }
+
+ @Override
+ protected void update(InstanceIdentifier<StateTunnelList> key, StateTunnelList original,
+ StateTunnelList update) {
+ }
+
+ @Override
+ protected void add(InstanceIdentifier<StateTunnelList> key, StateTunnelList add) {
+ LOG.info("processing add state for StateTunnelList {}", add);
+ if (!isInternalTunnel(add)) {
+ LOG.trace("tunnel {} is not a internal vxlan tunnel", add);
+ return;
+ }
+ TunnelOperStatus tunOpStatus = add.getOperState();
+ if (tunOpStatus != TunnelOperStatus.Down && tunOpStatus != TunnelOperStatus.Up) {
+ LOG.trace("Returning because unsupported tunnelOperStatus {}", tunOpStatus);
+ return;
+ }
+ DataStoreJobCoordinator.getInstance().enqueueJob(add.getTunnelInterfaceName(), () -> {
+ BigInteger srcDpId = new BigInteger(add.getSrcInfo().getTepDeviceId());
+ BigInteger dstDpId = new BigInteger(add.getDstInfo().getTepDeviceId());
+ try {
+ LOG.info("Handling tunnel state event for srcDpId {} and dstDpId {} ",
+ srcDpId, dstDpId);
+ elanInterfaceManager.handleInternalTunnelStateEvent(srcDpId, dstDpId);
+ } catch (ElanException e) {
+ LOG.error("Failed handle tunnel state event between srcDpId {} and dstDpId {} ",
+ srcDpId, dstDpId, e);
+ }
+ return Collections.emptyList();
+ }, ElanConstants.JOB_MAX_RETRIES);
+ }
+
+ @Override
+ protected ElanTunnelInterfaceStateListener getDataTreeChangeListener() {
+ return this;
+ }
+
+ private boolean isInternalTunnel(StateTunnelList stateTunnelList) {
+ return stateTunnelList.getDstInfo().getTepDeviceType() == TepTypeInternal.class;
+ }
+
+}
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServicesKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.ExternalTunnelList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelList;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnel;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.external.tunnel.list.ExternalTunnelKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.CreateTerminatingServiceActionsInput;
itmRpcService.createTerminatingServiceActions(input);
}
- public static TunnelList buildInternalTunnel(DataBroker broker) {
- InstanceIdentifier<TunnelList> tunnelListInstanceIdentifier = InstanceIdentifier.builder(TunnelList.class)
- .build();
- Optional<TunnelList> tunnelList = MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION,
- tunnelListInstanceIdentifier);
- if (tunnelList.isPresent()) {
- return tunnelList.get();
- }
- return null;
- }
-
/**
* Gets the external tunnel.
*
<argument ref="elanInterfaceManager" />
</bean>
+ <bean id="elanTunnelInterfaceStateListener"
+ class="org.opendaylight.netvirt.elan.internal.ElanTunnelInterfaceStateListener"
+ init-method="init" destroy-method="close">
+ <argument ref="dataBroker" />
+ <argument ref="elanInterfaceManager" />
+ </bean>
+
<bean id="elanInterfaceStateClusterListener"
class="org.opendaylight.netvirt.elan.internal.ElanInterfaceStateClusteredListener"
init-method="init" destroy-method="close">