014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent Traceback (most recent call last):
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/common/utils.py", line 341, in call
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent return func(*args, **kwargs)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/l3_agent.py", line 938, in process_router
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent self.external_gateway_added(ri, ex_gw_port, interface_name)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/l3_agent.py", line 1318, in external_gateway_added
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent ri.ns_name, preserve_ips)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/l3_agent.py", line 1362, in _external_gateway_added
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent preserve_ips=preserve_ips)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/interface.py", line 120, in init_l3
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent device.route.add_gateway(gateway)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/ip_lib.py", line 395, in add_gateway
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent self._as_root(*args)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/ip_lib.py", line 242, in _as_root
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent kwargs.get('use_root_namespace', False))
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/ip_lib.py", line 74, in _as_root
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent log_fail_as_error=self.log_fail_as_error)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/ip_lib.py", line 86, in _execute
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent log_fail_as_error=log_fail_as_error)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent File "/usr/lib/python2.7/site-packages/neutron/agent/linux/utils.py", line 84, in execute
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent raise RuntimeError(m)
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent RuntimeError:
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent Command: ['sudo', 'neutron-rootwrap', '/etc/neutron/rootwrap.conf', 'ip', 'netns', 'exec', 'qrouter-bcfe22ff-049c-4eb9-9b57-235d903ee52f', 'ip', 'route', 'replace', 'default', 'via', '37.187.128.254', 'dev', 'qg-eaa2de59-95']
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent Exit code: 2
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent Stdout: ''
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent Stderr: 'RTNETLINK answers: Network is unreachable\n'
2014-11-30 16:25:10.113 8086 TRACE neutron.agent.l3_agent
This happens because we should set an on-link route to the gateway IP
on the external network interface first.
Once this works, we can remove the "force_gateway_on_subnet" deprecation,
to allow this not to be enforced, as it's a valid use case in many data centers.
This is a POC patch, which must be updated to check if gateway belongs to
subnet , or if it doesn't:
diff --git a/neutron/ agent/linux/ interface. py b/neutron/ agent/linux/ interface. py agent/linux/ interface. py agent/linux/ interface. py river(object) :
namespace= namespace,
ip=ip_ cidr)
index 538527b..5a9f186 100644
--- a/neutron/
+++ b/neutron/
@@ -116,15 +116,16 @@ class LinuxInterfaceD
- if gateway: route.add_ gateway( gateway)
new_onlink_ routes = set(s['cidr'] for s in extra_subnets) routes. update( [gateway] )
existing_ onlink_ routes = set(device. route.list_ onlink_ routes( )) onlink_ routes:
device. route.add_ onlink_ route(route) onlink_ routes - new_onlink_routes:
device. route.delete_ onlink_ route(route) route.add_ gateway( gateway)
- device.
-
+ if gateway:
+ new_onlink_
for route in new_onlink_routes - existing_
for route in existing_
+ if gateway:
+ device.
def delete_ conntrack_ state(self, root_helper, namespace, ip):
"""Delete conntrack state associated with an IP address.