X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fvpnmanager%2FInterfaceStateChangeListener.java;h=9211bfcf865c4a717a0dfa9472ba6ca539981810;hb=2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf;hp=eb148a9fb6ba9e2078619008719a7250ab4ba03e;hpb=5df4473cb0fbd4aa6b72d213bca1f2b6b1f0ea81;p=netvirt.git diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java index eb148a9fb6..9211bfcf86 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java @@ -10,7 +10,6 @@ package org.opendaylight.netvirt.vpnmanager; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import static org.opendaylight.genius.infra.Datastore.OPERATIONAL; -import com.google.common.base.Optional; import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import com.google.common.util.concurrent.FutureCallback; @@ -22,23 +21,28 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; -import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.inject.Inject; import javax.inject.Singleton; -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.infra.ManagedNewTransactionRunner; import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; +import org.opendaylight.infrautils.utils.concurrent.Executors; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; import org.opendaylight.netvirt.fibmanager.api.IFibManager; import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils; +import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan; 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.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn._interface.op.data.VpnInterfaceOpDataEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.Adjacencies; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.VpnInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.vpn.interfaces.vpn._interface.VpnInstanceNames; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -47,8 +51,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton -public class InterfaceStateChangeListener - extends AsyncDataTreeChangeListenerBase { +public class InterfaceStateChangeListener extends AbstractAsyncDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateChangeListener.class); private static final short DJC_MAX_RETRIES = 3; @@ -84,7 +87,9 @@ public class InterfaceStateChangeListener @Inject public InterfaceStateChangeListener(final DataBroker dataBroker, final VpnInterfaceManager vpnInterfaceManager, final VpnUtil vpnUtil, final JobCoordinator jobCoordinator, final IFibManager fibManager) { - super(Interface.class, InterfaceStateChangeListener.class); + super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class) + .child(Interface.class), + Executors.newListeningSingleThreadExecutor("InterfaceStateChangeListener", LOG)); this.dataBroker = dataBroker; this.txRunner = new ManagedNewTransactionRunnerImpl(dataBroker); this.vpnInterfaceManager = vpnInterfaceManager; @@ -94,28 +99,22 @@ public class InterfaceStateChangeListener initialize(); } - @PostConstruct public void start() { LOG.info("{} start", getClass().getSimpleName()); - registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker); } - @Override - protected InstanceIdentifier getWildCardPath() { - return InstanceIdentifier.create(InterfacesState.class).child(Interface.class); - } - - @Override - protected InterfaceStateChangeListener getDataTreeChangeListener() { - return InterfaceStateChangeListener.this; + @PreDestroy + public void close() { + super.close(); + Executors.shutdownAndAwaitTermination(getExecutorService()); } @Override // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") - protected void add(InstanceIdentifier identifier, Interface intrf) { + public void add(InstanceIdentifier identifier, Interface intrf) { try { if (L2vlan.class.equals(intrf.getType())) { LOG.info("VPN Interface add event - intfName {} from InterfaceStateChangeListener", @@ -196,7 +195,7 @@ public class InterfaceStateChangeListener @Override // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") - protected void remove(InstanceIdentifier identifier, Interface intrf) { + public void remove(InstanceIdentifier identifier, Interface intrf) { final String ifName = intrf.getName(); Uint64 dpId = Uint64.ZERO; try { @@ -233,6 +232,7 @@ public class InterfaceStateChangeListener + " triggered by northbound agent. ignoring.", ifName, vpnName); continue; } + handleMipAdjRemoval(cfgVpnInterface, vpnName); final VpnInterfaceOpDataEntry vpnInterface = optVpnInterface.get(); String gwMac = intrf.getPhysAddress() != null ? intrf.getPhysAddress() .getValue() : vpnInterface.getGatewayMacAddress(); @@ -261,7 +261,7 @@ public class InterfaceStateChangeListener // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") @Override - protected void update(InstanceIdentifier identifier, + public void update(InstanceIdentifier identifier, Interface original, Interface update) { final String ifName = update.getName(); try { @@ -342,6 +342,7 @@ public class InterfaceStateChangeListener if (optVpnInterface.isPresent()) { VpnInterfaceOpDataEntry vpnOpInterface = optVpnInterface.get(); + handleMipAdjRemoval(vpnIf, vpnName); vpnInterfaceManager.processVpnInterfaceDown(dpnId, vpnIf.getName(), ifIndex, update.getPhysAddress() .getValue(), vpnOpInterface, true, @@ -371,6 +372,29 @@ public class InterfaceStateChangeListener } } + private void handleMipAdjRemoval(VpnInterface cfgVpnInterface, String vpnName) { + String interfaceName = cfgVpnInterface.getName(); + Adjacencies adjacencies = cfgVpnInterface.augmentation(Adjacencies.class); + if (adjacencies != null) { + List adjacencyList = adjacencies.getAdjacency(); + if (!adjacencyList.isEmpty()) { + for (Adjacency adj : adjacencyList) { + if (adj.getAdjacencyType() != Adjacency.AdjacencyType.PrimaryAdjacency) { + String ipAddress = adj.getIpAddress(); + String prefix = ipAddress.split("/")[0]; + LearntVpnVipToPort vpnVipToPort = vpnUtil.getLearntVpnVipToPort(vpnName, prefix); + if (vpnVipToPort != null && vpnVipToPort.getPortName().equals(interfaceName)) { + vpnUtil.removeMipAdjacency(vpnName, interfaceName, ipAddress, null); + } else { + LOG.debug("IP {} could be extra-route or learnt-ip on different interface" + + "than oper-vpn-interface {}", ipAddress, interfaceName); + } + } + } + } + } + } + private class PostVpnInterfaceThreadWorker implements FutureCallback { private final String interfaceName; private final boolean add;