Add 169.254.169.254 when enable force_metadata
When enable force_metadata in dhcp.ini, and create a network and a subnet, none 169.254.169.254/24 ip info set in related namespace(qdhcp-XXX) with `ip a` command. In this case, vms could not get metadata any more. Change-Id: Ib5b95f3afc6e66f66cdb7e1e98e5450a6e80a1b2 Closes-Bug: #1549793
This commit is contained in:
parent
8582373d61
commit
45bec12cfc
|
@ -1258,7 +1258,7 @@ class DeviceManager(object):
|
||||||
net = netaddr.IPNetwork(subnet.cidr)
|
net = netaddr.IPNetwork(subnet.cidr)
|
||||||
ip_cidrs.append('%s/%s' % (gateway, net.prefixlen))
|
ip_cidrs.append('%s/%s' % (gateway, net.prefixlen))
|
||||||
|
|
||||||
if self.conf.enable_isolated_metadata:
|
if self.conf.force_metadata or self.conf.enable_isolated_metadata:
|
||||||
ip_cidrs.append(METADATA_DEFAULT_CIDR)
|
ip_cidrs.append(METADATA_DEFAULT_CIDR)
|
||||||
|
|
||||||
self.driver.init_l3(interface_name, ip_cidrs,
|
self.driver.init_l3(interface_name, ip_cidrs,
|
||||||
|
|
|
@ -1995,6 +1995,8 @@ class TestDeviceManager(TestConfBase):
|
||||||
# Create DeviceManager.
|
# Create DeviceManager.
|
||||||
self.conf.register_opt(cfg.BoolOpt('enable_isolated_metadata',
|
self.conf.register_opt(cfg.BoolOpt('enable_isolated_metadata',
|
||||||
default=False))
|
default=False))
|
||||||
|
self.conf.register_opt(cfg.BoolOpt('force_metadata',
|
||||||
|
default=False))
|
||||||
plugin = mock.Mock()
|
plugin = mock.Mock()
|
||||||
device = mock.Mock()
|
device = mock.Mock()
|
||||||
mock_IPDevice.return_value = device
|
mock_IPDevice.return_value = device
|
||||||
|
@ -2064,15 +2066,16 @@ class TestDeviceManager(TestConfBase):
|
||||||
self._test_setup(self.mock_load_interface_driver,
|
self._test_setup(self.mock_load_interface_driver,
|
||||||
self.mock_ip_lib, use_gateway_ips=True)
|
self.mock_ip_lib, use_gateway_ips=True)
|
||||||
|
|
||||||
def test_setup_reserved(self):
|
def _test_setup_reserved(self, enable_isolated_metadata=False,
|
||||||
"""Test reserved port case of DeviceManager's DHCP port setup
|
force_metadata=False):
|
||||||
logic.
|
|
||||||
"""
|
|
||||||
|
|
||||||
with mock.patch.object(dhcp.ip_lib, 'IPDevice') as mock_IPDevice:
|
with mock.patch.object(dhcp.ip_lib, 'IPDevice') as mock_IPDevice:
|
||||||
# Create DeviceManager.
|
# Create DeviceManager.
|
||||||
self.conf.register_opt(cfg.BoolOpt('enable_isolated_metadata',
|
self.conf.register_opt(
|
||||||
default=False))
|
cfg.BoolOpt('enable_isolated_metadata',
|
||||||
|
default=enable_isolated_metadata))
|
||||||
|
self.conf.register_opt(
|
||||||
|
cfg.BoolOpt('force_metadata',
|
||||||
|
default=force_metadata))
|
||||||
plugin = mock.Mock()
|
plugin = mock.Mock()
|
||||||
device = mock.Mock()
|
device = mock.Mock()
|
||||||
mock_IPDevice.return_value = device
|
mock_IPDevice.return_value = device
|
||||||
|
@ -2087,8 +2090,8 @@ class TestDeviceManager(TestConfBase):
|
||||||
|
|
||||||
def mock_update(port_id, dict):
|
def mock_update(port_id, dict):
|
||||||
port = reserved_port
|
port = reserved_port
|
||||||
port.network_id = dict['port']['network_id']
|
port.network_id = dict['port'].get('network_id')
|
||||||
port.device_id = dict['port']['device_id']
|
port.device_id = dict['port'].get('device_id')
|
||||||
return port
|
return port
|
||||||
|
|
||||||
plugin.update_dhcp_port.side_effect = mock_update
|
plugin.update_dhcp_port.side_effect = mock_update
|
||||||
|
@ -2099,19 +2102,48 @@ class TestDeviceManager(TestConfBase):
|
||||||
plugin.update_dhcp_port.assert_called_with(reserved_port.id,
|
plugin.update_dhcp_port.assert_called_with(reserved_port.id,
|
||||||
mock.ANY)
|
mock.ANY)
|
||||||
|
|
||||||
|
except_ips = ['192.168.0.6/24']
|
||||||
|
if enable_isolated_metadata or force_metadata:
|
||||||
|
except_ips.append(dhcp.METADATA_DEFAULT_CIDR)
|
||||||
mgr.driver.init_l3.assert_called_with('ns-XXX',
|
mgr.driver.init_l3.assert_called_with('ns-XXX',
|
||||||
['192.168.0.6/24'],
|
except_ips,
|
||||||
namespace='qdhcp-ns')
|
namespace='qdhcp-ns')
|
||||||
|
|
||||||
|
def test_setup_reserved_and_disable_metadata(self):
|
||||||
|
"""Test reserved port case of DeviceManager's DHCP port setup
|
||||||
|
logic which metadata disabled.
|
||||||
|
"""
|
||||||
|
self._test_setup_reserved()
|
||||||
|
|
||||||
|
def test_setup_reserved_with_isolated_metadata_enable(self):
|
||||||
|
"""Test reserved port case of DeviceManager's DHCP port setup
|
||||||
|
logic which isolated_ metadata enabled.
|
||||||
|
"""
|
||||||
|
self._test_setup_reserved(enable_isolated_metadata=True)
|
||||||
|
|
||||||
|
def test_setup_reserved_with_force_metadata_enable(self):
|
||||||
|
"""Test reserved port case of DeviceManager's DHCP port setup
|
||||||
|
logic which force_metadata enabled.
|
||||||
|
"""
|
||||||
|
self._test_setup_reserved(force_metadata=True)
|
||||||
|
|
||||||
|
def test_setup_reserved_and_enable_metadata(self):
|
||||||
|
"""Test reserved port case of DeviceManager's DHCP port setup
|
||||||
|
logic which both isolated_metadata and force_metadata enabled.
|
||||||
|
"""
|
||||||
|
self._test_setup_reserved(enable_isolated_metadata=True,
|
||||||
|
force_metadata=True)
|
||||||
|
|
||||||
def test_setup_reserved_2(self):
|
def test_setup_reserved_2(self):
|
||||||
"""Test scenario where a network has two reserved ports, and
|
"""Test scenario where a network has two reserved ports, and
|
||||||
update_dhcp_port fails for the first of those.
|
update_dhcp_port fails for the first of those.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
with mock.patch.object(dhcp.ip_lib, 'IPDevice') as mock_IPDevice:
|
with mock.patch.object(dhcp.ip_lib, 'IPDevice') as mock_IPDevice:
|
||||||
# Create DeviceManager.
|
# Create DeviceManager.
|
||||||
self.conf.register_opt(cfg.BoolOpt('enable_isolated_metadata',
|
self.conf.register_opt(
|
||||||
default=False))
|
cfg.BoolOpt('enable_isolated_metadata', default=False))
|
||||||
|
self.conf.register_opt(
|
||||||
|
cfg.BoolOpt('force_metadata', default=False))
|
||||||
plugin = mock.Mock()
|
plugin = mock.Mock()
|
||||||
device = mock.Mock()
|
device = mock.Mock()
|
||||||
mock_IPDevice.return_value = device
|
mock_IPDevice.return_value = device
|
||||||
|
@ -2130,8 +2162,8 @@ class TestDeviceManager(TestConfBase):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
port = reserved_port_2
|
port = reserved_port_2
|
||||||
port.network_id = dict['port']['network_id']
|
port.network_id = dict['port'].get('network_id')
|
||||||
port.device_id = dict['port']['device_id']
|
port.device_id = dict['port'].get('device_id')
|
||||||
return port
|
return port
|
||||||
|
|
||||||
plugin.update_dhcp_port.side_effect = mock_update
|
plugin.update_dhcp_port.side_effect = mock_update
|
||||||
|
|
Loading…
Reference in New Issue