Handle nullable lists in natservice 19/77019/4
authorStephen Kitt <skitt@redhat.com>
Mon, 15 Oct 2018 15:46:55 +0000 (17:46 +0200)
committerSam Hague <shague@redhat.com>
Wed, 17 Oct 2018 13:42:02 +0000 (13:42 +0000)
Following YANGTOOLS-585, lists can be null (which is correctly
indicated with an @Nullable annotation). This patch deals with the
fallout.

Change-Id: I7724304822d4088e9c8a149cbbddae071a88ce1f
Signed-off-by: Stephen Kitt <skitt@redhat.com>
26 files changed:
natservice/api/src/main/java/org/opendaylight/netvirt/natservice/api/SnatServiceManager.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/cli/DisplayNaptSwithcesCli.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/WeightedCentralizedSwitchScheduler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworkGroupInstaller.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalNetworksChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FloatingIPListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTEntryEvent.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NAPTSwitchSelector.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptEventHandler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptManager.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatEvpnUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatInterfaceStateChangeListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatSouthboundEventHandlers.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/RouterToVpnListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SNATDefaultRouteProgrammer.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/UpgradeStateListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/rpcservice/NatRpcServiceImpl.java

index ef8b8a4b43e173b6a37a7968c7cbf1a7281d1a78..8df218294c82c38c25acacef1b6ee24402808b26 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.netvirt.natservice.api;
 import java.math.BigInteger;
 
 import java.util.concurrent.ExecutionException;
+import javax.annotation.Nullable;
 import org.opendaylight.genius.infra.Datastore.Configuration;
 import org.opendaylight.genius.infra.TypedReadWriteTransaction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
@@ -31,8 +32,8 @@ public interface SnatServiceManager {
 
     void removeNatServiceListener(SnatServiceListener aclServiceListner);
 
-    void notify(TypedReadWriteTransaction<Configuration> confTx,
-        Routers router, Routers oldRouter, BigInteger primarySwitchId, BigInteger dpnId, Action action)
+    void notify(TypedReadWriteTransaction<Configuration> confTx, Routers router, @Nullable Routers oldRouter,
+        BigInteger primarySwitchId, @Nullable BigInteger dpnId, Action action)
         throws ExecutionException, InterruptedException;
 
 }
index ee6eb228b9ae49abe21190241588aa08667bf7ba..c7c4af00c07f075f8e78590dfcc47881d7eb9b9d 100644 (file)
@@ -11,7 +11,9 @@ package org.opendaylight.netvirt.natservice.cli;
 import com.google.common.base.Optional;
 import java.io.PrintStream;
 import java.math.BigInteger;
+import java.util.Collections;
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -40,13 +42,15 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
     }
 
     @Override
-    protected Object doExecute() throws Exception {
+    @Nullable
+    protected Object doExecute() {
         PrintStream ps = session.getConsole();
         Optional<NaptSwitches> npatSwitches = NatUtil.getAllPrimaryNaptSwitches(dataBroker);
         ps.printf(String.format(" %-36s  %-20s  %-20s %n", "Router Id ", "Datapath Node Id", "Managment Ip Address"));
         ps.printf("-------------------------------------------------------------------------------------------%n");
         if (npatSwitches.isPresent()) {
-            for (RouterToNaptSwitch routerToNaptSwitch : npatSwitches.get().getRouterToNaptSwitch()) {
+            for (RouterToNaptSwitch routerToNaptSwitch : NatUtil.requireNonNullElse(
+                    npatSwitches.get().getRouterToNaptSwitch(), Collections.<RouterToNaptSwitch>emptyList())) {
                 ps.printf(String.format(" %-36s  %-20s  %-20s %n", routerToNaptSwitch.getRouterName(),
                      routerToNaptSwitch.getPrimarySwitchId(), getDpnLocalIp(routerToNaptSwitch.getPrimarySwitchId())));
             }
@@ -73,10 +77,12 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
                 LogicalDatastoreType.OPERATIONAL, nodeId);
     }
 
+    @Nullable
     private String getDpnLocalIp(BigInteger dpId) {
         return getPortsNode(dpId).toJavaUtil().map(node -> getOpenvswitchOtherConfig(node, LOCAL_IP)).orElse(null);
     }
 
+    @Nullable
     private String getOpenvswitchOtherConfig(Node node, String key) {
         OvsdbNodeAugmentation ovsdbNode = node.augmentation(OvsdbNodeAugmentation.class);
         if (ovsdbNode == null) {
@@ -88,7 +94,7 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
 
         if (ovsdbNode != null && ovsdbNode.getOpenvswitchOtherConfigs() != null) {
             for (OpenvswitchOtherConfigs openvswitchOtherConfigs : ovsdbNode.getOpenvswitchOtherConfigs()) {
-                if (openvswitchOtherConfigs.getOtherConfigKey().equals(key)) {
+                if (key.equals(openvswitchOtherConfigs.getOtherConfigKey())) {
                     return openvswitchOtherConfigs.getOtherConfigValue();
                 }
             }
@@ -110,7 +116,8 @@ public class DisplayNaptSwithcesCli extends OsgiCommandSupport {
 
     }
 
-    private OvsdbBridgeAugmentation extractBridgeAugmentation(Node node) {
+    @Nullable
+    private OvsdbBridgeAugmentation extractBridgeAugmentation(@Nullable Node node) {
         if (node == null) {
             return null;
         }
index dce1357832b52e3c6fe648f1299711bf65f612f7..3c0c2888b79dc7649601aa1a7285bbe5c35f63cc 100644 (file)
@@ -23,6 +23,7 @@ import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -356,6 +357,7 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
                 new SubnetmapKey(subnetId)).build();
     }
 
+    @Nullable
     public BigInteger getCentralizedSwitch(String routerName) {
         try {
             Optional<RouterToNaptSwitch> naptSwitches = SingleTransactionDataBroker
@@ -381,9 +383,8 @@ public class WeightedCentralizedSwitchScheduler implements CentralizedSwitchSche
         return false;
     }
 
-    public static List<Uuid> getUpdatedSubnetIds(
-            List<Uuid> updatedSubnetIds,
-            List<Uuid> currentSubnetIds) {
+    @Nullable
+    public static List<Uuid> getUpdatedSubnetIds(List<Uuid> updatedSubnetIds, List<Uuid> currentSubnetIds) {
         if (updatedSubnetIds == null) {
             return null;
         }
index 9d53b33cd673aa2ef8a9c67e25e3764f146ce590..e22adf220e2471c12dbe1fb24087516ff11f12be 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import java.math.BigInteger;
 import java.time.Duration;
@@ -17,6 +18,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
@@ -61,7 +63,6 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfacesBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
@@ -291,7 +292,8 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         addDefaultFibRouteForSNAT(confTx, dpnId, routerId);
         int elanId = NatUtil.getElanInstanceByName(routers.getNetworkId().getValue(), getDataBroker())
                 .getElanTag().intValue();
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -309,7 +311,8 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         String routerName = routers.getRouterName();
         Long routerId = NatUtil.getVpnId(dataBroker, routerName);
         removeDefaultFibRouteForSNAT(confTx, dpnId, routerId);
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -325,7 +328,8 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         String routerName = routers.getRouterName();
         Long routerId = NatUtil.getVpnId(dataBroker, routerName);
         String externalGwMac = routers.getExtGwMacAddress();
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -342,7 +346,8 @@ public abstract class AbstractSnatService implements SnatServiceListener {
             Routers routers, BigInteger dpnId) throws ExecutionException, InterruptedException {
         String routerName = routers.getRouterName();
         Long routerId = NatUtil.getVpnId(confTx, routerName);
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -419,7 +424,7 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         String nextHopIp = NatUtil.getEndpointIpAddressForDPN(dataBroker, dpnId);
         String ipPrefix = externalIp + "/32";
         NatUtil.addPrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, subNetId),
-                null, ipPrefix, externalNetId, new Uuid(subNetId), dpnId, Prefixes.PrefixCue.Nat);
+                null, ipPrefix, externalNetId, dpnId, Prefixes.PrefixCue.Nat);
 
         fibManager.addOrUpdateFibEntry(rd, routerMac, ipPrefix,
                 Collections.singletonList(nextHopIp), VrfEntry.EncapType.Mplsgre, extSubnetId,
@@ -635,6 +640,7 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         return "snatmiss." + routerName;
     }
 
+    @Nullable
     protected String getTunnelInterfaceName(BigInteger srcDpId, BigInteger dstDpId) {
         Class<? extends TunnelTypeBase> tunType = TunnelTypeVxlan.class;
         RpcResult<GetTunnelInterfaceNameOutput> rpcResult;
@@ -672,7 +678,8 @@ public abstract class AbstractSnatService implements SnatServiceListener {
     protected void removeMipAdjacencies(Routers routers) {
         LOG.info("removeMipAdjacencies for router {}", routers.getRouterName());
         String externalSubNetId  = null;
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -691,11 +698,13 @@ public abstract class AbstractSnatService implements SnatServiceListener {
             VpnInterfaces vpnInterfaces = SingleTransactionDataBroker.syncRead(dataBroker,
                     LogicalDatastoreType.CONFIGURATION, vpnInterfacesId);
             List<VpnInterface> updatedVpnInterface = new ArrayList<>();
-            for (VpnInterface vpnInterface : vpnInterfaces.getVpnInterface()) {
+            for (VpnInterface vpnInterface : requireNonNullElse(vpnInterfaces.getVpnInterface(),
+                    Collections.<VpnInterface>emptyList())) {
                 List<Adjacency> updatedAdjacencies = new ArrayList<>();
                 Adjacencies adjacencies = vpnInterface.augmentation(Adjacencies.class);
                 if (null != adjacencies) {
-                    for (Adjacency adjacency : adjacencies.getAdjacency()) {
+                    for (Adjacency adjacency : requireNonNullElse(adjacencies.getAdjacency(),
+                            Collections.<Adjacency>emptyList())) {
                         if (!adjacency.getSubnetId().getValue().equals(externalSubNetId)) {
                             updatedAdjacencies.add(adjacency);
                         }
@@ -729,13 +738,15 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         }
         LearntVpnVipToPortDataBuilder learntVpnVipToPortDataBuilder = new LearntVpnVipToPortDataBuilder();
         List<LearntVpnVipToPort> learntVpnVipToPortList = new ArrayList<>();
-        for (LearntVpnVipToPort learntVpnVipToPort : learntVpnVipToPortData.getLearntVpnVipToPort()) {
-            if (!learntVpnVipToPort.getVpnName().equals(networkId)) {
+        for (LearntVpnVipToPort learntVpnVipToPort : requireNonNullElse(learntVpnVipToPortData.getLearntVpnVipToPort(),
+                Collections.<LearntVpnVipToPort>emptyList())) {
+            if (!networkId.equals(learntVpnVipToPort.getVpnName())) {
                 LOG.info("The learned port belongs to Vpn {} hence not removing", learntVpnVipToPort.getVpnName());
                 learntVpnVipToPortList.add(learntVpnVipToPort);
             } else {
                 String externalSubNetId = null;
-                for (ExternalIps externalIp : routers.getExternalIps()) {
+                for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                        Collections.<ExternalIps>emptyList())) {
                     if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                         // In this class we handle only IPv4 use-cases.
                         continue;
index 0c933f6ece224f200c98f5bef47ea695ee0710a1..077604eb886c7eec8722f62b0e1cb8deda46a1d7 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
+
 import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -95,7 +98,8 @@ public abstract class ConntrackBasedSnatService extends AbstractSnatService {
 
         String extGwMacAddress = NatUtil.getExtGwMacAddFromRouterName(confTx, routerName);
         addOutboundTblTrackEntry(confTx, dpnId, routerId, extGwMacAddress);
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
@@ -138,7 +142,8 @@ public abstract class ConntrackBasedSnatService extends AbstractSnatService {
         removeSnatMissEntryForPrimrySwch(confTx, dpnId, routerId);
 
         removeOutboundTblTrackEntry(confTx, dpnId, routerId);
-        for (ExternalIps externalIp : routers.getExternalIps()) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             if (!NWUtil.isIpv4Address(externalIp.getIpAddress())) {
                 // In this class we handle only IPv4 use-cases.
                 continue;
index de5bab6bcad85a4411527c7127eab8752a9f6ab5..970df56eb75fd09e0b4f8a50a11554c4ec15c9de 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.netvirt.natservice.internal;
 import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
@@ -227,7 +228,8 @@ public class EvpnDnatFlowProgrammer {
                         LogicalDatastoreType.CONFIGURATION, vpnIfIdentifier);
         if (optionalVpnInterface.isPresent()) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
-                for (VpnInstanceNames vpnInstance : optionalVpnInterface.get().getVpnInstanceNames()) {
+                for (VpnInstanceNames vpnInstance : requireNonNullElse(optionalVpnInterface.get().getVpnInstanceNames(),
+                        Collections.<VpnInstanceNames>emptyList())) {
                     if (!vpnName.equals(vpnInstance.getVpnName())) {
                         continue;
                     }
@@ -236,7 +238,8 @@ public class EvpnDnatFlowProgrammer {
                     VpnInterfaceOpDataEntryBuilder vpnIfOpDataEntryBuilder = new VpnInterfaceOpDataEntryBuilder();
                     vpnIfOpDataEntryBuilder.withKey(new VpnInterfaceOpDataEntryKey(interfaceName, vpnName));
 
-                    List<Adjacency> adjacencyList = adjs != null ? adjs.getAdjacency() : new ArrayList<>();
+                    List<Adjacency> adjacencyList =
+                        adjs != null && adjs.getAdjacency() != null ? adjs.getAdjacency() : new ArrayList<>();
                     List<Adjacency> adjacencyListToImport = new ArrayList<>();
                     for (Adjacency adj : adjacencyList) {
                         Subnetmap sn = VpnHelper.getSubnetmapFromItsUuid(dataBroker, adj.getSubnetId());
@@ -345,7 +348,8 @@ public class EvpnDnatFlowProgrammer {
                         LogicalDatastoreType.CONFIGURATION, vpnIfIdentifier);
         if (optionalVpnInterface.isPresent()) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(OPERATIONAL, tx -> {
-                for (VpnInstanceNames vpnInstance : optionalVpnInterface.get().getVpnInstanceNames()) {
+                for (VpnInstanceNames vpnInstance : requireNonNullElse(optionalVpnInterface.get().getVpnInstanceNames(),
+                        Collections.<VpnInstanceNames>emptyList())) {
                     if (!vpnName.equals(vpnInstance.getVpnName())) {
                         continue;
                     }
index 5e333910274840a28cea9c1cb18b9a8cf53c4030..0c8881e9d7565925cb02d7e8b8b9130ff1558ef4 100644 (file)
@@ -16,6 +16,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -177,9 +178,7 @@ public class ExternalNetworkGroupInstaller {
 
         coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + subnetName + extInterface, () -> {
             GroupEntity groupEntity = buildExtNetGroupEntity(macAddress, subnetName, groupId, extInterface, dpnId);
-            if (groupEntity != null) {
-                mdsalManager.syncInstallGroup(groupEntity);
-            }
+            mdsalManager.syncInstallGroup(groupEntity);
             return Collections.emptyList();
         });
     }
@@ -248,6 +247,7 @@ public class ExternalNetworkGroupInstaller {
         return MDSALUtil.buildGroupEntity(dpnId, groupId, subnetName, GroupTypes.GroupAll, listBucketInfo);
     }
 
+    @Nullable
     private GroupEntity buildEmptyExtNetGroupEntity(String subnetName, long groupId, String extInterface) {
         BigInteger dpId = NatUtil.getDpnForInterface(odlInterfaceRpcService, extInterface);
         if (BigInteger.ZERO.equals(dpId)) {
index c8ccbc536768e494d1e0209306eaa36dc1800991..71f1aeb460768d2915cb48a8dace9df1fff0450c 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import java.math.BigInteger;
@@ -98,7 +99,8 @@ public class ExternalNetworksChangeListener
 
     @Override
     protected void remove(InstanceIdentifier<Networks> identifier, Networks networks) {
-        if (identifier == null || networks == null || networks.getRouterIds().isEmpty()) {
+        if (identifier == null || networks == null || networks.getRouterIds() == null
+                || networks.getRouterIds().isEmpty()) {
             LOG.warn("remove : returning without processing since networks/identifier is null: "
                 + "identifier: {}, networks: {}", identifier, networks);
             return;
@@ -133,9 +135,8 @@ public class ExternalNetworksChangeListener
     }
 
     private void removeSnatEntries(Networks original, Uuid networkUuid) {
-        List<Uuid> routerUuids = original.getRouterIds();
-        for (Uuid routerUuid : routerUuids) {
-            Long routerId = NatUtil.getVpnId(dataBroker, routerUuid.getValue());
+        for (Uuid routerUuid : requireNonNullElse(original.getRouterIds(), Collections.<Uuid>emptyList())) {
+            long routerId = NatUtil.getVpnId(dataBroker, routerUuid.getValue());
             if (routerId == NatConstants.INVALID_ID) {
                 LOG.error("removeSnatEntries : Invalid routerId returned for routerName {}", routerUuid.getValue());
                 return;
@@ -144,16 +145,15 @@ public class ExternalNetworksChangeListener
             if (natMode == NatMode.Controller) {
                 coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + routerUuid.getValue(),
                     () -> Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-                        tx -> {
-                            externalRouterListener.handleDisableSnatInternetVpn(routerUuid.getValue(), routerId,
-                                networkUuid, externalIps, original.getVpnid().getValue(), tx);
-                        })), NatConstants.NAT_DJC_MAX_RETRIES);
+                        tx -> externalRouterListener.handleDisableSnatInternetVpn(routerUuid.getValue(), routerId,
+                            networkUuid, externalIps, original.getVpnid().getValue(), tx))),
+                    NatConstants.NAT_DJC_MAX_RETRIES);
             }
         }
     }
 
     private void associateExternalNetworkWithVPN(Networks network) {
-        List<Uuid> routerIds = network.getRouterIds();
+        List<Uuid> routerIds = requireNonNullElse(network.getRouterIds(), Collections.emptyList());
         for (Uuid routerId : routerIds) {
             //long router = NatUtil.getVpnId(dataBroker, routerId.getValue());
 
@@ -166,8 +166,7 @@ public class ExternalNetworksChangeListener
                 continue;
             }
             RouterPorts routerPorts = optRouterPorts.get();
-            List<Ports> interfaces = routerPorts.getPorts();
-            for (Ports port : interfaces) {
+            for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
                 String portName = port.getPortName();
                 BigInteger dpnId = NatUtil.getDpnForInterface(interfaceManager, portName);
                 if (dpnId.equals(BigInteger.ZERO)) {
@@ -175,15 +174,13 @@ public class ExternalNetworksChangeListener
                             + "skip handling of ext nw {} association", portName, network.getId());
                     continue;
                 }
-                List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-                for (InternalToExternalPortMap ipMap : intExtPortMapList) {
+                for (InternalToExternalPortMap ipMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                        Collections.<InternalToExternalPortMap>emptyList())) {
                     // remove all VPN related entries
                     coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + ipMap.key(),
                         () -> Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-                            tx -> {
-                                floatingIpListener.createNATFlowEntries(dpnId, portName, routerId.getValue(),
-                                    network.getId(), ipMap, tx);
-                            })), NatConstants.NAT_DJC_MAX_RETRIES);
+                            tx -> floatingIpListener.createNATFlowEntries(dpnId, portName, routerId.getValue(),
+                                network.getId(), ipMap, tx))), NatConstants.NAT_DJC_MAX_RETRIES);
                 }
             }
         }
@@ -235,8 +232,8 @@ public class ExternalNetworksChangeListener
                             .intext.ip.map.IpMapping> ipMapping = MDSALUtil.read(dataBroker,
                                     LogicalDatastoreType.OPERATIONAL, id);
                         if (ipMapping.isPresent()) {
-                            List<IpMap> ipMaps = ipMapping.get().getIpMap();
-                            for (IpMap ipMap : ipMaps) {
+                            for (IpMap ipMap : requireNonNullElse(ipMapping.get().getIpMap(),
+                                    Collections.<IpMap>emptyList())) {
                                 String externalIp = ipMap.getExternalIp();
                                 LOG.debug("associateExternalNetworkWithVPN : Calling advToBgpAndInstallFibAndTsFlows "
                                     + "for dpnId {},vpnName {} and externalIp {}", finalDpnId, vpnName, externalIp);
@@ -268,9 +265,7 @@ public class ExternalNetworksChangeListener
     }
 
     private void disassociateExternalNetworkFromVPN(Networks network, String vpnName) {
-        List<Uuid> routerIds = network.getRouterIds();
-
-        for (Uuid routerId : routerIds) {
+        for (Uuid routerId : requireNonNullElse(network.getRouterIds(), Collections.<Uuid>emptyList())) {
             InstanceIdentifier<RouterPorts> routerPortsId = NatUtil.getRouterPortsId(routerId.getValue());
             Optional<RouterPorts> optRouterPorts = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
                 routerPortsId);
@@ -280,8 +275,7 @@ public class ExternalNetworksChangeListener
                 continue;
             }
             RouterPorts routerPorts = optRouterPorts.get();
-            List<Ports> interfaces = routerPorts.getPorts();
-            for (Ports port : interfaces) {
+            for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
                 String portName = port.getPortName();
                 BigInteger dpnId = NatUtil.getDpnForInterface(interfaceManager, portName);
                 if (dpnId.equals(BigInteger.ZERO)) {
@@ -289,14 +283,12 @@ public class ExternalNetworksChangeListener
                             + "skip handling of ext nw {} disassociation", portName, network.getId());
                     continue;
                 }
-                List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-                for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+                for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                        Collections.<InternalToExternalPortMap>emptyList())) {
                     coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + intExtPortMap.key(),
                         () -> Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
-                            tx -> {
-                                floatingIpListener.removeNATFlowEntries(dpnId, portName, vpnName, routerId.getValue(),
-                                    intExtPortMap, tx);
-                            })), NatConstants.NAT_DJC_MAX_RETRIES);
+                            tx -> floatingIpListener.removeNATFlowEntries(dpnId, portName, vpnName, routerId.getValue(),
+                                intExtPortMap, tx))), NatConstants.NAT_DJC_MAX_RETRIES);
                 }
             }
         }
index 3766704f2683cf55fcc7d3f9d9354f647968a786..74b659c86739eb721717358db3e7e1b01766d80d 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.FutureCallback;
@@ -410,13 +411,12 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
 
     protected void subnetRegisterMapping(Routers routerEntry, Long segmentId) {
         LOG.debug("subnetRegisterMapping : Fetching values from extRouters model");
-        List<Uuid> subnetList = routerEntry.getSubnetIds();
         List<String> externalIps = NatUtil.getIpsListFromExternalIps(routerEntry.getExternalIps());
         int counter = 0;
         int extIpCounter = externalIps.size();
         LOG.debug("subnetRegisterMapping : counter values before looping counter {} and extIpCounter {}",
                 counter, extIpCounter);
-        for (Uuid subnet : subnetList) {
+        for (Uuid subnet : requireNonNullElse(routerEntry.getSubnetIds(), Collections.<Uuid>emptyList())) {
             LOG.debug("subnetRegisterMapping : Looping internal subnets for subnet {}", subnet);
             InstanceIdentifier<Subnetmap> subnetmapId = InstanceIdentifier
                 .builder(Subnetmaps.class)
@@ -715,6 +715,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         mdsalManager.addFlow(confTx, icmpDropFlow);
     }
 
+    @Nullable
     protected String getTunnelInterfaceName(BigInteger srcDpId, BigInteger dstDpId) {
         Class<? extends TunnelTypeBase> tunType = TunnelTypeVxlan.class;
         RpcResult<GetTunnelInterfaceNameOutput> rpcResult;
@@ -975,11 +976,11 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         if (networkId != null) {
             Uuid vpnUuid = NatUtil.getVpnIdfromNetworkId(dataBroker, networkId);
             if (vpnUuid != null) {
-                Long vpnId = NatUtil.getVpnId(dataBroker, vpnUuid.getValue());
+                long vpnId = NatUtil.getVpnId(dataBroker, vpnUuid.getValue());
                 coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + networkId, () -> {
                     installNaptPfibEntriesForExternalSubnets(routerName, dpnId, null);
                     //Install the NAPT PFIB TABLE which forwards outgoing packet to FIB Table matching on the VPN ID.
-                    if (vpnId != null && vpnId != NatConstants.INVALID_ID) {
+                    if (vpnId != NatConstants.INVALID_ID) {
                         installNaptPfibEntry(dpnId, vpnId, null);
                     }
                     return Collections.emptyList();
@@ -1001,7 +1002,8 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         return listBucketInfo;
     }
 
-    public void installNaptPfibEntry(BigInteger dpnId, long segmentId, TypedWriteTransaction<Configuration> confTx) {
+    public void installNaptPfibEntry(BigInteger dpnId, long segmentId,
+            @Nullable TypedWriteTransaction<Configuration> confTx) {
         LOG.debug("installNaptPfibEntry : called for dpnId {} and segmentId {} ", dpnId, segmentId);
         FlowEntity naptPfibFlowEntity = buildNaptPfibFlowEntity(dpnId, segmentId);
         if (confTx != null) {
@@ -1055,7 +1057,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
 
     public void advToBgpAndInstallFibAndTsFlows(final BigInteger dpnId, final short tableId, final String vpnName,
                                                 final long routerId, final String routerName, final String externalIp,
-                                                final Uuid extNetworkId, final Routers router,
+                                                final Uuid extNetworkId, @Nullable final Routers router,
                                                 final TypedWriteTransaction<Configuration> confTx) {
         LOG.debug("advToBgpAndInstallFibAndTsFlows : entry for DPN ID {}, tableId {}, vpnname {} "
                 + "and externalIp {}", dpnId, tableId, vpnName, externalIp);
@@ -1090,33 +1092,28 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                 int externalIpInDsFlag = 0;
                 //Get IPMaps from the DB for the router ID
                 List<IpMap> dbIpMaps = NaptManager.getIpMapList(dataBroker, routerId);
-                if (dbIpMaps != null) {
-                    for (IpMap dbIpMap : dbIpMaps) {
-                        String dbExternalIp = dbIpMap.getExternalIp();
-                        //Select the IPMap, whose external IP is the IP for which FIB is installed
-                        if (dbExternalIp.contains(externalIp)) {
-                            String dbInternalIp = dbIpMap.getInternalIp();
-                            IpMapKey dbIpMapKey = dbIpMap.key();
-                            LOG.debug("advToBgpAndInstallFibAndTsFlows : Setting label {} for internalIp {} "
-                                    + "and externalIp {}", label, dbInternalIp, externalIp);
-                            IpMap newIpm = new IpMapBuilder().withKey(dbIpMapKey).setInternalIp(dbInternalIp)
-                                .setExternalIp(dbExternalIp).setLabel(label).build();
-                            MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
-                                naptManager.getIpMapIdentifier(routerId, dbInternalIp), newIpm);
-                            externalIpInDsFlag++;
-                        }
-                    }
-                    if (externalIpInDsFlag <= 0) {
-                        LOG.debug("advToBgpAndInstallFibAndTsFlows : External Ip {} not found in DS, "
-                                + "Failed to update label {} for routerId {} in DS",
-                                externalIp, label, routerId);
-                        String errMsg = String.format("Failed to update label %s due to external Ip %s not"
-                            + " found in DS for router %s", label, externalIp, routerId);
-                        return Futures.immediateFailedFuture(new Exception(errMsg));
+                for (IpMap dbIpMap : dbIpMaps) {
+                    String dbExternalIp = dbIpMap.getExternalIp();
+                    //Select the IPMap, whose external IP is the IP for which FIB is installed
+                    if (dbExternalIp.contains(externalIp)) {
+                        String dbInternalIp = dbIpMap.getInternalIp();
+                        IpMapKey dbIpMapKey = dbIpMap.key();
+                        LOG.debug("advToBgpAndInstallFibAndTsFlows : Setting label {} for internalIp {} "
+                                + "and externalIp {}", label, dbInternalIp, externalIp);
+                        IpMap newIpm = new IpMapBuilder().withKey(dbIpMapKey).setInternalIp(dbInternalIp)
+                            .setExternalIp(dbExternalIp).setLabel(label).build();
+                        MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                            naptManager.getIpMapIdentifier(routerId, dbInternalIp), newIpm);
+                        externalIpInDsFlag++;
                     }
-                } else {
-                    LOG.error("advToBgpAndInstallFibAndTsFlows : Failed to write label {} for externalIp {} for"
-                            + " routerId {} in DS", label, externalIp, routerId);
+                }
+                if (externalIpInDsFlag <= 0) {
+                    LOG.debug("advToBgpAndInstallFibAndTsFlows : External Ip {} not found in DS, "
+                            + "Failed to update label {} for routerId {} in DS",
+                            externalIp, label, routerId);
+                    String errMsg = String.format("Failed to update label %s due to external Ip %s not"
+                        + " found in DS for router %s", label, externalIp, routerId);
+                    return Futures.immediateFailedFuture(new Exception(errMsg));
                 }
                 //Inform BGP
                 long l3vni = 0;
@@ -1125,9 +1122,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                 }
                 Routers extRouter = router != null ? router :
                     NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
-                Uuid externalSubnetId = NatUtil.getExternalSubnetForRouterExternalIp(externalIp,
-                        extRouter);
-                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd, externalSubnetId,
+                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd,
                     externalIp, nextHopIp, extRouter.getNetworkId().getValue(), null, label, l3vni,
                     RouteOrigin.STATIC, dpnId);
 
@@ -1146,12 +1141,9 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                     NatUtil.makePreDnatToSnatTableEntry(mdsalManager, dpnId, NwConstants.INBOUND_NAPT_TABLE, confTx);
                 }
                 String fibExternalIp = NatUtil.validateAndAddNetworkMask(externalIp);
-                Optional<Subnets> externalSubnet = NatUtil.getOptionalExternalSubnets(dataBroker,
-                        externalSubnetId);
-                String externalVpn = vpnName;
-                if (externalSubnet.isPresent()) {
-                    externalVpn =  externalSubnetId.getValue();
-                }
+                Uuid externalSubnetId = NatUtil.getExternalSubnetForRouterExternalIp(externalIp, extRouter);
+                Optional<Subnets> externalSubnet = NatUtil.getOptionalExternalSubnets(dataBroker, externalSubnetId);
+                String externalVpn = externalSubnet.isPresent() ? externalSubnetId.getValue() : vpnName;
                 CreateFibEntryInput input = new CreateFibEntryInputBuilder()
                     .setVpnName(externalVpn)
                     .setSourceDpid(dpnId).setIpAddress(fibExternalIp).setServiceId(label)
@@ -1429,12 +1421,12 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                             Optional<IpPortMapping> ipPortMapping =
                                     MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, ipPortMappingId);
                             if (ipPortMapping.isPresent()) {
-                                List<IntextIpProtocolType> intextIpProtocolTypes = ipPortMapping.get()
-                                        .getIntextIpProtocolType();
-                                for (IntextIpProtocolType intextIpProtocolType : intextIpProtocolTypes) {
+                                for (IntextIpProtocolType intextIpProtocolType : requireNonNullElse(
+                                        ipPortMapping.get().getIntextIpProtocolType(),
+                                        Collections.<IntextIpProtocolType>emptyList())) {
                                     ProtocolTypes protoType = intextIpProtocolType.getProtocol();
-                                    List<IpPortMap> ipPortMaps = intextIpProtocolType.getIpPortMap();
-                                    for (IpPortMap ipPortMap : ipPortMaps) {
+                                    for (IpPortMap ipPortMap : requireNonNullElse(intextIpProtocolType.getIpPortMap(),
+                                            Collections.<IpPortMap>emptyList())) {
                                         IpPortExternal ipPortExternal = ipPortMap.getIpPortExternal();
                                         if (ipPortExternal.getIpAddress().equals(externalIp)) {
                                             externalPorts.add(ipPortExternal.getPortNum());
@@ -1530,8 +1522,11 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                     LOG.debug("update : Checking if this is update on subnets");
                     List<Uuid> originalSubnetIds = original.getSubnetIds();
                     List<Uuid> updatedSubnetIds = update.getSubnetIds();
-                    Set<Uuid> addedSubnetIds = new HashSet<>(updatedSubnetIds);
-                    addedSubnetIds.removeAll(originalSubnetIds);
+                    Set<Uuid> addedSubnetIds =
+                        updatedSubnetIds != null ? new HashSet<>(updatedSubnetIds) : new HashSet<>();
+                    if (originalSubnetIds != null) {
+                        addedSubnetIds.removeAll(originalSubnetIds);
+                    }
 
                     //Check if the Subnet IDs are added during the update.
                     if (addedSubnetIds.size() != 0) {
@@ -1611,9 +1606,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if (externalCountersData.isPresent()) {
             ExternalIpsCounter externalIpsCounters = externalCountersData.get();
-            List<ExternalCounters> externalCounters = externalIpsCounters.getExternalCounters();
-            for (ExternalCounters ext : externalCounters) {
-                for (ExternalIpCounter externalIpCount : ext.getExternalIpCounter()) {
+            for (ExternalCounters ext : requireNonNullElse(externalIpsCounters.getExternalCounters(),
+                    Collections.<ExternalCounters>emptyList())) {
+                for (ExternalIpCounter externalIpCount : requireNonNullElse(ext.getExternalIpCounter(),
+                        Collections.<ExternalIpCounter>emptyList())) {
                     if (externalIpCount.getExternalIp().equals(externalIp)) {
                         if (externalIpCount.getCounter() != 0) {
                             return true;
@@ -1694,6 +1690,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         }
     }
 
+    @Nullable
     protected Long checkExternalIpLabel(long routerId, String externalIp) {
         List<IpMap> ipMaps = naptManager.getIpMapList(dataBroker, routerId);
         for (IpMap ipMap : ipMaps) {
@@ -1769,7 +1766,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
     }
 
     public void handleDisableSnat(Routers router, Uuid networkUuid, @Nonnull Collection<String> externalIps,
-                                  boolean routerFlag, String vpnName, BigInteger naptSwitchDpnId,
+                                  boolean routerFlag, @Nullable String vpnName, BigInteger naptSwitchDpnId,
                                   long routerId, TypedReadWriteTransaction<Configuration> removeFlowInvTx) {
         LOG.info("handleDisableSnat : Entry");
         String routerName = router.getRouterName();
@@ -2026,10 +2023,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             return;
         }
 
-        List<IntextIpProtocolType> intextIpProtocolTypes = ipPortMapping.getIntextIpProtocolType();
-        for (IntextIpProtocolType intextIpProtocolType : intextIpProtocolTypes) {
-            List<IpPortMap> ipPortMaps = intextIpProtocolType.getIpPortMap();
-            for (IpPortMap ipPortMap : ipPortMaps) {
+        for (IntextIpProtocolType intextIpProtocolType : requireNonNullElse(ipPortMapping.getIntextIpProtocolType(),
+                Collections.<IntextIpProtocolType>emptyList())) {
+            for (IpPortMap ipPortMap : requireNonNullElse(intextIpProtocolType.getIpPortMap(),
+                    Collections.<IpPortMap>emptyList())) {
                 String ipPortInternal = ipPortMap.getIpPortInternal();
                 String[] ipPortParts = ipPortInternal.split(":");
                 if (ipPortParts.length != 2) {
@@ -2142,10 +2139,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                 LOG.error("removeNaptFlowsFromActiveSwitchInternetVpn : Unable to retrieve the IpPortMapping");
                 return;
             }
-            List<IntextIpProtocolType> intextIpProtocolTypes = ipPortMapping.getIntextIpProtocolType();
-            for (IntextIpProtocolType intextIpProtocolType : intextIpProtocolTypes) {
-                List<IpPortMap> ipPortMaps = intextIpProtocolType.getIpPortMap();
-                for (IpPortMap ipPortMap : ipPortMaps) {
+            for (IntextIpProtocolType intextIpProtocolType : requireNonNullElse(ipPortMapping.getIntextIpProtocolType(),
+                    Collections.<IntextIpProtocolType>emptyList())) {
+                for (IpPortMap ipPortMap : requireNonNullElse(intextIpProtocolType.getIpPortMap(),
+                        Collections.<IpPortMap>emptyList())) {
                     String ipPortInternal = ipPortMap.getIpPortInternal();
                     String[] ipPortParts = ipPortInternal.split(":");
                     if (ipPortParts.length != 2) {
@@ -2233,8 +2230,8 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         }
     }
 
-    public void clrRtsFromBgpAndDelFibTs(final BigInteger dpnId, Long routerId, Uuid networkUuid,
-                                         @Nonnull Collection<String> externalIps, String vpnName,
+    public void clrRtsFromBgpAndDelFibTs(final BigInteger dpnId, Long routerId, @Nullable Uuid networkUuid,
+                                         @Nonnull Collection<String> externalIps, @Nullable String vpnName,
                                          String extGwMacAddress, TypedReadWriteTransaction<Configuration> confTx)
             throws ExecutionException, InterruptedException {
         //Withdraw the corresponding routes from the BGP.
@@ -2469,9 +2466,8 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
     }
 
     protected void clearFibTsAndReverseTraffic(final BigInteger dpnId, Long routerId, Uuid networkUuid,
-                                               List<String> externalIps, String vpnName, String extGwMacAddress,
-                                               TypedReadWriteTransaction<Configuration> writeFlowInvTx)
-            throws ExecutionException, InterruptedException {
+            List<String> externalIps, @Nullable String vpnName, String extGwMacAddress,
+            TypedReadWriteTransaction<Configuration> writeFlowInvTx) throws ExecutionException, InterruptedException {
         //Withdraw the corresponding routes from the BGP.
         //Get the network ID using the router ID.
         LOG.debug("clearFibTsAndReverseTraffic : for externalIps {} with routerId {},"
@@ -2695,10 +2691,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                     routerId);
             return;
         }
-        List<IntextIpProtocolType> intextIpProtocolTypes = ipPortMapping.getIntextIpProtocolType();
-        for (IntextIpProtocolType intextIpProtocolType : intextIpProtocolTypes) {
-            List<IpPortMap> ipPortMaps = intextIpProtocolType.getIpPortMap();
-            for (IpPortMap ipPortMap : ipPortMaps) {
+        for (IntextIpProtocolType intextIpProtocolType : requireNonNullElse(ipPortMapping.getIntextIpProtocolType(),
+                Collections.<IntextIpProtocolType>emptyList())) {
+            for (IpPortMap ipPortMap : requireNonNullElse(intextIpProtocolType.getIpPortMap(),
+                    Collections.<IpPortMap>emptyList())) {
                 String ipPortInternal = ipPortMap.getIpPortInternal();
                 String[] ipPortParts = ipPortInternal.split(":");
                 if (ipPortParts.length != 2) {
@@ -2897,7 +2893,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
     }
 
     protected void installNaptPfibEntriesForExternalSubnets(String routerName, BigInteger dpnId,
-                                                            TypedWriteTransaction<Configuration> writeFlowInvTx) {
+                                                        @Nullable TypedWriteTransaction<Configuration> writeFlowInvTx) {
         Collection<Uuid> externalSubnetIdsForRouter = NatUtil.getExternalSubnetIdsForRouter(dataBroker,
                 routerName);
         for (Uuid externalSubnetId : externalSubnetIdsForRouter) {
index f9e0ec2a40c2a77fc0962616b23e4d9d57d65cb8..7ff3f2fc7d82f9b273b413efad67b835d9f062af 100644 (file)
@@ -17,6 +17,7 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
+import javax.annotation.Nullable;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -138,6 +139,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
                 update.key(), original, update);
     }
 
+    @Nullable
     private FlowEntity buildPreDNATFlowEntity(BigInteger dpId, InternalToExternalPortMap mapping, long routerId, long
             associatedVpn) {
         String externalIp = mapping.getExternalIp();
@@ -250,6 +252,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
         return flowEntity;
     }
 
+    @Nullable
     private FlowEntity buildSNATFlowEntity(BigInteger dpId, InternalToExternalPortMap mapping, long vpnId, Uuid
             externalNetworkId) {
         String internalIp = mapping.getInternalIp();
@@ -341,6 +344,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
         }
     }
 
+    @Nullable
     private Uuid getExtNetworkId(final InstanceIdentifier<RouterPorts> portIid,
                                  LogicalDatastoreType dataStoreType) {
         Optional<RouterPorts> rtrPort =
@@ -351,8 +355,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
             return null;
         }
 
-        Uuid extNwId = rtrPort.get().getExternalNetworkId();
-        return extNwId;
+        return rtrPort.get().getExternalNetworkId();
     }
 
     private long getVpnId(Uuid extNwId, Uuid floatingIpExternalId) {
@@ -463,7 +466,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
     }
 
     void createNATFlowEntries(String interfaceName, final InternalToExternalPortMap mapping,
-                              final InstanceIdentifier<RouterPorts> portIid, final String routerName, BigInteger dpnId,
+            final InstanceIdentifier<RouterPorts> portIid, final String routerName, @Nullable BigInteger dpnId,
             TypedReadWriteTransaction<Configuration> confTx) throws ExecutionException, InterruptedException {
         if (!validateIpMapping(mapping)) {
             LOG.error("createNATFlowEntries : Not a valid ip addresses in the mapping {}", mapping);
@@ -560,7 +563,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
                 confTx);
     }
 
-    void createNATOnlyFlowEntries(BigInteger dpnId, String routerName, String associatedVPN,
+    void createNATOnlyFlowEntries(BigInteger dpnId, String routerName, @Nullable String associatedVPN,
                                   Uuid externalNetworkId, InternalToExternalPortMap mapping)
             throws ExecutionException, InterruptedException {
         String internalIp = mapping.getInternalIp();
@@ -604,9 +607,8 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
     }
 
     void removeNATFlowEntries(String interfaceName, final InternalToExternalPortMap mapping,
-                              InstanceIdentifier<RouterPorts> portIid, final String routerName, BigInteger dpnId,
-                              TypedReadWriteTransaction<Configuration> removeFlowInvTx)
-            throws ExecutionException, InterruptedException {
+            InstanceIdentifier<RouterPorts> portIid, final String routerName, @Nullable BigInteger dpnId,
+            TypedReadWriteTransaction<Configuration> removeFlowInvTx) throws ExecutionException, InterruptedException {
         Uuid extNwId = getExtNetworkId(portIid, LogicalDatastoreType.OPERATIONAL);
         if (extNwId == null) {
             LOG.error("removeNATFlowEntries : External network associated with interface {} could not be retrieved",
@@ -819,7 +821,7 @@ public class FloatingIPListener extends AsyncDataTreeChangeListenerBase<Internal
     }
 
     private void addOrDelDefaultFibRouteForDnat(BigInteger dpnId, String routerName, long routerId,
-            TypedReadWriteTransaction<Configuration> confTx, boolean create)
+            @Nullable TypedReadWriteTransaction<Configuration> confTx, boolean create)
             throws ExecutionException, InterruptedException {
         if (confTx == null) {
             ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
index d1c54f358b97eb97dff31e68ef2a7a8e6de357d0..63dde2a28411791ab55f5bd8404bf835a5b0405b 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.netvirt.natservice.internal;
 
+import javax.annotation.Nullable;
 import org.opendaylight.netvirt.natservice.internal.NaptPacketInHandler.NatPacketProcessingState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
 
@@ -23,7 +24,7 @@ public class NAPTEntryEvent {
     private final NatPacketProcessingState state;
 
     NAPTEntryEvent(String ipAddress, int portNumber, Long routerId, Operation op, Protocol protocol,
-            PacketReceived packetReceived, boolean pktProcessed, NatPacketProcessingState state) {
+            @Nullable PacketReceived packetReceived, boolean pktProcessed, @Nullable NatPacketProcessingState state) {
         this.ipAddress = ipAddress;
         this.portNumber = portNumber;
         this.routerId = routerId;
index 7067a1b4ec795b8d2abbf325ebc863f342a92d31..af98e5edd0e640cf6d721a23fac5a434316dfad9 100644 (file)
@@ -7,8 +7,11 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
+
 import com.google.common.base.Optional;
 import java.math.BigInteger;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -89,9 +92,9 @@ public class NAPTSwitchSelector {
 
         if (optNaptSwitches.isPresent()) {
             NaptSwitches naptSwitches = optNaptSwitches.get();
-            List<RouterToNaptSwitch> routerToNaptSwitches = naptSwitches.getRouterToNaptSwitch();
 
-            for (RouterToNaptSwitch naptSwitch : routerToNaptSwitches) {
+            for (RouterToNaptSwitch naptSwitch : requireNonNullElse(naptSwitches.getRouterToNaptSwitch(),
+                    Collections.<RouterToNaptSwitch>emptyList())) {
                 BigInteger primarySwitch = naptSwitch.getPrimarySwitchId();
                 //update weight
                 Integer weight = switchWeights.get(primarySwitch);
index 3b0636247a06dba1fe4af815bfac7cf824f7d03d..1ac8cbde462615637e787e201ef820a5c4d87b1e 100644 (file)
@@ -18,6 +18,7 @@ import java.math.BigInteger;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
@@ -521,6 +522,7 @@ public class NaptEventHandler {
         return new FlowRef(flowInstanceId);
     }
 
+    @Nullable
     private static List<MatchInfo> buildAndGetMatchInfo(String ip, int port, short tableId,
                                                         NAPTEntryEvent.Protocol protocol, long segmentId) {
         MatchInfo ipMatchInfo = null;
@@ -572,6 +574,7 @@ public class NaptEventHandler {
         return matchInfo;
     }
 
+    @Nonnull
     private static List<InstructionInfo> buildAndGetSetActionInstructionInfo(String ipAddress, int port,
                                                                              long segmentId, long vpnId,
                                                                              short tableId,
@@ -611,7 +614,7 @@ public class NaptEventHandler {
             default:
                 LOG.error("buildAndGetSetActionInstructionInfo : Neither OUTBOUND_NAPT_TABLE nor "
                         + "INBOUND_NAPT_TABLE matches with input table id {}", tableId);
-                return null;
+                return Collections.emptyList();
         }
 
         listActionInfo.add(ipActionInfo);
@@ -645,6 +648,7 @@ public class NaptEventHandler {
                 + "for SNAT ({}:{}) session:{}ms", tableId, dpnId, ip, port, System.currentTimeMillis() - startTime);
     }
 
+    @Nullable
     @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
     protected byte[] buildNaptPacketOut(Ethernet etherPkt) {
         LOG.debug("removeNatFlows : About to build Napt Packet Out");
index f49b2fc258d09378987ea71924e80a5b2e27df49..ba494e5c164b57915ca95d2f280b7d3d448ca096 100644 (file)
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
+
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import java.util.ArrayList;
 import java.util.Arrays;
 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.apache.commons.net.util.SubnetUtils;
@@ -221,6 +225,7 @@ public class NaptManager {
      */
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
+    @Nullable
     public SessionAddress getExternalAddressMapping(long segmentId, SessionAddress sourceAddress,
                                                     NAPTEntryEvent.Protocol protocol) {
         LOG.debug("getExternalAddressMapping : called with segmentId {}, internalIp {} and port {}",
@@ -527,6 +532,7 @@ public class NaptManager {
             .child(IpPortMap.class, new IpPortMapKey(internal)).build();
     }
 
+    @Nullable
     private SessionAddress checkIpPortMap(long segmentId, String internalIpPort,
             NAPTEntryEvent.Protocol protocol) {
         LOG.debug("checkIpPortMap : called with segmentId {} and internalIpPort {}",
@@ -555,6 +561,7 @@ public class NaptManager {
         return null;
     }
 
+    @Nullable
     protected String checkIpMap(long segmentId, String internalIp) {
         LOG.debug("checkIpMap : called with segmentId {} and internalIp {}", segmentId, internalIp);
         String externalIp;
@@ -564,9 +571,8 @@ public class NaptManager {
         InstanceIdentifier<IpMapping> id = idBuilder.build();
         Optional<IpMapping> ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if (ipMapping.isPresent()) {
-            List<IpMap> ipMaps = ipMapping.get().getIpMap();
-            for (IpMap ipMap : ipMaps) {
-                if (ipMap.getInternalIp().equals(internalIp)) {
+            for (IpMap ipMap : requireNonNullElse(ipMapping.get().getIpMap(), Collections.<IpMap>emptyList())) {
+                if (Objects.equals(ipMap.getInternalIp(), internalIp)) {
                     LOG.debug("checkIpMap : IpMap : {}", ipMap);
                     externalIp = ipMap.getExternalIp();
                     LOG.debug("checkIpMap : successfully returning externalIp {}", externalIp);
@@ -681,6 +687,7 @@ public class NaptManager {
         MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
     }
 
+    @Nullable
     protected String getExternalIpAllocatedForSubnet(long segmentId, String internalIp) {
         InstanceIdentifierBuilder<IpMap> idBuilder = InstanceIdentifier.builder(IntextIpMap.class)
             .child(IpMapping.class, new IpMappingKey(segmentId))
@@ -699,12 +706,10 @@ public class NaptManager {
             .child(IpMapping.class, new IpMappingKey(segmentId));
         InstanceIdentifier<IpMapping> id = idBuilder.build();
         // Get all externalIps and decrement their counters before deleting the ipmap
-        String externalIp = null;
         Optional<IpMapping> ipMapping = MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if (ipMapping.isPresent()) {
-            List<IpMap> ipMaps = ipMapping.get().getIpMap();
-            for (IpMap ipMap : ipMaps) {
-                externalIp = ipMap.getExternalIp();
+            for (IpMap ipMap : requireNonNullElse(ipMapping.get().getIpMap(), Collections.<IpMap>emptyList())) {
+                String externalIp = ipMap.getExternalIp();
                 LOG.debug("removeIpMappingForRouterID : externalIP is {}", externalIp);
                 if (externalIp != null) {
                     updateCounter(segmentId, externalIp, false);
@@ -760,10 +765,10 @@ public class NaptManager {
 
     protected void initialiseExternalCounter(Routers routers, long routerId) {
         LOG.debug("initialiseExternalCounter : Initialise External IPs counter");
-        List<ExternalIps> externalIps = routers.getExternalIps();
 
         //update the new counter value for this externalIp
-        for (ExternalIps externalIp : externalIps) {
+        for (ExternalIps externalIp : requireNonNullElse(routers.getExternalIps(),
+                Collections.<ExternalIps>emptyList())) {
             String[] ipSplit = externalIp.getIpAddress().split("/");
             String extIp = ipSplit[0];
             String extPrefix = Short.toString(NatConstants.DEFAULT_PREFIX);
index e7db4423be620ea615788ca43c1ca9e0646d0c27..eef02ba2a02f45db99ff7089eb08e87f74d84808 100644 (file)
@@ -19,6 +19,7 @@ import java.util.Set;
 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;
@@ -137,7 +138,7 @@ public class NaptSwitchHA {
     }
 
     protected void removeSnatFlowsInOldNaptSwitch(String routerName, Long routerId, BigInteger naptSwitch,
-                                                  Map<String, Long> externalIpmap,
+                                                  @Nullable Map<String, Long> externalIpmap,
                                                   TypedReadWriteTransaction<Configuration> confTx)
             throws ExecutionException, InterruptedException {
 
@@ -508,6 +509,7 @@ public class NaptSwitchHA {
         return true;
     }
 
+    @Nullable
     private String getExtNetworkVpnName(String routerName, Uuid networkId) {
         if (networkId == null) {
             LOG.error("getExtNetworkVpnName : networkId is null for the router ID {}", routerName);
@@ -737,6 +739,7 @@ public class NaptSwitchHA {
         LOG.debug("modifySnatGroupEntry : modified SnatMissEntry for dpnId {} of router {}", dpnId, routerName);
     }
 
+    @Nullable
     protected String getTunnelInterfaceName(BigInteger srcDpId, BigInteger dstDpId) {
         Class<? extends TunnelTypeBase> tunType = TunnelTypeVxlan.class;
         RpcResult<GetTunnelInterfaceNameOutput> rpcResult;
index e5e236f6815f99b6fe733b570102893df839b01d..40ba8fdca57550893b9928cee4dead257261cb29 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
+import javax.annotation.Nullable;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.SingleTransactionDataBroker;
@@ -167,7 +168,7 @@ public final class NatEvpnUtil {
                                                  String prefix,
                                                  String nextHopIp,
                                                  long l3Vni,
-                                                 String interfaceName,
+                                                 @Nullable String interfaceName,
                                                  String gwMacAddress,
                                                  TypedWriteTransaction<Configuration> writeTx,
                                                  RouteOrigin origin, BigInteger dpId,
@@ -181,7 +182,7 @@ public final class NatEvpnUtil {
                 return;
             }
             NatUtil.addPrefixToInterface(broker, NatUtil.getVpnId(broker, vpnName), interfaceName, prefix,
-                    networkId.getValue(), null, dpId, Prefixes.PrefixCue.Nat);
+                    networkId.getValue(), dpId, Prefixes.PrefixCue.Nat);
 
             fibManager.addOrUpdateFibEntry(rd, null /*macAddress*/, prefix,
                     Collections.singletonList(nextHopIp), VrfEntry.EncapType.Vxlan, NatConstants.DEFAULT_LABEL_VALUE,
@@ -243,6 +244,7 @@ public final class NatEvpnUtil {
                 .FLOWID_SEPARATOR + l3Vni;
     }
 
+    @Nullable
     public static Uuid getFloatingIpInterfaceIdFromFloatingIpId(DataBroker broker, Uuid floatingIpId) {
         InstanceIdentifier<FloatingIpIdToPortMapping> id =
                 NatUtil.buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
index 49567a129cac74c5dccc4a6426a3ee284bf720a2..7fbcf0354478fc91f1b59bb7caedd8f1966f0e91 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
+
 import com.google.common.base.Optional;
 import java.math.BigInteger;
 
+import java.util.Collections;
 import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -116,7 +119,8 @@ public class NatInterfaceStateChangeListener
                 LOG.warn("remove : Interface {} is not a VPN Interface, ignoring.", interfaceName);
                 return;
             }
-            for (VpnInstanceNames vpnInterfaceVpnInstance : cfgVpnInterface.get().getVpnInstanceNames()) {
+            for (VpnInstanceNames vpnInterfaceVpnInstance : requireNonNullElse(
+                    cfgVpnInterface.get().getVpnInstanceNames(), Collections.<VpnInstanceNames>emptyList())) {
                 String vpnName  = vpnInterfaceVpnInstance.getVpnName();
                 InstanceIdentifier<VpnInterfaceOpDataEntry> idOper = NatUtil
                       .getVpnInterfaceOpDataEntryIdentifier(interfaceName, vpnName);
@@ -129,7 +133,7 @@ public class NatInterfaceStateChangeListener
                 }
             }
         }
-        if (intfDpnId.equals(BigInteger.ZERO)) {
+        if (BigInteger.ZERO.equals(intfDpnId)) {
             LOG.warn("remove : Could not retrieve dpnid for interface {} ", interfaceName);
             return;
         }
@@ -164,7 +168,8 @@ public class NatInterfaceStateChangeListener
                 LOG.warn("update : Interface {} is not a VPN Interface, ignoring.", interfaceName);
                 return;
             }
-            for (VpnInstanceNames vpnInterfaceVpnInstance : cfgVpnInterface.get().getVpnInstanceNames()) {
+            for (VpnInstanceNames vpnInterfaceVpnInstance : requireNonNullElse(
+                    cfgVpnInterface.get().getVpnInstanceNames(), Collections.<VpnInstanceNames>emptyList())) {
                 String vpnName  = vpnInterfaceVpnInstance.getVpnName();
                 InstanceIdentifier<VpnInterfaceOpDataEntry> idOper = NatUtil
                       .getVpnInterfaceOpDataEntryIdentifier(interfaceName, vpnName);
@@ -177,7 +182,7 @@ public class NatInterfaceStateChangeListener
                 }
             }
         }
-        if (intfDpnId.equals(BigInteger.ZERO)) {
+        if (BigInteger.ZERO.equals(intfDpnId)) {
             LOG.warn("remove : Could not retrieve dpnid for interface {} ", interfaceName);
             return;
         }
index caa14eb5d0061e0c1e515dbd790f302e91903dde..9e8a22bfb2cf94b837a4ac457e9fba18b24ad68d 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 import static org.opendaylight.genius.infra.Datastore.OPERATIONAL;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.HashBasedTable;
@@ -18,11 +19,14 @@ import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Callable;
 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;
 
@@ -112,7 +116,7 @@ public class NatSouthboundEventHandlers {
     }
 
     public void handleAdd(String interfaceName, BigInteger intfDpnId,
-                          RouterInterface routerInterface, VipState vipState) {
+                          RouterInterface routerInterface, @Nullable VipState vipState) {
         String routerName = routerInterface.getRouterName();
         NatInterfaceStateAddWorker natIfaceStateAddWorker = new NatInterfaceStateAddWorker(interfaceName,
                 intfDpnId, routerName);
@@ -286,7 +290,7 @@ public class NatSouthboundEventHandlers {
     private void processInterfaceAdded(String portName, String routerId, BigInteger dpnId, VipState vipState) {
         LOG.trace("processInterfaceAdded : Processing Interface Add Event for interface {}", portName);
         List<InternalToExternalPortMap> intExtPortMapList = getIntExtPortMapListForPortName(portName, routerId);
-        if (intExtPortMapList == null || intExtPortMapList.isEmpty()) {
+        if (intExtPortMapList.isEmpty()) {
             LOG.debug("processInterfaceAdded : Ip Mapping list is empty/null for portname {}", portName);
             return;
         }
@@ -304,6 +308,7 @@ public class NatSouthboundEventHandlers {
         }, MoreExecutors.directExecutor());
     }
 
+    @Nonnull
     private List<InternalToExternalPortMap> getIntExtPortMapListForPortName(String portName, String routerId) {
         InstanceIdentifier<Ports> portToIpMapIdentifier = NatUtil.buildPortToIpMapIdentifier(routerId, portName);
         Optional<Ports> port =
@@ -312,11 +317,12 @@ public class NatSouthboundEventHandlers {
         if (!port.isPresent()) {
             LOG.info("getIntExtPortMapListForPortName : Unable to read router port entry for router ID {} "
                     + "and port name {}", routerId, portName);
-            return null;
+            return Collections.emptyList();
         }
-        return port.get().getInternalToExternalPortMap();
+        return requireNonNullElse(port.get().getInternalToExternalPortMap(), Collections.emptyList());
     }
 
+    @Nullable
     private BigInteger getNaptSwitchforRouter(DataBroker broker, String routerName) {
         InstanceIdentifier<RouterToNaptSwitch> rtrNaptSw = InstanceIdentifier.builder(NaptSwitches.class)
             .child(RouterToNaptSwitch.class, new RouterToNaptSwitchKey(routerName)).build();
@@ -340,6 +346,7 @@ public class NatSouthboundEventHandlers {
             + "router {} ip {} port {}", tableId, dpnId, routerId, ipAddress, ipPort);
     }
 
+    @Nullable
     private List<String> getFixedIpsForPort(String interfname) {
         LOG.debug("getFixedIpsForPort : getFixedIpsForPort method is called for interface {}", interfname);
         try {
@@ -365,7 +372,7 @@ public class NatSouthboundEventHandlers {
         LOG.trace("processInterfaceRemoved : Processing Interface Removed Event for interface {} on DPN ID {}",
                 portName, dpnId);
         List<InternalToExternalPortMap> intExtPortMapList = getIntExtPortMapListForPortName(portName, routerId);
-        if (intExtPortMapList == null || intExtPortMapList.isEmpty()) {
+        if (intExtPortMapList.isEmpty()) {
             LOG.debug("processInterfaceRemoved : Ip Mapping list is empty/null for portName {}", portName);
             return;
         }
@@ -415,9 +422,10 @@ public class NatSouthboundEventHandlers {
                 continue;
             }
 
-            for (IntIpProtoType protoType: ipPort.getIntIpProtoType()) {
+            for (IntIpProtoType protoType : requireNonNullElse(ipPort.getIntIpProtoType(),
+                    Collections.<IntIpProtoType>emptyList())) {
                 ProtocolTypes protocol = protoType.getProtocol();
-                for (Integer portnum : protoType.getPorts()) {
+                for (Integer portnum : requireNonNullElse(protoType.getPorts(), Collections.<Integer>emptyList())) {
                     //build and remove the flow in outbound table
                     try {
                         removeNatFlow(naptSwitch, NwConstants.OUTBOUND_NAPT_TABLE, routerId, internalIp, portnum);
index 455ecdd0ebeec481c3fa14e1f7e03158b356f10c..12a245a7d4a59d25bce7d1c74ebd233ebbe7d553 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
@@ -19,6 +20,7 @@ import com.google.common.util.concurrent.MoreExecutors;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
@@ -443,7 +445,6 @@ public class NatTunnelInterfaceStateListener
         } catch (Exception e) {
                 /* this dpn does not have the VTEP */
             LOG.error("handleTepDelForAllRtrs : DPN {} does not have the VTEP", srcDpnId);
-            endpointIpForDPN = null;
         }
 
         if (endpointIpForDPN != null) {
@@ -663,7 +664,7 @@ public class NatTunnelInterfaceStateListener
         } else {
             LOG.debug("hndlTepAddOnNaptSwitch : SNAT -> Private BGP VPN associated to router {}", routerId);
             vpnId = NatUtil.getVpnId(dataBroker, vpnName.getValue());
-            if (vpnId == null || vpnId == NatConstants.INVALID_ID) {
+            if (vpnId == NatConstants.INVALID_ID) {
                 LOG.error("hndlTepAddOnNaptSwitch : Invalid vpnId returned for routerName {}", routerName);
                 return false;
             }
@@ -752,9 +753,8 @@ public class NatTunnelInterfaceStateListener
                 if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
                     l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, l3vni).longValue();
                 }
-                Uuid externalSubnetId = NatUtil.getExternalSubnetForRouterExternalIp(externalIp, router);
-                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd, externalSubnetId,
-                        fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
+                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, externalVpnName, rd,
+                    fibExternalIp, nextHopIp, networkId.getValue(), null /* mac-address */, label, l3vni,
                         RouteOrigin.STATIC, srcDpnId);
                 serviceId = label;
             }
@@ -854,8 +854,7 @@ public class NatTunnelInterfaceStateListener
                 l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
             }
         }
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
             //Get the DPN on which this interface resides
             final String interfaceName = port.getPortName();
             final BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
@@ -870,8 +869,8 @@ public class NatTunnelInterfaceStateListener
                     tepAddedDpnId, fipCfgdDpnId, interfaceName);
                 continue;
             }
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 final String internalIp = intExtPortMap.getInternalIp();
                 final String externalIp = intExtPortMap.getExternalIp();
                 LOG.debug("hndlTepAddForDnatInEachRtr : DNAT -> Advertising the FIB route to the floating IP {} "
@@ -899,8 +898,8 @@ public class NatTunnelInterfaceStateListener
                     if (NatUtil.isOpenStackVniSemanticsEnforcedForGreAndVxlan(elanManager, extNwProvType)) {
                         l3vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, l3vni).longValue();
                     }
-                    NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd, null,
-                            fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
+                    NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd,
+                        fibExternalIp, nextHopIp, null, null, label, l3vni, RouteOrigin.STATIC,
                             fipCfgdDpnId);
                     serviceId = label;
                 }
@@ -1082,8 +1081,7 @@ public class NatTunnelInterfaceStateListener
                 l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
             }
         }
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(routerPorts.getPorts(), Collections.<Ports>emptyList())) {
             //Get the DPN on which this interface resides
             String interfaceName = port.getPortName();
             BigInteger fipCfgdDpnId = NatUtil.getDpnForInterface(interfaceService, interfaceName);
@@ -1098,8 +1096,8 @@ public class NatTunnelInterfaceStateListener
                     tepDeletedDpnId, fipCfgdDpnId, interfaceName);
                 continue;
             }
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 String internalIp = intExtPortMap.getInternalIp();
                 String externalIp = intExtPortMap.getExternalIp();
                 externalIp = NatUtil.validateAndAddNetworkMask(externalIp);
index b527cfef0da72499993bd827b3a792a5cddd61c0..bfd3a2cb5b15959095694f954a22fdec08cccdbf 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.netvirt.natservice.internal;
 
+import static java.util.Objects.requireNonNull;
 import static org.opendaylight.controller.md.sal.binding.api.WriteTransaction.CREATE_MISSING_PARENTS;
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
 
@@ -289,7 +290,7 @@ public final class NatUtil {
     /*
         getVpnId() returns the VPN ID from the VPN name
      */
-    public static long getVpnId(DataBroker broker, String vpnName) {
+    public static long getVpnId(DataBroker broker, @Nullable String vpnName) {
         if (vpnName == null) {
             return NatConstants.INVALID_ID;
         }
@@ -376,6 +377,7 @@ public final class NatUtil {
                     .instance.to.vpn.id.VpnInstanceKey(vpnName)).build();
     }
 
+    @Nullable
     static String getVpnInstanceFromVpnIdentifier(DataBroker broker, long vpnId) {
         InstanceIdentifier<VpnIds> id = InstanceIdentifier.builder(VpnIdToVpnInstance.class)
             .child(VpnIds.class, new VpnIdsKey(vpnId)).build();
@@ -402,6 +404,7 @@ public final class NatUtil {
                 + port;
     }
 
+    @Nullable
     static Uuid getNetworkIdFromRouterId(DataBroker broker, long routerId) {
         String routerName = getRouterName(broker, routerId);
         if (routerName == null) {
@@ -411,6 +414,7 @@ public final class NatUtil {
         return getNetworkIdFromRouterName(broker, routerName);
     }
 
+    @Nullable
     static Uuid getNetworkIdFromRouterName(DataBroker broker, String routerName) {
         if (routerName == null) {
             LOG.error("getNetworkIdFromRouterName - empty routerName received");
@@ -446,6 +450,7 @@ public final class NatUtil {
                 LogicalDatastoreType.CONFIGURATION, id).toJavaUtil().map(Routers::isEnableSnat).orElse(false);
     }
 
+    @Nullable
     public static Uuid getVpnIdfromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -462,6 +467,7 @@ public final class NatUtil {
         }
     }
 
+    @Nullable
     public static ProviderTypes getProviderTypefromNetworkId(DataBroker broker, Uuid networkId) {
         InstanceIdentifier<Networks> id = buildNetworkIdentifier(networkId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -487,6 +493,7 @@ public final class NatUtil {
                 Collections.emptyList());
     }
 
+    @Nullable
     static String getAssociatedExternalNetwork(DataBroker dataBroker, String routerId) {
         InstanceIdentifier<Routers> id = NatUtil.buildRouterIdentifier(routerId);
         Optional<Routers> routerData =
@@ -507,6 +514,7 @@ public final class NatUtil {
             .child(Networks.class, new NetworksKey(networkId)).build();
     }
 
+    @Nullable
     public static BigInteger getPrimaryNaptfromRouterId(DataBroker broker, Long routerId) {
         // convert routerId to Name
         String routerName = getRouterName(broker, routerId);
@@ -517,6 +525,7 @@ public final class NatUtil {
         return getPrimaryNaptfromRouterName(broker, routerName);
     }
 
+    @Nullable
     public static BigInteger getPrimaryNaptfromRouterName(DataBroker broker, String routerName) {
         if (routerName == null) {
             LOG.error("getPrimaryNaptfromRouterName - empty routerName received");
@@ -529,9 +538,8 @@ public final class NatUtil {
     }
 
     public static InstanceIdentifier<RouterToNaptSwitch> buildNaptSwitchIdentifier(String routerId) {
-        InstanceIdentifier<RouterToNaptSwitch> rtrNaptSw = InstanceIdentifier.builder(NaptSwitches.class)
-            .child(RouterToNaptSwitch.class, new RouterToNaptSwitchKey(routerId)).build();
-        return rtrNaptSw;
+        return InstanceIdentifier.builder(NaptSwitches.class).child(RouterToNaptSwitch.class,
+            new RouterToNaptSwitchKey(routerId)).build();
     }
 
     public static Optional<NaptSwitches> getAllPrimaryNaptSwitches(DataBroker broker) {
@@ -539,6 +547,7 @@ public final class NatUtil {
                 LogicalDatastoreType.CONFIGURATION, getNaptSwitchesIdentifier());
     }
 
+    @Nullable
     public static String getRouterName(DataBroker broker, Long routerId) {
         return getVpnInstanceFromVpnIdentifier(broker, routerId);
     }
@@ -570,6 +579,7 @@ public final class NatUtil {
             + ((rawIpAddress[2] & 0xFF) << 1 * 8) + (rawIpAddress[3] & 0xFF) & 0xffffffffL;
     }
 
+    @Nullable
     public static String getEndpointIpAddressForDPN(DataBroker broker, BigInteger dpnId) {
         String nextHopIp = null;
         InstanceIdentifier<DPNTEPsInfo> tunnelInfoId =
@@ -587,8 +597,8 @@ public final class NatUtil {
         return nextHopIp;
     }
 
+    @Nullable
     public static String getVpnRd(DataBroker broker, String vpnName) {
-
         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
             .instance.to.vpn.id.VpnInstance> id = getVpnInstanceToVpnIdIdentifier(vpnName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -597,6 +607,7 @@ public final class NatUtil {
                         .VpnInstance::getVrfId).orElse(null);
     }
 
+    @Nullable
     public static String getVpnRd(TypedReadTransaction<Configuration> tx, String vpnName) {
         try {
             return tx.read(getVpnInstanceToVpnIdIdentifier(vpnName)).get().toJavaUtil().map(
@@ -608,6 +619,7 @@ public final class NatUtil {
         }
     }
 
+    @Nullable
     public static IpPortExternal getExternalIpPortMap(DataBroker broker, Long routerId, String internalIpAddress,
                                                       String internalPort, NAPTEntryEvent.Protocol protocol) {
         ProtocolTypes protocolType = NatUtil.getProtocolType(protocol);
@@ -632,12 +644,14 @@ public final class NatUtil {
             .child(VpnInterface.class, new VpnInterfaceKey(vpnInterfaceName)).build();
     }
 
+    @Nullable
     static VpnInterface getConfiguredVpnInterface(DataBroker broker, String interfaceName) {
         InstanceIdentifier<VpnInterface> interfaceId = getVpnInterfaceIdentifier(interfaceName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
                 LogicalDatastoreType.CONFIGURATION, interfaceId).orNull();
     }
 
+    @Nullable
     public static String getDpnFromNodeConnectorId(NodeConnectorId portId) {
         /*
          * NodeConnectorId is of form 'openflow:dpnid:portnum'
@@ -658,6 +672,7 @@ public final class NatUtil {
         return new BigInteger(getDpnFromNodeConnectorId(nodeConnectorId));
     }
 
+    @Nullable
     public static String getRouterIdfromVpnInstance(DataBroker broker, String vpnName) {
         // returns only router, attached to IPv4 networks
         InstanceIdentifier<VpnMap> vpnMapIdentifier = InstanceIdentifier.builder(VpnMaps.class)
@@ -694,6 +709,7 @@ public final class NatUtil {
         return null;
     }
 
+    @Nullable
     static Uuid getVpnForRouter(DataBroker broker, String routerId) {
         Preconditions.checkNotNull(routerId, "dissociateRouter: routerId not found!");
         InstanceIdentifier<VpnMaps> vpnMapsIdentifier = InstanceIdentifier.builder(VpnMaps.class).build();
@@ -701,32 +717,23 @@ public final class NatUtil {
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
                         LogicalDatastoreType.CONFIGURATION, vpnMapsIdentifier);
         if (optionalVpnMaps.isPresent() && optionalVpnMaps.get().getVpnMap() != null) {
-            List<VpnMap> allMaps = optionalVpnMaps.get().getVpnMap();
-            for (VpnMap vpnMap: allMaps) {
+            for (VpnMap vpnMap : requireNonNullElse(optionalVpnMaps.get().getVpnMap(),
+                    Collections.<VpnMap>emptyList())) {
                 if (routerId.equals(vpnMap.getVpnId().getValue())) {
                     continue;
                 }
                 List<Uuid> routerIdsList = NeutronUtils.getVpnMapRouterIdsListUuid(vpnMap.getRouterIds());
-                if (routerIdsList == null || routerIdsList.isEmpty()) {
+                if (routerIdsList.isEmpty()) {
                     return null;
                 }
-                //Skip router vpnId fetching from internet BGP-VPN
-                boolean isInternetBgpVpn = false;
+                // Skip router vpnId fetching from internet BGP-VPN
                 if (vpnMap.getNetworkIds() != null && !vpnMap.getNetworkIds().isEmpty()) {
-                    for (Uuid netId: vpnMap.getNetworkIds()) {
-                        if (isExternalNetwork(broker, netId)) {
-                            isInternetBgpVpn = true;
-                        }
-                        /* If first network is not a external network then no need iterate
-                         * whole network list from the VPN
-                         */
-                        break;
+                    // We only need to check the first network; if it’s not an external network there’s no
+                    // need to check the rest of the VPN’s network list
+                    if (isExternalNetwork(broker, vpnMap.getNetworkIds().iterator().next())) {
+                        continue;
                     }
                 }
-                if (isInternetBgpVpn) {
-                    //skip further processing
-                    continue;
-                }
                 if (routerIdsList.contains(new Uuid(routerId))) {
                     return vpnMap.getVpnId();
                 }
@@ -743,6 +750,7 @@ public final class NatUtil {
                 NatConstants.INVALID_ID);
     }
 
+    @Nullable
     public static String getAssociatedVPN(DataBroker dataBroker, Uuid networkId) {
         Uuid vpnUuid = NatUtil.getVpnIdfromNetworkId(dataBroker, networkId);
         if (vpnUuid == null) {
@@ -752,6 +760,7 @@ public final class NatUtil {
         return vpnUuid.getValue();
     }
 
+    @Nullable
     public static String getAssociatedVPN(TypedReadTransaction<Configuration> tx, Uuid networkId) {
         Uuid vpnUuid = NatUtil.getVpnIdfromNetworkId(tx, networkId);
         if (vpnUuid == null) {
@@ -768,11 +777,10 @@ public final class NatUtil {
                                       IFibManager fibManager,
                                       String vpnName,
                                       String rd,
-                                      Uuid subnetId,
                                       String prefix,
                                       String nextHopIp,
-                                      String parentVpnRd,
-                                      String macAddress,
+                                      @Nullable String parentVpnRd,
+                                      @Nullable String macAddress,
                                       long label,
                                       long l3vni,
                                       RouteOrigin origin,
@@ -787,7 +795,7 @@ public final class NatUtil {
             }
 
             addPrefixToInterface(broker, getVpnId(broker, vpnName), null /*interfaceName*/,prefix, parentVpnRd,
-                    subnetId, dpId, Prefixes.PrefixCue.Nat);
+                dpId, Prefixes.PrefixCue.Nat);
             fibManager.addOrUpdateFibEntry(rd, macAddress, prefix,
                     Collections.singletonList(nextHopIp), VrfEntry.EncapType.Mplsgre, (int)label, l3vni /*l3vni*/,
                     null /*gatewayMacAddress*/, parentVpnRd, origin, null /*writeTxn*/);
@@ -805,8 +813,8 @@ public final class NatUtil {
         }
     }
 
-    static void addPrefixToInterface(DataBroker broker, long vpnId, String interfaceName, String ipPrefix,
-                                     String networkId, Uuid subnetId, BigInteger dpId, Prefixes.PrefixCue prefixCue) {
+    static void addPrefixToInterface(DataBroker broker, long vpnId, @Nullable String interfaceName, String ipPrefix,
+                                     String networkId, BigInteger dpId, Prefixes.PrefixCue prefixCue) {
         InstanceIdentifier<Prefixes> prefixId = InstanceIdentifier.builder(PrefixToInterface.class)
                 .child(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface
                         .VpnIds.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix
@@ -937,6 +945,7 @@ public final class NatUtil {
         }
     }
 
+    @Nullable
     public static IpPortMapping getIportMapping(DataBroker broker, long routerId) {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
                 LogicalDatastoreType.CONFIGURATION, getIportMappingIdentifier(routerId)).orNull();
@@ -949,12 +958,11 @@ public final class NatUtil {
 
     public static InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt
         .natservice.rev160111.intext.ip.map.IpMapping> getIpMappingBuilder(Long routerId) {
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111
-            .intext.ip.map.IpMapping> idBuilder = InstanceIdentifier.builder(IntextIpMap.class)
+        return InstanceIdentifier.builder(IntextIpMap.class)
             .child(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.intext.ip.map
                 .IpMapping.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111
-                .intext.ip.map.IpMappingKey(routerId)).build();
-        return idBuilder;
+                .intext.ip.map.IpMappingKey(routerId))
+            .build();
     }
 
     @Nonnull
@@ -966,8 +974,7 @@ public final class NatUtil {
         // Ensure there are no duplicates
         Collection<String> externalIps = new HashSet<>();
         if (ipMappingOptional.isPresent()) {
-            List<IpMap> ipMaps = ipMappingOptional.get().getIpMap();
-            for (IpMap ipMap : ipMaps) {
+            for (IpMap ipMap : requireNonNullElse(ipMappingOptional.get().getIpMap(), Collections.<IpMap>emptyList())) {
                 externalIps.add(ipMap.getExternalIp());
             }
         }
@@ -992,14 +999,14 @@ public final class NatUtil {
                         LogicalDatastoreType.OPERATIONAL, getIpMappingBuilder(routerId));
         Map<String, Long> externalIpsLabel = new HashMap<>();
         if (ipMappingOptional.isPresent()) {
-            List<IpMap> ipMaps = ipMappingOptional.get().getIpMap();
-            for (IpMap ipMap : ipMaps) {
+            for (IpMap ipMap : requireNonNullElse(ipMappingOptional.get().getIpMap(), Collections.<IpMap>emptyList())) {
                 externalIpsLabel.put(ipMap.getExternalIp(), ipMap.getLabel());
             }
         }
         return externalIpsLabel;
     }
 
+    @Nullable
     public static String getLeastLoadedExternalIp(DataBroker dataBroker, long segmentId) {
         String leastLoadedExternalIp = null;
         InstanceIdentifier<ExternalCounters> id =
@@ -1009,9 +1016,9 @@ public final class NatUtil {
             MDSALUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if (externalCountersData.isPresent()) {
             ExternalCounters externalCounter = externalCountersData.get();
-            List<ExternalIpCounter> externalIpCounterList = externalCounter.getExternalIpCounter();
             short countOfLstLoadExtIp = 32767;
-            for (ExternalIpCounter externalIpCounter : externalIpCounterList) {
+            for (ExternalIpCounter externalIpCounter : requireNonNullElse(externalCounter.getExternalIpCounter(),
+                    Collections.<ExternalIpCounter>emptyList())) {
                 String curExternalIp = externalIpCounter.getExternalIp();
                 short countOfCurExtIp = externalIpCounter.getCounter();
                 if (countOfCurExtIp < countOfLstLoadExtIp) {
@@ -1024,6 +1031,7 @@ public final class NatUtil {
     }
 
     @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
+    @Nullable
     public static String[] getSubnetIpAndPrefix(DataBroker dataBroker, Uuid subnetId) {
         String subnetIP = getSubnetIp(dataBroker, subnetId);
         if (subnetIP != null) {
@@ -1033,6 +1041,7 @@ public final class NatUtil {
         return null;
     }
 
+    @Nonnull
     public static String[] getSubnetIpAndPrefix(String subnetString) {
         String[] subnetSplit = subnetString.split("/");
         String subnetIp = subnetSplit[0];
@@ -1043,6 +1052,7 @@ public final class NatUtil {
         return new String[] {subnetIp, subnetPrefix};
     }
 
+    @Nullable
     public static String getSubnetIp(DataBroker dataBroker, Uuid subnetId) {
         InstanceIdentifier<Subnetmap> subnetmapId = InstanceIdentifier
             .builder(Subnetmaps.class)
@@ -1050,7 +1060,6 @@ public final class NatUtil {
             .build();
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
                 LogicalDatastoreType.CONFIGURATION, subnetmapId).toJavaUtil().map(Subnetmap::getSubnetIp).orElse(null);
-
     }
 
     public static String[] getExternalIpAndPrefix(String leastLoadedExtIpAddr) {
@@ -1072,8 +1081,8 @@ public final class NatUtil {
                         LogicalDatastoreType.OPERATIONAL, id);
         List<BigInteger> dpns = new ArrayList<>();
         if (routerDpnListData.isPresent()) {
-            List<DpnVpninterfacesList> dpnVpninterfacesList = routerDpnListData.get().getDpnVpninterfacesList();
-            for (DpnVpninterfacesList dpnVpnInterface : dpnVpninterfacesList) {
+            for (DpnVpninterfacesList dpnVpnInterface : requireNonNullElse(
+                    routerDpnListData.get().getDpnVpninterfacesList(), Collections.<DpnVpninterfacesList>emptyList())) {
                 dpns.add(dpnVpnInterface.getDpnId());
             }
         }
@@ -1089,6 +1098,7 @@ public final class NatUtil {
         return bgpVpnId;
     }
 
+    @Nullable
     static org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces
         .RouterInterface getConfiguredRouterInterface(DataBroker broker, String interfaceName) {
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1370,7 +1380,7 @@ public final class NatUtil {
     public static List<ActionInfo> getEgressActionsForInterface(OdlInterfaceRpcService odlInterfaceRpcService,
                                                                 ItmRpcService itmRpcService,
                                                                 IInterfaceManager interfaceManager,
-                                                                String ifName, Long tunnelKey, int pos,
+                                                                String ifName, @Nullable Long tunnelKey, int pos,
                                                                 boolean internalTunnelInterface) {
         LOG.debug("getEgressActionsForInterface : called for interface {}", ifName);
         GetEgressActionsForInterfaceInputBuilder egressActionsIfmBuilder =
@@ -1404,7 +1414,7 @@ public final class NatUtil {
                 }
             }
             List<ActionInfo> listActionInfo = new ArrayList<>();
-            for (Action action : actions) {
+            for (Action action : requireNonNullElse(actions, Collections.<Action>emptyList())) {
                 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action
                     actionClass = action.getAction();
                 if (actionClass instanceof OutputActionCase) {
@@ -1436,6 +1446,7 @@ public final class NatUtil {
         return Collections.emptyList();
     }
 
+    @Nullable
     public static Port getNeutronPortForRouterGetewayIp(DataBroker broker, IpAddress targetIP) {
         return getNeutronPortForIp(broker, targetIP, NeutronConstants.DEVICE_OWNER_GATEWAY_INF);
     }
@@ -1458,8 +1469,8 @@ public final class NatUtil {
         return portsOptional.get().getPort();
     }
 
-    public static Port getNeutronPortForIp(DataBroker broker,
-                                           IpAddress targetIP, String deviceType) {
+    @Nullable
+    public static Port getNeutronPortForIp(DataBroker broker, IpAddress targetIP, String deviceType) {
         List<Port> ports = getNeutronPorts(
             broker);
 
@@ -1476,12 +1487,13 @@ public final class NatUtil {
         return null;
     }
 
+    @Nullable
     public static Uuid getSubnetIdForFloatingIp(Port port, IpAddress targetIP) {
         if (port == null) {
             LOG.error("getSubnetIdForFloatingIp : port is null");
             return null;
         }
-        for (FixedIps ip : port.getFixedIps()) {
+        for (FixedIps ip : requireNonNullElse(port.getFixedIps(), Collections.<FixedIps>emptyList())) {
             if (Objects.equals(ip.getIpAddress(), targetIP)) {
                 return ip.getSubnetId();
             }
@@ -1490,6 +1502,7 @@ public final class NatUtil {
         return null;
     }
 
+    @Nullable
     public static Subnetmap getSubnetMap(DataBroker broker, Uuid subnetId) {
         InstanceIdentifier<Subnetmap> subnetmapId = InstanceIdentifier.builder(Subnetmaps.class)
             .child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
@@ -1506,6 +1519,7 @@ public final class NatUtil {
                 Collections.emptyList());
     }
 
+    @Nullable
     public static String getSubnetGwMac(DataBroker broker, Uuid subnetId, String vpnName) {
         if (subnetId == null) {
             LOG.error("getSubnetGwMac : subnetID is null");
@@ -1576,6 +1590,7 @@ public final class NatUtil {
             .child(RouterDpnList.class, new RouterDpnListKey(routerName)).build();
     }
 
+    @Nullable
     protected static String getFloatingIpPortMacFromFloatingIpId(DataBroker broker, Uuid floatingIpId) {
         InstanceIdentifier<FloatingIpIdToPortMapping> id = buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1583,6 +1598,7 @@ public final class NatUtil {
                 FloatingIpIdToPortMapping::getFloatingIpPortMacAddress).orElse(null);
     }
 
+    @Nullable
     protected static String getFloatingIpPortMacFromFloatingIpId(TypedReadTransaction<Configuration> confTx,
         Uuid floatingIpId) {
         try {
@@ -1594,6 +1610,7 @@ public final class NatUtil {
         }
     }
 
+    @Nullable
     protected static Uuid getFloatingIpPortSubnetIdFromFloatingIpId(DataBroker broker, Uuid floatingIpId) {
         InstanceIdentifier<FloatingIpIdToPortMapping> id = buildfloatingIpIdToPortMappingIdentifier(floatingIpId);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1618,6 +1635,7 @@ public final class NatUtil {
             FloatingIpIdToPortMappingKey(floatingIpId)).build();
     }
 
+    @Nullable
     static Interface getInterfaceStateFromOperDS(DataBroker dataBroker, String interfaceName) {
         InstanceIdentifier<Interface> ifStateId =
             buildStateInterfaceId(interfaceName);
@@ -1632,10 +1650,10 @@ public final class NatUtil {
                 .child(Interface.class,
                     new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508
                         .interfaces.state.InterfaceKey(interfaceName));
-        InstanceIdentifier<Interface> id = idBuilder.build();
-        return id;
+        return idBuilder.build();
     }
 
+    @Nullable
     public static Routers getRoutersFromConfigDS(DataBroker dataBroker, String routerName) {
         InstanceIdentifier<Routers> routerIdentifier = NatUtil.buildRouterIdentifier(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(dataBroker,
@@ -1662,6 +1680,7 @@ public final class NatUtil {
         MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, buildRouterIdentifier(routerId), rtrs);
     }
 
+    @Nullable
     static FlowEntity buildDefaultNATFlowEntityForExternalSubnet(BigInteger dpId, long vpnId, String subnetId,
             IdManagerService idManager) {
         InetAddress defaultIP = null;
@@ -1684,12 +1703,12 @@ public final class NatUtil {
         actionsInfo.add(new ActionGroup(groupId));
         String flowRef = getFlowRef(dpId, NwConstants.L3_FIB_TABLE, defaultIP, vpnId);
         instructions.add(new InstructionApplyActions(actionsInfo));
-        FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, NwConstants.L3_FIB_TABLE, flowRef,
+        return MDSALUtil.buildFlowEntity(dpId, NwConstants.L3_FIB_TABLE, flowRef,
                 NatConstants.DEFAULT_DNAT_FLOW_PRIORITY, flowRef, 0, 0,
                 NwConstants.COOKIE_DNAT_TABLE, matches, instructions);
-        return flowEntity;
     }
 
+    @Nullable
     static String getExtGwMacAddFromRouterId(DataBroker broker, long routerId) {
         String routerName = getRouterName(broker, routerId);
         if (routerName == null) {
@@ -1699,6 +1718,7 @@ public final class NatUtil {
         return getExtGwMacAddFromRouterName(broker, routerName);
     }
 
+    @Nullable
     static String getExtGwMacAddFromRouterName(DataBroker broker, String routerName) {
         InstanceIdentifier<Routers> id = buildRouterIdentifier(routerName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1723,6 +1743,7 @@ public final class NatUtil {
         return routerInstanceIdentifier;
     }
 
+    @Nullable
     public static String getNeutronRouterNamebyUuid(DataBroker broker, Uuid routerUuid) {
         InstanceIdentifier<Router> neutronRouterIdentifier = NatUtil.buildNeutronRouterIdentifier(routerUuid);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1745,9 +1766,10 @@ public final class NatUtil {
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
                         LogicalDatastoreType.CONFIGURATION, externalNwIdentifier);
         if (externalNwData.isPresent()) {
-            for (Networks externalNw : externalNwData.get().getNetworks()) {
+            for (Networks externalNw : requireNonNullElse(externalNwData.get().getNetworks(),
+                    Collections.<Networks>emptyList())) {
                 if (externalNw.getVpnid() != null && externalNw.getVpnid().equals(vpnUuid)) {
-                    return externalNw.getRouterIds();
+                    return requireNonNullElse(externalNw.getRouterIds(), Collections.emptyList());
                 }
             }
         }
@@ -1768,7 +1790,7 @@ public final class NatUtil {
     }
 
     @Nonnull
-    public static Collection<Uuid> getExternalSubnetIdsFromExternalIps(List<ExternalIps> externalIps) {
+    public static Collection<Uuid> getExternalSubnetIdsFromExternalIps(@Nullable List<ExternalIps> externalIps) {
         if (externalIps == null) {
             return Collections.emptySet();
         }
@@ -1777,7 +1799,7 @@ public final class NatUtil {
     }
 
     @Nonnull
-    public static Collection<Uuid> getExternalSubnetIdsForRouter(DataBroker dataBroker, String routerName) {
+    public static Collection<Uuid> getExternalSubnetIdsForRouter(DataBroker dataBroker, @Nullable String routerName) {
         if (routerName == null) {
             LOG.error("getExternalSubnetIdsForRouter : empty routerName received");
             return Collections.emptySet();
@@ -1865,10 +1887,10 @@ public final class NatUtil {
         return NatConstants.INVALID_ID;
     }
 
+    @Nullable
     protected static Uuid getExternalSubnetForRouterExternalIp(String externalIpAddress, Routers router) {
         externalIpAddress = validateAndAddNetworkMask(externalIpAddress);
-        List<ExternalIps> externalIps = router.getExternalIps();
-        for (ExternalIps extIp : externalIps) {
+        for (ExternalIps extIp : requireNonNullElse(router.getExternalIps(), Collections.<ExternalIps>emptyList())) {
             String extIpString = validateAndAddNetworkMask(extIp.getIpAddress());
             if (extIpString.equals(externalIpAddress)) {
                 return extIp.getSubnetId();
@@ -1898,6 +1920,7 @@ public final class NatUtil {
     }
 
     // elan-instances config container
+    @Nullable
     public static ElanInstance getElanInstanceByName(String elanInstanceName, DataBroker broker) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker,
@@ -1963,7 +1986,7 @@ public final class NatUtil {
                 + NwConstants.FLOWID_SEPARATOR + uniqueId;
     }
 
-    public static Boolean isFloatingIpPresentForDpn(DataBroker dataBroker, BigInteger dpnId, String rd,
+    public static boolean isFloatingIpPresentForDpn(DataBroker dataBroker, BigInteger dpnId, String rd,
                                                     String vpnName, String externalIp,
                                                     Boolean isMoreThanOneFipCheckOnDpn) {
         InstanceIdentifier<VpnToDpnList> id = getVpnToDpnListIdentifier(rd, dpnId);
@@ -1976,31 +1999,31 @@ public final class NatUtil {
                 if (ipAddressList != null && !ipAddressList.isEmpty()) {
                     int floatingIpPresentCount = 0;
                     for (IpAddresses ipAddress: ipAddressList) {
-                        if (!ipAddress.getIpAddress().equals(externalIp)
+                        if (!Objects.equals(ipAddress.getIpAddress(), externalIp)
                                 && IpAddresses.IpAddressSource.FloatingIP.equals(ipAddress.getIpAddressSource())) {
                             floatingIpPresentCount++;
                             //Add tunnel table check
                             if (isMoreThanOneFipCheckOnDpn && floatingIpPresentCount > 1) {
-                                return Boolean.TRUE;
+                                return true;
                             }
                             //Remove tunnel table check
                             if (!isMoreThanOneFipCheckOnDpn) {
-                                return Boolean.TRUE;
+                                return true;
                             }
                         }
                     }
                 } else {
                     LOG.debug("isFloatingIpPresentForDpn : vpn-to-dpn-list does not contain any floating IP for DPN {}",
                            dpnId);
-                    return Boolean.FALSE;
+                    return false;
                 }
             } catch (NullPointerException e) {
                 LOG.error("isFloatingIpPresentForDpn: Exception occurred on getting external IP address from "
                         + "vpn-to-dpn-list on Dpn {}", dpnId, e);
-                return Boolean.FALSE;
+                return false;
             }
         }
-        return Boolean.FALSE;
+        return false;
     }
 
     private static InstanceIdentifier<VpnToDpnList> getVpnToDpnListIdentifier(String rd, BigInteger dpnId) {
@@ -2026,12 +2049,13 @@ public final class NatUtil {
         return vpnName;
     }
 
-    public static String getPrimaryRd(VpnInstance vpnInstance) {
-        List<String> rds = null;
-        if (vpnInstance != null) {
-            rds = getListOfRdsFromVpnInstance(vpnInstance);
+    @Nullable
+    public static String getPrimaryRd(@Nullable VpnInstance vpnInstance) {
+        if (vpnInstance == null) {
+            return null;
         }
-        return rds == null || rds.isEmpty() ? vpnInstance.getVpnInstanceName() : rds.get(0);
+        List<String> rds = getListOfRdsFromVpnInstance(vpnInstance);
+        return rds.isEmpty() ? vpnInstance.getVpnInstanceName() : rds.get(0);
     }
 
     public static InstanceIdentifier<VpnInstance> getVpnInstanceIdentifier(String vpnName) {
@@ -2067,6 +2091,7 @@ public final class NatUtil {
         new VpnInterfaceOpDataEntryKey(vpnInterfaceName, vpnName)).build();
     }
 
+    @Nullable
     public static VpnInstanceOpDataEntry getVpnInstanceOpData(DataBroker broker, String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = NatUtil.getVpnInstanceOpDataIdentifier(rd);
         return SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(
@@ -2085,9 +2110,7 @@ public final class NatUtil {
                     String sharedRouterName = routerUuid.getValue();
                     if (!routerName.equals(sharedRouterName)) {
                         BigInteger switchDpnId = NatUtil.getPrimaryNaptfromRouterName(broker, sharedRouterName);
-                        if (switchDpnId == null) {
-                            continue;
-                        } else if (switchDpnId.equals(dpnId)) {
+                        if (switchDpnId != null && switchDpnId.equals(dpnId)) {
                             LOG.debug("checkForRoutersWithSameExtNetAndNaptSwitch: external-network {} is "
                                     + "associated with other active router {} on NAPT switch {}", networkId,
                                     sharedRouterName, switchDpnId);
@@ -2105,14 +2128,12 @@ public final class NatUtil {
         List<Uuid> routerUuidList = getOptionalExternalSubnets(broker, externalSubnetId).toJavaUtil()
             .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external
                 .subnets.Subnets::getRouterIds).orElse(Collections.emptyList());
-        if (routerUuidList != null && !routerUuidList.isEmpty()) {
+        if (!routerUuidList.isEmpty()) {
             for (Uuid routerUuid : routerUuidList) {
                 String sharedRouterName = routerUuid.getValue();
                 if (!routerName.equals(sharedRouterName)) {
                     BigInteger switchDpnId = NatUtil.getPrimaryNaptfromRouterName(broker, sharedRouterName);
-                    if (switchDpnId == null) {
-                        continue;
-                    } else if (switchDpnId.equals(dpnId)) {
+                    if (switchDpnId != null && switchDpnId.equals(dpnId)) {
                         LOG.debug("checkForRoutersWithSameExtSubnetAndNaptSwitch: external-subnetwork {} is "
                                   + "associated with other active router {} on NAPT switch {}", externalSubnetId,
                             sharedRouterName, switchDpnId);
@@ -2130,7 +2151,7 @@ public final class NatUtil {
             List<ExternalIps> externalIps = router.getExternalIps();
             List<String> externalIpsSting = new ArrayList<>();
 
-            if (externalIps.isEmpty()) {
+            if (externalIps == null || externalIps.isEmpty()) {
                 LOG.error("installRouterGwFlows: setupRouterGwFlows no externalIP present");
                 return;
             }
@@ -2365,17 +2386,16 @@ public final class NatUtil {
         return extRouterInstanceIndentifier;
     }
 
+    @Nullable
     public static LearntVpnVipToPortData getLearntVpnVipToPortData(DataBroker dataBroker) {
-        InstanceIdentifier<LearntVpnVipToPortData> learntVpnVipToPortDataId = getLearntVpnVipToPortDataId();
-        LearntVpnVipToPortData learntVpnVipToPortData = null;
         try {
-            learntVpnVipToPortData = SingleTransactionDataBroker.syncRead(dataBroker,
-                    LogicalDatastoreType.OPERATIONAL, learntVpnVipToPortDataId);
+            return SingleTransactionDataBroker.syncRead(dataBroker,
+                    LogicalDatastoreType.OPERATIONAL, getLearntVpnVipToPortDataId());
         }
         catch (ReadFailedException e) {
             LOG.warn("Failed to read LearntVpnVipToPortData with error {}", e.getMessage());
+            return null;
         }
-        return learntVpnVipToPortData;
     }
 
     public static InstanceIdentifier<LearntVpnVipToPortData> getLearntVpnVipToPortDataId() {
@@ -2437,14 +2457,11 @@ public final class NatUtil {
         Optional<Networks> networkData =
                 SingleTransactionDataBroker.syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(
                         broker, LogicalDatastoreType.CONFIGURATION, id);
-        if (networkData.isPresent()) {
-            return true;
-        }
-        return false;
+        return networkData.isPresent();
     }
 
+    @Nullable
     public static String getElanInstancePhysicalNetwok(String elanInstanceName, DataBroker broker) {
-
         ElanInstance elanInstance =  getElanInstanceByName(elanInstanceName, broker);
         if (null != elanInstance) {
             return elanInstance.getPhysicalNetworkName();
@@ -2494,11 +2511,13 @@ public final class NatUtil {
                 LogicalDatastoreType.OPERATIONAL, nodeId);
     }
 
+    @Nullable
     public static String getProviderMappings(BigInteger dpId, DataBroker dataBroker) {
         return getBridgeRefInfo(dpId, dataBroker).toJavaUtil().map(node -> getOpenvswitchOtherConfigs(node,
                 PROVIDER_MAPPINGS, dataBroker)).orElse(null);
     }
 
+    @Nullable
     public static String getOpenvswitchOtherConfigs(Node node, String key, DataBroker dataBroker) {
         OvsdbNodeAugmentation ovsdbNode = node.augmentation(OvsdbNodeAugmentation.class);
         if (ovsdbNode == null) {
@@ -2510,7 +2529,7 @@ public final class NatUtil {
 
         if (ovsdbNode != null && ovsdbNode.getOpenvswitchOtherConfigs() != null) {
             for (OpenvswitchOtherConfigs openvswitchOtherConfigs : ovsdbNode.getOpenvswitchOtherConfigs()) {
-                if (openvswitchOtherConfigs.getOtherConfigKey().equals(key)) {
+                if (Objects.equals(openvswitchOtherConfigs.getOtherConfigKey(), key)) {
                     return openvswitchOtherConfigs.getOtherConfigValue();
                 }
             }
@@ -2532,10 +2551,17 @@ public final class NatUtil {
 
     }
 
+    @Nullable
     public static OvsdbBridgeAugmentation extractBridgeAugmentation(Node node) {
         if (node == null) {
             return null;
         }
         return node.augmentation(OvsdbBridgeAugmentation.class);
     }
+
+    // Use Objects.requireNonNullElse instead with JDK9+
+    @Nonnull
+    public static <T> T requireNonNullElse(@Nullable T obj, @Nonnull T defaultObj) {
+        return obj != null ? obj : requireNonNull(defaultObj);
+    }
 }
index 68341c7466a04a8532c4dface7000af2aded1c1b..b51c238713b1092663184beed82030ba7aab67f0 100644 (file)
@@ -8,10 +8,11 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 import java.math.BigInteger;
-import java.util.List;
+import java.util.Collections;
 import java.util.concurrent.ExecutionException;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -142,9 +143,7 @@ public class RouterToVpnListener implements NeutronvpnListener {
             return;
         }
         Uuid networkId = Uuid.getDefaultInstance(externalNetwork);
-        RouterPorts routerPorts = optRouterPorts.get();
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(optRouterPorts.get().getPorts(), Collections.<Ports>emptyList())) {
             String portName = port.getPortName();
             BigInteger dpnId = NatUtil.getDpnForInterface(interfaceManager, portName);
             if (dpnId.equals(BigInteger.ZERO)) {
@@ -153,8 +152,8 @@ public class RouterToVpnListener implements NeutronvpnListener {
                 continue;
             }
 
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 //remove all NAT related entries with routerName
                 //floatingIpListener.removeNATOnlyFlowEntries(dpnId, portName, routerName, null,
                 // intExtPortMap.getInternalIp(), externalIp);
@@ -177,9 +176,7 @@ public class RouterToVpnListener implements NeutronvpnListener {
             return;
         }
         Uuid networkId = Uuid.getDefaultInstance(externalNetwork);
-        RouterPorts routerPorts = optRouterPorts.get();
-        List<Ports> interfaces = routerPorts.getPorts();
-        for (Ports port : interfaces) {
+        for (Ports port : requireNonNullElse(optRouterPorts.get().getPorts(), Collections.<Ports>emptyList())) {
             String portName = port.getPortName();
             BigInteger dpnId = NatUtil.getDpnForInterface(interfaceManager, portName);
             if (dpnId.equals(BigInteger.ZERO)) {
@@ -187,8 +184,8 @@ public class RouterToVpnListener implements NeutronvpnListener {
                         + "skip handling of router {} association with vpn {}", portName, routerName, vpnName);
                 continue;
             }
-            List<InternalToExternalPortMap> intExtPortMapList = port.getInternalToExternalPortMap();
-            for (InternalToExternalPortMap intExtPortMap : intExtPortMapList) {
+            for (InternalToExternalPortMap intExtPortMap : requireNonNullElse(port.getInternalToExternalPortMap(),
+                    Collections.<InternalToExternalPortMap>emptyList())) {
                 //remove all NAT related entries with routerName
                 //floatingIpListener.removeNATOnlyFlowEntries(dpnId, portName, routerName, vpnName,
                 // intExtPortMap.getInternalIp(), externalIp);
index be6a548e96dbcbca51288ce411d8357220c7aa09..d9e7f8646b4c021ca1d04290299ca95fdbbc8bab 100644 (file)
@@ -15,6 +15,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import java.util.concurrent.ExecutionException;
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
@@ -64,6 +65,7 @@ public class SNATDefaultRouteProgrammer {
         this.natServiceCounters = natServiceCounters;
     }
 
+    @Nullable
     private FlowEntity buildDefNATFlowEntity(BigInteger dpId, long vpnId) {
         InetAddress defaultIP = null;
         try {
@@ -96,6 +98,7 @@ public class SNATDefaultRouteProgrammer {
         return flowEntity;
     }
 
+    @Nullable
     private FlowEntity buildDefNATFlowEntity(BigInteger dpId, long bgpVpnId, long routerId) {
         InetAddress defaultIP = null;
         try {
index a389cc8be7f721b6aa54849ddbdf7e69f52e58fa..4356f77f16a2d426dfce3392fcac86d1ed490c9b 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import javax.annotation.Nullable;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -94,8 +95,8 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
         LOG.info("{} close", getClass().getSimpleName());
     }
 
+    @Nullable
     public AbstractSnatService createFlatVlanSnatServiceImpl() {
-
         if (natMode == NatMode.Conntrack) {
             return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
                     idManager, naptSwitchSelector, interfaceManager, vpnFootprintService, fibManager,  natDataUtil,
@@ -104,8 +105,8 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
         return null;
     }
 
+    @Nullable
     public AbstractSnatService createVxlanGreSnatServiceImpl() {
-
         if (natMode == NatMode.Conntrack) {
             NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager, idManager,
                     NatConstants.ODL_VNI_POOL_NAME);
@@ -115,6 +116,4 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
         }
         return null;
     }
-
-
 }
index a1368fe2aafb29c459995eb065eb13afed2b6d3f..8abb6187282f54a8a70fca8974a628e6ebc9e092 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.netvirt.natservice.internal;
 
 import static org.opendaylight.genius.infra.Datastore.CONFIGURATION;
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
 
 import com.google.common.base.Optional;
 
@@ -104,15 +105,15 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
             if (original.isUpgradeInProgress() && !updated.isUpgradeInProgress()) {
                 Optional<NaptSwitches> npatSwitches = NatUtil.getAllPrimaryNaptSwitches(dataBroker);
                 if (npatSwitches.isPresent()) {
-                    for (RouterToNaptSwitch routerToNaptSwitch : npatSwitches.get().getRouterToNaptSwitch()) {
+                    for (RouterToNaptSwitch routerToNaptSwitch : requireNonNullElse(
+                            npatSwitches.get().getRouterToNaptSwitch(), Collections.<RouterToNaptSwitch>emptyList())) {
                         BigInteger primaryNaptDpnId = routerToNaptSwitch.getPrimarySwitchId();
                         if (!NatUtil.getSwitchStatus(dataBroker, routerToNaptSwitch.getPrimarySwitchId())) {
                             String routerUuid = routerToNaptSwitch.getRouterName();
                             coordinator.enqueueJob(NatConstants.NAT_DJC_PREFIX + routerUuid,
                                 () -> Collections.singletonList(
-                                    txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, confTx -> {
-                                        reElectNewNaptSwitch(routerUuid, primaryNaptDpnId, confTx);
-                                    }
+                                    txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION,
+                                        confTx -> reElectNewNaptSwitch(routerUuid, primaryNaptDpnId, confTx)
                                 )), NatConstants.NAT_DJC_MAX_RETRIES);
                         }
                     }
@@ -136,7 +137,7 @@ public class UpgradeStateListener extends AbstractClusteredSyncDataTreeChangeLis
             return;
         }
 
-        for (Routers router : routers.getRouters()) {
+        for (Routers router : requireNonNullElse(routers.getRouters(), Collections.<Routers>emptyList())) {
             List<ExternalIps> externalIps = router.getExternalIps();
             if (router.isEnableSnat() && externalIps != null && !externalIps.isEmpty()) {
                 centralizedSwitchScheduler.scheduleCentralizedSwitch(router);
index 8faf3ae21eedf14563c9c4ab4a919c3afa8fc6db..eea9f84637004de4846443ec85b8b8b5a34e2a68 100644 (file)
@@ -223,8 +223,8 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
                 }
                 String fibExternalIp = NatUtil.validateAndAddNetworkMask(externalIp);
                 //Inform BGP
-                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd, subnetId,
-                        fibExternalIp, nextHopIp, networkId.getValue(), floatingIpPortMacAddress,
+                NatUtil.addPrefixToBGP(dataBroker, bgpManager, fibManager, vpnName, rd,
+                    fibExternalIp, nextHopIp, networkId.getValue(), floatingIpPortMacAddress,
                         label, l3vni, RouteOrigin.STATIC, dpnId);
 
                 List<Instruction> instructions = new ArrayList<>();
index 1e64f03205d0ee7e7ad3c1e6dd4b8d73c1716c29..2244602b6de2b2262087a588194d96e8a4b25625 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.netvirt.natservice.rpcservice;
 
+import static org.opendaylight.netvirt.natservice.internal.NatUtil.requireNonNullElse;
+
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -134,7 +137,8 @@ public class NatRpcServiceImpl implements OdlNatRpcService {
         outerloop:
         for (Uuid subnetUuid: subnetUuidList) {
             subNet = nvpnManager.getNeutronSubnet(subnetUuid);
-            for (AllocationPools allocationPool : subNet.getAllocationPools()) {
+            for (AllocationPools allocationPool : requireNonNullElse(subNet.getAllocationPools(),
+                    Collections.<AllocationPools>emptyList())) {
                 if (NatUtil.isIpInSubnet(ipAddress,
                         allocationPool.getStart().stringValue(),
                         allocationPool.getEnd().stringValue())) {
@@ -162,8 +166,8 @@ public class NatRpcServiceImpl implements OdlNatRpcService {
             LOG.warn("getNatTranslationsForNetworkAndIpaddress : No DNAT IP Mapping found for IP {}", ipAddress);
         } else {
             for (Ports fipPort : fipPorts) {
-                List<InternalToExternalPortMap> ipMapping = fipPort.getInternalToExternalPortMap();
-                for (InternalToExternalPortMap fipMap : ipMapping) {
+                for (InternalToExternalPortMap fipMap : requireNonNullElse(fipPort.getInternalToExternalPortMap(),
+                        Collections.<InternalToExternalPortMap>emptyList())) {
                     if (fipMap.getInternalIp().equals(ipAddress)) {
                         output = new GetNatTranslationsForNetworkAndIpaddressOutputBuilder()
                                     .setExternalIp(fipMap.getExternalIp())
@@ -180,8 +184,10 @@ public class NatRpcServiceImpl implements OdlNatRpcService {
         if (ipPortMapping == null) {
             LOG.warn("getNatTranslationsForNetworkAndIpaddress : No SNAT IP Mapping found for IP {}", ipAddress);
         } else {
-            for (IntextIpProtocolType protocolType : ipPortMapping.getIntextIpProtocolType()) {
-                for (IpPortMap ipPortMap : protocolType.getIpPortMap()) {
+            for (IntextIpProtocolType protocolType : requireNonNullElse(ipPortMapping.getIntextIpProtocolType(),
+                    Collections.<IntextIpProtocolType>emptyList())) {
+                for (IpPortMap ipPortMap : requireNonNullElse(protocolType.getIpPortMap(),
+                        Collections.<IpPortMap>emptyList())) {
                     String[] internalIpPort = ipPortMap.getIpPortInternal().split(NwConstants.MACADDR_SEP);
                     if (ipAddress.equals(internalIpPort[0])) {
 
@@ -222,8 +228,10 @@ public class NatRpcServiceImpl implements OdlNatRpcService {
             // Capturing SNAT information
             List<SnatIpMapping> snatIpMapping = new ArrayList<>();
 
-            for (IntextIpProtocolType protocolType : ipPortMapping.getIntextIpProtocolType()) {
-                for (IpPortMap ipPortMap : protocolType.getIpPortMap()) {
+            for (IntextIpProtocolType protocolType : requireNonNullElse(ipPortMapping.getIntextIpProtocolType(),
+                    Collections.<IntextIpProtocolType>emptyList())) {
+                for (IpPortMap ipPortMap : requireNonNullElse(protocolType.getIpPortMap(),
+                        Collections.<IpPortMap>emptyList())) {
                     String[] internalPortMap = ipPortMap.getIpPortInternal().split(NwConstants.MACADDR_SEP);
                     SnatIpMappingBuilder natIpMappingBuilder = new SnatIpMappingBuilder()
                             .setInternalIp(internalPortMap[0]).setInternalPort(internalPortMap[1])
@@ -243,8 +251,8 @@ public class NatRpcServiceImpl implements OdlNatRpcService {
             LOG.warn("constructNatInformation : No DNAT IP Mapping found for router-uuid {}", routerUuid.getValue());
         } else {
             for (Ports fipPort : fipPorts) {
-                List<InternalToExternalPortMap> ipMapping = fipPort.getInternalToExternalPortMap();
-                for (InternalToExternalPortMap fipMap : ipMapping) {
+                for (InternalToExternalPortMap fipMap : requireNonNullElse(fipPort.getInternalToExternalPortMap(),
+                        Collections.<InternalToExternalPortMap>emptyList())) {
                     DnatIpMappingBuilder natIpMappingBuilder = new DnatIpMappingBuilder()
                             .setExternalIp(fipMap.getExternalIp()).setInternalIp(fipMap.getInternalIp());
                     dnatIpMapping.add(natIpMappingBuilder.build());