Merge lp:~jtv/maas/retire-get_dns_managed_interface into lp:~maas-committers/maas/trunk

Proposed by Jeroen T. Vermeulen
Status: Merged
Approved by: Jeroen T. Vermeulen
Approved revision: no longer in the source branch.
Merged at revision: 1862
Proposed branch: lp:~jtv/maas/retire-get_dns_managed_interface
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 271 lines (+64/-77)
6 files modified
src/maasserver/dns.py (+5/-13)
src/maasserver/forms.py (+3/-10)
src/maasserver/models/node.py (+4/-8)
src/maasserver/models/nodegroup.py (+10/-4)
src/maasserver/models/tests/test_nodegroup.py (+42/-18)
src/maasserver/tests/test_dns.py (+0/-24)
To merge this branch: bzr merge lp:~jtv/maas/retire-get_dns_managed_interface
Reviewer Review Type Date Requested Status
Raphaël Badin (community) Approve
Review via email: mp+203695@code.launchpad.net

Commit message

Retire NodeGroup.get_dns_managed_interface, in favour of the more general NodeGroup.manages_dns().

Description of the change

This also subsumes the helper function is_dns_managed. The change eliminates the last currently known roadblock to permitting multiple DNS-managed nodegroupinterfaces per nodegroup.

Jeroen

To post a comment you must log in.
Revision history for this message
Raphaël Badin (rvb) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/dns.py'
2--- src/maasserver/dns.py 2014-01-28 09:00:22 +0000
3+++ src/maasserver/dns.py 2014-01-29 10:12:13 +0000
4@@ -16,7 +16,6 @@
5 'add_zone',
6 'change_dns_zones',
7 'is_dns_enabled',
8- 'is_dns_managed',
9 'next_zone_serial',
10 'write_full_dns_config',
11 ]
12@@ -31,10 +30,7 @@
13
14 from django.conf import settings
15 from maasserver import logger
16-from maasserver.enum import (
17- NODEGROUP_STATUS,
18- NODEGROUPINTERFACE_MANAGEMENT,
19- )
20+from maasserver.enum import NODEGROUPINTERFACE_MANAGEMENT
21 from maasserver.exceptions import MAASException
22 from maasserver.models import (
23 Config,
24@@ -85,13 +81,6 @@
25 """An error occured when setting up MAAS's DNS server."""
26
27
28-def is_dns_managed(nodegroup):
29- """Does MAAS manage a DNS zone for this Nodegroup?"""
30- return (
31- nodegroup.status == NODEGROUP_STATUS.ACCEPTED and
32- nodegroup.get_dns_managed_interface() is not None)
33-
34-
35 WARNING_MESSAGE = (
36 "The DNS server will use the address '%s', which is inside the "
37 "loopback network. This may not be a problem if you're not using "
38@@ -171,7 +160,10 @@
39 @staticmethod
40 def _filter_dns_managed(nodegroups):
41 """Return the subset of `nodegroups` for which we manage DNS."""
42- return set(filter(is_dns_managed, nodegroups))
43+ return set(
44+ nodegroup
45+ for nodegroup in nodegroups
46+ if nodegroup.manages_dns())
47
48 @staticmethod
49 def _get_forward_nodegroups(domains):
50
51=== modified file 'src/maasserver/forms.py'
52--- src/maasserver/forms.py 2014-01-23 12:00:13 +0000
53+++ src/maasserver/forms.py 2014-01-29 10:12:13 +0000
54@@ -1,4 +1,4 @@
55-# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the
56+# Copyright 2012-2014 Canonical Ltd. This software is licensed under the
57 # GNU Affero General Public License version 3 (see the file LICENSE).
58
59 """Forms."""
60@@ -65,7 +65,6 @@
61 NODE_AFTER_COMMISSIONING_ACTION,
62 NODE_AFTER_COMMISSIONING_ACTION_CHOICES,
63 NODE_STATUS,
64- NODEGROUP_STATUS,
65 NODEGROUPINTERFACE_MANAGEMENT,
66 NODEGROUPINTERFACE_MANAGEMENT_CHOICES,
67 )
68@@ -101,9 +100,7 @@
69 from maasserver.utils import strip_domain
70 from metadataserver.fields import Bin
71 from metadataserver.models import CommissioningScript
72-from provisioningserver.enum import (
73- POWER_TYPE_CHOICES,
74- )
75+from provisioningserver.enum import POWER_TYPE_CHOICES
76
77
78 INVALID_ARCHITECTURE_MESSAGE = compose_invalid_choice_text(
79@@ -867,11 +864,7 @@
80 # No change to the name. Return old name.
81 return old_name
82
83- if self.instance.status != NODEGROUP_STATUS.ACCEPTED:
84- # This nodegroup is not in use. Change it at will.
85- return new_name
86-
87- if self.instance.get_dns_managed_interface() is None:
88+ if not self.instance.manages_dns():
89 # Not managing DNS. There won't be any DNS problems with this
90 # name change then.
91 return new_name
92
93=== modified file 'src/maasserver/models/node.py'
94--- src/maasserver/models/node.py 2014-01-23 08:50:05 +0000
95+++ src/maasserver/models/node.py 2014-01-29 10:12:13 +0000
96@@ -1,4 +1,4 @@
97-# Copyright 2012, 2013 Canonical Ltd. This software is licensed under the
98+# Copyright 2012-2014 Canonical Ltd. This software is licensed under the
99 # GNU Affero General Public License version 3 (see the file LICENSE).
100
101 """Node objects."""
102@@ -38,8 +38,8 @@
103 IntegerField,
104 Manager,
105 ManyToManyField,
106+ Q,
107 SET_DEFAULT,
108- Q,
109 )
110 from django.shortcuts import get_object_or_404
111 import djorm_pgarray.fields
112@@ -72,9 +72,7 @@
113 strip_domain,
114 )
115 from piston.models import Token
116-from provisioningserver.enum import (
117- POWER_TYPE_CHOICES,
118- )
119+from provisioningserver.enum import POWER_TYPE_CHOICES
120 from provisioningserver.tasks import (
121 power_off,
122 power_on,
123@@ -501,9 +499,7 @@
124 on the cluster controller.
125 If not, simply return the node's hostname.
126 """
127- # Avoid circular imports.
128- from maasserver.dns import is_dns_managed
129- if is_dns_managed(self.nodegroup):
130+ if self.nodegroup.manages_dns():
131 # If the hostname field contains a domain, strip it.
132 hostname = strip_domain(self.hostname)
133 # Build the FQDN by using the hostname and nodegroup.name
134
135=== modified file 'src/maasserver/models/nodegroup.py'
136--- src/maasserver/models/nodegroup.py 2014-01-28 04:58:37 +0000
137+++ src/maasserver/models/nodegroup.py 2014-01-29 10:12:13 +0000
138@@ -222,14 +222,20 @@
139 if itf.management != NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED
140 ]
141
142- def get_dns_managed_interface(self):
143- """Return the `NodeGroupInterface`, if any, whose DNS we manage."""
144+ def manages_dns(self):
145+ """Does this `NodeGroup` manage DNS on any interfaces?
146+
147+ This returns `True` when the `NodeGroup` is accepted, and has a
148+ `NodeGroupInterface` that's set to manage both DHCP and DNS.
149+ """
150+ if self.status != NODEGROUP_STATUS.ACCEPTED:
151+ return False
152 # Filter in python instead of in SQL. This will use the cached
153 # version of self.nodegroupinterface_set if present.
154 for itf in self.nodegroupinterface_set.all():
155 if itf.management == NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS:
156- return itf
157- return None
158+ return True
159+ return False
160
161 def ensure_dhcp_key(self):
162 """Ensure that this nodegroup has a dhcp key.
163
164=== modified file 'src/maasserver/models/tests/test_nodegroup.py'
165--- src/maasserver/models/tests/test_nodegroup.py 2014-01-28 04:58:37 +0000
166+++ src/maasserver/models/tests/test_nodegroup.py 2014-01-29 10:12:13 +0000
167@@ -333,27 +333,51 @@
168 args, kwargs = task.apply_async.call_args
169 self.assertEqual(nodegroup.work_queue, kwargs['queue'])
170
171- def test_get_dns_managed_interface_returns_dns_managed_interface(self):
172+ def test_manages_dns_returns_True_if_managing_DNS(self):
173 nodegroup = factory.make_node_group(
174+ status=NODEGROUP_STATUS.ACCEPTED,
175 management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
176- self.assertEqual(
177- nodegroup.nodegroupinterface_set.all()[0],
178- nodegroup.get_dns_managed_interface())
179-
180- def test_get_dns_managed_interface_returns_None_if_dhcp_only(self):
181- nodegroup = factory.make_node_group(
182- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP)
183- self.assertIsNone(nodegroup.get_dns_managed_interface())
184-
185- def test_get_dns_managed_interface_returns_None_if_unmanaged(self):
186- nodegroup = factory.make_node_group(
187- management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED)
188- self.assertIsNone(nodegroup.get_dns_managed_interface())
189-
190- def test_get_dns_managed_interface_returns_None_if_no_interface(self):
191- nodegroup = factory.make_node_group()
192+ self.assertTrue(nodegroup.manages_dns())
193+
194+ def test_manages_dns_returns_False_if_not_accepted(self):
195+ nodegroups = [
196+ factory.make_node_group(
197+ status=status,
198+ management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS)
199+ for status in map_enum(NODEGROUP_STATUS).values()
200+ ]
201+ self.assertEqual(
202+ {
203+ NODEGROUP_STATUS.PENDING: False,
204+ NODEGROUP_STATUS.ACCEPTED: True,
205+ NODEGROUP_STATUS.REJECTED: False,
206+ },
207+ {
208+ nodegroup.status: nodegroup.manages_dns()
209+ for nodegroup in nodegroups
210+ })
211+
212+ def test_manages_dns_returns_False_if_no_interface_manages_DNS(self):
213+ nodegroups = {
214+ management: factory.make_node_group(
215+ status=NODEGROUP_STATUS.ACCEPTED, management=management)
216+ for management in map_enum(NODEGROUPINTERFACE_MANAGEMENT).values()
217+ }
218+ self.assertEqual(
219+ {
220+ NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED: False,
221+ NODEGROUPINTERFACE_MANAGEMENT.DHCP: False,
222+ NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS: True,
223+ },
224+ {
225+ management: nodegroup.manages_dns()
226+ for management, nodegroup in nodegroups.items()
227+ })
228+
229+ def test_manages_dns_returns_False_if_nodegroup_has_no_interfaces(self):
230+ nodegroup = factory.make_node_group(status=NODEGROUP_STATUS.ACCEPTED)
231 nodegroup.nodegroupinterface_set.all().delete()
232- self.assertIsNone(nodegroup.get_dns_managed_interface())
233+ self.assertFalse(nodegroup.manages_dns())
234
235 def test_get_managed_interfaces_returns_list(self):
236 nodegroup = factory.make_node_group()
237
238=== modified file 'src/maasserver/tests/test_dns.py'
239--- src/maasserver/tests/test_dns.py 2014-01-28 10:38:25 +0000
240+++ src/maasserver/tests/test_dns.py 2014-01-29 10:12:13 +0000
241@@ -132,30 +132,6 @@
242 (ip, [(hostname, )]),
243 (dns.get_dns_server_address(nodegroup), resolver.extract_args()))
244
245- def test_is_dns_managed(self):
246- nodegroups_with_expected_results = {
247- factory.make_node_group(
248- status=NODEGROUP_STATUS.PENDING,
249- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS): False,
250- factory.make_node_group(
251- status=NODEGROUP_STATUS.REJECTED,
252- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS): False,
253- factory.make_node_group(
254- status=NODEGROUP_STATUS.ACCEPTED,
255- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS): True,
256- factory.make_node_group(
257- status=NODEGROUP_STATUS.ACCEPTED,
258- management=NODEGROUPINTERFACE_MANAGEMENT.DHCP): False,
259- factory.make_node_group(
260- status=NODEGROUP_STATUS.ACCEPTED,
261- management=NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED): False,
262- }
263- results = {
264- nodegroup: dns.is_dns_managed(nodegroup)
265- for nodegroup, _ in nodegroups_with_expected_results.items()
266- }
267- self.assertEqual(nodegroups_with_expected_results, results)
268-
269
270 class TestLazyDict(TestCase):
271 """Tests for `lazydict`."""