From e63e25f3cc8514fb06c4c4eb9f51a3af1960f205 Mon Sep 17 00:00:00 2001 From: Konsta Pozdeev Date: Wed, 4 Jan 2017 17:41:53 +0200 Subject: [PATCH] Support for LearntVpnVipToPort in netvirt Change-Id: I87adb41f904edbabd7a73c8e48689e228748c7b6 Signed-off-by: Konsta Pozdeev --- .../unimgr/mef/netvirt/DataWaitListener.java | 35 ++++++++++++-- .../unimgr/mef/netvirt/GwMacListener.java | 24 +++++----- .../unimgr/mef/netvirt/NetvirtVpnUtils.java | 46 ++++++++++++++++--- .../unimgr/mef/netvirt/SubnetListener.java | 6 +-- 4 files changed, 85 insertions(+), 26 deletions(-) diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/DataWaitListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/DataWaitListener.java index ecce5e7e..641b1502 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/DataWaitListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/DataWaitListener.java @@ -73,6 +73,12 @@ public class DataWaitListener extends UnimgrDataTreeChange @Override public void remove(DataTreeModification removedDataObject) { + if (removedDataObject.getRootPath() != null && removedDataObject.getRootNode() != null) { + Log.info("data {} deleted", removedDataObject.getRootNode().getIdentifier()); + } + synchronized (lockDataAvailable) { + lockDataAvailable.notifyAll(); + } } @Override @@ -96,6 +102,10 @@ public class DataWaitListener extends UnimgrDataTreeChange return waitForData(maxRetries); } + public boolean waitForClean() { + return waitForClean(maxRetries); + } + public Object getData() { Optional objectInstance = MdsalUtils.read(dataBroker, logicalDatastoreType, objectIdentifierId); if (!objectInstance.isPresent()) { @@ -113,11 +123,28 @@ public class DataWaitListener extends UnimgrDataTreeChange } else if (retry <= 0) { return false; } - try { - lockDataAvailable.wait(waitMillisec); - } catch (InterruptedException e1) { - } + safeWaitLock(); } return waitForData(--retry); } + + public boolean waitForClean(int retry) { + synchronized (lockDataAvailable) { + dataAvailable = dataAvailable(); + if (dataAvailable == false) { + return true; + } else if (retry <= 0) { + return false; + } + safeWaitLock(); + } + return waitForClean(--retry); + } + + private void safeWaitLock() { + try { + lockDataAvailable.wait(waitMillisec); + } catch (InterruptedException e1) { + } + } } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/GwMacListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/GwMacListener.java index a85371c8..f07b889b 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/GwMacListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/GwMacListener.java @@ -8,9 +8,7 @@ package org.opendaylight.unimgr.mef.netvirt; -import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -24,12 +22,12 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPort; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.learnt.vpn.vip.to.port.data.LearntVpnVipToPort; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GwMacListener extends UnimgrDataTreeChangeListener implements IGwMacListener { +public class GwMacListener extends UnimgrDataTreeChangeListener implements IGwMacListener { private static final Logger Log = LoggerFactory.getLogger(GwMacListener.class); private ListenerRegistration gwMacListenerRegistration; private final OdlArputilService arpUtilService; @@ -49,8 +47,8 @@ public class GwMacListener extends UnimgrDataTreeChangeListener public void registerListener() { try { - final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>( - LogicalDatastoreType.OPERATIONAL, NetvirtVpnUtils.getVpnPortipToPortIdentifier()); + final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>( + LogicalDatastoreType.OPERATIONAL, NetvirtVpnUtils.getLearntVpnVipToPortIdentifier()); gwMacListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); startRetriesThread(); Log.info("GwMacListener created and registered"); @@ -70,26 +68,26 @@ public class GwMacListener extends UnimgrDataTreeChangeListener } @Override - public void add(DataTreeModification newDataObject) { + public void add(DataTreeModification newDataObject) { if (newDataObject.getRootPath() != null && newDataObject.getRootNode() != null) { - VpnPortipToPort portIpToPort = newDataObject.getRootNode().getDataAfter(); + LearntVpnVipToPort portIpToPort = newDataObject.getRootNode().getDataAfter(); updateMac(portIpToPort); } } @Override - public void remove(DataTreeModification removedDataObject) { + public void remove(DataTreeModification removedDataObject) { } @Override - public void update(DataTreeModification modifiedDataObject) { + public void update(DataTreeModification modifiedDataObject) { if (modifiedDataObject.getRootPath() != null && modifiedDataObject.getRootNode() != null) { - VpnPortipToPort portIpToPort = modifiedDataObject.getRootNode().getDataAfter(); + LearntVpnVipToPort portIpToPort = modifiedDataObject.getRootNode().getDataAfter(); updateMac(portIpToPort); } } - private synchronized void updateMac(VpnPortipToPort portIpToPort) { + private synchronized void updateMac(LearntVpnVipToPort portIpToPort) { String portName = portIpToPort.getPortName(); String macAddress = portIpToPort.getMacAddress(); String vpnName = portIpToPort.getVpnName(); @@ -152,7 +150,7 @@ public class GwMacListener extends UnimgrDataTreeChangeListener gwMacResolver.get(gwMacKey).getSubnets().add(subnet); } - VpnPortipToPort portIpToPort = NetvirtVpnUtils.getVpnPortFixedIp(dataBroker, vpnName, dstIpAddressStr); + LearntVpnVipToPort portIpToPort = NetvirtVpnUtils.getLearntVpnVipToPort(dataBroker, vpnName, dstIpAddressStr); if (portIpToPort != null) { updateMac(portIpToPort); } diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java index a180cb32..27477a08 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/NetvirtVpnUtils.java @@ -46,11 +46,14 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.instances.ElanInstanceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AdjacenciesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.LearntVpnVipToPortData; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceToVpnId; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyKey; +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.learnt.vpn.vip.to.port.data.LearntVpnVipToPortKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NetworkMaps; @@ -204,25 +207,39 @@ public class NetvirtVpnUtils { } public static void removeVpnInterfaceAdjacencies(DataBroker dataBroker, String vpnName, String interfaceName) { + InstanceIdentifier identifier = getVpnInterfaceInstanceIdentifier(interfaceName); InstanceIdentifier path = identifier.augmentation(Adjacencies.class); + Optional adjacencies = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path); List adjacenciesList = adjacencies.isPresent() && adjacencies.get().getAdjacency() != null ? adjacencies.get().getAdjacency() : Collections.emptyList(); adjacenciesList.forEach(a -> { String ipStr = getIpAddressFromPrefix(a.getIpAddress()); - InstanceIdentifier id = getVpnPortipToPortIdentifier(vpnName, ipStr); + InstanceIdentifier id = getLearntVpnVipToPortIdentifier(vpnName, ipStr); MdsalUtils.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id); }); + int waitCount = (adjacenciesList.isEmpty()) ? 2 : 2 * adjacenciesList.size(); AdjacenciesBuilder builder = new AdjacenciesBuilder(); List list = new ArrayList<>(); builder.setAdjacency(list); VpnInterfaceBuilder einterfaceBuilder = createVpnInterface(vpnName, interfaceName, builder.build()); + MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, identifier, einterfaceBuilder.build()); - MdsalUtils.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, - getVpnInterfaceInstanceIdentifier(interfaceName), einterfaceBuilder.build()); + final DataWaitGetter getData = vpnint -> { + if (vpnint.getAdjacency() == null) + return null; + return vpnint.getAdjacency().stream().filter(a -> !a.isPrimaryAdjacency()); + }; + @SuppressWarnings("resource") // AutoCloseable + DataWaitListener vpnIntWaiter = new DataWaitListener(dataBroker, path, waitCount, + LogicalDatastoreType.OPERATIONAL, getData); + if (!vpnIntWaiter.waitForClean()) { + logger.error("Fail to wait for VPN interface clean-up {} {}", vpnName, interfaceName); + return; + } } public static void removeVpnInterfaceAdjacency(DataBroker dataBroker, String interfaceName, IpPrefix ifPrefix) { @@ -272,7 +289,7 @@ public class NetvirtVpnUtils { VpnPortipToPortBuilder builder = new VpnPortipToPortBuilder() .setKey(new VpnPortipToPortKey(fixedIp, vpnName)).setVpnName(vpnName).setPortFixedip(fixedIp) .setPortName(portName).setMacAddress(macAddress.getValue()).setSubnetIp(true); - tx.put(LogicalDatastoreType.OPERATIONAL, id, builder.build()); + tx.put(LogicalDatastoreType.CONFIGURATION, id, builder.build()); logger.debug( "Interface to fixedIp added: {}, vpn {}, interface {}, mac {} added to " + "VpnPortipToPort DS", fixedIp, vpnName, portName, macAddress); @@ -281,7 +298,13 @@ public class NetvirtVpnUtils { public static VpnPortipToPort getVpnPortFixedIp(DataBroker dataBroker, String vpnName, String fixedIp) { InstanceIdentifier id = getVpnPortipToPortIdentifier(vpnName, fixedIp); - Optional opt = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); + Optional opt = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id); + return opt != null && opt.isPresent() ? opt.get() : null; + } + + public static LearntVpnVipToPort getLearntVpnVipToPort(DataBroker dataBroker, String vpnName, String fixedIp) { + InstanceIdentifier id = getLearntVpnVipToPortIdentifier(vpnName, fixedIp); + Optional opt = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); return opt != null && opt.isPresent() ? opt.get() : null; } @@ -289,7 +312,7 @@ public class NetvirtVpnUtils { String fixedIpPrefix = ipPrefixToString(ipAddress); String fixedIp = getIpAddressFromPrefix(fixedIpPrefix); InstanceIdentifier id = getVpnPortipToPortIdentifier(vpnName, fixedIp); - tx.delete(LogicalDatastoreType.OPERATIONAL, id); + tx.delete(LogicalDatastoreType.CONFIGURATION, id); } public static void registerDirectSubnetForVpn(DataBroker dataBroker, Uuid subnetName, IpAddress gwIpAddress) { @@ -491,10 +514,21 @@ public class NetvirtVpnUtils { return id; } + private static InstanceIdentifier getLearntVpnVipToPortIdentifier(String vpnName, + String fixedIp) { + InstanceIdentifier id = InstanceIdentifier.builder(LearntVpnVipToPortData.class) + .child(LearntVpnVipToPort.class, new LearntVpnVipToPortKey(fixedIp, vpnName)).build(); + return id; + } + public static InstanceIdentifier getVpnPortipToPortIdentifier() { return InstanceIdentifier.builder(NeutronVpnPortipPortData.class).child(VpnPortipToPort.class).build(); } + public static InstanceIdentifier getLearntVpnVipToPortIdentifier() { + return InstanceIdentifier.builder(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class).build(); + } + private static void publishSubnetAddNotification(final NotificationPublishService notificationPublishService, Uuid subnetId, String subnetIp, String vpnName, Long elanTag) { SubnetAddedToVpnBuilder builder = new SubnetAddedToVpnBuilder(); diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java index c403a79f..c24de908 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/SubnetListener.java @@ -58,10 +58,10 @@ public class SubnetListener extends UnimgrDataTreeChangeListener impleme final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, MefInterfaceUtils.getSubnetsInstanceIdentifier()); subnetListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); - Log.info("IpvcDataTreeChangeListener created and registered"); + Log.info("SubnetListener created and registered"); } catch (final Exception e) { - Log.error("Ipvc DataChange listener registration failed !", e); - throw new IllegalStateException("Ipvc registration Listener failed.", e); + Log.error("SubnetListener listener registration failed !", e); + throw new IllegalStateException("SubnetListener registration Listener failed.", e); } } -- 2.36.6