Bug 8863: NPE at VpnFloatingIpHandler 54/60554/3
authorkarthikeyan <karthikeyan.k@altencalsoftlabs.com>
Wed, 19 Jul 2017 09:12:03 +0000 (14:42 +0530)
committerVivekanandan Narasimhan <n.vivekanandan@ericsson.com>
Thu, 10 Aug 2017 10:42:55 +0000 (10:42 +0000)
Problem Description:
=======================
The following exception was observed from VpnFloatingIpHandler in CSIT

Error in generate label or fib install process
java.lang.NullPointerException: Supplied value may not be null
org.opendaylight.netvirt.natservice.internal.VpnFloatingIpHandler.lambda$onAddFloatingIp$0(VpnFloatingIpHandler.java:194)[307:org.opendaylight.netvirt.natservice-impl:0.5.0.SNAPSHOT]

Solution:
=========
We need to enhance the pre-condition check in VpnFloatingIpHandler before
proceeding with any DNAT flow installation.

Have added the required null check for floatingIp ADD/REMOVE methods.

Change-Id: Ic516f8afc325a1e6eb515481abb2d0fef411336a
Signed-off-by: karthikeyan <karthikeyan.k@altencalsoftlabs.com>
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java

index 16817f1ebcb7cc6c691a5a314a4b0a7443dc06c5..783fb7bb7f1548d522ef309e8162c38fdadd093b 100644 (file)
@@ -132,18 +132,33 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
         Uuid floatingIpId = mapping.getExternalId();
         Uuid subnetId = NatUtil.getFloatingIpPortSubnetIdFromFloatingIpId(dataBroker, floatingIpId);
         String floatingIpPortMacAddress = NatUtil.getFloatingIpPortMacFromFloatingIpId(dataBroker, floatingIpId);
+        if (floatingIpPortMacAddress == null) {
+            LOG.error("onAddFloatingIp: Unable to retrieve floatingIp port MAC address from floatingIpId {} for "
+                    + "router {} to handle floatingIp {}", floatingIpId, routerId, externalIp);
+            return;
+        }
         Optional<Subnets> externalSubnet = NatUtil.getOptionalExternalSubnets(dataBroker, subnetId);
         final String vpnName = externalSubnet.isPresent() ? subnetId.getValue() :
             NatUtil.getAssociatedVPN(dataBroker, networkId, LOG);
         final String subnetVpnName = externalSubnet.isPresent() ? subnetId.getValue() : null;
         if (vpnName == null) {
-            LOG.error("onAddFloatingIp : No VPN associated with ext nw {} to handle add floating ip configuration {} "
-                    + "in router {}", networkId, externalIp, routerId);
+            LOG.error("onAddFloatingIp: No VPN is associated with ext nw {} to handle add floating ip {} configuration "
+                    + "for router {}", networkId, externalIp, routerId);
             return;
         }
         String rd = NatUtil.getVpnRd(dataBroker, vpnName);
+        if (rd == null) {
+            LOG.error("onAddFloatingIp: Unable to retrieve external (internet) VPN RD from external VPN {} for "
+                    + "router {} to handle floatingIp {}", vpnName, routerId, externalIp);
+            return;
+        }
         String nextHopIp = NatUtil.getEndpointIpAddressForDPN(dataBroker, dpnId);
-        LOG.debug("onAddFloatingIp : Nexthop ip for prefix {} is {}", externalIp, nextHopIp);
+        if (nextHopIp == null) {
+            LOG.error("onAddFloatingIp: Unable to retrieve nextHopIp for DPN {} to handle floatingIp {}",
+                    dpnId, externalIp);
+            return;
+        }
+        LOG.debug("onAddFloatingIp: Nexthop ip for prefix {} is {}", externalIp, nextHopIp);
         WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
         ProviderTypes provType = NatEvpnUtil.getExtNwProvTypeFromRouterName(dataBroker, routerId);
         if (provType == null) {
@@ -258,14 +273,19 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
         final String vpnName = externalSubnet.isPresent() ? subnetId.getValue() :
             NatUtil.getAssociatedVPN(dataBroker, networkId, LOG);
         if (vpnName == null) {
-            LOG.warn("onRemoveFloatingIp : No VPN associated with ext nw {} to handle remove floating ip "
-                    + "configuration {} in router {}", networkId, externalIp, routerId);
+            LOG.error("onRemoveFloatingIp: No VPN associated with ext nw {} to remove floating ip {} configuration "
+                    + "for router {}", networkId, externalIp, routerId);
             return;
         }
 
         //Remove floating mac from mymac table
-        LOG.debug("onRemoveFloatingIp : Removing FloatingIp {}", externalIp);
+        LOG.debug("onRemoveFloatingIp: Removing FloatingIp {}", externalIp);
         String floatingIpPortMacAddress = NatUtil.getFloatingIpPortMacFromFloatingIpId(dataBroker, floatingIpId);
+        if (floatingIpPortMacAddress == null) {
+            LOG.error("onRemoveFloatingIp: Unable to retrieve floatingIp port MAC address from floatingIpId {} for "
+                    + "router {} to remove floatingIp {}", floatingIpId, routerId, externalIp);
+            return;
+        }
         if (floatingIpPortMacAddress != null) {
             WriteTransaction writeTx = dataBroker.newWriteOnlyTransaction();
             String networkVpnName =  NatUtil.getAssociatedVPN(dataBroker, networkId, LOG);