Bug 4733 - impl/SecurityServicesImpl.java: null pointer exception
authorIsaku Yamahata <isaku.yamahata@intel.com>
Mon, 7 Dec 2015 21:36:48 +0000 (13:36 -0800)
committerSam Hague <shague@redhat.com>
Tue, 15 Dec 2015 01:58:59 +0000 (01:58 +0000)
This patch masks the following null pointer exception.
The code assumes that there is always nodes(ovs switch) corresponding to
neutron port always exists. But this is not always true because there are
race conditions and some tempests tests only run neutron without nova.
So the code shouldn't assume that nodes always exists and also external
attributes in ovsdb always exists. The latter case will be addressed by
another patch.
NOTE: this patch only addresses null pointer exception. The race condition
should be handled somehow later.

> 2015-12-03 18:48:15,562 | ERROR | ntDispatcherImpl | TenantNetworkManagerImpl         | 267 - org.opendaylight.ovsdb.openstack.net-virt - 1.2.1.SNAPSHOT | Exception during handlingNeutron network delete
> java.lang.NullPointerException
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.SouthboundImpl.extractTerminationPointAugmentations(SouthboundImpl.java:482)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.SouthboundImpl.getTerminationPointsOfBridge(SouthboundImpl.java:437)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl.getInterface(SecurityServicesImpl.java:435)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.SecurityServicesImpl.syncSecurityRule(SecurityServicesImpl.java:371)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.PortSecurityHandler.syncSecurityGroup(PortSecurityHandler.java:165)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.PortSecurityHandler.processNeutronSecurityRuleAdded(PortSecurityHandler.java:144)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.PortSecurityHandler.processEvent(PortSecurityHandler.java:130)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.dispatchEvent(EventDispatcherImpl.java:94)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.access$200(EventDispatcherImpl.java:27)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl$1.run(EventDispatcherImpl.java:56)[267:org.opendaylight.ovsdb.openstack.net-virt:1.2.1.SNAPSHOT]
>         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)[:1.8.0_45-internal]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:266)[:1.8.0_45-internal]
>         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_45-internal]
>         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_45-internal]
>         at java.lang.Thread.run(Thread.java:745)[:1.8.0_45-internal]

Change-Id: I37e0a72c4bc4361b678f748bf1df6c926c101cb1
Signed-off-by: Isaku Yamahata <isaku.yamahata@intel.com>
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/LBaaSPoolMemberHandler.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/SecurityGroupCacheManagerImpl.java
openstack/net-virt/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/impl/SecurityServicesImpl.java

index 4b577c0f6a1e13bf6e4c07c09dbbdaa196744caf..7ad5da40b04a280fc878fa1ccd880104aab3eb2a 100755 (executable)
@@ -212,6 +212,10 @@ public class LBaaSPoolMemberHandler extends AbstractHandler
             return null;
         }
         NeutronLoadBalancerPool neutronLBPool = neutronLBPoolCache.getNeutronLoadBalancerPool(memberPoolID);
+        if (neutronLBPool == null) {
+            logger.debug("Neutron LB pool {} unavailable", memberPoolID);
+            return null;
+        }
         memberProtocol = neutronLBPool.getLoadBalancerPoolProtocol();
         if (!(memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_TCP) ||
                 memberProtocol.equalsIgnoreCase(LoadBalancerConfiguration.PROTOCOL_HTTP) ||
index 70c0eef2ce2702d5ae0c7d6413be83d1986a865e..96aa471df94ba8450d5c3e326ceb8373d4e342cc 100644 (file)
@@ -46,6 +46,10 @@ public class SecurityGroupCacheManagerImpl implements ConfigInterface, SecurityG
     public void portAdded(String securityGroupUuid, String portUuid) {
         LOG.debug("In portAdded securityGroupUuid:" + securityGroupUuid + " portUuid:" + portUuid);
         NeutronPort port = neutronPortCache.getPort(portUuid);
+        if (port == null) {
+            LOG.debug("In portAdded no neutron port found:" + " portUuid:" + portUuid);
+            return;
+        }
         processPortAdded(securityGroupUuid,port);
     }
 
@@ -53,6 +57,10 @@ public class SecurityGroupCacheManagerImpl implements ConfigInterface, SecurityG
     public void portRemoved(String securityGroupUuid, String portUuid) {
         LOG.debug("In portRemoved securityGroupUuid:" + securityGroupUuid + " portUuid:" + portUuid);
         NeutronPort port = neutronPortCache.getPort(portUuid);
+        if (port == null) {
+            LOG.debug("In portRemoved no neutron port found:" + " portUuid:" + portUuid);
+            return;
+        }
         processPortRemoved(securityGroupUuid,port);
     }
 
index 967618d2b45515748843fee92e497e6d8009619a..4ece09173499eea5ae3c19b1a421c6f4618191a8 100644 (file)
@@ -148,6 +148,10 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
             /* Get all the ports in the subnet and identify the dhcp port*/
             String subnetUuid = fixedIps.iterator().next().getSubnetUUID();
             NeutronSubnet neutronSubnet = neutronSubnetCache.getSubnet(subnetUuid);
+            if (neutronSubnet == null) {
+                LOG.error("getDHCPServerPort: No subnet is found for " + subnetUuid);
+                return null;
+            }
             List<NeutronPort> ports = neutronSubnet.getPortsInSubnet();
             for (NeutronPort port : ports) {
                 if (port.getDeviceOwner().contains("dhcp")) {
@@ -411,9 +415,18 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
         LOG.trace("syncSecurityGroup:" + securityGroupList + " Write:" + write);
         if (null != port && null != port.getSecurityGroups()) {
             Node node = getNode(port);
+            if (node == null) {
+                return;
+            }
             NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(port.getNetworkUUID());
+            if (neutronNetwork == null) {
+                return;
+            }
             String segmentationId = neutronNetwork.getProviderSegmentationID();
             OvsdbTerminationPointAugmentation intf = getInterface(node, port);
+            if (intf == null) {
+                return;
+            }
             long localPort = southbound.getOFPort(intf);
             String attachedMac = southbound.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC);
             if (attachedMac == null) {
@@ -421,8 +434,15 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
                 return;
             }
             long dpid = getDpidOfIntegrationBridge(node);
+            if (dpid == 0L) {
+                return;
+            }
             String neutronPortId = southbound.getInterfaceExternalIdsValue(intf,
                                                                            Constants.EXTERNAL_ID_INTERFACE_ID);
+            if (neutronPortId == null) {
+                LOG.debug("syncSecurityGroup: No neutronPortId seen in {}", intf);
+                return;
+            }
             for (NeutronSecurityGroup securityGroupInPort:securityGroupList) {
                 ingressAclProvider.programPortSecurityGroup(dpid, segmentationId, attachedMac, localPort,
                                                           securityGroupInPort, neutronPortId, write);
@@ -437,9 +457,18 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
         LOG.trace("syncSecurityGroup:" + securityRule + " Write:" + write);
         if (null != port && null != port.getSecurityGroups()) {
             Node node = getNode(port);
+            if (node == null) {
+                return;
+            }
             NeutronNetwork neutronNetwork = neutronNetworkCache.getNetwork(port.getNetworkUUID());
+            if (neutronNetwork == null) {
+                return;
+            }
             String segmentationId = neutronNetwork.getProviderSegmentationID();
             OvsdbTerminationPointAugmentation intf = getInterface(node, port);
+            if (intf == null) {
+                return;
+            }
             long localPort = southbound.getOFPort(intf);
             String attachedMac = southbound.getInterfaceExternalIdsValue(intf, Constants.EXTERNAL_ID_VM_MAC);
             if (attachedMac == null) {
@@ -447,6 +476,9 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
                 return;
             }
             long dpid = getDpidOfIntegrationBridge(node);
+            if (dpid == 0L) {
+                return;
+            }
             if ("IPv4".equals(securityRule.getSecurityRuleEthertype())
                     && "ingress".equals(securityRule.getSecurityRuleDirection())) {
 
@@ -466,6 +498,9 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
         if (southbound.getBridgeName(node).equals(configurationService.getIntegrationBridgeName())) {
             dpid = getDpid(node);
         }
+        if (dpid == 0L) {
+            LOG.warn("getDpidOfIntegerationBridge: dpid not found: {}", node);
+        }
         return dpid;
     }
 
@@ -497,6 +532,7 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
                 LOG.error("Exception during handlingNeutron network delete", e);
             }
         }
+        LOG.info("no node found for port:" + port);
         return null;
     }
 
@@ -514,6 +550,7 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
         } catch (Exception e) {
             LOG.error("Exception during handlingNeutron network delete", e);
         }
+        LOG.info("no interface found for node: " + node + " port:" + port);
         return null;
     }
 
@@ -542,4 +579,4 @@ public class SecurityServicesImpl implements ConfigInterface, SecurityServicesMa
             egressAclProvider = (EgressAclProvider) impl;
         }
     }
-}
\ No newline at end of file
+}