Merge "Update DHCP port information during setup"
This commit is contained in:
commit
3fbc9151c4
neutron
@ -718,7 +718,7 @@ class DhcpPluginApi(object):
|
|||||||
and update_dhcp_port methods.
|
and update_dhcp_port methods.
|
||||||
1.5 - Added dhcp_ready_on_ports
|
1.5 - Added dhcp_ready_on_ports
|
||||||
1.7 - Added get_networks
|
1.7 - Added get_networks
|
||||||
|
1.8 - Added get_dhcp_port
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, topic, host):
|
def __init__(self, topic, host):
|
||||||
@ -776,6 +776,13 @@ class DhcpPluginApi(object):
|
|||||||
network_id=network_id, device_id=device_id,
|
network_id=network_id, device_id=device_id,
|
||||||
host=self.host)
|
host=self.host)
|
||||||
|
|
||||||
|
def get_dhcp_port(self, port_id):
|
||||||
|
"""Make a remote process call to retrieve the dhcp port."""
|
||||||
|
cctxt = self.client.prepare(version='1.8')
|
||||||
|
port = cctxt.call(self.context, 'get_dhcp_port', port_id=port_id)
|
||||||
|
if port:
|
||||||
|
return dhcp.DictModel(port)
|
||||||
|
|
||||||
def dhcp_ready_on_ports(self, port_ids):
|
def dhcp_ready_on_ports(self, port_ids):
|
||||||
"""Notify the server that DHCP is configured for the port."""
|
"""Notify the server that DHCP is configured for the port."""
|
||||||
cctxt = self.client.prepare(version='1.5')
|
cctxt = self.client.prepare(version='1.5')
|
||||||
|
@ -1391,6 +1391,37 @@ class DeviceManager(object):
|
|||||||
fixed_ips=unique_ip_subnets)
|
fixed_ips=unique_ip_subnets)
|
||||||
return self.plugin.create_dhcp_port({'port': port_dict})
|
return self.plugin.create_dhcp_port({'port': port_dict})
|
||||||
|
|
||||||
|
def _check_dhcp_port_subnet(self, dhcp_port, dhcp_subnets, network):
|
||||||
|
"""Check if DHCP port IPs are in the range of the DHCP subnets
|
||||||
|
|
||||||
|
FIXME(kevinbenton): ensure we have the IPs we actually need.
|
||||||
|
can be removed once bug/1627480 is fixed
|
||||||
|
"""
|
||||||
|
if self.driver.use_gateway_ips:
|
||||||
|
return
|
||||||
|
|
||||||
|
expected = set(dhcp_subnets)
|
||||||
|
actual = {fip.subnet_id for fip in dhcp_port.fixed_ips}
|
||||||
|
missing = expected - actual
|
||||||
|
if not missing:
|
||||||
|
return
|
||||||
|
|
||||||
|
LOG.debug('Requested DHCP port with IPs on subnets %(expected)s '
|
||||||
|
'but only got IPs on subnets %(actual)s.',
|
||||||
|
{'expected': expected, 'actual': actual})
|
||||||
|
updated_dhcp_port = self.plugin.get_dhcp_port(dhcp_port.id)
|
||||||
|
actual = {fip.subnet_id for fip in updated_dhcp_port.fixed_ips}
|
||||||
|
missing = expected - actual
|
||||||
|
if missing:
|
||||||
|
raise exceptions.SubnetMismatchForPort(
|
||||||
|
port_id=updated_dhcp_port.id, subnet_id=list(missing)[0])
|
||||||
|
|
||||||
|
self._update_dhcp_port(network, updated_dhcp_port)
|
||||||
|
LOG.debug('Previous DHCP port information: %(dhcp_port)s. Updated '
|
||||||
|
'DHCP port information: %(updated_dhcp_port)s.',
|
||||||
|
{'dhcp_port': dhcp_port,
|
||||||
|
'updated_dhcp_port': updated_dhcp_port})
|
||||||
|
|
||||||
def setup_dhcp_port(self, network):
|
def setup_dhcp_port(self, network):
|
||||||
"""Create/update DHCP port for the host if needed and return port."""
|
"""Create/update DHCP port for the host if needed and return port."""
|
||||||
|
|
||||||
@ -1416,19 +1447,8 @@ class DeviceManager(object):
|
|||||||
else:
|
else:
|
||||||
raise exceptions.Conflict()
|
raise exceptions.Conflict()
|
||||||
|
|
||||||
# FIXME(kevinbenton): ensure we have the IPs we actually need.
|
self._check_dhcp_port_subnet(dhcp_port, dhcp_subnets, network)
|
||||||
# can be removed once bug/1627480 is fixed
|
|
||||||
if not self.driver.use_gateway_ips:
|
|
||||||
expected = set(dhcp_subnets)
|
|
||||||
actual = {fip.subnet_id for fip in dhcp_port.fixed_ips}
|
|
||||||
missing = expected - actual
|
|
||||||
if missing:
|
|
||||||
LOG.debug("Requested DHCP port with IPs on subnets "
|
|
||||||
"%(expected)s but only got IPs on subnets "
|
|
||||||
"%(actual)s.", {'expected': expected,
|
|
||||||
'actual': actual})
|
|
||||||
raise exceptions.SubnetMismatchForPort(
|
|
||||||
port_id=dhcp_port.id, subnet_id=list(missing)[0])
|
|
||||||
# Convert subnet_id to subnet dict
|
# Convert subnet_id to subnet dict
|
||||||
fixed_ips = [dict(subnet_id=fixed_ip.subnet_id,
|
fixed_ips = [dict(subnet_id=fixed_ip.subnet_id,
|
||||||
ip_address=fixed_ip.ip_address,
|
ip_address=fixed_ip.ip_address,
|
||||||
|
@ -71,10 +71,11 @@ class DhcpRpcCallback(object):
|
|||||||
# DHCP agent since Havana, so similar rationale for not bumping
|
# DHCP agent since Havana, so similar rationale for not bumping
|
||||||
# the major version as above applies here too.
|
# the major version as above applies here too.
|
||||||
# 1.7 - Add get_networks
|
# 1.7 - Add get_networks
|
||||||
|
# 1.8 - Add get_dhcp_port
|
||||||
|
|
||||||
target = oslo_messaging.Target(
|
target = oslo_messaging.Target(
|
||||||
namespace=constants.RPC_NAMESPACE_DHCP_PLUGIN,
|
namespace=constants.RPC_NAMESPACE_DHCP_PLUGIN,
|
||||||
version='1.7')
|
version='1.8')
|
||||||
|
|
||||||
def _get_active_networks(self, context, **kwargs):
|
def _get_active_networks(self, context, **kwargs):
|
||||||
"""Retrieve and return a list of the active networks."""
|
"""Retrieve and return a list of the active networks."""
|
||||||
@ -313,6 +314,13 @@ class DhcpRpcCallback(object):
|
|||||||
'%(port_id)s which no longer exists.',
|
'%(port_id)s which no longer exists.',
|
||||||
{'host': host, 'port_id': port['id']})
|
{'host': host, 'port_id': port['id']})
|
||||||
|
|
||||||
|
@db_api.retry_db_errors
|
||||||
|
def get_dhcp_port(self, context, **kwargs):
|
||||||
|
"""Retrieve the DHCP port"""
|
||||||
|
port_id = kwargs.get('port_id')
|
||||||
|
plugin = directory.get_plugin()
|
||||||
|
return plugin.get_port(context, port_id)
|
||||||
|
|
||||||
@db_api.retry_db_errors
|
@db_api.retry_db_errors
|
||||||
def dhcp_ready_on_ports(self, context, port_ids):
|
def dhcp_ready_on_ports(self, context, port_ids):
|
||||||
for port_id in port_ids:
|
for port_id in port_ids:
|
||||||
|
@ -1906,7 +1906,21 @@ class TestDeviceManager(base.BaseTestCase):
|
|||||||
[{'subnet_id': fake_fixed_ip1.subnet_id}],
|
[{'subnet_id': fake_fixed_ip1.subnet_id}],
|
||||||
'device_id': mock.ANY}})])
|
'device_id': mock.ANY}})])
|
||||||
|
|
||||||
def test_create_dhcp_port_update_add_subnet_bug_1627480(self):
|
def test__check_dhcp_port_subnet(self):
|
||||||
|
# this can go away once bug/1627480 is fixed
|
||||||
|
plugin = mock.Mock()
|
||||||
|
fake_port_copy = copy.deepcopy(fake_port1)
|
||||||
|
fake_port_copy.fixed_ips = [fake_fixed_ip1, fake_fixed_ip_subnet2]
|
||||||
|
plugin.get_dhcp_port.return_value = fake_port_copy
|
||||||
|
dh = dhcp.DeviceManager(cfg.CONF, plugin)
|
||||||
|
fake_network_copy = copy.deepcopy(fake_network)
|
||||||
|
fake_network_copy.ports[0].device_id = dh.get_device_id(fake_network)
|
||||||
|
fake_network_copy.subnets[1].enable_dhcp = True
|
||||||
|
plugin.update_dhcp_port.return_value = fake_network.ports[0]
|
||||||
|
dh.setup_dhcp_port(fake_network_copy)
|
||||||
|
self.assertEqual(fake_port_copy, fake_network_copy.ports[0])
|
||||||
|
|
||||||
|
def test__check_dhcp_port_subnet_port_missing_subnet(self):
|
||||||
# this can go away once bug/1627480 is fixed
|
# this can go away once bug/1627480 is fixed
|
||||||
plugin = mock.Mock()
|
plugin = mock.Mock()
|
||||||
dh = dhcp.DeviceManager(cfg.CONF, plugin)
|
dh = dhcp.DeviceManager(cfg.CONF, plugin)
|
||||||
@ -1914,6 +1928,7 @@ class TestDeviceManager(base.BaseTestCase):
|
|||||||
fake_network_copy.ports[0].device_id = dh.get_device_id(fake_network)
|
fake_network_copy.ports[0].device_id = dh.get_device_id(fake_network)
|
||||||
fake_network_copy.subnets[1].enable_dhcp = True
|
fake_network_copy.subnets[1].enable_dhcp = True
|
||||||
plugin.update_dhcp_port.return_value = fake_network.ports[0]
|
plugin.update_dhcp_port.return_value = fake_network.ports[0]
|
||||||
|
plugin.get_dhcp_port.return_value = fake_network_copy.ports[0]
|
||||||
with testtools.ExpectedException(exceptions.SubnetMismatchForPort):
|
with testtools.ExpectedException(exceptions.SubnetMismatchForPort):
|
||||||
dh.setup_dhcp_port(fake_network_copy)
|
dh.setup_dhcp_port(fake_network_copy)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user