Merge "BUG #4029 : null pointer exception at NeutronL3Adapter.java:251"
[netvirt.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / impl / NeutronL3Adapter.java
index 31adf9a765f5ee735ee99436e86959af765bd547..de664cbb803b02c99343b2af78e10d276725c251 100644 (file)
@@ -214,8 +214,10 @@ public class NeutronL3Adapter implements ConfigInterface {
 
                 if(externalNetwork != null){
                     if(externalNetwork.isRouterExternal()){
-                        final NeutronSubnet externalSubnet = neutronSubnetCache.getSubnet(neutronPort.getFixedIPs().get(0).getSubnetUUID());
-                        if(externalSubnet != null){
+                        final NeutronSubnet externalSubnet = getExternalNetworkSubnet(neutronPort);
+                        // TODO support IPv6
+                        if (externalSubnet != null &&
+                            externalSubnet.getIpVersion() == 4) {
                             gatewayMacResolver.stopPeriodicRefresh(new Ipv4Address(externalSubnet.getGatewayIP()));
                         }
                     }
@@ -1254,14 +1256,15 @@ public class NeutronL3Adapter implements ConfigInterface {
     }
 
     private NeutronSubnet getExternalNetworkSubnet(NeutronPort gatewayPort){
-        NeutronSubnet extSubnet = null;
-        for (NeutronSubnet subnet : neutronSubnetCache.getAllSubnets()){
-            if(subnet.getPortsInSubnet().contains(gatewayPort)){
-                extSubnet = subnet;
-                break;
+        for (Neutron_IPs neutronIPs : gatewayPort.getFixedIPs()) {
+            String subnetUUID = neutronIPs.getSubnetUUID();
+            NeutronSubnet extSubnet = neutronSubnetCache.getSubnet(subnetUUID);
+            if (extSubnet.getGatewayIP() == null) {
+                continue;
             }
+            return extSubnet;
         }
-        return extSubnet;
+        return null;
     }
 
     public void triggerGatewayMacResolver(final Node node, final NeutronPort gatewayPort ){
@@ -1273,41 +1276,39 @@ public class NeutronL3Adapter implements ConfigInterface {
         if(externalNetwork != null){
             if(externalNetwork.isRouterExternal()){
                 final NeutronSubnet externalSubnet = getExternalNetworkSubnet(gatewayPort);
-                if(externalSubnet != null){
-                    if(externalSubnet.getGatewayIP() != null){
-                        LOG.info("Trigger MAC resolution for gateway ip {} on Node {}", externalSubnet.getGatewayIP(), node.getNodeId());
-
-                        ListenableFuture<MacAddress> gatewayMacAddress =
-                                gatewayMacResolver.resolveMacAddress(getDpidForExternalBridge(node),
-                                        new Ipv4Address(externalSubnet.getGatewayIP()),
-                                        new Ipv4Address(gatewayPort.getFixedIPs().get(0).getIpAddress()),
-                                        new MacAddress(gatewayPort.getMacAddress()),
-                                        true);
-                        if(gatewayMacAddress != null){
-                            Futures.addCallback(gatewayMacAddress, new FutureCallback<MacAddress>(){
-                                @Override
-                                public void onSuccess(MacAddress result) {
-                                    if(result != null){
-                                        if(!result.getValue().equals(externalRouterMac)){
-                                            updateExternalRouterMac(result.getValue());
-                                            LOG.info("Resolved MAC address for gateway IP {} is {}", externalSubnet.getGatewayIP(),result.getValue());
-                                        }
-                                    }else{
-                                        LOG.warn("MAC address resolution failed for gateway IP {}", externalSubnet.getGatewayIP());
-                                    }
-                                }
 
-                                @Override
-                                public void onFailure(Throwable t) {
+                // TODO: address IPv6 case.
+                if (externalSubnet != null &&
+                    externalSubnet.getIpVersion() == 4) {
+                    LOG.info("Trigger MAC resolution for gateway ip {} on Node {}",externalSubnet.getGatewayIP(),node.getNodeId());
+                    ListenableFuture<MacAddress> gatewayMacAddress =
+                        gatewayMacResolver.resolveMacAddress(getDpidForExternalBridge(node),
+                                                             new Ipv4Address(externalSubnet.getGatewayIP()),
+                                                             new Ipv4Address(gatewayPort.getFixedIPs().get(0).getIpAddress()),
+                                                             new MacAddress(gatewayPort.getMacAddress()),
+                                                             true);
+                    if(gatewayMacAddress != null){
+                        Futures.addCallback(gatewayMacAddress, new FutureCallback<MacAddress>(){
+                            @Override
+                            public void onSuccess(MacAddress result) {
+                                if(result != null){
+                                    if(!result.getValue().equals(externalRouterMac)){
+                                        updateExternalRouterMac(result.getValue());
+                                        LOG.info("Resolved MAC address for gateway IP {} is {}", externalSubnet.getGatewayIP(),result.getValue());
+                                    }
+                                }else{
                                     LOG.warn("MAC address resolution failed for gateway IP {}", externalSubnet.getGatewayIP());
                                 }
-                            }, gatewayMacResolverPool);
-                        }
-                    }else{
-                        LOG.warn("No gateway IP address found for external subnet {}", externalSubnet);
+                            }
+
+                            @Override
+                            public void onFailure(Throwable t) {
+                                LOG.warn("MAC address resolution failed for gateway IP {}", externalSubnet.getGatewayIP());
+                            }
+                        }, gatewayMacResolverPool);
                     }
-                }else{
-                    LOG.warn("Neutron subnet not found for external network {}", externalNetwork);
+                } else {
+                    LOG.warn("No gateway IP address found for external network {}", externalNetwork);
                 }
             }
         }else{