Merge lp:~mpontillo/maas/ntp-issues--bug-1695083 into lp:~maas-committers/maas/trunk

Proposed by Mike Pontillo
Status: Merged
Approved by: Mike Pontillo
Approved revision: no longer in the source branch.
Merged at revision: 6073
Proposed branch: lp:~mpontillo/maas/ntp-issues--bug-1695083
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 85 lines (+51/-7)
2 files modified
src/maasserver/dhcp.py (+24/-7)
src/maasserver/tests/test_dhcp.py (+27/-0)
To merge this branch: bzr merge lp:~mpontillo/maas/ntp-issues--bug-1695083
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+325037@code.launchpad.net

Commit message

When selecting an NTP server address to provide via DHCP, prefer subnets on VLANs where DHCP is enabled.

To post a comment you must log in.
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/dhcp.py'
--- src/maasserver/dhcp.py 2017-05-22 13:39:28 +0000
+++ src/maasserver/dhcp.py 2017-06-03 19:25:25 +0000
@@ -256,19 +256,36 @@
256 IPADDRESS_TYPE.STICKY, IPADDRESS_TYPE.USER_RESERVED})256 IPADDRESS_TYPE.STICKY, IPADDRESS_TYPE.USER_RESERVED})
257 rack_addresses = rack_addresses.exclude(subnet__isnull=True)257 rack_addresses = rack_addresses.exclude(subnet__isnull=True)
258 rack_addresses = rack_addresses.order_by(258 rack_addresses = rack_addresses.order_by(
259 "subnet__vlan__space_id", "subnet__cidr", "ip")259 # Prefer subnets with DHCP enabled.
260 "-subnet__vlan__dhcp_on",
261 "subnet__vlan__space_id",
262 "subnet__cidr",
263 "ip"
264 )
260 rack_addresses = rack_addresses.values_list(265 rack_addresses = rack_addresses.values_list(
261 "subnet__vlan__space_id", "subnet__cidr", "ip")266 "subnet__vlan__dhcp_on",
267 "subnet__vlan__space_id",
268 "subnet__cidr",
269 "ip"
270 )
262271
263 def get_space_id_and_family(record):272 def get_space_id_and_family(record):
264 space_id, cidr, ip = record273 dhcp_on, space_id, cidr, ip = record
265 return space_id, IPNetwork(cidr).version274 return space_id, IPNetwork(cidr).version
266275
276 def sort_key__dhcp_on__ip(record):
277 dhcp_on, space_id, cidr, ip = record
278 return -int(dhcp_on), IPAddress(ip)
279
280 best_ntp_servers = {
281 space_id_and_family:
282 min(group, key=sort_key__dhcp_on__ip)
283 for space_id_and_family, group in groupby(
284 rack_addresses, get_space_id_and_family)
285 }
267 return {286 return {
268 space_id_and_family: min(287 key: value[3]
269 (ip for _, _, ip in group), key=IPAddress)288 for key, value in best_ntp_servers.items()
270 for space_id_and_family, group in groupby(
271 rack_addresses, get_space_id_and_family)
272 }289 }
273290
274291
275292
=== modified file 'src/maasserver/tests/test_dhcp.py'
--- src/maasserver/tests/test_dhcp.py 2017-05-30 18:36:16 +0000
+++ src/maasserver/tests/test_dhcp.py 2017-06-03 19:25:25 +0000
@@ -748,6 +748,33 @@
748 (address.ip for address in addresses), key=IPAddress),748 (address.ip for address in addresses), key=IPAddress),
749 }))749 }))
750750
751 def test__returned_dict_prefers_vlans_with_dhcp_on(self):
752 rack = factory.make_RackController()
753 space = factory.make_Space()
754 ip_version = random.choice([4, 6])
755 cidr1 = factory.make_ip4_or_6_network(version=ip_version, host_bits=16)
756 cidr2 = factory.make_ip4_or_6_network(version=ip_version, host_bits=16)
757 subnet1 = factory.make_Subnet(space=space, cidr=cidr1)
758 subnet2 = factory.make_Subnet(space=space, cidr=cidr2)
759 # Expect subnet2 to be selected, since DHCP is enabled.
760 subnet2.vlan.dhcp_on = True
761 subnet2.vlan.save()
762 interface = factory.make_Interface(node=rack)
763 # Make some addresses that won't be selected since they're on the
764 # incorrect VLAN (without DHCP enabled).
765 for _ in range(3):
766 factory.make_StaticIPAddress(
767 interface=interface, subnet=subnet1,
768 alloc_type=IPADDRESS_TYPE.STICKY)
769 expected_address = factory.make_StaticIPAddress(
770 interface=interface, subnet=subnet2,
771 alloc_type=IPADDRESS_TYPE.STICKY)
772 self.assertThat(
773 dhcp.get_ntp_server_addresses_for_rack(rack), Equals({
774 (space.id, subnet2.get_ipnetwork().version):
775 expected_address.ip
776 }))
777
751 def test__constant_query_count(self):778 def test__constant_query_count(self):
752 rack = factory.make_RackController()779 rack = factory.make_RackController()
753 interface = factory.make_Interface(node=rack)780 interface = factory.make_Interface(node=rack)