X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnmanager%2Fimpl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Fvpnmanager%2Fintervpnlink%2FInterVpnLinkLocator.java;h=1296ffa2a473920a4df895cd15a2ac4f872211de;hb=2f0569ed75ef8a1fb60f992d19c8bbdf92ff45bf;hp=8acffceef17bc118436ce8e595b37b35c8938cec;hpb=72bd2d39aefb0e36308765cd15b3bdbda8275fc7;p=netvirt.git diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java index 8acffceef1..1296ffa2a4 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkLocator.java @@ -8,17 +8,19 @@ package org.opendaylight.netvirt.vpnmanager.intervpnlink; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import java.math.BigInteger; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; +import java.util.concurrent.ExecutionException; import java.util.function.Predicate; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.genius.mdsalutil.NWUtil; +import org.opendaylight.mdsal.binding.api.DataBroker; import org.opendaylight.netvirt.vpnmanager.VpnUtil; import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache; import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite; @@ -26,6 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnTargets; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpntargets.VpnTarget; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink; +import org.opendaylight.yangtools.yang.common.Uint64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,11 +45,14 @@ public class InterVpnLinkLocator { private final DataBroker dataBroker; private final InterVpnLinkCache interVpnLinkCache; + private final VpnUtil vpnUtil; @Inject - public InterVpnLinkLocator(final DataBroker dataBroker, final InterVpnLinkCache interVpnLinkCache) { + public InterVpnLinkLocator(final DataBroker dataBroker, final InterVpnLinkCache interVpnLinkCache, + final VpnUtil vpnUtil) { this.dataBroker = dataBroker; this.interVpnLinkCache = interVpnLinkCache; + this.vpnUtil = vpnUtil; } /** @@ -57,9 +63,14 @@ public class InterVpnLinkLocator { * @param interVpnLink InterVpnLink to find suitable DPNs for. * @return the list of the selected DPN Ids */ - public List selectSuitableDpns(InterVpnLink interVpnLink) { + public List selectSuitableDpns(InterVpnLink interVpnLink) { int numberOfDpns = Integer.getInteger(NBR_OF_DPNS_PROPERTY_NAME, 1); - List dpnIdPool = NWUtil.getOperativeDPNs(dataBroker); + List dpnIdPool = new ArrayList<>(); + try { + dpnIdPool = NWUtil.getOperativeDPNs(dataBroker).stream().map(dpn -> dpn).collect(Collectors.toList()); + } catch (ExecutionException | InterruptedException e) { + LOG.error("selectSuitableDpns: Exception while reading Operative DPNs", e); + } LOG.trace("selectSuitableDpns for {} with numberOfDpns={} and availableDpns={}", interVpnLink.getName(), numberOfDpns, dpnIdPool); int poolSize = dpnIdPool.size(); @@ -71,18 +82,18 @@ public class InterVpnLinkLocator { List allInterVpnLinks = interVpnLinkCache.getAllInterVpnLinks(); // 1st criteria is to select those DPNs where there is no InterVpnLink at all - List dpnsWithNoIVL = findDPNsWithNoInterVpnLink(dpnIdPool, allInterVpnLinks); + List dpnsWithNoIVL = findDPNsWithNoInterVpnLink(dpnIdPool, allInterVpnLinks); if (dpnsWithNoIVL.size() >= numberOfDpns) { return dpnsWithNoIVL.subList(0, numberOfDpns); // Best case scenario } // Not enough. 2nd criteria is to avoid DPNs where there are InterVpnLinks of the same group - List result = new ArrayList<>(dpnsWithNoIVL); + List result = new ArrayList<>(dpnsWithNoIVL); dpnIdPool.removeAll(result); int pendingDPNs = numberOfDpns - result.size(); - List dpnsToAvoid = findDpnsWithSimilarIVpnLinks(interVpnLink, allInterVpnLinks); - result.addAll(dpnIdPool.stream().filter(dpId -> dpnsToAvoid == null || !dpnsToAvoid.contains(dpId)) + List dpnsToAvoid = findDpnsWithSimilarIVpnLinks(interVpnLink, allInterVpnLinks); + result.addAll(dpnIdPool.stream().filter(dpId -> !dpnsToAvoid.contains(dpId)) .limit(pendingDPNs).collect(Collectors.toList())); int currentNbrOfItems = result.size(); @@ -105,9 +116,9 @@ public class InterVpnLinkLocator { * * @return the list of available DPNs among the specified ones */ - private List findDPNsWithNoInterVpnLink(List dpnList, + private List findDPNsWithNoInterVpnLink(List dpnList, List interVpnLinks) { - List occupiedDpns = new ArrayList<>(); + List occupiedDpns = new ArrayList<>(); for (InterVpnLinkDataComposite ivl : interVpnLinks) { if (ivl.isActive()) { occupiedDpns.addAll(ivl.getFirstEndpointDpns()); @@ -115,7 +126,7 @@ public class InterVpnLinkLocator { } } - List result = new ArrayList<>(dpnList); + List result = new ArrayList<>(dpnList); result.removeAll(occupiedDpns); return result; } @@ -130,11 +141,12 @@ public class InterVpnLinkLocator { * @return the list of dpnIds where the specified InterVpnLink should not * be installed */ - private List findDpnsWithSimilarIVpnLinks(InterVpnLink interVpnLink, + @NonNull + private List findDpnsWithSimilarIVpnLinks(InterVpnLink interVpnLink, List allInterVpnLinks) { List sameGroupInterVpnLinks = findInterVpnLinksSameGroup(interVpnLink, allInterVpnLinks); - Set resultDpns = new HashSet<>(); + Set resultDpns = new HashSet<>(); for (InterVpnLinkDataComposite ivl : sameGroupInterVpnLinks) { resultDpns.addAll(ivl.getFirstEndpointDpns()); resultDpns.addAll(ivl.getSecondEndpointDpns()); @@ -155,15 +167,15 @@ public class InterVpnLinkLocator { return new ArrayList<>(); } return vpnTargets.stream() - .filter(target -> target.getVrfRTType().equals(rtType) - || target.getVrfRTType().equals(VpnTarget.VrfRTType.Both)) + .filter(target -> Objects.equals(target.getVrfRTType(), rtType) + || Objects.equals(target.getVrfRTType(), VpnTarget.VrfRTType.Both)) .map(VpnTarget::getVrfRTValue) .collect(Collectors.toList()); } private List getIRTsByVpnName(String vpnName) { - String vpn1Rd = VpnUtil.getVpnRd(dataBroker, vpnName); - final VpnInstanceOpDataEntry vpnInstance = VpnUtil.getVpnInstanceOpData(dataBroker, vpn1Rd); + String vpn1Rd = vpnUtil.getVpnRd(vpnName); + final VpnInstanceOpDataEntry vpnInstance = vpnUtil.getVpnInstanceOpData(vpn1Rd); return getRts(vpnInstance, VpnTarget.VrfRTType.ImportExtcommunity); } @@ -172,7 +184,7 @@ public class InterVpnLinkLocator { if (irts1 == null && irts2 == null) { return true; } - if (irts1 == null && irts2 != null || irts1 != null && irts2 == null) { + if (irts1 == null || irts2 == null) { return false; } @@ -196,8 +208,8 @@ public class InterVpnLinkLocator { if (ivl.getInterVpnLinkName().equals(ivpnLinkToMatch.getName())) { return false; // ivl and ivpnLinlToMatch are the same InterVpnLink } - String vpn1Name = ivl.getFirstEndpointVpnUuid().orNull(); - String vpn2Name = ivl.getSecondEndpointVpnUuid().orNull(); + String vpn1Name = ivl.getFirstEndpointVpnUuid().orElse(null); + String vpn2Name = ivl.getSecondEndpointVpnUuid().orElse(null); if (vpn1Name == null) { return false; }