workaround: external arp resolver doesn't know IPv6 94/24494/3
authorIsaku Yamahata <isaku.yamahata@intel.com>
Fri, 24 Jul 2015 02:18:11 +0000 (19:18 -0700)
committerIsaku Yamahata <isaku.yamahata@intel.com>
Fri, 14 Aug 2015 04:10:04 +0000 (21:10 -0700)
ovsdb net-virt doesn't support IPv6 yet. On the other hand opensatck
neutron Kilo release supports IPv6.
So as work around, ignore subnet of IPv6 in external arp resolver.
Otherwise the following exception occurs.

> 2015-07-22 15:23:31,185 | ERROR | ntDispatcherImpl | EventDispatcher                  | 400 - org.opendaylight.ovsdb.openstack.net-virt - 1.2.0.SNAPSHOT | Exception in dispatching event NorthboundEvent [handler=NEUTRON_PORT, action=ADD, port=NeutronPort [portUUID=02b4a96c-e117-47e6-8af6-174edaf49c66, networkUUID=15f6f0f3-233a-4e8e-9efa-5ed092aca8b4, name=, adminStateUp=true, status=null, macAddress=FA:16:3E:57:87:DB, fixedIPs=[Neutron_IPs{ipAddress='172.24.4.3', subnetUUID='39cc05f6-dd5e-488a-b13e-b954fb2e0a9d'}, Neutron_IPs{ipAddress='2001:db8::3', subnetUUID='67ba5967-ff6a-4dc0-aea3-cd59d7bd12ef'}], deviceID=076e7e06-8d4f-42a5-9a1a-e8f41a0993d4, deviceOwner=network:router_gateway, tenantID=d41ad324d7a740b685895f6054dc41d7, floatingIPMap={}, securityGroups=[], bindinghostID=, bindingvnicType=normal, bindingvnicType=normal], subnet=null, router=null, routerInterface=null, floatingIP=null, network=null, loadBalancer=null, loadBalancerPool=null, loadBalancerPoolMember=null]
> java.lang.IllegalArgumentException: Supplied value "2001:db8::2" does not match required pattern "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?$"
>         at com.google.common.base.Preconditions.checkArgument(Preconditions.java:145)[39:com.google.guava:18.0.0]
>         at org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address.<init>(Ipv4Address.java:50)[49:org.opendaylight.yangtools.model.ietf-inet-types:2010.9.24.8-SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter.triggerGatewayMacResolver(NeutronL3Adapter.java:1289)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter.handleNeutronPortEvent(NeutronL3Adapter.java:212)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.PortHandler.doNeutronPortCreated(PortHandler.java:68)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.PortHandler.processEvent(PortHandler.java:164)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.dispatchEvent(EventDispatcherImpl.java:97)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl.access$100(EventDispatcherImpl.java:30)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at org.opendaylight.ovsdb.openstack.netvirt.impl.EventDispatcherImpl$1.run(EventDispatcherImpl.java:59)[400:org.opendaylight.ovsdb.openstack.net-virt:1.2.0.SNAPSHOT]
>         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)[:1.7.0_79]
>         at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.0_79]
>         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[:1.7.0_79]
>         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[:1.7.0_79]
>         at java.lang.Thread.run(Thread.java:745)[:1.7.0_79]

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

index cae6d3be651c8cab9a69ef57a935f297f69d3599..73bacd458f9c5ad8045ea1af83262df6d313b0d7 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()));
                         }
                     }
@@ -1272,7 +1274,10 @@ public class NeutronL3Adapter implements ConfigInterface {
         if(externalNetwork != null){
             if(externalNetwork.isRouterExternal()){
                 final NeutronSubnet externalSubnet = getExternalNetworkSubnet(gatewayPort);
-                if (externalSubnet != null) {
+
+                // 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),