From 8d9b5387be4852403dd22e460fab21d75bd74389 Mon Sep 17 00:00:00 2001 From: Konsta Pozdeev Date: Sun, 25 Dec 2016 18:29:35 +0200 Subject: [PATCH] fix for BUG_7341 Change-Id: Iac5787c5de985a4b64f39b9af50d83bd3ffb0eb7 Signed-off-by: Konsta Pozdeev --- .../unimgr/mef/netvirt/DataWaitListener.java | 29 +++--- .../unimgr/mef/netvirt/EvcListener.java | 21 +++- .../unimgr/mef/netvirt/IpvcListener.java | 97 +++++++++++++------ .../unimgr/mef/netvirt/MefServicesUtils.java | 8 +- .../unimgr/mef/netvirt/NetvirtVpnUtils.java | 31 ++++-- 5 files changed, 126 insertions(+), 60 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 23b8ac47..bd4e599e 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 @@ -31,14 +31,13 @@ public class DataWaitListener extends UnimgrDataTreeChange LogicalDatastoreType logicalDatastoreType; DataWaitGetter getData; private final long waitMillisec = 1000; - public DataWaitListener(final DataBroker dataBroker, final InstanceIdentifier objectIdentifierId, int maxRetiries, LogicalDatastoreType logicalDatastoreType, final DataWaitGetter getData) { super(dataBroker); this.objectIdentifierId = objectIdentifierId; this.maxRetries = maxRetiries; - this.logicalDatastoreType = logicalDatastoreType; + this.logicalDatastoreType = logicalDatastoreType; this.getData = getData; registerListener(); } @@ -46,8 +45,8 @@ public class DataWaitListener extends UnimgrDataTreeChange @SuppressWarnings("unchecked") public void registerListener() { try { - final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier( - LogicalDatastoreType.CONFIGURATION, objectIdentifierId); + final DataTreeIdentifier dataTreeIid = new DataTreeIdentifier(logicalDatastoreType, + objectIdentifierId); dataWaitListenerRegistration = dataBroker.registerDataTreeChangeListener(dataTreeIid, this); Log.info("DataWaitListener created and registered"); } catch (final Exception e) { @@ -86,23 +85,25 @@ public class DataWaitListener extends UnimgrDataTreeChange } private boolean dataAvailable() { - Optional objectInstance = MdsalUtils.read(dataBroker, LogicalDatastoreType.CONFIGURATION, - objectIdentifierId); - if (!objectInstance.isPresent()) { - Log.debug("Data for {} doesn't exist, waiting more", objectIdentifierId); - return false; - } - if (getData.get(objectInstance.get()) != null) { + if (getData() != null) { return true; } return false; } - public boolean waitForData () { + public boolean waitForData() { return waitForData(maxRetries); } - - + + public Object getData() { + Optional objectInstance = MdsalUtils.read(dataBroker, logicalDatastoreType, objectIdentifierId); + if (!objectInstance.isPresent()) { + Log.debug("Data for {} doesn't exist, waiting more", objectIdentifierId); + return null; + } + return getData.get(objectInstance.get()); + } + public boolean waitForData(int retry) { synchronized (dataAvailable) { dataAvailable = dataAvailable(); diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java index 568a7d7f..a513af5e 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/EvcListener.java @@ -18,7 +18,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.unimgr.api.UnimgrDataTreeChangeListener; - +import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.MefService; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.Evc; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.Uni; import org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.services.rev150526.mef.services.mef.service.mef.service.choice.evc.choice.evc.unis.uni.EvcUniCeVlans; @@ -129,9 +129,11 @@ public class EvcListener extends UnimgrDataTreeChangeListener { : Collections.emptyList(); synchronized (data.getEvcId().getValue().intern()) { + updateQos(uniToRemove); EvcElan evcElan = getOperEvcElan(evcId); if (evcElan == null) { log.error("Evc {} has not been created as required. Nothing to remove", data.getEvcId().getValue()); + return; } String instanceName = evcElan.getElanId(); @@ -139,7 +141,6 @@ public class EvcListener extends UnimgrDataTreeChangeListener { for (Uni uni : uniToRemove) { removeUniElanInterfaces(evcId, instanceName, uni); } - updateQos(uniToRemove); log.info("Removing elan instance: " + instanceName); NetvirtUtils.deleteElanInstance(dataBroker, instanceName); @@ -203,6 +204,12 @@ public class EvcListener extends UnimgrDataTreeChangeListener { if (evcUniCeVlan.isEmpty()) { String interfaceName = uniPortManager.getUniVlanInterface(uni.getUniId().getValue(), Long.valueOf(0)); + if (interfaceName == null) { + String errorMessage = String.format("Uni %s Interface for vlan %d is not operational ", uni.getUniId(), + 0); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } if (isOperEvcElanPort(evcId, interfaceName)) { log.info("elan interface for elan {} vlan {} interface {} exists already", instanceName, 0, interfaceName); @@ -218,6 +225,12 @@ public class EvcListener extends UnimgrDataTreeChangeListener { for (EvcUniCeVlan ceVlan : evcUniCeVlan) { Long vlan = safeCastVlan(ceVlan.getVid()); String interfaceName = uniPortManager.getUniVlanInterface(uni.getUniId().getValue(), vlan); + if (interfaceName == null) { + String errorMessage = String.format("Uni %s Interface for vlan %d is not operational ", + uni.getUniId(), 0); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } if (isOperEvcElanPort(evcId, interfaceName)) { log.info("elan interface for elan {} vlan {} interface {} exists already", instanceName, 0, interfaceName); @@ -309,8 +322,8 @@ public class EvcListener extends UnimgrDataTreeChangeListener { } private void removeOperEvcElan(InstanceIdentifier identifier) { - InstanceIdentifier path = identifier.augmentation(EvcElan.class); - MdsalUtils.delete(dataBroker, LogicalDatastoreType.OPERATIONAL, path); + final InstanceIdentifier serviceId = identifier.firstIdentifierOf(MefService.class); + MdsalUtils.delete(dataBroker, LogicalDatastoreType.OPERATIONAL, serviceId); } private boolean isOperEvcElanPort(InstanceIdentifier identifier, String elanPort) { diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java index d10a8c3d..69f39467 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/IpvcListener.java @@ -31,6 +31,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInterface.EtreeInterfaceType; +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.to.vpn.id.VpnInstance; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; @@ -95,27 +97,40 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { private void addIpvc(DataTreeModification newDataObject) { try { - WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); Ipvc ipvc = newDataObject.getRootNode().getDataAfter(); String instanceName = ipvc.getIpvcId().getValue(); final String vpnName = NetvirtVpnUtils.getUUidFromString(instanceName); InstanceIdentifier ipvcId = newDataObject.getRootPath().getRootIdentifier(); List unis = new ArrayList<>(); + String rd = null; synchronized (vpnName.intern()) { + WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); Log.info("Adding vpn instance: " + instanceName); NetvirtVpnUtils.createVpnInstance(vpnName, tx); MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, tx); - if (ipvc.getUnis() != null && ipvc.getUnis() != null) { - unis = ipvc.getUnis().getUni(); - } - Log.info("Number of UNI's: " + unis.size()); + MdsalUtils.commitTransaction(tx); - // Create elan/vpn interfaces - for (Uni uni : unis) { - createInterfaces(vpnName, uni, ipvcId, tx); + InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceToVpnIdIdentifier(vpnName); + DataWaitListener vpnInstanceWaiter = new DataWaitListener(dataBroker, vpnId, + 5, LogicalDatastoreType.CONFIGURATION, vpn -> vpn.getVrfId()); + if (!vpnInstanceWaiter.waitForData()) { + String errorMessage = String.format("Fail to wait for vrfId for vpn %s", vpnName); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); } - MdsalUtils.commitTransaction(tx); + rd = (String) vpnInstanceWaiter.getData(); + } + + if (ipvc.getUnis() != null && ipvc.getUnis() != null) { + unis = ipvc.getUnis().getUni(); } + Log.info("Number of UNI's: " + unis.size()); + + // Create elan/vpn interfaces + for (Uni uni : unis) { + createInterfaces(vpnName, uni, ipvcId, rd); + } + createUnis(ipvcId, unis); } catch (final Exception e) { Log.error("Add ipvc failed !", e); @@ -196,6 +211,16 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { return; } String vpnName = operIpvcVpn.getVpnId(); + InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceToVpnIdIdentifier(vpnName); + @SuppressWarnings("resource") + DataWaitListener vpnInstanceWaiter = new DataWaitListener(dataBroker, vpnId, 5, + LogicalDatastoreType.CONFIGURATION, vpn -> vpn.getVrfId()); + if (!vpnInstanceWaiter.waitForData()) { + String errorMessage = String.format("Fail to wait for vrfId for vpn %s", vpnName); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } + String rd = (String) vpnInstanceWaiter.getData(); List originalUni = origIpvc.getUnis() != null && origIpvc.getUnis().getUni() != null ? origIpvc.getUnis().getUni() : Collections.emptyList(); @@ -209,14 +234,11 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { removeUnis(ipvcId, operIpvcVpn, uniToRemove, txRemove); MdsalUtils.commitTransaction(txRemove); - WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); List uniToCreate = new ArrayList<>(updateUni); uniToCreate.removeAll(originalUni); for (Uni uni : uniToCreate) { - createInterfaces(vpnName, uni, ipvcId, tx); + createInterfaces(vpnName, uni, ipvcId, rd); } - MdsalUtils.commitTransaction(tx); - createUnis(ipvcId, uniToCreate); } @@ -225,8 +247,9 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { } } - private void createInterfaces(String vpnName, Uni uniInService, InstanceIdentifier ipvcId, - WriteTransaction tx) { + private void createInterfaces(String vpnName, Uni uniInService, InstanceIdentifier ipvcId, String rd) { + + WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); String uniId = uniInService.getUniId().getValue(); String ipUniId = uniInService.getIpUniId().getValue(); org.opendaylight.yang.gen.v1.http.metroethernetforum.org.ns.yang.mef.interfaces.rev150526.mef.interfaces.unis.Uni uni = MefInterfaceUtils @@ -244,19 +267,36 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { throw new UnsupportedOperationException(errorMessage); } - Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : null; - String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId, ipUniId); + String interfaceName = null; + synchronized (vpnName.intern()) { + Long vlan = ipUni.getVlan() != null ? Long.valueOf(ipUni.getVlan().getValue()) : null; + String elanName = NetvirtVpnUtils.getElanNameForVpnPort(uniId, ipUniId); + + String srcIpAddressStr = NetvirtVpnUtils + .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress())); + IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray()); + + interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx, + ipUni.getSegmentationId()); + uniQosManager.mapUniPortBandwidthLimits(uniId, interfaceName, uniInService.getIngressBwProfile()); + createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx); + MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, uniInService.getUniId(), uniInService.getIpUniId(), + elanName, interfaceName, null, tx); + MdsalUtils.commitTransaction(tx); + } - String srcIpAddressStr = NetvirtVpnUtils - .getIpAddressFromPrefix(NetvirtVpnUtils.ipPrefixToString(ipUni.getIpAddress())); - IpAddress ipAddress = new IpAddress(srcIpAddressStr.toCharArray()); + InstanceIdentifier vpnId = NetvirtVpnUtils.getVpnInstanceOpDataIdentifier(rd); + @SuppressWarnings("resource") + DataWaitListener vpnInstanceWaiter = new DataWaitListener( + dataBroker, vpnId, 5, LogicalDatastoreType.OPERATIONAL, vpn -> vpn.getVpnToDpnList()); + if (!vpnInstanceWaiter.waitForData()) { + String errorMessage = String.format("Fail to wait for vpn to dpn list %s", vpnName); + Log.error(errorMessage); + throw new UnsupportedOperationException(errorMessage); + } - String interfaceName = createElanInterface(vpnName, ipvcId, uniId, elanName, vlan, ipAddress, tx, - ipUni.getSegmentationId()); - uniQosManager.mapUniPortBandwidthLimits(uniId, interfaceName, uniInService.getIngressBwProfile()); - createVpnInterface(vpnName, uni, ipUni, interfaceName, elanName, tx); - MefServicesUtils.addOperIpvcVpnElan(ipvcId, vpnName, uniInService.getUniId(), uniInService.getIpUniId(), - elanName, interfaceName, null, tx); + NetvirtVpnUtils.createVpnPortFixedIp(dataBroker, vpnName, interfaceName, ipUni.getIpAddress(), + uni.getMacAddress()); } private String createElanInterface(String vpnName, InstanceIdentifier ipvcId, String uniId, String elanName, @@ -286,10 +326,11 @@ public class IpvcListener extends UnimgrDataTreeChangeListener { IpUni ipUni, String interfaceName, String elanName, WriteTransaction tx) { Log.info("Adding vpn interface: " + interfaceName); + NetvirtVpnUtils.createUpdateVpnInterface(vpnName, interfaceName, ipUni.getIpAddress(), uni.getMacAddress().getValue(), true, null, elanName, tx); - NetvirtVpnUtils.createVpnPortFixedIp(vpnName, interfaceName, ipUni.getIpAddress(), uni.getMacAddress(), tx); - Log.info("Finished working on vpn instance: " + vpnName); + + Log.info("Finished working on vpn instance {} interface () ", vpnName, interfaceName); } private void createDirectSubnet(Uni uni, IpUni ipUni) { diff --git a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java index 810d6c3b..0438618a 100644 --- a/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java +++ b/netvirt/src/main/java/org/opendaylight/unimgr/mef/netvirt/MefServicesUtils.java @@ -93,7 +93,6 @@ public class MefServicesUtils { return null; } - public static IpvcVpn getOperIpvcVpn(DataBroker dataBroker, InstanceIdentifier identifier) { InstanceIdentifier path = identifier.augmentation(IpvcVpn.class); Optional ipvcVpn = MdsalUtils.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path); @@ -155,8 +154,8 @@ public class MefServicesUtils { } public static void removeOperIpvcVpn(InstanceIdentifier identifier, WriteTransaction tx) { - InstanceIdentifier path = identifier.augmentation(IpvcVpn.class); - tx.delete(LogicalDatastoreType.OPERATIONAL, path); + final InstanceIdentifier serviceId = identifier.firstIdentifierOf(MefService.class); + tx.delete(LogicalDatastoreType.OPERATIONAL, serviceId); } public static void removeOperIpvcSubnet(DataBroker dataBroker, InstanceIdentifier identifier, String vpnId, @@ -176,7 +175,8 @@ public class MefServicesUtils { vpnElansEx.remove(vpnElans); VpnElansBuilder vpnElansB = new VpnElansBuilder(vpnElans); List exSubnets = vpnElansB.getSubnets(); - List newSubnets = exSubnets.stream().filter(s -> ! s.getSubnet().equals(deleteSubnet)).collect(Collectors.toList()); + List newSubnets = exSubnets.stream().filter(s -> !s.getSubnet().equals(deleteSubnet)) + .collect(Collectors.toList()); vpnElansB.setSubnets(newSubnets); vpnElansEx.add(vpnElansB.build()); } 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 9aaad0e5..5e6bcaf0 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,9 +46,13 @@ 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.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.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; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronVpnPortipPortData; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetAddedToVpnBuilder; @@ -113,6 +117,20 @@ public class NetvirtVpnUtils { .build(); } + static InstanceIdentifier getVpnInstanceToVpnIdIdentifier( + String vpnName) { + return InstanceIdentifier.builder(VpnInstanceToVpnId.class) + .child(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance.class, + new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstanceKey( + vpnName)) + .build(); + } + + public static InstanceIdentifier getVpnInstanceOpDataIdentifier(String rd) { + return InstanceIdentifier.builder(VpnInstanceOpData.class) + .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd)).build(); + } + public static void createUpdateVpnInterface(DataBroker dataBroker, String vpnName, String interfaceName, String ifAddr, String macAddress, boolean primary, String gwIpAddress, String directSubnetId) { WriteTransaction tx = MdsalUtils.createTransaction(dataBroker); @@ -247,13 +265,6 @@ public class NetvirtVpnUtils { MdsalUtils.commitTransaction(tx); } - public static void createVpnPortFixedIp(String vpnName, String portName, IpPrefix ipAddress, MacAddress macAddress, - WriteTransaction tx) { - String fixedIpPrefix = ipPrefixToString(ipAddress); - String fixedIp = getIpAddressFromPrefix(fixedIpPrefix); - createVpnPortFixedIp(vpnName, portName, fixedIp, macAddress, tx); - } - private static void createVpnPortFixedIp(String vpnName, String portName, String fixedIp, MacAddress macAddress, WriteTransaction tx) { synchronized ((vpnName + fixedIp).intern()) { @@ -308,9 +319,9 @@ public class NetvirtVpnUtils { InstanceIdentifier elanIdentifierId = NetvirtUtils.getElanInstanceInstanceIdentifier(subnetName); @SuppressWarnings("resource") // AutoCloseable - DataWaitListener elanTagWaiter = new DataWaitListener<>( - dataBroker, elanIdentifierId, 10, LogicalDatastoreType.CONFIGURATION, el -> el.getElanTag()); - if ( !elanTagWaiter.waitForData()) { + DataWaitListener elanTagWaiter = new DataWaitListener(dataBroker, elanIdentifierId, + 10, LogicalDatastoreType.CONFIGURATION, el -> el.getElanTag()); + if (!elanTagWaiter.waitForData()) { logger.error("Trying to add invalid elan {} to vpn {}", subnetName, vpnName); return; } -- 2.36.6