Handling for occassional npe in neutron-mapper/vpp-renderer 55/50555/7
authorVladimir Lavor <vlavor@cisco.com>
Tue, 17 Jan 2017 14:56:42 +0000 (15:56 +0100)
committerVladimir Lavor <vlavor@cisco.com>
Tue, 24 Jan 2017 10:17:42 +0000 (10:17 +0000)
Change-Id: I1ec230adca38c1eda083a008d1cc2c579ac79eb8
Signed-off-by: Vladimir Lavor <vlavor@cisco.com>
neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/manager/VppNodeManager.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/policy/ForwardingManager.java

index 07a0129a81c9dcd1d3042f2fa58794e87cd08972..cb177af8fb36c11cda2d42a00ab489037fb55b99 100644 (file)
@@ -15,7 +15,6 @@ import java.util.Set;
 
 import javax.annotation.Nullable;
 
-import com.sun.jndi.cosnaming.IiopUrl;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
@@ -292,6 +291,10 @@ public class NeutronPortAware implements NeutronAware<Port> {
     }
 
     private void changeL3ContextForEpsInSubnet(Uuid subnetUuid, Neutron neutron) {
+        if (neutron == null) {
+            LOG.debug("No new data are written, there is no L3 context in subnet {} to update", subnetUuid);
+            return;
+        }
         Set<Port> portsInSameSubnet = PortUtils.findPortsBySubnet(subnetUuid, neutron.getPorts());
         for (Port portInSameSubnet : portsInSameSubnet) {
             if (PortUtils.isNormalPort(portInSameSubnet) || PortUtils.isDhcpPort(portInSameSubnet)
@@ -566,7 +569,7 @@ public class NeutronPortAware implements NeutronAware<Port> {
             }
             FixedIps portIpWithSubnet = potentialPortIpWithSubnet.get();
             L3ContextId l3Context = new L3ContextId(port.getNetworkId().getValue());
-            // change L3Context for all EPs with same subnet as router port
+            // change L3Context for all new EPs with same subnet as router port
             changeL3ContextForEpsInSubnet(portIpWithSubnet.getSubnetId(), newNeutron);
             // set L3Context as parent for bridge domain which is parent of subnet
             TenantId tenantId = new TenantId(port.getTenantId().getValue());
index 0859505ba0e18be35a69852cf1c26d39bded8c25..4d00d62f8405bfd1a759e6e741efdfe1549b6aa7 100644 (file)
@@ -165,6 +165,7 @@ public class VppNodeManager {
 
     private DataBroker getNodeMountPoint(InstanceIdentifier<Node> mountPointIid) {
         Optional<MountPoint> optionalObject = mountService.getMountPoint(mountPointIid);
+        LOG.debug("Optional mountpoint object: {}", optionalObject);
         MountPoint mountPoint;
         if (optionalObject.isPresent()) {
             mountPoint = optionalObject.get();
index 96bc7fdea411a7c57a7f698ca4c082154775fb3d..461ce4bd0296ba8e42804fc5453e2ac34a6851a7 100644 (file)
@@ -24,7 +24,6 @@ import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.api.BridgeDomainManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.KeyFactory;
-import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppRendererProcessingException;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.NetworkContainment;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.common.endpoint.fields.network.containment.Containment;
@@ -33,8 +32,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.LocationType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.has.absolute.location.absolute.location.location.type.ExternalLocationCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.NetworkDomainId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.L2FloodDomain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.NetworkDomain;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.fields.Parent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpointKey;
@@ -258,10 +259,17 @@ public final class ForwardingManager {
             }
         }
         if (containment instanceof NetworkDomainContainment) {
-            NetworkDomainContainment netDomainCont = (NetworkDomainContainment) containment;
-            RendererNetworkDomain rendererNetworkDomain =
-                    policyCtx.getNetworkDomainTable().get(ep.getTenant(), new RendererNetworkDomainKey(
-                            netDomainCont.getNetworkDomainId(), netDomainCont.getNetworkDomainType()));
+            final NetworkDomainContainment netDomainCont = (NetworkDomainContainment) containment;
+            final TenantId tenantId = ep.getTenant();
+            final NetworkDomainId domainId = netDomainCont.getNetworkDomainId();
+            final Class<? extends NetworkDomain> domainKey = netDomainCont.getNetworkDomainType();
+            final RendererNetworkDomainKey rendererNetworkDomainKey = new RendererNetworkDomainKey(domainId, domainKey);
+            final RendererNetworkDomain rendererNetworkDomain =
+                    policyCtx.getNetworkDomainTable().get(tenantId, rendererNetworkDomainKey);
+            if (rendererNetworkDomain == null) {
+                LOG.debug("Network domain not found. Containment: {}", containment);
+                return java.util.Optional.empty();
+            }
             java.util.Optional<String> optL2Fd = getForwardingCtxForParent(ep.getTenant(),
                     rendererNetworkDomain.getParent(), policyCtx.getForwardingCtxTable())
                         .filter(fwdCtx -> L2FloodDomain.class.equals(fwdCtx.getContextType()))