Finally let L3 and DHCP agents cleanup namespaces by default
There has been a problem with iproute package that resulted in errors when deleting the namespaces, so deleting was turned off by default. According to tests with iproute version 3.12.0 there is no such issue so the option could be safely turned on by default. DocImpact Related-Bug: #1052535 Related-Bug: #1402739 Change-Id: I4c831f98fb2462382ef0f9216e265555186b965a
This commit is contained in:
parent
e9997b1c76
commit
723162501a
@ -77,13 +77,12 @@
|
|||||||
# Use broadcast in DHCP replies
|
# Use broadcast in DHCP replies
|
||||||
# dhcp_broadcast_reply = False
|
# dhcp_broadcast_reply = False
|
||||||
|
|
||||||
# dhcp_delete_namespaces, which is false by default, can be set to True if
|
# dhcp_delete_namespaces, which is True by default, can be set to False if
|
||||||
# namespaces can be deleted cleanly on the host running the dhcp agent.
|
# namespaces can't be deleted cleanly on the host running the DHCP agent.
|
||||||
# Do not enable this until you understand the problem with the Linux iproute
|
# Disable this if you hit the issue in
|
||||||
# utility mentioned in https://bugs.launchpad.net/neutron/+bug/1052535 and
|
# https://bugs.launchpad.net/neutron/+bug/1052535 or if
|
||||||
# you are sure that your version of iproute does not suffer from the problem.
|
# you are sure that your version of iproute suffers from the problem.
|
||||||
# If True, namespaces will be deleted when a dhcp server is disabled.
|
# dhcp_delete_namespaces = True
|
||||||
# dhcp_delete_namespaces = False
|
|
||||||
|
|
||||||
# Timeout for ovs-vsctl commands.
|
# Timeout for ovs-vsctl commands.
|
||||||
# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
|
# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
|
||||||
|
@ -85,13 +85,13 @@
|
|||||||
# Iptables mangle mark used to mark ingress from external network
|
# Iptables mangle mark used to mark ingress from external network
|
||||||
# external_ingress_mark = 0x2
|
# external_ingress_mark = 0x2
|
||||||
|
|
||||||
# router_delete_namespaces, which is false by default, can be set to True if
|
# router_delete_namespaces, which is True by default, can be set to False if
|
||||||
# namespaces can be deleted cleanly on the host running the L3 agent.
|
# namespaces can't be deleted cleanly on the host running the L3 agent.
|
||||||
# Do not enable this until you understand the problem with the Linux iproute
|
# Disable this if you hit the issue in
|
||||||
# utility mentioned in https://bugs.launchpad.net/neutron/+bug/1052535 and
|
# https://bugs.launchpad.net/neutron/+bug/1052535 or if
|
||||||
# you are sure that your version of iproute does not suffer from the problem.
|
# you are sure that your version of iproute suffers from the problem.
|
||||||
# If True, namespaces will be deleted when a router is destroyed.
|
# If True, namespaces will be deleted when a router is destroyed.
|
||||||
# router_delete_namespaces = False
|
# router_delete_namespaces = True
|
||||||
|
|
||||||
# Timeout for ovs-vsctl commands.
|
# Timeout for ovs-vsctl commands.
|
||||||
# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
|
# If the timeout expires, ovs commands will fail with ALARMCLOCK error.
|
||||||
|
@ -49,7 +49,7 @@ DNSMASQ_OPTS = [
|
|||||||
help=_('Comma-separated list of the DNS servers which will be '
|
help=_('Comma-separated list of the DNS servers which will be '
|
||||||
'used as forwarders.'),
|
'used as forwarders.'),
|
||||||
deprecated_name='dnsmasq_dns_server'),
|
deprecated_name='dnsmasq_dns_server'),
|
||||||
cfg.BoolOpt('dhcp_delete_namespaces', default=False,
|
cfg.BoolOpt('dhcp_delete_namespaces', default=True,
|
||||||
help=_("Delete namespace after removing a dhcp server.")),
|
help=_("Delete namespace after removing a dhcp server.")),
|
||||||
cfg.IntOpt(
|
cfg.IntOpt(
|
||||||
'dnsmasq_lease_max',
|
'dnsmasq_lease_max',
|
||||||
|
@ -76,7 +76,7 @@ OPTS = [
|
|||||||
"to the network and not through this parameter. ")),
|
"to the network and not through this parameter. ")),
|
||||||
cfg.BoolOpt('enable_metadata_proxy', default=True,
|
cfg.BoolOpt('enable_metadata_proxy', default=True,
|
||||||
help=_("Allow running metadata proxy.")),
|
help=_("Allow running metadata proxy.")),
|
||||||
cfg.BoolOpt('router_delete_namespaces', default=False,
|
cfg.BoolOpt('router_delete_namespaces', default=True,
|
||||||
help=_("Delete namespace after removing a router.")),
|
help=_("Delete namespace after removing a router.")),
|
||||||
cfg.StrOpt('metadata_access_mark',
|
cfg.StrOpt('metadata_access_mark',
|
||||||
default='0x1',
|
default='0x1',
|
||||||
|
@ -204,7 +204,6 @@ class L3ConfigFixture(ConfigFixture):
|
|||||||
'OVSInterfaceDriver'),
|
'OVSInterfaceDriver'),
|
||||||
'ovs_integration_bridge': integration_bridge,
|
'ovs_integration_bridge': integration_bridge,
|
||||||
'external_network_bridge': self._generate_external_bridge(),
|
'external_network_bridge': self._generate_external_bridge(),
|
||||||
'router_delete_namespaces': 'True',
|
|
||||||
'debug': 'True',
|
'debug': 'True',
|
||||||
'verbose': 'True',
|
'verbose': 'True',
|
||||||
}
|
}
|
||||||
|
1
neutron/tests/functional/agent/test_l3_agent.py
Executable file → Normal file
1
neutron/tests/functional/agent/test_l3_agent.py
Executable file → Normal file
@ -83,7 +83,6 @@ class L3AgentTestFramework(base.BaseSudoTestCase):
|
|||||||
conf.set_override(
|
conf.set_override(
|
||||||
'interface_driver',
|
'interface_driver',
|
||||||
'neutron.agent.linux.interface.OVSInterfaceDriver')
|
'neutron.agent.linux.interface.OVSInterfaceDriver')
|
||||||
conf.set_override('router_delete_namespaces', True)
|
|
||||||
|
|
||||||
br_int = self.useFixture(net_helpers.OVSBridgeFixture()).bridge
|
br_int = self.useFixture(net_helpers.OVSBridgeFixture()).bridge
|
||||||
br_ex = self.useFixture(net_helpers.OVSBridgeFixture()).bridge
|
br_ex = self.useFixture(net_helpers.OVSBridgeFixture()).bridge
|
||||||
|
@ -1941,6 +1941,7 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
|
|||||||
self.mock_ip.del_veth.assert_called_once_with('rfp-aaaa')
|
self.mock_ip.del_veth.assert_called_once_with('rfp-aaaa')
|
||||||
|
|
||||||
def test_destroy_router_namespace_skips_ns_removal(self):
|
def test_destroy_router_namespace_skips_ns_removal(self):
|
||||||
|
self.conf.set_override('router_delete_namespaces', False)
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
ns = namespaces.Namespace(
|
ns = namespaces.Namespace(
|
||||||
'qrouter-bar', self.conf, agent.driver, agent.use_ipv6)
|
'qrouter-bar', self.conf, agent.driver, agent.use_ipv6)
|
||||||
@ -1949,7 +1950,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
|
|||||||
self.assertEqual(self.mock_ip.netns.delete.call_count, 0)
|
self.assertEqual(self.mock_ip.netns.delete.call_count, 0)
|
||||||
|
|
||||||
def test_destroy_router_namespace_removes_ns(self):
|
def test_destroy_router_namespace_removes_ns(self):
|
||||||
self.conf.set_override('router_delete_namespaces', True)
|
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
ns = namespaces.Namespace(
|
ns = namespaces.Namespace(
|
||||||
'qrouter-bar', self.conf, agent.driver, agent.use_ipv6)
|
'qrouter-bar', self.conf, agent.driver, agent.use_ipv6)
|
||||||
@ -2149,7 +2149,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
|
|||||||
other_namespaces,
|
other_namespaces,
|
||||||
mock_snat_ns,
|
mock_snat_ns,
|
||||||
mock_router_ns):
|
mock_router_ns):
|
||||||
self.conf.set_override('router_delete_namespaces', True)
|
|
||||||
|
|
||||||
good_namespace_list = [namespaces.NS_PREFIX + r['id']
|
good_namespace_list = [namespaces.NS_PREFIX + r['id']
|
||||||
for r in router_list]
|
for r in router_list]
|
||||||
@ -2281,7 +2280,6 @@ class TestBasicRouterOperations(BasicRouterOperationsFramework):
|
|||||||
|
|
||||||
def _test_external_gateway_removed_ext_gw_port_and_fip(self, fip_ns=False):
|
def _test_external_gateway_removed_ext_gw_port_and_fip(self, fip_ns=False):
|
||||||
self.conf.set_override('state_path', '/tmp')
|
self.conf.set_override('state_path', '/tmp')
|
||||||
self.conf.set_override('router_delete_namespaces', True)
|
|
||||||
|
|
||||||
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
agent = l3_agent.L3NATAgent(HOSTNAME, self.conf)
|
||||||
agent.conf.agent_mode = 'dvr_snat'
|
agent.conf.agent_mode = 'dvr_snat'
|
||||||
|
@ -742,6 +742,7 @@ class TestDhcpLocalProcess(TestBase):
|
|||||||
self._assert_disabled(lp)
|
self._assert_disabled(lp)
|
||||||
|
|
||||||
def test_disable(self):
|
def test_disable(self):
|
||||||
|
self.conf.set_override('dhcp_delete_namespaces', False)
|
||||||
attrs_to_mock = dict([(a, mock.DEFAULT) for a in
|
attrs_to_mock = dict([(a, mock.DEFAULT) for a in
|
||||||
['active', 'interface_name']])
|
['active', 'interface_name']])
|
||||||
network = FakeDualNetwork()
|
network = FakeDualNetwork()
|
||||||
@ -760,7 +761,6 @@ class TestDhcpLocalProcess(TestBase):
|
|||||||
self.assertEqual(ip.return_value.netns.delete.call_count, 0)
|
self.assertEqual(ip.return_value.netns.delete.call_count, 0)
|
||||||
|
|
||||||
def test_disable_delete_ns(self):
|
def test_disable_delete_ns(self):
|
||||||
self.conf.set_override('dhcp_delete_namespaces', True)
|
|
||||||
attrs_to_mock = {'active': mock.DEFAULT}
|
attrs_to_mock = {'active': mock.DEFAULT}
|
||||||
|
|
||||||
with mock.patch.multiple(LocalChild, **attrs_to_mock) as mocks:
|
with mock.patch.multiple(LocalChild, **attrs_to_mock) as mocks:
|
||||||
|
Loading…
Reference in New Issue
Block a user