From 8479c212b79e61aa9b694ec1368a1073898a09d5 Mon Sep 17 00:00:00 2001 From: Alexander Ignatov Date: Thu, 3 Jul 2014 13:51:14 +0400 Subject: [PATCH] Omit mode keyword when spawning dnsmasq with some ipv6 subnets Fix UnboundLocalError for certain cases of ipv6 subnets Closes-Bug: #1335959 Change-Id: I5e4b94d9ba1b13b72e2300b53d5638968e0d3401 --- neutron/agent/linux/dhcp.py | 14 +++++++++++--- neutron/tests/unit/test_linux_dhcp.py | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index f0b0ec05e90..7ea1cdb9381 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -359,6 +359,7 @@ class Dnsmasq(DhcpLocalProcess): possible_leases = 0 for i, subnet in enumerate(self.network.subnets): + mode = None # if a subnet is specified to have dhcp disabled if not subnet.enable_dhcp: continue @@ -373,6 +374,7 @@ class Dnsmasq(DhcpLocalProcess): elif getattr(subnet, 'ipv6_ra_mode', None) is None: # RA mode is not set - do not launch dnsmasq continue + if self.version >= self.MINIMUM_VERSION: set_tag = 'set:' else: @@ -385,9 +387,15 @@ class Dnsmasq(DhcpLocalProcess): else: lease = '%ss' % self.conf.dhcp_lease_duration - cmd.append('--dhcp-range=%s%s,%s,%s,%s' % - (set_tag, self._TAG_PREFIX % i, - cidr.network, mode, lease)) + # mode is optional and is not set - skip it + if mode: + cmd.append('--dhcp-range=%s%s,%s,%s,%s' % + (set_tag, self._TAG_PREFIX % i, + cidr.network, mode, lease)) + else: + cmd.append('--dhcp-range=%s%s,%s,%s' % + (set_tag, self._TAG_PREFIX % i, + cidr.network, lease)) possible_leases += cidr.size diff --git a/neutron/tests/unit/test_linux_dhcp.py b/neutron/tests/unit/test_linux_dhcp.py index e3479c5b144..14b80c79219 100644 --- a/neutron/tests/unit/test_linux_dhcp.py +++ b/neutron/tests/unit/test_linux_dhcp.py @@ -684,7 +684,8 @@ class TestDhcpLocalProcess(TestBase): class TestDnsmasq(TestBase): def _test_spawn(self, extra_options, network=FakeDualNetwork(), - max_leases=16777216, lease_duration=86400): + max_leases=16777216, lease_duration=86400, + has_static=True): def mock_get_conf_file_name(kind, ensure_conf_dir=False): return '/dhcp/%s/%s' % (network.id, kind) @@ -719,7 +720,11 @@ class TestDnsmasq(TestBase): lease_duration = 'infinite' else: seconds = 's' - expected.extend('--dhcp-range=set:tag%d,%s,static,%s%s' % + if has_static: + prefix = '--dhcp-range=set:tag%d,%s,static,%s%s' + else: + prefix = '--dhcp-range=set:tag%d,%s,%s%s' + expected.extend(prefix % (i, s.cidr.split('/')[0], lease_duration, seconds) for i, s in enumerate(network.subnets)) @@ -765,6 +770,14 @@ class TestDnsmasq(TestBase): self.conf.set_override('dhcp_domain', '') self._test_spawn(['--conf-file=']) + def test_spawn_no_dnsmasq_ipv6_mode(self): + network = FakeV6Network() + subnet = FakeV6Subnet() + subnet.ipv6_ra_mode = True + network.subnets = [subnet] + self._test_spawn(['--conf-file=', '--domain=openstacklocal'], + network, has_static=False) + def test_spawn_cfg_dns_server(self): self.conf.set_override('dnsmasq_dns_servers', ['8.8.8.8']) self._test_spawn(['--conf-file=',