From 7a476368c9e62d969a3896b1911e6fcc2946fda0 Mon Sep 17 00:00:00 2001 From: Stephen Kitt Date: Fri, 25 Jan 2019 09:53:23 +0100 Subject: [PATCH] fibmanager: drop nullToEmpty and reqNonNullOrElse Change-Id: I00072529caa24f6a1c75507b5fdd2d71e6eb461e Signed-off-by: Stephen Kitt --- .../fibmanager/BaseVrfEntryHandler.java | 22 +- .../fibmanager/BgpRouteVrfEntryHandler.java | 7 +- .../fibmanager/EvpnVrfEntryHandler.java | 7 +- .../netvirt/fibmanager/FibUtil.java | 11 +- .../netvirt/fibmanager/NexthopManager.java | 280 +++++++++--------- .../netvirt/fibmanager/VrfEntryListener.java | 25 +- 6 files changed, 176 insertions(+), 176 deletions(-) diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java index 92d9a4637e..01cdccb6cc 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java @@ -9,7 +9,6 @@ package org.opendaylight.netvirt.fibmanager; import static java.util.stream.Collectors.toList; import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address; -import static org.opendaylight.netvirt.fibmanager.FibUtil.nullToEmpty; import com.google.common.base.Optional; import java.math.BigInteger; @@ -159,7 +158,7 @@ public class BaseVrfEntryHandler implements AutoCloseable { @Nonnull protected List resolveAdjacency(final BigInteger remoteDpnId, final long vpnId, final VrfEntry vrfEntry, String rd) { - List routePaths = nullToEmpty(vrfEntry.getRoutePaths()); + List routePaths = vrfEntry.nonnullRoutePaths(); FibHelper.sortIpAddress(routePaths); List adjacencyList = new ArrayList<>(); List prefixIpList; @@ -187,15 +186,16 @@ public class BaseVrfEntryHandler implements AutoCloseable { prefixIpList = Collections.singletonList(vrfEntry.getDestPrefix()); } else { List prefixIpListLocal = new ArrayList<>(); - vpnExtraRoutes.forEach(route -> nullToEmpty(route.getNexthopIpList()).forEach(extraRouteIp -> { - String ipPrefix; - if (isIpv4Address(extraRouteIp)) { - ipPrefix = extraRouteIp + NwConstants.IPV4PREFIX; - } else { - ipPrefix = extraRouteIp + NwConstants.IPV6PREFIX; - } - prefixIpListLocal.add(ipPrefix); - })); + vpnExtraRoutes.stream().filter(route -> route.getNexthopIpList() != null).forEach( + route -> route.getNexthopIpList().forEach(extraRouteIp -> { + String ipPrefix; + if (isIpv4Address(extraRouteIp)) { + ipPrefix = extraRouteIp + NwConstants.IPV4PREFIX; + } else { + ipPrefix = extraRouteIp + NwConstants.IPV6PREFIX; + } + prefixIpListLocal.add(ipPrefix); + })); prefixIpList = prefixIpListLocal; } } else { diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java index 214aca0772..1c0d62db6d 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java @@ -8,7 +8,6 @@ package org.opendaylight.netvirt.fibmanager; import static java.util.stream.Collectors.toList; -import static org.opendaylight.netvirt.fibmanager.FibUtil.nullToEmpty; import com.google.common.base.Optional; import java.math.BigInteger; @@ -255,7 +254,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler String rd, List adjacencyResults, List subTxns) { - if (nullToEmpty(vrfEntry.getRoutePaths()).size() > 2) { + if (vrfEntry.nonnullRoutePaths().size() > 2) { LOG.error("DC-GW can advertise only 2 bestPaths for prefix {}", vrfEntry.getDestPrefix()); return; } @@ -370,7 +369,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler final BigInteger dpnId, final long vpnId, final String rd, final String remoteNextHopIp, final Optional vrfTable, WriteTransaction writeCfgTxn, List subTxns) { - return vrfEntry -> nullToEmpty(vrfEntry.getRoutePaths()).stream() + return vrfEntry -> vrfEntry.nonnullRoutePaths().stream() .filter(routes -> !routes.getNexthopAddress().isEmpty() && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim())) .findFirst() @@ -386,7 +385,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler final BigInteger dpnId, final long vpnId, final String remoteNextHopIp, final Optional vrfTable, WriteTransaction writeCfgTxn, List subTxns) { - return vrfEntry -> nullToEmpty(vrfEntry.getRoutePaths()).stream() + return vrfEntry -> vrfEntry.nonnullRoutePaths().stream() .filter(routes -> !routes.getNexthopAddress().isEmpty() && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim())) .findFirst() diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java index f091ba6bd0..55bfef2d55 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java @@ -8,16 +8,13 @@ package org.opendaylight.netvirt.fibmanager; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; -import static org.opendaylight.netvirt.fibmanager.FibUtil.nullToEmpty; import com.google.common.base.Optional; import com.google.common.base.Preconditions; - import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.List; - import java.util.Objects; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; @@ -149,8 +146,8 @@ public class EvpnVrfEntryHandler extends BaseVrfEntryHandler implements IVrfEntr if (localNextHopInfo == null) { //Handle extra routes and imported routes Routes extraRoute = getVpnToExtraroute(vpnId, rd, vrfEntry.getDestPrefix()); - if (extraRoute != null) { - for (String nextHopIp : nullToEmpty(extraRoute.getNexthopIpList())) { + if (extraRoute != null && extraRoute.getNexthopIpList() != null) { + for (String nextHopIp : extraRoute.getNexthopIpList()) { LOG.info("NextHop IP for destination {} is {}", vrfEntry.getDestPrefix(), nextHopIp); if (nextHopIp != null) { localNextHopInfo = getFibUtil().getPrefixToInterface(vpnId, nextHopIp + "/32"); diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java index c4442e0442..840b60268f 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java @@ -8,7 +8,6 @@ package org.opendaylight.netvirt.fibmanager; -import static java.util.Collections.emptyList; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS; @@ -25,7 +24,6 @@ import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; -import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; @@ -730,7 +728,8 @@ public class FibUtil { public static void removeOrUpdateNextHopInfo(BigInteger dpnId, String nextHopKey, String groupId, Nexthops nexthops, TypedWriteTransaction tx) { InstanceIdentifier nextHopsId = getNextHopsIdentifier(nextHopKey); - List targetDeviceIds = new ArrayList<>(nullToEmpty(nexthops.getTargetDeviceId())); + List targetDeviceIds = + nexthops.getTargetDeviceId() != null ? new ArrayList<>(nexthops.getTargetDeviceId()) : new ArrayList<>(); targetDeviceIds.remove(dpnId.toString()); if (targetDeviceIds.isEmpty()) { tx.delete(nextHopsId); @@ -908,10 +907,4 @@ public class FibUtil { } return false; } - - // TODO Replace this with mdsal's DataObjectUtils.nullToEmpty when upgrading to mdsal 3 - @Nonnull - public static List nullToEmpty(final @Nullable List input) { - return input != null ? input : emptyList(); - } } diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java index 8ff25aa5bc..7fb4ee76df 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java @@ -10,7 +10,6 @@ package org.opendaylight.netvirt.fibmanager; import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import static org.opendaylight.genius.infra.Datastore.OPERATIONAL; import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address; -import static org.opendaylight.netvirt.fibmanager.FibUtil.nullToEmpty; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -271,7 +270,7 @@ public class NexthopManager implements AutoCloseable { ifName, rpcResult.getErrors()); return Collections.emptyList(); } else { - actions = rpcResult.getResult().getAction(); + actions = rpcResult.getResult().nonnullAction(); } } else { RpcResult rpcResult = odlInterfaceRpcService @@ -282,11 +281,11 @@ public class NexthopManager implements AutoCloseable { ifName, rpcResult.getErrors()); return Collections.emptyList(); } else { - actions = rpcResult.getResult().getAction(); + actions = rpcResult.getResult().nonnullAction(); } } List listActionInfo = new ArrayList<>(); - for (Action action : nullToEmpty(actions)) { + for (Action action : actions) { actionKey = action.key().getOrder() + actionKey; org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionClass = action.getAction(); @@ -536,7 +535,7 @@ public class NexthopManager implements AutoCloseable { Optional vpnNexthops = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id); if (vpnNexthops.isPresent()) { // get nexthops list for vpn - List nexthops = nullToEmpty(vpnNexthops.get().getVpnNexthop()); + List nexthops = vpnNexthops.get().nonnullVpnNexthop(); for (VpnNexthop nexthop : nexthops) { if (Objects.equals(nexthop.getIpAddress(), ipAddress)) { // return nexthop @@ -600,12 +599,12 @@ public class NexthopManager implements AutoCloseable { if (FibUtil.lockCluster(lockManager, nextHopLockStr, WAIT_TIME_TO_ACQUIRE_LOCK)) { VpnNexthop nh = getVpnNexthop(vpnId, primaryIpAddress); if (nh != null) { - List prefixesList = new ArrayList<>(nullToEmpty(nh.getIpAdjacencies())); + List prefixesList = new ArrayList<>(nh.nonnullIpAdjacencies()); IpAdjacencies prefix = new IpAdjacenciesBuilder().setIpAdjacency(currDestIpPrefix).build(); prefixesList.remove(prefix); if (prefixesList.isEmpty()) { //remove the group only if there are no more flows using this group GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnId, nh.getEgressPointer(), - primaryIpAddress, GroupTypes.GroupAll, Collections.EMPTY_LIST); + primaryIpAddress, GroupTypes.GroupAll, Collections.emptyList()); // remove Group ... mdsalApiManager.removeGroup(groupEntity); //update MD-SAL DS @@ -925,34 +924,37 @@ public class NexthopManager implements AutoCloseable { private List getBucketsForLocalNexthop(Long vpnId, BigInteger dpnId, VrfEntry vrfEntry, Routes routes) { + @Nullable List nexthopIpList = routes.getNexthopIpList(); if (LOG.isDebugEnabled()) { LOG.debug("NexthopManager.getBucketsForLocalNexthop invoked with vpnId {} dpnId {} " + " vrfEntry.routePaths {}, routes.nexthopList {}", vpnId, dpnId, vrfEntry.getRoutePaths(), - routes.getNexthopIpList()); + nexthopIpList); } List listBucketInfo = new CopyOnWriteArrayList<>(); - nullToEmpty(routes.getNexthopIpList()).parallelStream().forEach(nextHopIp -> { - String localNextHopIP; - if (isIpv4Address(nextHopIp)) { - localNextHopIP = nextHopIp + NwConstants.IPV4PREFIX; - } else { - localNextHopIP = nextHopIp + NwConstants.IPV6PREFIX; - } - Prefixes localNextHopInfo = fibUtil.getPrefixToInterface(vpnId, localNextHopIP); - if (localNextHopInfo != null) { - long groupId = getLocalNextHopGroup(vpnId, localNextHopIP); - if (groupId == FibConstants.INVALID_GROUP_ID) { - LOG.error("Unable to allocate groupId for vpnId {} , prefix {} , interface {}", vpnId, - vrfEntry.getDestPrefix(), localNextHopInfo.getVpnInterfaceName()); - return; + if (nexthopIpList != null) { + nexthopIpList.parallelStream().forEach(nextHopIp -> { + String localNextHopIP; + if (isIpv4Address(nextHopIp)) { + localNextHopIP = nextHopIp + NwConstants.IPV4PREFIX; + } else { + localNextHopIP = nextHopIp + NwConstants.IPV6PREFIX; } - List actionsInfos = + Prefixes localNextHopInfo = fibUtil.getPrefixToInterface(vpnId, localNextHopIP); + if (localNextHopInfo != null) { + long groupId = getLocalNextHopGroup(vpnId, localNextHopIP); + if (groupId == FibConstants.INVALID_GROUP_ID) { + LOG.error("Unable to allocate groupId for vpnId {} , prefix {} , interface {}", vpnId, + vrfEntry.getDestPrefix(), localNextHopInfo.getVpnInterfaceName()); + return; + } + List actionsInfos = Collections.singletonList(new ActionGroup(groupId)); - BucketInfo bucket = new BucketInfo(actionsInfos); - bucket.setWeight(1); - listBucketInfo.add(bucket); - } - }); + BucketInfo bucket = new BucketInfo(actionsInfos); + bucket.setWeight(1); + listBucketInfo.add(bucket); + } + }); + } LOG.trace("LOCAL: listbucket {}, vpnId {}, dpnId {}, routes {}", listBucketInfo, vpnId, dpnId, routes); return listBucketInfo; } @@ -961,86 +963,88 @@ public class NexthopManager implements AutoCloseable { List vpnExtraRoutes) { List listBucketInfo = new ArrayList<>(); Map> egressActionMap = new HashMap<>(); - vpnExtraRoutes.forEach(vpnExtraRoute -> nullToEmpty(vpnExtraRoute.getNexthopIpList()).forEach(nextHopIp -> { - String nextHopPrefixIp; - if (isIpv4Address(nextHopIp)) { - nextHopPrefixIp = nextHopIp + NwConstants.IPV4PREFIX; - } else { - nextHopPrefixIp = nextHopIp + NwConstants.IPV6PREFIX; - } - List tepIpAddresses = fibUtil.getNextHopAddresses(rd, nextHopPrefixIp); - if (tepIpAddresses.isEmpty()) { - return; - } - // There would be only one nexthop address for a VM ip which would be the tep Ip - String tepIp = tepIpAddresses.get(0); - AdjacencyResult adjacencyResult = getRemoteNextHopPointer(dpnId, vpnId, + vpnExtraRoutes.stream().filter(vpnExtraRoute -> vpnExtraRoute.getNexthopIpList() != null).forEach( + vpnExtraRoute -> vpnExtraRoute.getNexthopIpList().forEach(nextHopIp -> { + String nextHopPrefixIp; + if (isIpv4Address(nextHopIp)) { + nextHopPrefixIp = nextHopIp + NwConstants.IPV4PREFIX; + } else { + nextHopPrefixIp = nextHopIp + NwConstants.IPV6PREFIX; + } + List tepIpAddresses = fibUtil.getNextHopAddresses(rd, nextHopPrefixIp); + if (tepIpAddresses.isEmpty()) { + return; + } + // There would be only one nexthop address for a VM ip which would be the tep Ip + String tepIp = tepIpAddresses.get(0); + AdjacencyResult adjacencyResult = getRemoteNextHopPointer(dpnId, vpnId, vrfEntry.getDestPrefix(), tepIp, TunnelTypeVxlan.class); - if (adjacencyResult == null) { - return; - } - String egressInterface = adjacencyResult.getInterfaceName(); - if (!FibUtil.isTunnelInterface(adjacencyResult)) { - return; - } - Class tunnelType = VpnExtraRouteHelper.getTunnelType(itmManager, egressInterface); - StateTunnelList ifState = null; - try { - ifState = fibUtil.getTunnelState(egressInterface); - if (ifState == null || ifState.getOperState() != TunnelOperStatus.Up) { - LOG.trace("Tunnel is not up for interface {}", egressInterface); + if (adjacencyResult == null) { return; } - } catch (ReadFailedException e) { - LOG.error("getBucketsForRemoteNexthop: error in fetching tunnel state for interface {}", + String egressInterface = adjacencyResult.getInterfaceName(); + if (!FibUtil.isTunnelInterface(adjacencyResult)) { + return; + } + Class tunnelType = + VpnExtraRouteHelper.getTunnelType(itmManager, egressInterface); + StateTunnelList ifState = null; + try { + ifState = fibUtil.getTunnelState(egressInterface); + if (ifState == null || ifState.getOperState() != TunnelOperStatus.Up) { + LOG.trace("Tunnel is not up for interface {}", egressInterface); + return; + } + } catch (ReadFailedException e) { + LOG.error("getBucketsForRemoteNexthop: error in fetching tunnel state for interface {}", egressInterface, e); - return; - } - if (!TunnelTypeVxlan.class.equals(tunnelType)) { - return; - } - Long label = FibUtil.getLabelFromRoutePaths(vrfEntry).get(); - Prefixes prefixInfo = fibUtil.getPrefixToInterface(vpnId, nextHopPrefixIp); - if (prefixInfo == null) { - LOG.error("No prefix info found for prefix {} in rd {} for VPN {}", nextHopPrefixIp, rd, + return; + } + if (!TunnelTypeVxlan.class.equals(tunnelType)) { + return; + } + Long label = FibUtil.getLabelFromRoutePaths(vrfEntry).get(); + Prefixes prefixInfo = fibUtil.getPrefixToInterface(vpnId, nextHopPrefixIp); + if (prefixInfo == null) { + LOG.error("No prefix info found for prefix {} in rd {} for VPN {}", nextHopPrefixIp, rd, vpnId); - return; - } - BigInteger tunnelId; - if (FibUtil.isVxlanNetwork(prefixInfo.getNetworkType())) { - tunnelId = BigInteger.valueOf(prefixInfo.getSegmentationId()); - } else { - LOG.warn("Network is not of type VXLAN for prefix {}." + return; + } + BigInteger tunnelId; + if (FibUtil.isVxlanNetwork(prefixInfo.getNetworkType())) { + tunnelId = BigInteger.valueOf(prefixInfo.getSegmentationId()); + } else { + LOG.warn("Network is not of type VXLAN for prefix {}." + "Going with default Lport Tag.", prefixInfo.toString()); - tunnelId = BigInteger.valueOf(label); - } - List actionInfos = new ArrayList<>(); - actionInfos.add(new ActionSetFieldTunnelId(tunnelId)); - String ifName = prefixInfo.getVpnInterfaceName(); - String vpnName = fibUtil.getVpnNameFromId(vpnId); - if (vpnName == null) { - return; - } - String macAddress = fibUtil.getMacAddressFromPrefix(ifName, vpnName, nextHopPrefixIp); - actionInfos.add(new ActionSetFieldEthernetDestination(actionInfos.size(), + tunnelId = BigInteger.valueOf(label); + } + List actionInfos = new ArrayList<>(); + actionInfos.add(new ActionSetFieldTunnelId(tunnelId)); + String ifName = prefixInfo.getVpnInterfaceName(); + String vpnName = fibUtil.getVpnNameFromId(vpnId); + if (vpnName == null) { + return; + } + String macAddress = fibUtil.getMacAddressFromPrefix(ifName, vpnName, nextHopPrefixIp); + actionInfos.add(new ActionSetFieldEthernetDestination(actionInfos.size(), new MacAddress(macAddress))); - List egressActions; - if (egressActionMap.containsKey(egressInterface)) { - egressActions = egressActionMap.get(egressInterface); - } else { - egressActions = getEgressActionsForInterface(egressInterface, actionInfos.size(), true); - egressActionMap.put(egressInterface, egressActions); - } - if (egressActions.isEmpty()) { - LOG.error("Failed to retrieve egress action for prefix {} route-paths {}" - + " interface {}." + " Aborting remote FIB entry creation.", + List egressActions; + if (egressActionMap.containsKey(egressInterface)) { + egressActions = egressActionMap.get(egressInterface); + } else { + egressActions = getEgressActionsForInterface(egressInterface, actionInfos.size(), true); + egressActionMap.put(egressInterface, egressActions); + } + if (egressActions.isEmpty()) { + LOG.error("Failed to retrieve egress action for prefix {} route-paths {}" + + " interface {}." + " Aborting remote FIB entry creation.", vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), egressInterface); - } - actionInfos.addAll(egressActions); - BucketInfo bucket = new BucketInfo(actionInfos); - bucket.setWeight(1); - listBucketInfo.add(bucket); - })); + } + actionInfos.addAll(egressActions); + BucketInfo bucket = new BucketInfo(actionInfos); + bucket.setWeight(1); + listBucketInfo.add(bucket); + })); LOG.trace("LOCAL: listbucket {}, rd {}, dpnId {}, routes {}", listBucketInfo, rd, dpnId, vpnExtraRoutes); return listBucketInfo; } @@ -1097,7 +1101,7 @@ public class NexthopManager implements AutoCloseable { LOG.warn("RPC Call to Get egress actions for interface {} returned with Errors {}", interfaceName, rpcResult.getErrors()); } else { - actions = nullToEmpty(rpcResult.getResult().getAction()); + actions = rpcResult.getResult().nonnullAction(); } } catch (InterruptedException | ExecutionException e) { LOG.warn("Exception when egress actions for interface {}", interfaceName, e); @@ -1127,25 +1131,27 @@ public class NexthopManager implements AutoCloseable { if (!dpnLbNextHops.isPresent()) { return; } - List nextHopKeys = nullToEmpty(dpnLbNextHops.get().getNexthopKey()); - for (String nextHopKey : nextHopKeys) { - Optional optionalNextHops = fibUtil.getNexthops(nextHopKey); - if (!optionalNextHops.isPresent()) { - return; - } - Nexthops nexthops = optionalNextHops.get(); - final String groupId = nexthops.getGroupId(); - final long groupIdValue = Long.parseLong(groupId); - if (noOfDcGws > 1) { - mdsalApiManager.removeBucket(confTx, dpnId, groupIdValue, bucketId); - } else { - LOG.trace("Removed LB group {} on dpn {}", groupIdValue, dpnId); - mdsalApiManager.removeGroup(confTx, dpnId, groupIdValue); - removeNextHopPointer(nextHopKey); - } - // When the DC-GW is removed from configuration. - if (noOfDcGws != availableDcGws.size()) { - FibUtil.removeOrUpdateNextHopInfo(dpnId, nextHopKey, groupId, nexthops, operTx); + List nextHopKeys = dpnLbNextHops.get().getNexthopKey(); + if (nextHopKeys != null) { + for (String nextHopKey : nextHopKeys) { + Optional optionalNextHops = fibUtil.getNexthops(nextHopKey); + if (!optionalNextHops.isPresent()) { + return; + } + Nexthops nexthops = optionalNextHops.get(); + final String groupId = nexthops.getGroupId(); + final long groupIdValue = Long.parseLong(groupId); + if (noOfDcGws > 1) { + mdsalApiManager.removeBucket(confTx, dpnId, groupIdValue, bucketId); + } else { + LOG.trace("Removed LB group {} on dpn {}", groupIdValue, dpnId); + mdsalApiManager.removeGroup(confTx, dpnId, groupIdValue); + removeNextHopPointer(nextHopKey); + } + // When the DC-GW is removed from configuration. + if (noOfDcGws != availableDcGws.size()) { + FibUtil.removeOrUpdateNextHopInfo(dpnId, nextHopKey, groupId, nexthops, operTx); + } } } FibUtil.removeDpnIdToNextHopInfo(destinationIp, dpnId, operTx); @@ -1167,22 +1173,24 @@ public class NexthopManager implements AutoCloseable { if (!dpnLbNextHops.isPresent()) { return; } - List nextHopKeys = nullToEmpty(dpnLbNextHops.get().getNexthopKey()); - for (String nextHopKey : nextHopKeys) { - Optional optionalNextHops = fibUtil.getNexthops(nextHopKey); - if (!optionalNextHops.isPresent()) { - return; - } - Nexthops nexthops = optionalNextHops.get(); - final String groupId = nexthops.getGroupId(); - final long groupIdValue = Long.parseLong(groupId); - if (isTunnelUp) { - Bucket bucket = buildBucketForDcGwLbGroup(destinationIp, dpnId, bucketId, tunnelType); - LOG.trace("Added bucket {} to group {} on dpn {}.", bucket, groupId, dpnId); - mdsalApiManager.addBucket(confTx, dpnId, groupIdValue, bucket); - } else { - LOG.trace("Removed bucketId {} from group {} on dpn {}.", bucketId, groupId, dpnId); - mdsalApiManager.removeBucket(confTx, dpnId, groupIdValue, bucketId); + List nextHopKeys = dpnLbNextHops.get().getNexthopKey(); + if (nextHopKeys != null) { + for (String nextHopKey : nextHopKeys) { + Optional optionalNextHops = fibUtil.getNexthops(nextHopKey); + if (!optionalNextHops.isPresent()) { + return; + } + Nexthops nexthops = optionalNextHops.get(); + final String groupId = nexthops.getGroupId(); + final long groupIdValue = Long.parseLong(groupId); + if (isTunnelUp) { + Bucket bucket = buildBucketForDcGwLbGroup(destinationIp, dpnId, bucketId, tunnelType); + LOG.trace("Added bucket {} to group {} on dpn {}.", bucket, groupId, dpnId); + mdsalApiManager.addBucket(confTx, dpnId, groupIdValue, bucket); + } else { + LOG.trace("Removed bucketId {} from group {} on dpn {}.", bucketId, groupId, dpnId); + mdsalApiManager.removeBucket(confTx, dpnId, groupIdValue, bucketId); + } } } }), LOG, "Error updating load-balancing group"); diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java index 02983c613e..5431663932 100755 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java @@ -11,7 +11,6 @@ import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CR import static org.opendaylight.genius.infra.Datastore.CONFIGURATION; import static org.opendaylight.genius.infra.Datastore.OPERATIONAL; import static org.opendaylight.genius.mdsalutil.NWUtil.isIpv4Address; -import static org.opendaylight.netvirt.fibmanager.FibUtil.nullToEmpty; import com.google.common.base.Optional; import com.google.common.base.Preconditions; @@ -37,6 +36,7 @@ import javax.annotation.Nullable; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.inject.Singleton; +import org.eclipse.jdt.annotation.NonNull; 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; @@ -505,7 +505,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase vpnInstanceNames = new ArrayList<>(nullToEmpty(lri.getVpnInstanceList())); + List vpnInstanceNames = + lri.getVpnInstanceList() != null ? new ArrayList<>(lri.getVpnInstanceList()) : new ArrayList<>(); vpnInstanceNames.add(vpnInstanceName); builder.setVpnInstanceList(vpnInstanceNames); MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, lriId, builder.build()); @@ -817,7 +818,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase usedRds = VpnExtraRouteHelper.getUsedRds(dataBroker, vpnId, vrfEntry.getDestPrefix()); String usedRd = usedRds.isEmpty() ? primaryRd : usedRds.get(0); Routes extraRoute = baseVrfEntryHandler.getVpnToExtraroute(vpnId, usedRd, vrfEntry.getDestPrefix()); - if (extraRoute != null) { - for (String nextHopIp : nullToEmpty(extraRoute.getNexthopIpList())) { + if (extraRoute != null && extraRoute.getNexthopIpList() != null) { + for (String nextHopIp : extraRoute.getNexthopIpList()) { LOG.debug("NextHop IP for destination {} is {}", vrfEntry.getDestPrefix(), nextHopIp); if (nextHopIp != null) { String ipPrefix; @@ -1448,8 +1450,9 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase + @NonNull List adjacencies = optAdjacencies.get().nonnullAdjacency(); + if (adjacencies.size() <= 2 + && adjacencies.stream().allMatch(adjacency -> adjacency.getAdjacencyType() == Adjacency.AdjacencyType.PrimaryAdjacency && adjacency.isMarkedForDeletion() != null && adjacency.isMarkedForDeletion() @@ -1677,7 +1680,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase { - for (final VrfEntry vrfEntry : nullToEmpty(vrfTable.get().getVrfEntry())) { + for (final VrfEntry vrfEntry : vrfTable.get().nonnullVrfEntry()) { SubnetRoute subnetRoute = vrfEntry.augmentation(SubnetRoute.class); if (subnetRoute != null) { long elanTag = subnetRoute.getElantag(); @@ -1757,7 +1760,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase RouteOrigin.BGP == RouteOrigin.value(vrfEntry.getOrigin())) .forEach(bgpRouteVrfEntryHandler.getConsumerForCreatingRemoteFib(dpnId, vpnId, rd, remoteNextHopIp, vrfTable, TransactionAdapter.toWriteTransaction(tx), txnObjects)); @@ -1850,7 +1853,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase { String vpnName = fibUtil.getVpnNameFromId(vpnInstance.getVpnId()); - for (final VrfEntry vrfEntry : nullToEmpty(vrfTable.get().getVrfEntry())) { + for (final VrfEntry vrfEntry : vrfTable.get().nonnullVrfEntry()) { /* parentRd is only filled for external PNF cases where the interface on the external * network VPN are used to cleanup the flows. For all other cases, use "rd" for * #fibUtil.isInterfacePresentInDpn(). @@ -1970,7 +1973,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase nullToEmpty(vrfTable.get().getVrfEntry()).stream() + tx -> vrfTable.get().nonnullVrfEntry().stream() .filter(vrfEntry -> RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) .forEach(bgpRouteVrfEntryHandler.getConsumerForDeletingRemoteFib(dpnId, vpnId, remoteNextHopIp, vrfTable, TransactionAdapter.toWriteTransaction(tx), -- 2.36.6