Merge lp:~ltrager/maas/lp1552444 into lp:~maas-committers/maas/trunk

Proposed by Lee Trager
Status: Merged
Approved by: Blake Rouse
Approved revision: no longer in the source branch.
Merged at revision: 4732
Proposed branch: lp:~ltrager/maas/lp1552444
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 121 lines (+65/-3)
2 files modified
src/maasserver/rpc/rackcontrollers.py (+18/-1)
src/maasserver/rpc/tests/test_rackcontrollers.py (+47/-2)
To merge this branch: bzr merge lp:~ltrager/maas/lp1552444
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Review via email: mp+288178@code.launchpad.net

Commit message

Turn dhcp_on on NodeGroup migration and log it. Also refresh rack when converting an existing node type.

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

Looks good. Thanks for the fixes and fixing refresh as well.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/rpc/rackcontrollers.py'
2--- src/maasserver/rpc/rackcontrollers.py 2016-02-26 16:19:41 +0000
3+++ src/maasserver/rpc/rackcontrollers.py 2016-03-04 21:06:01 +0000
4@@ -70,7 +70,12 @@
5 for nic in rackcontroller.interface_set.all():
6 if nic.vlan in vlans:
7 nic.vlan.primary_rack = rackcontroller
8+ nic.vlan.dhcp_on = True
9 nic.vlan.save()
10+ maaslog.info(
11+ "DHCP setting from NodeGroup(%s) have been migrated to "
12+ "VID %d on fabric_id %d" %
13+ (nodegroup_uuid, nic.vlan.vid, nic.vlan.fabric_id))
14 for ng_to_rack in ng_to_racks:
15 ng_to_rack.delete()
16
17@@ -89,11 +94,23 @@
18 Q(interface__mac_address__in=mac_addresses)).first()
19 if node is None:
20 return None
21+ # Refresh whenever an existing node is converted for use as a rack
22+ # controller. This is needed for two reasons. First, when the region starts
23+ # it creates a node for itself but only gathers networking information.
24+ # Second, information about the node may have changed since its last use.
25+ needs_refresh = True
26 if node.node_type in (
27 NODE_TYPE.RACK_CONTROLLER,
28 NODE_TYPE.REGION_AND_RACK_CONTROLLER):
29 maaslog.info(
30 "Registering existing rack controller %s." % node.hostname)
31+ # We don't want to refresh existing rack controllers as each time a
32+ # rack controller connects to a region it creates four connections.
33+ # This means for every region we connect to we would refresh
34+ # 4 * regions every time the rack controller restarts. Our information
35+ # at this point should be current anyway and the user can always
36+ # manually refresh.
37+ needs_refresh = False
38 elif node.node_type == NODE_TYPE.REGION_CONTROLLER:
39 maaslog.info(
40 "Converting %s into a region and rack controller." % node.hostname)
41@@ -106,7 +123,7 @@
42
43 rackcontroller = typecast_node(node, RackController)
44 # Tell register RPC call a refresh isn't needed
45- rackcontroller.needs_refresh = False
46+ rackcontroller.needs_refresh = needs_refresh
47 return rackcontroller
48
49
50
51=== modified file 'src/maasserver/rpc/tests/test_rackcontrollers.py'
52--- src/maasserver/rpc/tests/test_rackcontrollers.py 2016-02-27 02:32:00 +0000
53+++ src/maasserver/rpc/tests/test_rackcontrollers.py 2016-03-04 21:06:01 +0000
54@@ -62,11 +62,25 @@
55 rack_registered = register_rackcontroller(interfaces=interfaces)
56 self.assertEqual(node.system_id, rack_registered.system_id)
57
58- def test_finds_existing_node_sets_needs_refresh_to_false(self):
59- node = factory.make_Node()
60+ def test_finds_existing_controller_sets_needs_refresh_to_false(self):
61+ node_type = random.choice([
62+ NODE_TYPE.RACK_CONTROLLER,
63+ NODE_TYPE.REGION_AND_RACK_CONTROLLER,
64+ ])
65+ node = factory.make_Node(node_type=node_type)
66 rack_registered = register_rackcontroller(system_id=node.system_id)
67 self.assertFalse(rack_registered.needs_refresh)
68
69+ def test_converts_existing_node_sets_needs_refresh_to_true(self):
70+ node_type = random.choice([
71+ NODE_TYPE.MACHINE,
72+ NODE_TYPE.DEVICE,
73+ NODE_TYPE.REGION_CONTROLLER,
74+ ])
75+ node = factory.make_Node(node_type=node_type)
76+ rack_registered = register_rackcontroller(system_id=node.system_id)
77+ self.assertTrue(rack_registered.needs_refresh)
78+
79 def test_find_existing_keeps_type(self):
80 node_type = random.choice(
81 (NODE_TYPE.RACK_CONTROLLER, NODE_TYPE.REGION_AND_RACK_CONTROLLER))
82@@ -181,8 +195,39 @@
83 interfaces=interfaces, nodegroup_uuid=ng_uuid)
84 vlan = reload_object(vlan)
85 self.assertEqual(rack.system_id, vlan.primary_rack.system_id)
86+ self.assertTrue(vlan.dhcp_on)
87 self.assertItemsEqual([], NodeGroupToRackController.objects.all())
88
89+ def test_logs_migration(self):
90+ logger = self.useFixture(FakeLogger("maas"))
91+ rack = factory.make_RackController()
92+ vlan = factory.make_VLAN()
93+ subnet = factory.make_Subnet(vlan=vlan)
94+ ip = factory.pick_ip_in_Subnet(subnet)
95+ interfaces = {
96+ factory.make_name("eth0"): {
97+ "type": "physical",
98+ "mac_address": factory.make_mac_address(),
99+ "parents": [],
100+ "links": [{
101+ "mode": "static",
102+ "address": "%s/%d" % (
103+ str(ip), subnet.get_ipnetwork().prefixlen),
104+ }],
105+ "enabled": True,
106+ }
107+ }
108+ ng_uuid = factory.make_UUID()
109+ NodeGroupToRackController.objects.create(uuid=ng_uuid, subnet=subnet)
110+ register_rackcontroller(
111+ system_id=rack.system_id, hostname=rack.hostname,
112+ interfaces=interfaces, nodegroup_uuid=ng_uuid)
113+ vlan = reload_object(vlan)
114+ self.assertEqual(
115+ "DHCP setting from NodeGroup(%s) have been migrated to "
116+ "VID %d on fabric_id %d" % (ng_uuid, vlan.vid, vlan.fabric_id),
117+ logger.output.split('\n')[1].strip())
118+
119 def test_logs_creating_new_rackcontroller(self):
120 logger = self.useFixture(FakeLogger("maas"))
121 hostname = factory.make_name("hostname")