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>
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()));
}
}
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),