Bug 7298: NPE in vpn manager 82/48982/5
authorDavid Goldberg <gdavid@hpe.com>
Wed, 23 Nov 2016 10:38:51 +0000 (12:38 +0200)
committerAlon Kochba <alonko@hpe.com>
Wed, 7 Dec 2016 13:11:12 +0000 (13:11 +0000)
NPE in vpn manager when configuring layer 3 services directly without
using neutron.

Change-Id: Ife4d422807141ee0766bfe10fc9eaccaff44952e
Signed-off-by: David Goldberg <gdavid@hpe.com>
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java

index 4f5eed712580f1ca7c2d4bd715e3e92b067c031c..64515239271ed3dda9c91fd761f417d2fa19c96d 100644 (file)
@@ -57,6 +57,10 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
 
         short tableId = notification.getTableId().getValue();
         byte[] data = notification.getPayload();
+        if (notification.getMatch() == null || notification.getMatch().getMetadata() == null) {
+            LOG.debug("on packet received where the match or metadata are null");
+            return;
+        }
         BigInteger metadata = notification.getMatch().getMetadata().getMetadata();
         Ethernet res = new Ethernet();
 
index 715321692ad5fef9ab952d869d2e59dedc0fe5a7..92b8eb417ddfee72323109d8a7ee1a9c73d6b143 100644 (file)
@@ -475,19 +475,23 @@ public class VpnInstanceListener extends AsyncDataTreeChangeListenerBase<VpnInst
             List<String> ertList = new ArrayList<String>();
             List<String> irtList = new ArrayList<String>();
 
-            for (VpnTarget vpnTarget : vpnTargetList) {
-                if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.ExportExtcommunity) {
-                    ertList.add(vpnTarget.getVrfRTValue());
-                }
-                if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.ImportExtcommunity) {
-                    irtList.add(vpnTarget.getVrfRTValue());
-                }
-                if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.Both) {
-                    ertList.add(vpnTarget.getVrfRTValue());
-                    irtList.add(vpnTarget.getVrfRTValue());
+            if (vpnTargetList != null) {
+                for (VpnTarget vpnTarget : vpnTargetList) {
+                    if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.ExportExtcommunity) {
+                        ertList.add(vpnTarget.getVrfRTValue());
+                    }
+                    if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.ImportExtcommunity) {
+                        irtList.add(vpnTarget.getVrfRTValue());
+                    }
+                    if (vpnTarget.getVrfRTType() == VpnTarget.VrfRTType.Both) {
+                        ertList.add(vpnTarget.getVrfRTValue());
+                        irtList.add(vpnTarget.getVrfRTValue());
+                    }
                 }
+            } else {
+                LOG.error("vpn target list is empty, cannot add BGP VPN {} VRF {}", this.vpnName, rd);
+                return false;
             }
-
             try {
                 bgpManager.addVrf(rd, irtList, ertList);
             } catch (Exception e) {
index d7ed71fa25c311461d0231c8ceebc2054c231556..34ba7201567fb1da21e107cb212e832ba47a3e67 100755 (executable)
@@ -1338,9 +1338,15 @@ public class VpnUtil {
     static Optional<IpAddress> getGatewayIpAddressFromInterface(String srcInterface,
             INeutronVpnManager neutronVpnService, DataBroker dataBroker) {
         Optional <IpAddress> gatewayIp = Optional.absent();
-        Port port = neutronVpnService.getNeutronPort(srcInterface);
-        //TODO(Gobinath): Need to fix this as assuming port will belong to only one Subnet would be incorrect"
-        gatewayIp = Optional.of(neutronVpnService.getNeutronSubnet(port.getFixedIps().get(0).getSubnetId()).getGatewayIp());
+        if (neutronVpnService != null) {
+            //TODO(Gobinath): Need to fix this as assuming port will belong to only one Subnet would be incorrect"
+            Port port = neutronVpnService.getNeutronPort(srcInterface);
+            if (port != null && port.getFixedIps() != null && port.getFixedIps().get(0) != null && port.getFixedIps().get(0).getSubnetId() != null) {
+                gatewayIp = Optional.of(neutronVpnService.getNeutronSubnet(port.getFixedIps().get(0).getSubnetId()).getGatewayIp());
+            }
+        } else {
+            LOG.debug("neutron vpn service is not configured");
+        }
         return gatewayIp;
     }