diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index c55dc96e977..50ec1be2ed8 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -462,7 +462,8 @@ class Dnsmasq(DhcpLocalProcess): cmd.append('--dhcp-option-force=option:T2,%ds' % self.conf.dhcp_rebinding_time) - cmd.append('--conf-file=%s' % self.conf.dnsmasq_config_file) + cmd.append('--conf-file=%s' % + (self.conf.dnsmasq_config_file.strip() or '/dev/null')) for server in self.conf.dnsmasq_dns_servers: cmd.append('--server=%s' % server) diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 6104e484534..f88b05957c1 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -1287,6 +1287,21 @@ class TestDnsmasq(TestBase): def mock_get_conf_file_name(kind): return '/dhcp/%s/%s' % (network.id, kind) + # Empty string passed to --conf-file in dnsmasq is invalid + # we must force '' to '/dev/null' because the dhcp agent + # does the same. Therefore we allow empty string to + # be passed to neutron but not to dnsmasq. + def check_conf_file_empty(cmd_list): + for i in cmd_list: + conf_file = '' + value = '' + if i.startswith('--conf-file='): + conf_file = i + value = i[12:].strip() + if not value: + idx = cmd_list.index(conf_file) + cmd_list[idx] = '--conf-file=/dev/null' + # if you need to change this path here, think twice, # that means pid files will move around, breaking upgrades # or backwards-compatibility @@ -1348,7 +1363,9 @@ class TestDnsmasq(TestBase): expected.append('--dhcp-option-force=option:T1,%ds' % dhcp_t1) if dhcp_t2: expected.append('--dhcp-option-force=option:T2,%ds' % dhcp_t2) + expected.extend(extra_options) + check_conf_file_empty(expected) self.execute.return_value = ('', '')