Merge lp:~julian-edwards/maas/auto-link-mac-to-network into lp:~maas-committers/maas/trunk

Proposed by Julian Edwards
Status: Merged
Approved by: Julian Edwards
Approved revision: no longer in the source branch.
Merged at revision: 2695
Proposed branch: lp:~julian-edwards/maas/auto-link-mac-to-network
Merge into: lp:~maas-committers/maas/trunk
Prerequisite: lp:~julian-edwards/maas/cluster-interfaces-as-networks-2
Diff against target: 79 lines (+34/-2)
2 files modified
src/maasserver/api.py (+10/-0)
src/maasserver/tests/test_api_nodegroup.py (+24/-2)
To merge this branch: bzr merge lp:~julian-edwards/maas/auto-link-mac-to-network
Reviewer Review Type Date Requested Status
Gavin Panella (community) Approve
Review via email: mp+230422@code.launchpad.net

This proposal supersedes a proposal from 2014-08-12.

Commit message

Auto-populate the connected Network for a MAC at the same time the MAC's cluster_interface is set (at lease upload time).

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) :
review: Approve
Revision history for this message
Julian Edwards (julian-edwards) wrote :

Thanks for the review.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/api.py'
--- src/maasserver/api.py 2014-08-11 21:49:55 +0000
+++ src/maasserver/api.py 2014-08-12 03:08:32 +0000
@@ -1728,6 +1728,16 @@
1728 if netaddr.IPAddress(ip) in ip_range:1728 if netaddr.IPAddress(ip) in ip_range:
1729 mac_address.cluster_interface = interface1729 mac_address.cluster_interface = interface
1730 mac_address.save()1730 mac_address.save()
1731
1732 # Locate the Network to which this MAC belongs.
1733 ipnetwork = interface.network
1734 if ipnetwork is not None:
1735 try:
1736 network = Network.objects.get(ip=ipnetwork.ip.format())
1737 network.macaddress_set.add(mac_address)
1738 except Network.DoesNotExist:
1739 pass
1740
1731 # Cheap optimisation. No other interfaces will match, so1741 # Cheap optimisation. No other interfaces will match, so
1732 # break out of the loop.1742 # break out of the loop.
1733 break1743 break
17341744
=== modified file 'src/maasserver/tests/test_api_nodegroup.py'
--- src/maasserver/tests/test_api_nodegroup.py 2014-08-11 21:49:55 +0000
+++ src/maasserver/tests/test_api_nodegroup.py 2014-08-12 03:08:32 +0000
@@ -32,6 +32,7 @@
32 NODEGROUP_STATUS_CHOICES,32 NODEGROUP_STATUS_CHOICES,
33 NODEGROUPINTERFACE_MANAGEMENT,33 NODEGROUPINTERFACE_MANAGEMENT,
34 )34 )
35from maasserver.forms import create_Network_from_NodeGroupInterface
35from maasserver.models import (36from maasserver.models import (
36 Config,37 Config,
37 DHCPLease,38 DHCPLease,
@@ -833,7 +834,7 @@
833class TestUpdateMacClusterInterfaces(MAASServerTestCase):834class TestUpdateMacClusterInterfaces(MAASServerTestCase):
834 """Tests for `update_mac_cluster_interfaces`()."""835 """Tests for `update_mac_cluster_interfaces`()."""
835836
836 def test_updates_mac_cluster_interfaces(self):837 def make_cluster_with_macs_and_leases(self):
837 cluster = factory.make_node_group()838 cluster = factory.make_node_group()
838 mac_addresses = {839 mac_addresses = {
839 factory.make_mac_address(): factory.make_node_group_interface(840 factory.make_mac_address(): factory.make_node_group_interface(
@@ -843,8 +844,13 @@
843 leases = {844 leases = {
844 get_random_ip_from_interface_range(interface): (845 get_random_ip_from_interface_range(interface): (
845 mac_address.mac_address)846 mac_address.mac_address)
846 for mac_address, interface in mac_addresses.items()847 for mac_address, interface in mac_addresses.viewitems()
847 }848 }
849 return cluster, mac_addresses, leases
850
851 def test_updates_mac_cluster_interfaces(self):
852 cluster, mac_addresses, leases = (
853 self.make_cluster_with_macs_and_leases())
848 update_mac_cluster_interfaces(leases, cluster)854 update_mac_cluster_interfaces(leases, cluster)
849 results = {855 results = {
850 mac_address: mac_address.cluster_interface856 mac_address: mac_address.cluster_interface
@@ -853,6 +859,22 @@
853 }859 }
854 self.assertEqual(mac_addresses, results)860 self.assertEqual(mac_addresses, results)
855861
862 def test_updates_network_relations(self):
863 # update_mac_cluster_interfaces should also associate the mac
864 # with the network on which it resides.
865 cluster, mac_addresses, leases = (
866 self.make_cluster_with_macs_and_leases())
867 expected_relations = []
868 for mac, interface in mac_addresses.viewitems():
869 net = create_Network_from_NodeGroupInterface(interface)
870 expected_relations.append((net, mac))
871 update_mac_cluster_interfaces(leases, cluster)
872 # Doing a single giant comparison here would be unintuitive and
873 # fugly, so I'm iterating.
874 for net, mac in expected_relations:
875 [observed_macddress] = net.macaddress_set.all()
876 self.assertEqual(mac, observed_macddress)
877
856 def test_ignores_mac_not_attached_to_cluster(self):878 def test_ignores_mac_not_attached_to_cluster(self):
857 cluster = factory.make_node_group()879 cluster = factory.make_node_group()
858 mac_address = factory.make_mac_address()880 mac_address = factory.make_mac_address()