diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-02-14 06:03:12 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-02-14 06:03:12 +0000 |
| commit | 16fc2fd78c7b77b20cadbbc893a9d3571170ab87 (patch) | |
| tree | 1427484577e4618f7a95ed2579864327298d64e8 | |
| parent | 53d8b4b252a33d0f049b600a9201c5674e118186 (diff) | |
| parent | 43ee5a9763b2239168f510255e282f5eea19248f (diff) | |
Merge "Allow multiple dns servers when starting dnsmasq"
| -rw-r--r-- | nova/network/linux_net.py | 29 | ||||
| -rw-r--r-- | nova/tests/network/test_linux_net.py | 67 |
2 files changed, 89 insertions, 7 deletions
diff --git a/nova/network/linux_net.py b/nova/network/linux_net.py index 08a2ae354..edbabfc08 100644 --- a/nova/network/linux_net.py +++ b/nova/network/linux_net.py @@ -61,9 +61,14 @@ linux_net_opts = [ cfg.IntOpt('dhcp_lease_time', default=120, help='Lifetime of a DHCP lease in seconds'), - cfg.StrOpt('dns_server', - default=None, - help='if set, uses specific dns server for dnsmasq'), + cfg.MultiStrOpt('dns_server', + default=[], + help='if set, uses specific dns server for dnsmasq. Can' + 'be specified multiple times.'), + cfg.BoolOpt('use_network_dns_servers', + default=False, + help='if set, uses the dns1 and dns2 from the network ref.' + 'as dns servers.'), cfg.ListOpt('dmz_cidr', default=[], help='A list of dmz range that should be accepted'), @@ -961,11 +966,21 @@ def restart_dhcp(context, dev, network_ref): '--dhcp-hostsfile=%s' % _dhcp_file(dev, 'conf'), '--dhcp-script=%s' % CONF.dhcpbridge, '--leasefile-ro'] - if network_ref['multi_host'] and not CONF.dns_server: - cmd += ['--no-hosts', '--addn-hosts=%s' % _dhcp_file(dev, 'hosts')] - if CONF.dns_server: - cmd += ['-h', '-R', '--server=%s' % CONF.dns_server] + dns_servers = set(CONF.dns_server) + if CONF.use_network_dns_servers: + if network_ref.get('dns1'): + dns_servers.add(network_ref.get('dns1')) + if network_ref.get('dns2'): + dns_servers.add(network_ref.get('dns2')) + if network_ref['multi_host'] or dns_servers: + cmd.append('--no-hosts') + if network_ref['multi_host']: + '--addn-hosts=%s' % _dhcp_file(dev, 'hosts') + if dns_servers: + cmd.append('--no-resolv') + for dns_server in dns_servers: + cmd.append('--server=%s' % dns_server) if CONF.use_single_default_gateway: cmd += ['--dhcp-optsfile=%s' % _dhcp_file(dev, 'opts')] diff --git a/nova/tests/network/test_linux_net.py b/nova/tests/network/test_linux_net.py index bc21b80ad..50c98e78c 100644 --- a/nova/tests/network/test_linux_net.py +++ b/nova/tests/network/test_linux_net.py @@ -24,6 +24,7 @@ from nova import context from nova import db from nova.network import driver from nova.network import linux_net +from nova.openstack.common import cfg from nova.openstack.common import fileutils from nova.openstack.common import log as logging from nova.openstack.common import timeutils @@ -31,6 +32,7 @@ from nova import test from nova import utils LOG = logging.getLogger(__name__) +CONF = cfg.CONF HOST = "testhost" @@ -472,6 +474,71 @@ class LinuxNetworkTestCase(test.TestCase): driver.plug(network, "fakemac") self.assertEqual(info['passed_interface'], "override_interface") + def _test_dnsmasq_execute(self, extra_expected=None): + network_ref = {'id': 'fake', + 'label': 'fake', + 'multi_host': False, + 'cidr': '10.0.0.0/24', + 'dns1': '8.8.4.4', + 'dhcp_start': '1.0.0.2', + 'dhcp_server': '10.0.0.1'} + executes = [] + + def fake_execute(*args, **kwargs): + executes.append(args) + return "", "" + + self.stubs.Set(linux_net, '_execute', fake_execute) + + self.stubs.Set(os, 'chmod', lambda *a, **kw: None) + self.stubs.Set(linux_net, 'write_to_file', lambda *a, **kw: None) + self.stubs.Set(linux_net, '_dnsmasq_pid_for', lambda *a, **kw: None) + dev = 'br100' + linux_net.restart_dhcp(self.context, dev, network_ref) + expected = ['env', + 'CONFIG_FILE=%s' % CONF.dhcpbridge_flagfile, + 'NETWORK_ID=fake', + 'dnsmasq', + '--strict-order', + '--bind-interfaces', + '--conf-file=%s' % CONF.dnsmasq_config_file, + '--domain=%s' % CONF.dhcp_domain, + '--pid-file=%s' % linux_net._dhcp_file(dev, 'pid'), + '--listen-address=%s' % network_ref['dhcp_server'], + '--except-interface=lo', + "--dhcp-range=set:'%s',%s,static,%ss" % (network_ref['label'], + network_ref['dhcp_start'], + CONF.dhcp_lease_time), + '--dhcp-lease-max=256', + '--dhcp-hostsfile=%s' % linux_net._dhcp_file(dev, 'conf'), + '--dhcp-script=%s' % CONF.dhcpbridge, + '--leasefile-ro'] + if extra_expected: + expected += extra_expected + self.assertEqual([tuple(expected)], executes) + + def test_dnsmasq_execute(self): + self._test_dnsmasq_execute() + + def test_dnsmasq_execute_dns_servers(self): + self.flags(dns_server=['1.1.1.1', '2.2.2.2']) + expected = [ + '--no-hosts', + '--no-resolv', + '--server=1.1.1.1', + '--server=2.2.2.2', + ] + self._test_dnsmasq_execute(expected) + + def test_dnsmasq_execute_use_network_dns_servers(self): + self.flags(use_network_dns_servers=True) + expected = [ + '--no-hosts', + '--no-resolv', + '--server=8.8.4.4', + ] + self._test_dnsmasq_execute(expected) + def test_isolated_host(self): self.flags(fake_network=False, share_dhcp_address=True) |
