Merge "Delete metadata_proxy for network if it is not needed" into stable/liberty
This commit is contained in:
commit
bf98181abb
|
@ -245,6 +245,12 @@ class DhcpAgent(manager.Manager):
|
||||||
if subnet.ip_version == 4 and subnet.enable_dhcp:
|
if subnet.ip_version == 4 and subnet.enable_dhcp:
|
||||||
self.enable_isolated_metadata_proxy(network)
|
self.enable_isolated_metadata_proxy(network)
|
||||||
break
|
break
|
||||||
|
elif (self.conf.use_namespaces and not self.conf.force_metadata and
|
||||||
|
not self.conf.enable_isolated_metadata):
|
||||||
|
# In the case that the dhcp agent ran with metadata enabled,
|
||||||
|
# and dhcp agent now starts with metadata disabled, check and
|
||||||
|
# delete any metadata_proxy.
|
||||||
|
self.disable_isolated_metadata_proxy(network)
|
||||||
|
|
||||||
def disable_dhcp_helper(self, network_id):
|
def disable_dhcp_helper(self, network_id):
|
||||||
"""Disable DHCP for a network known to the agent."""
|
"""Disable DHCP for a network known to the agent."""
|
||||||
|
|
|
@ -27,6 +27,7 @@ from neutron.agent.common import ovs_lib
|
||||||
from neutron.agent.dhcp import agent
|
from neutron.agent.dhcp import agent
|
||||||
from neutron.agent import dhcp_agent
|
from neutron.agent import dhcp_agent
|
||||||
from neutron.agent.linux import dhcp
|
from neutron.agent.linux import dhcp
|
||||||
|
from neutron.agent.linux import external_process
|
||||||
from neutron.agent.linux import interface
|
from neutron.agent.linux import interface
|
||||||
from neutron.agent.linux import ip_lib
|
from neutron.agent.linux import ip_lib
|
||||||
from neutron.agent.linux import utils
|
from neutron.agent.linux import utils
|
||||||
|
@ -80,6 +81,8 @@ class DHCPAgentOVSTestFramework(base.BaseSudoTestCase):
|
||||||
|
|
||||||
self.ovs_driver = interface.OVSInterfaceDriver(self.conf)
|
self.ovs_driver = interface.OVSInterfaceDriver(self.conf)
|
||||||
|
|
||||||
|
self.conf.set_override('check_child_processes_interval', 1, 'AGENT')
|
||||||
|
|
||||||
def network_dict_for_dhcp(self, dhcp_enabled=True, ip_version=4):
|
def network_dict_for_dhcp(self, dhcp_enabled=True, ip_version=4):
|
||||||
net_id = uuidutils.generate_uuid()
|
net_id = uuidutils.generate_uuid()
|
||||||
subnet_dict = self.create_subnet_dict(
|
subnet_dict = self.create_subnet_dict(
|
||||||
|
@ -232,6 +235,12 @@ class DHCPAgentOVSTestFramework(base.BaseSudoTestCase):
|
||||||
self.addCleanup(proc.wait)
|
self.addCleanup(proc.wait)
|
||||||
self.addCleanup(proc.kill)
|
self.addCleanup(proc.kill)
|
||||||
|
|
||||||
|
def _get_metadata_proxy_process(self, network):
|
||||||
|
return external_process.ProcessManager(
|
||||||
|
self.conf,
|
||||||
|
network.id,
|
||||||
|
network.namespace)
|
||||||
|
|
||||||
|
|
||||||
class DHCPAgentOVSTestCase(DHCPAgentOVSTestFramework):
|
class DHCPAgentOVSTestCase(DHCPAgentOVSTestFramework):
|
||||||
|
|
||||||
|
@ -260,3 +269,38 @@ class DHCPAgentOVSTestCase(DHCPAgentOVSTestFramework):
|
||||||
port.mac_address = str(bad_mac_address)
|
port.mac_address = str(bad_mac_address)
|
||||||
self._plug_port_for_dhcp_request(network, port)
|
self._plug_port_for_dhcp_request(network, port)
|
||||||
self.assert_bad_allocation_for_port(network, port)
|
self.assert_bad_allocation_for_port(network, port)
|
||||||
|
|
||||||
|
def _spawn_network_metadata_proxy(self):
|
||||||
|
network = self.network_dict_for_dhcp()
|
||||||
|
self.conf.set_override('enable_isolated_metadata', True)
|
||||||
|
self.addCleanup(self.agent.disable_isolated_metadata_proxy, network)
|
||||||
|
self.configure_dhcp_for_network(network=network)
|
||||||
|
pm = self._get_metadata_proxy_process(network)
|
||||||
|
utils.wait_until_true(
|
||||||
|
lambda: pm.active,
|
||||||
|
timeout=5,
|
||||||
|
sleep=0.01,
|
||||||
|
exception=RuntimeError("Metadata proxy didn't spawn"))
|
||||||
|
return (pm, network)
|
||||||
|
|
||||||
|
def test_metadata_proxy_respawned(self):
|
||||||
|
pm, network = self._spawn_network_metadata_proxy()
|
||||||
|
old_pid = pm.pid
|
||||||
|
|
||||||
|
utils.execute(['kill', '-9', old_pid], run_as_root=True)
|
||||||
|
utils.wait_until_true(
|
||||||
|
lambda: pm.active and pm.pid != old_pid,
|
||||||
|
timeout=5,
|
||||||
|
sleep=0.1,
|
||||||
|
exception=RuntimeError("Metadata proxy didn't respawn"))
|
||||||
|
|
||||||
|
def test_stale_metadata_proxy_killed(self):
|
||||||
|
pm, network = self._spawn_network_metadata_proxy()
|
||||||
|
|
||||||
|
self.conf.set_override('enable_isolated_metadata', False)
|
||||||
|
self.configure_dhcp_for_network(network=network)
|
||||||
|
utils.wait_until_true(
|
||||||
|
lambda: not pm.active,
|
||||||
|
timeout=5,
|
||||||
|
sleep=0.1,
|
||||||
|
exception=RuntimeError("Stale metadata proxy didn't get killed"))
|
||||||
|
|
|
@ -617,11 +617,14 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
||||||
mock.call.get_network_info(network.id)])
|
mock.call.get_network_info(network.id)])
|
||||||
self.call_driver.assert_called_once_with('enable', network)
|
self.call_driver.assert_called_once_with('enable', network)
|
||||||
self.cache.assert_has_calls([mock.call.put(network)])
|
self.cache.assert_has_calls([mock.call.put(network)])
|
||||||
if is_isolated_network:
|
if is_isolated_network and enable_isolated_metadata:
|
||||||
self.external_process.assert_has_calls([
|
self.external_process.assert_has_calls([
|
||||||
self._process_manager_constructor_call(),
|
self._process_manager_constructor_call(),
|
||||||
mock.call().enable()
|
mock.call().enable()])
|
||||||
])
|
elif not enable_isolated_metadata:
|
||||||
|
self.external_process.assert_has_calls([
|
||||||
|
self._process_manager_constructor_call(ns=None),
|
||||||
|
mock.call().disable()])
|
||||||
else:
|
else:
|
||||||
self.assertFalse(self.external_process.call_count)
|
self.assertFalse(self.external_process.call_count)
|
||||||
|
|
||||||
|
@ -723,6 +726,7 @@ class TestDhcpAgentEventHandler(base.BaseTestCase):
|
||||||
def test_enable_dhcp_helper_driver_failure(self):
|
def test_enable_dhcp_helper_driver_failure(self):
|
||||||
self.plugin.get_network_info.return_value = fake_network
|
self.plugin.get_network_info.return_value = fake_network
|
||||||
self.call_driver.return_value = False
|
self.call_driver.return_value = False
|
||||||
|
cfg.CONF.set_override('enable_isolated_metadata', True)
|
||||||
self.dhcp.enable_dhcp_helper(fake_network.id)
|
self.dhcp.enable_dhcp_helper(fake_network.id)
|
||||||
self.plugin.assert_has_calls(
|
self.plugin.assert_has_calls(
|
||||||
[mock.call.get_network_info(fake_network.id)])
|
[mock.call.get_network_info(fake_network.id)])
|
||||||
|
|
Loading…
Reference in New Issue