Handle nullable lists in fibmanager 52/77152/3
authorStephen Kitt <skitt@redhat.com>
Mon, 15 Oct 2018 15:47:42 +0000 (17:47 +0200)
committerSam Hague <shague@redhat.com>
Fri, 19 Oct 2018 22:15:37 +0000 (22:15 +0000)
Following YANGTOOLS-585, lists can be null (which is correctly
indicated with an @Nullable annotation). This patch deals with the
fallout.

Change-Id: Ie4d6d34c5b0449c41ce21cfac31546d8faba019e
Signed-off-by: Stephen Kitt <skitt@redhat.com>
12 files changed:
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BgpRouteVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/EvpnVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibRpcServiceImpl.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java
fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ConfTransportL3VPNCommand.java
fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowFibCommand.java
fibmanager/shell/src/main/java/org/opendaylight/netvirt/fibmanager/shell/ShowTransportTypeCommand.java

index d48349cd3e96507150a849e395d479ed24a8e5d9..b6297843087ea63d299d66e038f49daaa217e10a 100644 (file)
@@ -15,10 +15,11 @@ import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -49,29 +50,29 @@ public final class FibHelper {
         return builder.build();
     }
 
-    public static VrfEntryBuilder getVrfEntryBuilder(String prefix, RouteOrigin origin, String parentVpnRd) {
+    public static VrfEntryBuilder getVrfEntryBuilder(String prefix, RouteOrigin origin, @Nullable String parentVpnRd) {
         return new VrfEntryBuilder().withKey(new VrfEntryKey(prefix)).setDestPrefix(prefix)
                 .setOrigin(origin.getValue()).setParentVpnRd(parentVpnRd);
     }
 
     public static VrfEntryBuilder getVrfEntryBuilder(String prefix, List<RoutePaths> routePaths,
-            RouteOrigin origin, String parentVpnRd) {
+            RouteOrigin origin, @Nullable String parentVpnRd) {
         return new VrfEntryBuilder().withKey(new VrfEntryKey(prefix)).setDestPrefix(prefix)
                 .setRoutePaths(routePaths).setOrigin(origin.getValue()).setParentVpnRd(parentVpnRd);
     }
 
     public static VrfEntryBuilder getVrfEntryBuilder(String prefix, long label, String nextHop, RouteOrigin origin,
-            String parentVpnRd) {
+            @Nullable String parentVpnRd) {
         if (nextHop != null) {
             RoutePaths routePath = buildRoutePath(nextHop, label);
-            return getVrfEntryBuilder(prefix, Arrays.asList(routePath), origin, parentVpnRd);
+            return getVrfEntryBuilder(prefix, Collections.singletonList(routePath), origin, parentVpnRd);
         } else {
             return getVrfEntryBuilder(prefix, origin, parentVpnRd);
         }
     }
 
     public static VrfEntryBuilder getVrfEntryBuilder(VrfEntry vrfEntry, long label,
-            List<String> nextHopList, RouteOrigin origin, String parentvpnRd) {
+            List<String> nextHopList, RouteOrigin origin, @Nullable String parentvpnRd) {
         List<RoutePaths> routePaths =
                 nextHopList.stream().map(nextHop -> buildRoutePath(nextHop, label))
                         .collect(toList());
@@ -152,19 +153,16 @@ public final class FibHelper {
      * @return true if it is an IPv4 or false if it is not.
      */
     public static boolean isIpv4Prefix(String prefix) {
-        boolean rep = false;
         if (prefix == null || prefix.length() < 7) {
-            return rep;
+            return false;
         }
         try {
             String ip = getIpFromPrefix(prefix);
             java.net.Inet4Address.getByName(ip);
-            rep = true;
         } catch (SecurityException | UnknownHostException | ClassCastException e) {
-            rep = false;
-            return rep;
+            return false;
         }
-        return rep;
+        return true;
     }
 
     /** get true if this prefix is an IPv6 version, false otherwise.
@@ -172,25 +170,23 @@ public final class FibHelper {
      * @return true if it is an IPv4 or false if it is not.
      */
     public static boolean isIpv6Prefix(String prefix) {
-        boolean rep = false;
         if (prefix == null || prefix.length() < 2) {
-            return rep;
+            return false;
         }
         try {
             String ip = getIpFromPrefix(prefix);
             java.net.Inet6Address.getByName(ip);
-            rep = true;
         } catch (SecurityException | UnknownHostException | ClassCastException e) {
-            rep = false;
-            return rep;
+            return false;
         }
-        return rep;
+        return true;
     }
 
     /**get String format IP from prefix as x.x.....x/nn.
      * @param prefix the prefix as IPv4 or IPv6 as x.....x/nn
      * @return prefix if "/" is unfindable or the IP only as x.x...x from x.x......x/nn
      */
+    @Nullable
     public static String getIpFromPrefix(String prefix) {
         if (prefix == null || prefix.length() < 2) {
             return null;
@@ -300,6 +296,7 @@ public final class FibHelper {
      * @param mask the lengh of the mask of net as 24 from this representation 10.1.1.0/24 or 64 for 2001::1/64
      * @return the bit mask of net ex: x.x.x.x/24 return a BigInteger == 0xFFFFFFotherwise null if any error
      */
+    @Nullable
     public static BigInteger getMaskNetwork(int ipVersion, int mask) {
         int lenghBitsIp = 0;
         if (ipVersion == 6) {
index c1511fc1aaad69b2dbd36cfed78247dd4cdb2dd5..de3e372481f6eae61da617790b6de9caf23f858d 100644 (file)
@@ -13,6 +13,7 @@ import com.google.common.util.concurrent.FutureCallback;
 import java.math.BigInteger;
 import java.util.List;
 
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedWriteTransaction;
@@ -22,7 +23,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev15033
 
 public interface IFibManager {
     void populateFibOnNewDpn(BigInteger dpnId, long vpnId, String rd,
-                             FutureCallback<List<Void>> callback);
+                             @Nullable FutureCallback<List<Void>> callback);
 
     void cleanUpExternalRoutesOnDpn(BigInteger dpnId, long vpnId, String rd,
                                     String localNextHopIp, String remoteNextHopIp);
@@ -31,7 +32,7 @@ public interface IFibManager {
                                      String localNextHopIp, String remoteNextHopIp);
 
     void cleanUpDpnForVpn(BigInteger dpnId, long vpnId, String rd,
-                          FutureCallback<List<Void>> callback);
+                          @Nullable FutureCallback<List<Void>> callback);
 
     void setConfTransType(String service, String transportType);
 
@@ -53,10 +54,10 @@ public interface IFibManager {
                                 String destTepIp,
                                 long label);
 
-    void addOrUpdateFibEntry(String rd, String macAddress, String prefix, List<String> nextHopList,
-                             VrfEntry.EncapType encapType, long label, long l3vni, String gwMacAddress,
-                             String parentVpnRd, RouteOrigin origin,
-                             TypedWriteTransaction<Configuration> writeConfigTxn);
+    void addOrUpdateFibEntry(String rd, @Nullable String macAddress, String prefix, List<String> nextHopList,
+                             VrfEntry.EncapType encapType, long label, long l3vni, @Nullable String gwMacAddress,
+                             @Nullable String parentVpnRd, RouteOrigin origin,
+                             @Nullable TypedWriteTransaction<Configuration> writeConfigTxn);
 
     void addFibEntryForRouterInterface(String rd, String prefix,
                                        RouterInterface routerInterface, long label,
@@ -65,7 +66,7 @@ public interface IFibManager {
     void removeOrUpdateFibEntry(String rd, String prefix, String nextHopToRemove,
                                 TypedWriteTransaction<Configuration> writeConfigTxn);
 
-    void removeFibEntry(String rd, String prefix, TypedWriteTransaction<Configuration> writeConfigTxn);
+    void removeFibEntry(String rd, String prefix, @Nullable TypedWriteTransaction<Configuration> writeConfigTxn);
 
     void updateRoutePathForFibEntry(String rd, String prefix, String nextHop,
                                     long label, boolean nextHopAdd, WriteTransaction writeConfigTxn);
index 102563e30069ba31f10e237947e1807ccc55ad8e..92d9a4637ed71c2ecff0943dc28cbeb88ea47df0 100644 (file)
@@ -9,6 +9,7 @@ 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;
@@ -21,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -157,7 +159,7 @@ public class BaseVrfEntryHandler implements AutoCloseable {
     @Nonnull
     protected List<AdjacencyResult> resolveAdjacency(final BigInteger remoteDpnId, final long vpnId,
                                                      final VrfEntry vrfEntry, String rd) {
-        List<RoutePaths> routePaths = vrfEntry.getRoutePaths();
+        List<RoutePaths> routePaths = nullToEmpty(vrfEntry.getRoutePaths());
         FibHelper.sortIpAddress(routePaths);
         List<AdjacencyResult> adjacencyList = new ArrayList<>();
         List<String> prefixIpList;
@@ -185,7 +187,7 @@ public class BaseVrfEntryHandler implements AutoCloseable {
                     prefixIpList = Collections.singletonList(vrfEntry.getDestPrefix());
                 } else {
                     List<String> prefixIpListLocal = new ArrayList<>();
-                    vpnExtraRoutes.forEach(route -> route.getNexthopIpList().forEach(extraRouteIp -> {
+                    vpnExtraRoutes.forEach(route -> nullToEmpty(route.getNexthopIpList()).forEach(extraRouteIp -> {
                         String ipPrefix;
                         if (isIpv4Address(extraRouteIp)) {
                             ipPrefix = extraRouteIp + NwConstants.IPV4PREFIX;
@@ -231,8 +233,8 @@ public class BaseVrfEntryHandler implements AutoCloseable {
     }
 
     protected void makeConnectedRoute(BigInteger dpId, long vpnId, VrfEntry vrfEntry, String rd,
-                            List<InstructionInfo> instructions, int addOrRemove, WriteTransaction tx,
-                            List<SubTransaction> subTxns) {
+                                      @Nullable List<InstructionInfo> instructions, int addOrRemove,
+                                      WriteTransaction tx, @Nullable List<SubTransaction> subTxns) {
         if (tx == null) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(
                 newTx -> makeConnectedRoute(dpId, vpnId, vrfEntry, rd, instructions, addOrRemove, newTx, subTxns)),
@@ -308,8 +310,8 @@ public class BaseVrfEntryHandler implements AutoCloseable {
         }
     }
 
-    protected void addRewriteDstMacAction(long vpnId, VrfEntry vrfEntry, Prefixes prefixInfo,
-                                        List<ActionInfo> actionInfos) {
+    protected void addRewriteDstMacAction(long vpnId, VrfEntry vrfEntry, @Nullable Prefixes prefixInfo,
+                                          List<ActionInfo> actionInfos) {
         if (vrfEntry.getMac() != null) {
             actionInfos.add(new ActionSetFieldEthernetDestination(actionInfos.size(),
                     new MacAddress(vrfEntry.getMac())));
@@ -410,6 +412,7 @@ public class BaseVrfEntryHandler implements AutoCloseable {
         addRewriteDstMacAction(vpnId, vrfEntry, prefixInfo, actionInfos);
     }
 
+    @Nullable
     private InstanceIdentifier<Interface> getFirstAbsentInterfaceStateIid(List<AdjacencyResult> adjacencyResults) {
         InstanceIdentifier<Interface> res = null;
         for (AdjacencyResult adjacencyResult : adjacencyResults) {
@@ -424,9 +427,9 @@ public class BaseVrfEntryHandler implements AutoCloseable {
     }
 
     public void programRemoteFib(final BigInteger remoteDpnId, final long vpnId,
-                                  final VrfEntry vrfEntry, WriteTransaction tx, String rd,
-                                  List<AdjacencyResult> adjacencyResults,
-                                  List<SubTransaction> subTxns) {
+                                 final VrfEntry vrfEntry, WriteTransaction tx, String rd,
+                                 List<AdjacencyResult> adjacencyResults,
+                                 @Nullable List<SubTransaction> subTxns) {
         if (upgradeState.isUpgradeInProgress()) {
             InstanceIdentifier<Interface> absentInterfaceStateIid = getFirstAbsentInterfaceStateIid(adjacencyResults);
             if (absentInterfaceStateIid != null) {
@@ -436,17 +439,15 @@ public class BaseVrfEntryHandler implements AutoCloseable {
                     absentInterfaceStateIid,
                     (before, after) -> {
                         LOG.info("programRemoteFib: waited for and got interface state {}", absentInterfaceStateIid);
-                        txRunner.callWithNewWriteOnlyTransactionAndSubmit((wtx) -> {
-                            programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null);
-                        });
+                        txRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                            (wtx) -> programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null));
                         return DataTreeEventCallbackRegistrar.NextAction.UNREGISTER;
                     },
                     Duration.of(15, ChronoUnit.MINUTES),
                     (iid) -> {
                         LOG.error("programRemoteFib: timed out waiting for {}", absentInterfaceStateIid);
-                        txRunner.callWithNewWriteOnlyTransactionAndSubmit((wtx) -> {
-                            programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null);
-                        });
+                        txRunner.callWithNewWriteOnlyTransactionAndSubmit(
+                            (wtx) -> programRemoteFib(remoteDpnId, vpnId, vrfEntry, wtx, rd, adjacencyResults, null));
                     });
                 return;
             }
@@ -477,8 +478,8 @@ public class BaseVrfEntryHandler implements AutoCloseable {
     }
 
     public boolean checkDpnDeleteFibEntry(VpnNexthop localNextHopInfo, BigInteger remoteDpnId, long vpnId,
-                                           VrfEntry vrfEntry, String rd,
-                                           WriteTransaction tx, List<SubTransaction> subTxns) {
+                                          VrfEntry vrfEntry, String rd,
+                                          WriteTransaction tx, @Nullable List<SubTransaction> subTxns) {
         boolean isRemoteRoute = true;
         if (localNextHopInfo != null) {
             isRemoteRoute = !remoteDpnId.equals(localNextHopInfo.getDpnId());
@@ -494,10 +495,10 @@ public class BaseVrfEntryHandler implements AutoCloseable {
         }
     }
 
-    public void deleteRemoteRoute(final BigInteger localDpnId, final BigInteger remoteDpnId,
+    public void deleteRemoteRoute(@Nullable final BigInteger localDpnId, final BigInteger remoteDpnId,
                                   final long vpnId, final VrfTablesKey vrfTableKey,
                                   final VrfEntry vrfEntry, Optional<Routes> extraRouteOptional,
-                                  WriteTransaction tx) {
+                                  @Nullable WriteTransaction tx) {
         if (tx == null) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(
                 newTx -> deleteRemoteRoute(localDpnId, remoteDpnId, vpnId, vrfTableKey, vrfEntry,
@@ -535,6 +536,7 @@ public class BaseVrfEntryHandler implements AutoCloseable {
                         new ExtraRoutesKey(vrfId)).child(Routes.class, new RoutesKey(ipPrefix)).build();
     }
 
+    @Nullable
     public Routes getVpnToExtraroute(Long vpnId, String vpnRd, String destPrefix) {
         String optVpnName = fibUtil.getVpnNameFromId(vpnId);
         if (optVpnName != null) {
index 00b8840ff6423ce9d2708b93bbbbf5b3c3e7fbbe..214aca0772fd75a1f69a1636bb9a07512ea55966 100644 (file)
@@ -8,6 +8,7 @@
 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;
@@ -17,6 +18,7 @@ import java.util.List;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.function.Consumer;
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -253,7 +255,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler
                                              String rd,
                                              List<NexthopManager.AdjacencyResult> adjacencyResults,
                                              List<SubTransaction> subTxns) {
-        if (vrfEntry.getRoutePaths().size() > 2) {
+        if (nullToEmpty(vrfEntry.getRoutePaths()).size() > 2) {
             LOG.error("DC-GW can advertise only 2 bestPaths for prefix {}", vrfEntry.getDestPrefix());
             return;
         }
@@ -331,10 +333,10 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler
         }
     }
 
-    public void deleteRemoteRoute(final BigInteger localDpnId, final BigInteger remoteDpnId,
+    public void deleteRemoteRoute(@Nullable final BigInteger localDpnId, final BigInteger remoteDpnId,
                                   final long vpnId, final VrfTablesKey vrfTableKey,
                                   final VrfEntry vrfEntry, Optional<Routes> extraRouteOptional,
-                                  WriteTransaction tx, List<SubTransaction> subTxns) {
+                                  @Nullable WriteTransaction tx, List<SubTransaction> subTxns) {
         if (tx == null) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(
                 newTx -> deleteRemoteRoute(localDpnId, remoteDpnId, vpnId, vrfTableKey, vrfEntry,
@@ -368,7 +370,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler
             final BigInteger dpnId, final long vpnId, final String rd,
             final String remoteNextHopIp, final Optional<VrfTables> vrfTable,
             WriteTransaction writeCfgTxn, List<SubTransaction> subTxns) {
-        return vrfEntry -> vrfEntry.getRoutePaths().stream()
+        return vrfEntry -> nullToEmpty(vrfEntry.getRoutePaths()).stream()
                 .filter(routes -> !routes.getNexthopAddress().isEmpty()
                         && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim()))
                 .findFirst()
@@ -384,7 +386,7 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler
             final BigInteger dpnId, final long vpnId,
             final String remoteNextHopIp, final Optional<VrfTables> vrfTable,
             WriteTransaction writeCfgTxn, List<SubTransaction> subTxns) {
-        return vrfEntry -> vrfEntry.getRoutePaths().stream()
+        return vrfEntry -> nullToEmpty(vrfEntry.getRoutePaths()).stream()
                 .filter(routes -> !routes.getNexthopAddress().isEmpty()
                         && remoteNextHopIp.trim().equals(routes.getNexthopAddress().trim()))
                 .findFirst()
@@ -426,8 +428,8 @@ public class BgpRouteVrfEntryHandler extends BaseVrfEntryHandler
     }
 
     @Override
-    protected void addRewriteDstMacAction(long vpnId, VrfEntry vrfEntry, Prefixes prefixInfo,
-                                        List<ActionInfo> actionInfos) {
+    protected void addRewriteDstMacAction(long vpnId, VrfEntry vrfEntry, @Nullable Prefixes prefixInfo,
+                                          List<ActionInfo> actionInfos) {
         if (vrfEntry.getGatewayMacAddress() != null) {
             actionInfos.add(new ActionSetFieldEthernetDestination(actionInfos.size(),
                     new MacAddress(vrfEntry.getGatewayMacAddress())));
index 8112951cbccf844158371f477476a70c865fdcf7..f091ba6bd057dde433d3892484ec76af90b8e523 100644 (file)
@@ -8,6 +8,7 @@
 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;
@@ -17,6 +18,7 @@ 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;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
@@ -148,7 +150,7 @@ public class EvpnVrfEntryHandler extends BaseVrfEntryHandler implements IVrfEntr
             //Handle extra routes and imported routes
             Routes extraRoute = getVpnToExtraroute(vpnId, rd, vrfEntry.getDestPrefix());
             if (extraRoute != null) {
-                for (String nextHopIp : extraRoute.getNexthopIpList()) {
+                for (String nextHopIp : nullToEmpty(extraRoute.getNexthopIpList())) {
                     LOG.info("NextHop IP for destination {} is {}", vrfEntry.getDestPrefix(), nextHopIp);
                     if (nextHopIp != null) {
                         localNextHopInfo = getFibUtil().getPrefixToInterface(vpnId, nextHopIp + "/32");
@@ -235,7 +237,7 @@ public class EvpnVrfEntryHandler extends BaseVrfEntryHandler implements IVrfEntr
             String prefix = adjacencyResult.getPrefix();
             Prefixes prefixInfo = getFibUtil().getPrefixToInterface(vpnId, prefix);
             String interfaceName = prefixInfo.getVpnInterfaceName();
-            if (vrfEntry.getOrigin().equals(RouteOrigin.BGP.getValue()) || isNatPrefix) {
+            if (RouteOrigin.BGP.getValue().equals(vrfEntry.getOrigin()) || isNatPrefix) {
                 tunnelId = BigInteger.valueOf(vrfEntry.getL3vni());
             } else if (FibUtil.isVxlanNetwork(prefixInfo.getNetworkType())) {
                 tunnelId = BigInteger.valueOf(prefixInfo.getSegmentationId());
@@ -307,7 +309,7 @@ public class EvpnVrfEntryHandler extends BaseVrfEntryHandler implements IVrfEntr
                     } else {
                         for (BigInteger localDpnId : localDpnIdList) {
                             for (VpnToDpnList curDpn2 : vpnToDpnList) {
-                                if (!curDpn2.getDpnId().equals(localDpnId)) {
+                                if (!Objects.equals(curDpn2.getDpnId(), localDpnId)) {
                                     if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP) {
                                         if (curDpn2.getDpnState() == VpnToDpnList.DpnState.Active) {
                                             bgpRouteVrfEntryHandler.deleteRemoteRoute(localDpnId, curDpn2.getDpnId(),
index 4ba7983be7deaafdf02f71631a4f48954b224008..e6f07f46c3512c6ef8a93b7f709e3d3adb6c1ef2 100644 (file)
@@ -16,6 +16,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -216,6 +217,7 @@ public class FibRpcServiceImpl implements FibRpcService {
     }
 
     //TODO: Below Util methods to be removed once VpnUtil methods are exposed in api bundle
+    @Nullable
     public static String getVpnRd(DataBroker broker, String vpnName) {
         InstanceIdentifier<VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         return MDSALUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
index ba6c75ac1f48279f6cf01a62649ab1d957b43e61..843341e5c074e8a9f8a87a3c1bc712ef36d70374 100644 (file)
@@ -8,6 +8,7 @@
 
 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;
@@ -15,18 +16,18 @@ import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CR
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
-
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
-
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
@@ -218,6 +219,7 @@ public class FibUtil {
         return operTx.read(getVpnInstanceOpDataIdentifier(rd)).get();
     }
 
+    @Nullable
     VpnInstanceOpDataEntry getVpnInstance(String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id =
                 InstanceIdentifier.create(VpnInstanceOpData.class)
@@ -231,17 +233,20 @@ public class FibUtil {
         return rd + FibConstants.SEPARATOR + prefix;
     }
 
+    @Nullable
     Prefixes getPrefixToInterface(Long vpnId, String ipPrefix) {
         Optional<Prefixes> localNextHopInfoData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
             getPrefixToInterfaceIdentifier(vpnId, ipPrefix));
         return localNextHopInfoData.isPresent() ? localNextHopInfoData.get() : null;
     }
 
+    @Nullable
     static Prefixes getPrefixToInterface(TypedReadTransaction<Operational> operTx, Long vpnId, String ipPrefix)
             throws ExecutionException, InterruptedException {
         return operTx.read(getPrefixToInterfaceIdentifier(vpnId, ipPrefix)).get().orNull();
     }
 
+    @Nullable
     String getMacAddressFromPrefix(String ifName, String vpnName, String ipPrefix) {
         Optional<Adjacency> adjacencyData = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                        getAdjacencyIdentifierOp(ifName, vpnName, ipPrefix));
@@ -287,6 +292,7 @@ public class FibUtil {
                 getVpnInstanceOpData(rd).toJavaUtil().map(VpnInstanceOpDataEntry::getVpnInstanceName));
     }
 
+    @Nullable
     public String getVpnNameFromId(long vpnId) {
         InstanceIdentifier<VpnIds> id = getVpnIdToVpnInstanceIdentifier(vpnId);
         return MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(
@@ -442,8 +448,8 @@ public class FibUtil {
             }
             java.util.Optional<RoutePaths> optRoutePath =
                     routePaths.stream()
-                              .filter(routePath -> routePath.getNexthopAddress().equals(
-                                    nextHopToRemove)).findFirst();
+                        .filter(
+                            routePath -> Objects.equals(routePath.getNexthopAddress(), nextHopToRemove)).findFirst();
             if (!optRoutePath.isPresent()) {
                 LOG.error("Unable to find a routePath that contains the given nextHop to remove {}", nextHopToRemove);
                 return;
@@ -563,11 +569,12 @@ public class FibUtil {
             return java.util.Optional.empty();
         }
         return routePaths.stream()
-                .filter(routePath -> routePath.getNexthopAddress().equals(nextHopIp))
+                .filter(routePath -> Objects.equals(routePath.getNexthopAddress(), nextHopIp))
                 .findFirst()
                 .map(RoutePaths::getLabel);
     }
 
+    @Nullable
     public StateTunnelList getTunnelState(String interfaceName) throws ReadFailedException {
         Optional<StateTunnelList> tunnelStateOptional = iitmProvider.getTunnelState(interfaceName);
         if (tunnelStateOptional.isPresent()) {
@@ -588,6 +595,7 @@ public class FibUtil {
         return id;
     }
 
+    @Nullable
     public org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces
         .state.Interface getInterfaceStateFromOperDS(String interfaceName) {
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
@@ -715,7 +723,7 @@ public class FibUtil {
     public static void removeOrUpdateNextHopInfo(BigInteger dpnId, String nextHopKey, String groupId,
             Nexthops nexthops, TypedWriteTransaction<Operational> tx) {
         InstanceIdentifier<Nexthops> nextHopsId = getNextHopsIdentifier(nextHopKey);
-        List<String> targetDeviceIds = nexthops.getTargetDeviceId();
+        List<String> targetDeviceIds = new ArrayList<>(nullToEmpty(nexthops.getTargetDeviceId()));
         targetDeviceIds.remove(dpnId.toString());
         if (targetDeviceIds.isEmpty()) {
             tx.delete(nextHopsId);
@@ -893,4 +901,10 @@ public class FibUtil {
         }
         return false;
     }
+
+    // TODO Replace this with mdsal's DataObjectUtils.nullToEmpty when upgrading to mdsal 3
+    @Nonnull
+    public static <T> List<T> nullToEmpty(final @Nullable List<T> input) {
+        return input != null ? input : emptyList();
+    }
 }
index 75798c86acb3c94c045e443ce111030d7c815b5d..75afa9304854100320ec8d40c73d51aadf3fbdbd 100644 (file)
@@ -10,6 +10,7 @@ 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;
@@ -20,9 +21,11 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import javax.annotation.Nullable;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -283,7 +286,7 @@ public class NexthopManager implements AutoCloseable {
                 }
             }
             List<ActionInfo> listActionInfo = new ArrayList<>();
-            for (Action action : actions) {
+            for (Action action : nullToEmpty(actions)) {
                 actionKey = action.key().getOrder() + actionKey;
                 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action
                     actionClass = action.getAction();
@@ -317,6 +320,7 @@ public class NexthopManager implements AutoCloseable {
         return Collections.emptyList();
     }
 
+    @Nullable
     protected String getTunnelInterfaceName(BigInteger srcDpId, BigInteger dstDpId) {
         Class<? extends TunnelTypeBase> tunType = getReqTunType(getReqTransType().toUpperCase(Locale.getDefault()));
         Future<RpcResult<GetTunnelInterfaceNameOutput>> result;
@@ -338,6 +342,7 @@ public class NexthopManager implements AutoCloseable {
         return null;
     }
 
+    @Nullable
     protected String getTunnelInterfaceName(BigInteger srcDpId, org.opendaylight.yang.gen.v1.urn.ietf.params
         .xml.ns.yang.ietf.inet.types.rev130715.IpAddress dstIp, Class<? extends TunnelTypeBase> tunnelType) {
         Future<RpcResult<GetInternalOrExternalInterfaceNameOutput>> result;
@@ -520,6 +525,7 @@ public class NexthopManager implements AutoCloseable {
         return id;
     }
 
+    @Nullable
     protected VpnNexthop getVpnNexthop(long vpnId, String ipAddress) {
 
         // check if vpn node is there
@@ -530,9 +536,9 @@ public class NexthopManager implements AutoCloseable {
         Optional<VpnNexthops> vpnNexthops = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if (vpnNexthops.isPresent()) {
             // get nexthops list for vpn
-            List<VpnNexthop> nexthops = vpnNexthops.get().getVpnNexthop();
+            List<VpnNexthop> nexthops = nullToEmpty(vpnNexthops.get().getVpnNexthop());
             for (VpnNexthop nexthop : nexthops) {
-                if (nexthop.getIpAddress().equals(ipAddress)) {
+                if (Objects.equals(nexthop.getIpAddress(), ipAddress)) {
                     // return nexthop
                     LOG.trace("VpnNextHop : {}", nexthop);
                     return nexthop;
@@ -543,8 +549,9 @@ public class NexthopManager implements AutoCloseable {
         return null;
     }
 
+    @Nullable
     public AdjacencyResult getRemoteNextHopPointer(BigInteger remoteDpnId, long vpnId, String prefixIp,
-            String nextHopIp, Class<? extends TunnelTypeBase> tunnelType) {
+            @Nullable String nextHopIp, Class<? extends TunnelTypeBase> tunnelType) {
         String egressIfName = null;
         LOG.trace("getRemoteNextHopPointer: input [remoteDpnId {}, vpnId {}, prefixIp {}, nextHopIp {} ]", remoteDpnId,
             vpnId, prefixIp, nextHopIp);
@@ -570,10 +577,10 @@ public class NexthopManager implements AutoCloseable {
                 prefixIp) : null;
     }
 
+    @Nullable
     public BigInteger getDpnForPrefix(long vpnId, String prefixIp) {
         VpnNexthop vpnNexthop = getVpnNexthop(vpnId, prefixIp);
-        BigInteger localDpnId = vpnNexthop == null ? null : vpnNexthop.getDpnId();
-        return localDpnId;
+        return vpnNexthop == null ? null : vpnNexthop.getDpnId();
     }
 
     private void removeVpnNexthopFromDS(long vpnId, String ipPrefix) {
@@ -593,7 +600,7 @@ public class NexthopManager implements AutoCloseable {
             if (FibUtil.lockCluster(lockManager, nextHopLockStr, WAIT_TIME_TO_ACQUIRE_LOCK)) {
                 VpnNexthop nh = getVpnNexthop(vpnId, primaryIpAddress);
                 if (nh != null) {
-                    List<IpAdjacencies> prefixesList = nh.getIpAdjacencies();
+                    List<IpAdjacencies> prefixesList = new ArrayList<>(nullToEmpty(nh.getIpAdjacencies()));
                     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
@@ -659,7 +666,7 @@ public class NexthopManager implements AutoCloseable {
                 MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, getConfTransportTypeIdentifier());
 
             if (configuredTransTypeFromConfig.isPresent()) {
-                if (configuredTransTypeFromConfig.get().getTransportType().equals(TunnelTypeGre.class)) {
+                if (TunnelTypeGre.class.equals(configuredTransTypeFromConfig.get().getTransportType())) {
                     configuredTransportTypeL3VPN = L3VPNTransportTypes.GRE;
                 } else {
                     configuredTransportTypeL3VPN = L3VPNTransportTypes.VxLAN;
@@ -730,6 +737,7 @@ public class NexthopManager implements AutoCloseable {
 
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
+    @Nullable
     private String getTunnelRemoteNextHopPointer(BigInteger remoteDpnId, String nextHopIp,
                                                  Class<? extends TunnelTypeBase> tunnelType) {
         if (nextHopIp != null && !nextHopIp.isEmpty()) {
@@ -823,14 +831,12 @@ public class NexthopManager implements AutoCloseable {
                 return false;
             }
 
-            boolean result = false;
             if (getClass() != obj.getClass()) {
-                return result;
+                return false;
             } else {
                 AdjacencyResult other = (AdjacencyResult) obj;
-                result = interfaceName.equals(other.interfaceName);
+                return interfaceName.equals(other.interfaceName);
             }
-            return result;
         }
     }
 
@@ -904,15 +910,15 @@ public class NexthopManager implements AutoCloseable {
     }
 
     long createNextHopGroups(Long vpnId, String rd, BigInteger dpnId, VrfEntry vrfEntry,
-            Routes routes, List<Routes> vpnExtraRoutes) {
+            @Nullable Routes routes, List<Routes> vpnExtraRoutes) {
         List<BucketInfo> localBucketInfo = new ArrayList<>();
         List<Routes> clonedVpnExtraRoutes  = new ArrayList<>(vpnExtraRoutes);
         if (clonedVpnExtraRoutes.contains(routes)) {
             localBucketInfo.addAll(getBucketsForLocalNexthop(vpnId, dpnId, vrfEntry, routes));
             clonedVpnExtraRoutes.remove(routes);
         }
-        List<BucketInfo> remoteBucketInfo = new ArrayList<>();
-        remoteBucketInfo.addAll(getBucketsForRemoteNexthop(vpnId, dpnId, vrfEntry, rd, clonedVpnExtraRoutes));
+        List<BucketInfo> remoteBucketInfo =
+            new ArrayList<>(getBucketsForRemoteNexthop(vpnId, dpnId, vrfEntry, rd, clonedVpnExtraRoutes));
         return setupLoadBalancingNextHop(vpnId, dpnId,
             vrfEntry.getDestPrefix(), localBucketInfo, remoteBucketInfo);
     }
@@ -925,7 +931,7 @@ public class NexthopManager implements AutoCloseable {
                     routes.getNexthopIpList());
         }
         List<BucketInfo> listBucketInfo = new CopyOnWriteArrayList<>();
-        routes.getNexthopIpList().parallelStream().forEach(nextHopIp -> {
+        nullToEmpty(routes.getNexthopIpList()).parallelStream().forEach(nextHopIp -> {
             String localNextHopIP;
             if (isIpv4Address(nextHopIp)) {
                 localNextHopIP = nextHopIp + NwConstants.IPV4PREFIX;
@@ -955,7 +961,7 @@ public class NexthopManager implements AutoCloseable {
             List<Routes> vpnExtraRoutes) {
         List<BucketInfo> listBucketInfo = new ArrayList<>();
         Map<String, List<ActionInfo>> egressActionMap = new HashMap<>();
-        vpnExtraRoutes.forEach(vpnExtraRoute -> vpnExtraRoute.getNexthopIpList().forEach(nextHopIp -> {
+        vpnExtraRoutes.forEach(vpnExtraRoute -> nullToEmpty(vpnExtraRoute.getNexthopIpList()).forEach(nextHopIp -> {
             String nextHopPrefixIp;
             if (isIpv4Address(nextHopIp)) {
                 nextHopPrefixIp = nextHopIp + NwConstants.IPV4PREFIX;
@@ -1091,7 +1097,7 @@ public class NexthopManager implements AutoCloseable {
                 LOG.warn("RPC Call to Get egress actions for interface {} returned with Errors {}",
                         interfaceName, rpcResult.getErrors());
             } else {
-                actions = rpcResult.getResult().getAction();
+                actions = nullToEmpty(rpcResult.getResult().getAction());
             }
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Exception when egress actions for interface {}", interfaceName, e);
@@ -1121,7 +1127,7 @@ public class NexthopManager implements AutoCloseable {
                 if (!dpnLbNextHops.isPresent()) {
                     return;
                 }
-                List<String> nextHopKeys = dpnLbNextHops.get().getNexthopKey();
+                List<String> nextHopKeys = nullToEmpty(dpnLbNextHops.get().getNexthopKey());
                 for (String nextHopKey : nextHopKeys) {
                     Optional<Nexthops> optionalNextHops = fibUtil.getNexthops(nextHopKey);
                     if (!optionalNextHops.isPresent()) {
@@ -1161,7 +1167,7 @@ public class NexthopManager implements AutoCloseable {
             if (!dpnLbNextHops.isPresent()) {
                 return;
             }
-            List<String> nextHopKeys = dpnLbNextHops.get().getNexthopKey();
+            List<String> nextHopKeys = nullToEmpty(dpnLbNextHops.get().getNexthopKey());
             for (String nextHopKey : nextHopKeys) {
                 Optional<Nexthops> optionalNextHops = fibUtil.getNexthops(nextHopKey);
                 if (!optionalNextHops.isPresent()) {
index 78f2a98d5c2b4377efa6fdc09a4529136a475425..81b3c29a6945e026fb16c36cf6bc095d329422b3 100755 (executable)
@@ -11,6 +11,7 @@ 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;
@@ -27,9 +28,11 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -496,7 +499,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
         LabelRouteInfoBuilder builder = new LabelRouteInfoBuilder(lri);
         if (!isPresentInList) {
             LOG.debug("vpnName {} is not present in LRI with label {}..", vpnInstanceName, lri.getLabel());
-            List<String> vpnInstanceNames = lri.getVpnInstanceList();
+            List<String> vpnInstanceNames = new ArrayList<>(nullToEmpty(lri.getVpnInstanceList()));
             vpnInstanceNames.add(vpnInstanceName);
             builder.setVpnInstanceList(vpnInstanceNames);
             MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, lriId, builder.build());
@@ -796,7 +799,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                     fibUtil.getVpnInstanceOpData(rd);
                             if (vpnInstanceOpDataEntryOptional.isPresent()) {
                                 String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName();
-                                if (lri.getVpnInstanceList().contains(vpnInstanceName)) {
+                                if (nullToEmpty(lri.getVpnInstanceList()).contains(vpnInstanceName)) {
                                     localNextHopInfo = updateVpnReferencesInLri(lri, vpnInstanceName, true);
                                     localNextHopIP = lri.getPrefix();
                                 } else {
@@ -839,7 +842,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     private BigInteger checkCreateLocalFibEntry(Prefixes localNextHopInfo, String localNextHopIP,
                                                 final Long vpnId, final String rd,
                                                 final VrfEntry vrfEntry,
-                                                Routes routes, List<Routes> vpnExtraRoutes,
+                                                @Nullable Routes routes, @Nullable List<Routes> vpnExtraRoutes,
                                                 int etherType) {
         String vpnName = fibUtil.getVpnNameFromId(vpnId);
         if (localNextHopInfo != null) {
@@ -926,12 +929,10 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     private boolean isVpnPresentInDpn(String rd, BigInteger dpnId)  {
         InstanceIdentifier<VpnToDpnList> id = VpnHelper.getVpnToDpnListIdentifier(rd, dpnId);
         Optional<VpnToDpnList> dpnInVpn = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
-        if (dpnInVpn.isPresent()) {
-            return true;
-        }
-        return false;
+        return dpnInVpn.isPresent();
     }
 
+    @Nullable
     private LabelRouteInfo getLabelRouteInfo(Long label) {
         InstanceIdentifier<LabelRouteInfo> lriIid = InstanceIdentifier.builder(LabelRouteMap.class)
             .child(LabelRouteInfo.class, new LabelRouteInfoKey(label)).build();
@@ -943,7 +944,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     }
 
     private boolean deleteLabelRouteInfo(LabelRouteInfo lri, String vpnInstanceName,
-            TypedWriteTransaction<Operational> tx) {
+            @Nullable TypedWriteTransaction<Operational> tx) {
         if (lri == null) {
             return true;
         }
@@ -1232,7 +1233,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             String usedRd = usedRds.isEmpty() ? primaryRd : usedRds.get(0);
             Routes extraRoute = baseVrfEntryHandler.getVpnToExtraroute(vpnId, usedRd, vrfEntry.getDestPrefix());
             if (extraRoute != null) {
-                for (String nextHopIp : extraRoute.getNexthopIpList()) {
+                for (String nextHopIp : nullToEmpty(extraRoute.getNexthopIpList())) {
                     LOG.debug("NextHop IP for destination {} is {}", vrfEntry.getDestPrefix(), nextHopIp);
                     if (nextHopIp != null) {
                         String ipPrefix;
@@ -1270,7 +1271,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
     }
 
     private void checkCleanUpOpDataForFib(final Prefixes prefixInfo, final Long vpnId, final String rd,
-                                          final VrfEntry vrfEntry, final Routes extraRoute) {
+                                          final VrfEntry vrfEntry, @Nullable final Routes extraRoute) {
 
         if (prefixInfo == null) {
             LOG.error("Cleanup VPN Data Failed as unable to find prefix Info for prefix {} VpnId {} rd {}",
@@ -1318,7 +1319,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                         List<String> nextHopAddressList = FibHelper.getNextHopListFromRoutePaths(vrfEntry);
                         synchronized (label.toString().intern()) {
                             LabelRouteInfo lri = getLabelRouteInfo(label);
-                            if (lri != null && lri.getPrefix().equals(vrfEntry.getDestPrefix())
+                            if (lri != null && Objects.equals(lri.getPrefix(), vrfEntry.getDestPrefix())
                                     && nextHopAddressList.contains(lri.getNextHopIpList().get(0))) {
                                 Optional<VpnInstanceOpDataEntry> vpnInstanceOpDataEntryOptional =
                                         fibUtil.getVpnInstanceOpData(rd);
@@ -1416,8 +1417,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             return;
         }
 
-        if (optAdjacencies.get().getAdjacency().stream().count() <= 2
-                && optAdjacencies.get().getAdjacency().stream().allMatch(adjacency ->
+        if (nullToEmpty(optAdjacencies.get().getAdjacency()).size() <= 2
+                && nullToEmpty(optAdjacencies.get().getAdjacency()).stream().allMatch(adjacency ->
                 adjacency.getAdjacencyType() == Adjacency.AdjacencyType.PrimaryAdjacency
                         && adjacency.isMarkedForDeletion() != null
                         && adjacency.isMarkedForDeletion()
@@ -1537,7 +1538,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                     } else {
                         for (BigInteger localDpnId : localDpnIdList) {
                             for (VpnToDpnList curDpn : vpnToDpnList) {
-                                if (!curDpn.getDpnId().equals(localDpnId)) {
+                                if (!Objects.equals(curDpn.getDpnId(), localDpnId)) {
                                     baseVrfEntryHandler.deleteRemoteRoute(localDpnId, curDpn.getDpnId(),
                                         vpnInstance.getVpnId(), vrfTableKey, vrfEntry, extraRouteOptional,
                                         TransactionAdapter.toWriteTransaction(tx));
@@ -1577,8 +1578,8 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
 
     }
 
-    private void makeLFibTableEntry(BigInteger dpId, long label, List<InstructionInfo> instructions, int priority,
-                                    int addOrRemove, TypedWriteTransaction<Configuration> tx) {
+    private void makeLFibTableEntry(BigInteger dpId, long label, @Nullable List<InstructionInfo> instructions,
+                                    int priority, int addOrRemove, TypedWriteTransaction<Configuration> tx) {
         if (tx == null) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
                 newTx -> makeLFibTableEntry(dpId, label, instructions, priority, addOrRemove, newTx)), LOG,
@@ -1634,7 +1635,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                 }
                 synchronized (vpnInstance.getVpnInstanceName().intern()) {
                     futures.add(retryingTxRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, tx -> {
-                        for (final VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
+                        for (final VrfEntry vrfEntry : nullToEmpty(vrfTable.get().getVrfEntry())) {
                             SubnetRoute subnetRoute = vrfEntry.augmentation(SubnetRoute.class);
                             if (subnetRoute != null) {
                                 long elanTag = subnetRoute.getElantag();
@@ -1659,7 +1660,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                     List<String> nextHopList = FibHelper.getNextHopListFromRoutePaths(vrfEntry);
                                     LabelRouteInfo lri = getLabelRouteInfo(optionalLabel.get());
                                     if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopList, lri)) {
-                                        if (lri.getDpnId().equals(dpnId)) {
+                                        if (Objects.equals(lri.getDpnId(), dpnId)) {
                                             try {
                                                 int etherType = NWUtil.getEtherTypeFromIpPrefix(
                                                         vrfEntry.getDestPrefix());
@@ -1710,7 +1711,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             jobCoordinator.enqueueJob(FibUtil.getJobKeyForVpnIdDpnId(vpnId, dpnId),
                 () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
                     synchronized (vpnInstance.getVpnInstanceName().intern()) {
-                        vrfTable.get().getVrfEntry().stream()
+                        nullToEmpty(vrfTable.get().getVrfEntry()).stream()
                             .filter(vrfEntry -> RouteOrigin.BGP == RouteOrigin.value(vrfEntry.getOrigin()))
                             .forEach(bgpRouteVrfEntryHandler.getConsumerForCreatingRemoteFib(dpnId, vpnId,
                                 rd, remoteNextHopIp, vrfTable, TransactionAdapter.toWriteTransaction(tx), txnObjects));
@@ -1795,7 +1796,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                     synchronized (vpnInstance.getVpnInstanceName().intern()) {
                         futures.add(retryingTxRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
                             String vpnName = fibUtil.getVpnNameFromId(vpnInstance.getVpnId());
-                            for (final VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) {
+                            for (final VrfEntry vrfEntry : nullToEmpty(vrfTable.get().getVrfEntry())) {
                                 /* 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().
@@ -1844,7 +1845,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                         List<String> nextHopList = FibHelper.getNextHopListFromRoutePaths(vrfEntry);
                                         LabelRouteInfo lri = getLabelRouteInfo(optionalLabel.get());
                                         if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopList,
-                                                lri) && lri.getDpnId().equals(dpnId)) {
+                                                lri) && Objects.equals(lri.getDpnId(), dpnId)) {
                                             deleteLocalFibEntry(vpnId, rd, vrfEntry);
                                         }
                                     }
@@ -1911,7 +1912,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                     synchronized (vpnInstance.getVpnInstanceName().intern()) {
                         return Collections.singletonList(
                             txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
-                                tx -> vrfTable.get().getVrfEntry().stream()
+                                tx -> nullToEmpty(vrfTable.get().getVrfEntry()).stream()
                                     .filter(vrfEntry -> RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.BGP)
                                     .forEach(bgpRouteVrfEntryHandler.getConsumerForDeletingRemoteFib(dpnId, vpnId,
                                         remoteNextHopIp, vrfTable, TransactionAdapter.toWriteTransaction(tx),
@@ -1937,6 +1938,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                 + tableMiss + FLOWID_PREFIX;
     }
 
+    @Nullable
     private VrfEntry getVrfEntry(DataBroker broker, String rd, String ipPrefix) {
         InstanceIdentifier<VrfEntry> vrfEntryId = InstanceIdentifier.builder(FibEntries.class)
             .child(VrfTables.class, new VrfTablesKey(rd))
@@ -1999,7 +2001,7 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
 
     private boolean isPrefixAndNextHopPresentInLri(String prefix,
             List<String> nextHopAddressList, LabelRouteInfo lri) {
-        return lri != null && lri.getPrefix().equals(prefix)
+        return lri != null && Objects.equals(lri.getPrefix(), prefix)
                 && nextHopAddressList.contains(lri.getNextHopIpList().get(0));
     }
 
index efb27a2bcf28709a046d5c5ad2be7c98a3745f66..17c993e642a0112470a56edca8dfd3a25ac1a679 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.netvirt.fibmanager.shell;
 
 import java.util.Locale;
+import javax.annotation.Nullable;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
@@ -31,6 +32,7 @@ public class ConfTransportL3VPNCommand extends OsgiCommandSupport {
     }
 
     @Override
+    @Nullable
     protected Object doExecute() {
 
         if (service == null || service.isEmpty() || !"L3VPN".equalsIgnoreCase(service)) {
index 5bc67c29eb94072af3c80b26b6cccbafdea5a7d3..87b02946af274cbb246b0bc689de43240264369e 100644 (file)
@@ -15,6 +15,7 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.List;
 import java.util.Locale;
+import javax.annotation.Nullable;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
@@ -68,6 +69,7 @@ public class ShowFibCommand extends OsgiCommandSupport {
     }
 
     @Override
+    @Nullable
     protected Object doExecute() {
         PrintStream console = session.getConsole();
         if (prefixOrSubnetOption != null && prefixOrSubnetOption.length() > 0) {
@@ -188,7 +190,7 @@ public class ShowFibCommand extends OsgiCommandSupport {
     }
 
     private void printVrfTable(VrfTables vrfTable, PrintStream console, boolean isIpv4, boolean isIpv6,
-            boolean isL2vpn, String inputPrefixOrSubnet) {
+            boolean isL2vpn, @Nullable String inputPrefixOrSubnet) {
 
         List<VrfEntry> vrfEntries = vrfTable.getVrfEntry();
         if (vrfEntries == null) {
@@ -238,6 +240,7 @@ public class ShowFibCommand extends OsgiCommandSupport {
         }
     }
 
+    @Nullable
     private Object usage(PrintStream console) {
         String nl = System.getProperty("line.separator");
         console.println("===================================================");
index f704363af46a41a424a5cbdc1413812e8800bff8..52d0b28ed486fd2e0a74a3be7f518289bd57476c 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.netvirt.fibmanager.shell;
 
+import javax.annotation.Nullable;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
@@ -20,6 +21,7 @@ public class ShowTransportTypeCommand extends OsgiCommandSupport {
     }
 
     @Override
+    @Nullable
     protected Object doExecute() {
         String displayFormat = "%-16s %-16s";
         String cacheVal = fibManager.getReqTransType();