From c80598dd587e8462a860ab46f1baf3a5a8626f07 Mon Sep 17 00:00:00 2001 From: James Page Date: Mon, 3 Jun 2019 09:39:58 +0100 Subject: [PATCH] Revert "Pass network's dns_domain to dnsmasq conf" The dns_domain attribute of a network is intended for use by neutron when creating DNS records in an external DNS system such as Designate. By using the networks dns_domain, the configured search path on booted instances mismatches with the generated dns assignments for instance ports in the hosts file for dnsmasq which creates a mismatched forward/reverse lookup behaviour. This reverts commit b7796f6c91b74440780056712060da5da69e583f. and commit 137a6d61053fb1cfb9a0a583b5a5c0f6253c75e6. Change-Id: Icf253a2d969828f3bd3c629c3765e15e9769be28 Closes-Bug: 1826419 Depends-On: I145144c042b100f7e12a02a8ac7e0fbbe41e984d --- neutron/agent/linux/dhcp.py | 14 +-- neutron/tests/unit/agent/linux/test_dhcp.py | 103 +++++++----------- .../notes/dns_domain-6f0e628aeb3c650c.yaml | 13 --- 3 files changed, 45 insertions(+), 85 deletions(-) delete mode 100644 releasenotes/notes/dns_domain-6f0e628aeb3c650c.yaml diff --git a/neutron/agent/linux/dhcp.py b/neutron/agent/linux/dhcp.py index 91c366f43bd..3139fb59a9a 100644 --- a/neutron/agent/linux/dhcp.py +++ b/neutron/agent/linux/dhcp.py @@ -131,8 +131,6 @@ class DhcpBase(object): version=None, plugin=None): self.conf = conf self.network = network - self.dns_domain = (self.network.get('dns_domain') or - self.conf.dns_domain) self.process_monitor = process_monitor self.device_manager = DeviceManager(self.conf, plugin) self.version = version @@ -434,8 +432,8 @@ class Dnsmasq(DhcpLocalProcess): for server in self.conf.dnsmasq_dns_servers: cmd.append('--server=%s' % server) - if self.dns_domain: - cmd.append('--domain=%s' % self.dns_domain) + if self.conf.dns_domain: + cmd.append('--domain=%s' % self.conf.dns_domain) if self.conf.dhcp_broadcast_reply: cmd.append('--dhcp-broadcast') @@ -625,8 +623,8 @@ class Dnsmasq(DhcpLocalProcess): hostname = 'host-%s' % alloc.ip_address.replace( '.', '-').replace(':', '-') fqdn = hostname - if self.dns_domain: - fqdn = '%s.%s' % (fqdn, self.dns_domain) + if self.conf.dns_domain: + fqdn = '%s.%s' % (fqdn, self.conf.dns_domain) yield (port, alloc, hostname, fqdn, no_dhcp, no_opts) def _get_port_extra_dhcp_opts(self, port): @@ -989,9 +987,9 @@ class Dnsmasq(DhcpLocalProcess): # dns-server submitted by the server subnet_index_map[subnet.id] = i - if self.dns_domain and subnet.ip_version == 6: + if self.conf.dns_domain and subnet.ip_version == 6: options.append('tag:tag%s,option6:domain-search,%s' % - (i, ''.join(self.dns_domain))) + (i, ''.join(self.conf.dns_domain))) gateway = subnet.gateway_ip host_routes = [] diff --git a/neutron/tests/unit/agent/linux/test_dhcp.py b/neutron/tests/unit/agent/linux/test_dhcp.py index 2b4139fb58a..b8d39d3039d 100644 --- a/neutron/tests/unit/agent/linux/test_dhcp.py +++ b/neutron/tests/unit/agent/linux/test_dhcp.py @@ -462,14 +462,7 @@ class FakeV4SubnetAgentWithNoDnsProvided(FakeV4Subnet): self.host_routes = [] -class FakeNetworkBase(object): - dns_domain = '' - - def get(self, attr): - return getattr(self, attr) - - -class FakeV4MultipleAgentsWithoutDnsProvided(FakeNetworkBase): +class FakeV4MultipleAgentsWithoutDnsProvided(object): def __init__(self): self.id = 'ffffffff-ffff-ffff-ffff-ffffffffffff' self.subnets = [FakeV4SubnetMultipleAgentsWithoutDnsProvided()] @@ -478,7 +471,7 @@ class FakeV4MultipleAgentsWithoutDnsProvided(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4AgentWithoutDnsProvided(FakeNetworkBase): +class FakeV4AgentWithoutDnsProvided(object): def __init__(self): self.id = 'ffffffff-ffff-ffff-ffff-ffffffffffff' self.subnets = [FakeV4SubnetMultipleAgentsWithoutDnsProvided()] @@ -487,7 +480,7 @@ class FakeV4AgentWithoutDnsProvided(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4AgentWithManyDnsProvided(FakeNetworkBase): +class FakeV4AgentWithManyDnsProvided(object): def __init__(self): self.id = 'ffffffff-ffff-ffff-ffff-ffffffffffff' self.subnets = [FakeV4SubnetAgentWithManyDnsProvided()] @@ -496,7 +489,7 @@ class FakeV4AgentWithManyDnsProvided(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4AgentWithNoDnsProvided(FakeNetworkBase): +class FakeV4AgentWithNoDnsProvided(object): def __init__(self): self.id = 'ffffffff-ffff-ffff-ffff-ffffffffffff' self.subnets = [FakeV4SubnetAgentWithNoDnsProvided()] @@ -511,7 +504,7 @@ class FakeV4SubnetMultipleAgentsWithDnsProvided(FakeV4Subnet): self.host_routes = [] -class FakeV4MultipleAgentsWithDnsProvided(FakeNetworkBase): +class FakeV4MultipleAgentsWithDnsProvided(object): def __init__(self): self.id = 'ffffffff-ffff-ffff-ffff-ffffffffffff' self.subnets = [FakeV4SubnetMultipleAgentsWithDnsProvided()] @@ -629,7 +622,7 @@ class FakeV4SubnetNoRouter(FakeV4Subnet): self.dns_nameservers = [] -class FakeV4Network(FakeNetworkBase): +class FakeV4Network(object): def __init__(self): self.id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' self.subnets = [FakeV4Subnet()] @@ -637,7 +630,7 @@ class FakeV4Network(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4NetworkClientId(FakeNetworkBase): +class FakeV4NetworkClientId(object): def __init__(self): self.id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' self.subnets = [FakeV4Subnet()] @@ -645,7 +638,7 @@ class FakeV4NetworkClientId(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4NetworkClientIdNum(FakeNetworkBase): +class FakeV4NetworkClientIdNum(object): def __init__(self): self.id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' self.subnets = [FakeV4Subnet()] @@ -653,7 +646,7 @@ class FakeV4NetworkClientIdNum(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4NetworkClientIdNumStr(FakeNetworkBase): +class FakeV4NetworkClientIdNumStr(object): def __init__(self): self.id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' self.subnets = [FakeV4Subnet()] @@ -661,7 +654,7 @@ class FakeV4NetworkClientIdNumStr(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV6Network(FakeNetworkBase): +class FakeV6Network(object): def __init__(self): self.id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' self.subnets = [FakeV6Subnet()] @@ -669,7 +662,7 @@ class FakeV6Network(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetwork(FakeNetworkBase): +class FakeDualNetwork(object): def __init__(self, domain='openstacklocal'): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV6SubnetDHCPStateful()] @@ -677,10 +670,9 @@ class FakeDualNetwork(FakeNetworkBase): self.ports = [FakePort1(domain=domain), FakeV6Port(domain=domain), FakeDualPort(domain=domain), FakeRouterPort(domain=domain)] - self.dns_domain = domain -class FakeDeviceManagerNetwork(FakeNetworkBase): +class FakeDeviceManagerNetwork(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV6SubnetDHCPStateful()] @@ -691,7 +683,7 @@ class FakeDeviceManagerNetwork(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkReserved(FakeNetworkBase): +class FakeDualNetworkReserved(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV6SubnetDHCPStateful()] @@ -700,7 +692,7 @@ class FakeDualNetworkReserved(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkReserved2(FakeNetworkBase): +class FakeDualNetworkReserved2(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV6SubnetDHCPStateful()] @@ -710,7 +702,7 @@ class FakeDualNetworkReserved2(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeNetworkDhcpPort(FakeNetworkBase): +class FakeNetworkDhcpPort(object): def __init__(self): self.id = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' self.subnets = [FakeV4Subnet()] @@ -718,7 +710,7 @@ class FakeNetworkDhcpPort(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkGatewayRoute(FakeNetworkBase): +class FakeDualNetworkGatewayRoute(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4SubnetGatewayRoute(), FakeV6SubnetDHCPStateful()] @@ -726,7 +718,7 @@ class FakeDualNetworkGatewayRoute(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkSingleDHCP(FakeNetworkBase): +class FakeDualNetworkSingleDHCP(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV4SubnetNoDHCP()] @@ -734,7 +726,7 @@ class FakeDualNetworkSingleDHCP(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkSingleDHCPBothAttaced(FakeNetworkBase): +class FakeDualNetworkSingleDHCPBothAttaced(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' # dhcp-agent actually can't get the subnet with dhcp disabled @@ -743,7 +735,7 @@ class FakeDualNetworkSingleDHCPBothAttaced(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkDualDHCP(FakeNetworkBase): +class FakeDualNetworkDualDHCP(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV4Subnet2()] @@ -751,7 +743,7 @@ class FakeDualNetworkDualDHCP(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkDualDHCPOnLinkSubnetRoutesDisabled(FakeNetworkBase): +class FakeDualNetworkDualDHCPOnLinkSubnetRoutesDisabled(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV4SubnetSegmentID()] @@ -759,7 +751,7 @@ class FakeDualNetworkDualDHCPOnLinkSubnetRoutesDisabled(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeNonLocalSubnets(FakeNetworkBase): +class FakeNonLocalSubnets(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4SubnetSegmentID2()] @@ -768,7 +760,7 @@ class FakeNonLocalSubnets(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeDualNetworkTriDHCPOneOnLinkSubnetRoute(FakeNetworkBase): +class FakeDualNetworkTriDHCPOneOnLinkSubnetRoute(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV4Subnet2(), @@ -778,28 +770,28 @@ class FakeDualNetworkTriDHCPOneOnLinkSubnetRoute(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV4NoGatewayNetwork(FakeNetworkBase): +class FakeV4NoGatewayNetwork(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4SubnetNoGateway()] self.ports = [FakePort1()] -class FakeV4NetworkNoRouter(FakeNetworkBase): +class FakeV4NetworkNoRouter(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4SubnetNoRouter()] self.ports = [FakePort1()] -class FakeV4MetadataNetwork(FakeNetworkBase): +class FakeV4MetadataNetwork(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4MetadataSubnet()] self.ports = [FakeRouterPort(ip_address='169.254.169.253')] -class FakeV4NetworkDistRouter(FakeNetworkBase): +class FakeV4NetworkDistRouter(object): def __init__(self): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet()] @@ -808,7 +800,7 @@ class FakeV4NetworkDistRouter(FakeNetworkBase): dev_owner=constants.DEVICE_OWNER_DVR_INTERFACE)] -class FakeDualV4Pxe3Ports(FakeNetworkBase): +class FakeDualV4Pxe3Ports(object): def __init__(self, port_detail="portsSame"): self.id = 'cccccccc-cccc-cccc-cccc-cccccccccccc' self.subnets = [FakeV4Subnet(), FakeV4SubnetNoDHCP()] @@ -842,7 +834,7 @@ class FakeDualV4Pxe3Ports(FakeNetworkBase): DhcpOpt(opt_name='bootfile-name', opt_value='pxelinux3.0')] -class FakeV4NetworkPxe2Ports(FakeNetworkBase): +class FakeV4NetworkPxe2Ports(object): def __init__(self, port_detail="portsSame"): self.id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' self.subnets = [FakeV4Subnet()] @@ -868,7 +860,7 @@ class FakeV4NetworkPxe2Ports(FakeNetworkBase): DhcpOpt(opt_name='bootfile-name', opt_value='pxelinux.0')] -class FakeV4NetworkPxe3Ports(FakeNetworkBase): +class FakeV4NetworkPxe3Ports(object): def __init__(self, port_detail="portsSame"): self.id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' self.subnets = [FakeV4Subnet()] @@ -902,7 +894,7 @@ class FakeV4NetworkPxe3Ports(FakeNetworkBase): DhcpOpt(opt_name='bootfile-name', opt_value='pxelinux3.0')] -class FakeV6NetworkPxePort(FakeNetworkBase): +class FakeV6NetworkPxePort(object): def __init__(self): self.id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' self.subnets = [FakeV6SubnetDHCPStateful()] @@ -915,7 +907,7 @@ class FakeV6NetworkPxePort(FakeNetworkBase): ip_version=6)] -class FakeV6NetworkPxePortWrongOptVersion(FakeNetworkBase): +class FakeV6NetworkPxePortWrongOptVersion(object): def __init__(self): self.id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' self.subnets = [FakeV6SubnetDHCPStateful()] @@ -928,14 +920,14 @@ class FakeV6NetworkPxePortWrongOptVersion(FakeNetworkBase): ip_version=6)] -class FakeDualStackNetworkSingleDHCP(FakeNetworkBase): +class FakeDualStackNetworkSingleDHCP(object): def __init__(self): self.id = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee' self.subnets = [FakeV4Subnet(), FakeV6SubnetSlaac()] self.ports = [FakePort1(), FakePort4(), FakeRouterPort()] -class FakeDualStackNetworkingSingleDHCPTags(FakeNetworkBase): +class FakeDualStackNetworkingSingleDHCPTags(object): def __init__(self): self.id = 'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee' self.subnets = [FakeV4Subnet(), FakeV6SubnetSlaac()] @@ -946,7 +938,7 @@ class FakeDualStackNetworkingSingleDHCPTags(FakeNetworkBase): opt_value='pxelinux.0')] -class FakeV4NetworkMultipleTags(FakeNetworkBase): +class FakeV4NetworkMultipleTags(object): def __init__(self): self.id = 'dddddddd-dddd-dddd-dddd-dddddddddddd' self.subnets = [FakeV4Subnet()] @@ -956,7 +948,7 @@ class FakeV4NetworkMultipleTags(FakeNetworkBase): DhcpOpt(opt_name='tag:ipxe,bootfile-name', opt_value='pxelinux.0')] -class FakeV6NetworkStatelessDHCP(FakeNetworkBase): +class FakeV6NetworkStatelessDHCP(object): def __init__(self): self.id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' self.subnets = [FakeV6SubnetStateless()] @@ -964,7 +956,7 @@ class FakeV6NetworkStatelessDHCP(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV6NetworkStatelessDHCPNoDnsProvided(FakeNetworkBase): +class FakeV6NetworkStatelessDHCPNoDnsProvided(object): def __init__(self): self.id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' self.subnets = [FakeV6SubnetStatelessNoDnsProvided()] @@ -972,7 +964,7 @@ class FakeV6NetworkStatelessDHCPNoDnsProvided(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeV6NetworkStatelessDHCPBadPrefixLength(FakeNetworkBase): +class FakeV6NetworkStatelessDHCPBadPrefixLength(object): def __init__(self): self.id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' self.subnets = [FakeV6SubnetStatelessBadPrefixLength()] @@ -980,7 +972,7 @@ class FakeV6NetworkStatelessDHCPBadPrefixLength(FakeNetworkBase): self.namespace = 'qdhcp-ns' -class FakeNetworkWithV6SatelessAndV4DHCPSubnets(FakeNetworkBase): +class FakeNetworkWithV6SatelessAndV4DHCPSubnets(object): def __init__(self): self.id = 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb' self.subnets = [FakeV6SubnetStateless(), FakeV4Subnet()] @@ -1336,28 +1328,11 @@ class TestDnsmasq(TestBase): (exp_host_name, exp_host_data, exp_addn_name, exp_addn_data) = self._test_no_dns_domain_alloc_data self.conf.set_override('dns_domain', '') - network = FakeDualNetwork(domain='') + network = FakeDualNetwork(domain=self.conf.dns_domain) self._test_spawn(['--conf-file='], network=network) self.safe.assert_has_calls([mock.call(exp_host_name, exp_host_data), mock.call(exp_addn_name, exp_addn_data)]) - def test_spawn_with_dns_domain_default(self): - network = FakeDualNetwork() - self._test_spawn( - ['--conf-file=', '--domain=openstacklocal'], network=network) - - def test_spawn_with_dns_domain_conf(self): - self.conf.set_override('dns_domain', 'starwars.local') - network = FakeDualNetwork(domain=None) - self._test_spawn( - ['--conf-file=', '--domain=starwars.local'], network=network) - - def test_spawn_with_dns_domain_api(self): - self.conf.set_override('dns_domain', 'wrong.answer') - network = FakeDualNetwork(domain='right.answer') - self._test_spawn( - ['--conf-file=', '--domain=right.answer'], network=network) - def test_spawn_no_dhcp_range(self): network = FakeV6Network() subnet = FakeV6SubnetSlaac() diff --git a/releasenotes/notes/dns_domain-6f0e628aeb3c650c.yaml b/releasenotes/notes/dns_domain-6f0e628aeb3c650c.yaml deleted file mode 100644 index 501f175145a..00000000000 --- a/releasenotes/notes/dns_domain-6f0e628aeb3c650c.yaml +++ /dev/null @@ -1,13 +0,0 @@ ---- -fixes: - - | - Previously a network's dns_domain attribute was ignored by the DHCP agent. - With this release, OpenStack deployments using Neutron's DHCP agent will - be able to specify a per network dns_domain and have instances configure - that domain in their dns resolver configuration files (Linux's - /etc/resolv.conf) to allow for local partial DNS lookups. The per-network - dns_domain value will override the DHCP agent's default dns_domain - configuration value. Note that it's also possible to update a network's - dns_domain, and that new value will be propogated to new instances - or when instances renew their DHCP lease. However, existing leases will - live on with the old dns_domain value.