dhcp agent start md-proxy with vrouter id only when has metadata subnet

When user create network with isolated subnet, dhcp agent will
create md-proxy with vrouter id. This will conflict with then md-proxy
created by l3 agent. This patch updated dhcp agent start md-proxy with
vrouter id only when the network has metadata subnet.

Change-Id: I3288327bf9d0cdf759a6fdf365d1289e8b7442db
Closes-Bug: #1703059
This commit is contained in:
Liping Mao (limao) 2017-07-08 10:22:28 +08:00
parent f04c6181e5
commit 13eea520b5
3 changed files with 25 additions and 8 deletions

View File

@ -505,8 +505,11 @@ class DhcpAgent(manager.Manager):
{'port_num': len(router_ports),
'port_id': router_ports[0].id,
'router_id': router_ports[0].device_id})
kwargs = {'router_id': router_ports[0].device_id}
self._metadata_routers[network.id] = router_ports[0].device_id
all_subnets = self.dhcp_driver_cls._get_all_subnets(network)
if self.dhcp_driver_cls.has_metadata_subnet(all_subnets):
kwargs = {'router_id': router_ports[0].device_id}
self._metadata_routers[network.id] = (
router_ports[0].device_id)
metadata_driver.MetadataDriver.spawn_monitored_metadata_proxy(
self._process_monitor, network.namespace, dhcp.METADATA_PORT,

View File

@ -1067,6 +1067,15 @@ class Dnsmasq(DhcpLocalProcess):
return isolated_subnets
@staticmethod
def has_metadata_subnet(subnets):
"""Check if the subnets has a metadata subnet."""
meta_cidr = netaddr.IPNetwork(METADATA_DEFAULT_CIDR)
if any(netaddr.IPNetwork(s.cidr) in meta_cidr
for s in subnets):
return True
return False
@classmethod
def should_enable_metadata(cls, conf, network):
"""Determine whether the metadata proxy is needed for a network
@ -1095,12 +1104,9 @@ class Dnsmasq(DhcpLocalProcess):
if not conf.enable_isolated_metadata:
return False
if conf.enable_metadata_network:
# check if the network has a metadata subnet
meta_cidr = netaddr.IPNetwork(METADATA_DEFAULT_CIDR)
if any(netaddr.IPNetwork(s.cidr) in meta_cidr
for s in all_subnets):
return True
if (conf.enable_metadata_network and
cls.has_metadata_subnet(all_subnets)):
return True
isolated_subnets = cls.get_isolated_subnets(network)
return any(isolated_subnets[s.id] for s in v4_dhcp_subnets)

View File

@ -2279,6 +2279,14 @@ class TestDnsmasq(TestBase):
self.safe.assert_has_calls([mock.call(exp_host_name, exp_host_data),
mock.call(exp_opt_name, exp_opt_data)])
def test_has_metadata_subnet_returns_true(self):
self.assertTrue(dhcp.Dnsmasq.has_metadata_subnet(
[FakeV4MetadataSubnet()]))
def test_has_metadata_subnet_returns_false(self):
self.assertFalse(dhcp.Dnsmasq.has_metadata_subnet(
[FakeV4Subnet()]))
def test_should_enable_metadata_isolated_network_returns_true(self):
self.assertTrue(dhcp.Dnsmasq.should_enable_metadata(
self.conf, FakeV4NetworkNoRouter()))