Merge lp:~blake-rouse/maas/fix-1558755 into lp:~maas-committers/maas/trunk

Proposed by Blake Rouse
Status: Merged
Approved by: Blake Rouse
Approved revision: no longer in the source branch.
Merged at revision: 4801
Proposed branch: lp:~blake-rouse/maas/fix-1558755
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 215 lines (+86/-11)
7 files modified
src/maasserver/clusterrpc/osystems.py (+1/-1)
src/maasserver/compose_preseed.py (+2/-2)
src/maasserver/models/node.py (+16/-0)
src/maasserver/models/tests/test_node.py (+59/-0)
src/maasserver/preseed.py (+6/-6)
src/maasserver/preseed_network.py (+1/-1)
src/metadataserver/user_data/utils.py (+1/-1)
To merge this branch: bzr merge lp:~blake-rouse/maas/fix-1558755
Reviewer Review Type Date Requested Status
Mike Pontillo (community) Approve
Review via email: mp+289423@code.launchpad.net

Commit message

Add get_boot_rack_controller that returns the booting rack controller for the machine from the set boot_cluster_ip.

To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Looks good to me.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/clusterrpc/osystems.py'
2--- src/maasserver/clusterrpc/osystems.py 2016-02-02 14:20:45 +0000
3+++ src/maasserver/clusterrpc/osystems.py 2016-03-17 20:11:48 +0000
4@@ -115,7 +115,7 @@
5 :raises TimeoutError: If a response has not been received within 30
6 seconds.
7 """
8- client = getClientFor(node.get_boot_primary_rack_controller().system_id)
9+ client = getClientFor(node.get_boot_rack_controller().system_id)
10 call = client(
11 GetPreseedData, osystem=node.get_osystem(), preseed_type=preseed_type,
12 node_system_id=node.system_id, node_hostname=node.hostname,
13
14=== modified file 'src/maasserver/compose_preseed.py'
15--- src/maasserver/compose_preseed.py 2016-02-02 14:20:45 +0000
16+++ src/maasserver/compose_preseed.py 2016-03-17 20:11:48 +0000
17@@ -33,7 +33,7 @@
18 return http_proxy
19 else:
20 return "http://%s:8000/" % get_maas_facing_server_host(
21- node.get_boot_primary_rack_controller())
22+ node.get_boot_rack_controller())
23 else:
24 return None
25
26@@ -224,7 +224,7 @@
27 from metadataserver.models import NodeKey
28
29 token = NodeKey.objects.get_token_for_node(node)
30- rack_controller = node.get_boot_primary_rack_controller()
31+ rack_controller = node.get_boot_rack_controller()
32 base_url = rack_controller.url
33
34 if preseed_type == PRESEED_TYPE.COMMISSIONING:
35
36=== modified file 'src/maasserver/models/node.py'
37--- src/maasserver/models/node.py 2016-03-17 13:35:36 +0000
38+++ src/maasserver/models/node.py 2016-03-17 20:11:48 +0000
39@@ -2600,6 +2600,22 @@
40 return None
41 return interfaces[0]
42
43+ def get_boot_rack_controller(self):
44+ """Return the `RackController` that this node booted from last.
45+
46+ This uses the `boot_cluster_ip` to determine which rack controller
47+ this node booted from last. If empty or not a rack controller
48+ then it will fallback to the primary rack controller for the boot
49+ interface."""
50+ rack_controller = None
51+ if self.boot_cluster_ip is not None:
52+ rack_controller = RackController.objects.filter(
53+ interface__ip_addresses__ip=self.boot_cluster_ip).first()
54+ if rack_controller is None:
55+ return self.get_boot_primary_rack_controller()
56+ else:
57+ return rack_controller
58+
59 def get_boot_primary_rack_controller(self):
60 """Return the `RackController` that this node will boot from as its
61 primary rack controller ."""
62
63=== modified file 'src/maasserver/models/tests/test_node.py'
64--- src/maasserver/models/tests/test_node.py 2016-03-14 18:47:35 +0000
65+++ src/maasserver/models/tests/test_node.py 2016-03-17 20:11:48 +0000
66@@ -2712,6 +2712,65 @@
67 node.boot_interface = interface
68 node.save()
69
70+ def test_get_boot_rack_controller_returns_rack_from_boot_ip(self):
71+ node = factory.make_Node()
72+ fabric = factory.make_Fabric()
73+ vlan = fabric.get_default_vlan()
74+ subnet = factory.make_Subnet(vlan=vlan)
75+ boot_interface = factory.make_Interface(
76+ INTERFACE_TYPE.PHYSICAL, node=node, vlan=vlan)
77+ primary_rack = factory.make_RackController()
78+ primary_rack_interface = factory.make_Interface(
79+ INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan)
80+ factory.make_StaticIPAddress(
81+ alloc_type=IPADDRESS_TYPE.STICKY,
82+ ip=factory.pick_ip_in_Subnet(subnet),
83+ subnet=subnet, interface=primary_rack_interface)
84+ secondary_rack = factory.make_RackController()
85+ secondary_rack_interface = factory.make_Interface(
86+ INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan)
87+ secondary_rack_ip = factory.make_StaticIPAddress(
88+ alloc_type=IPADDRESS_TYPE.STICKY,
89+ ip=factory.pick_ip_in_Subnet(subnet),
90+ subnet=subnet, interface=secondary_rack_interface)
91+ vlan.dhcp_on = True
92+ vlan.primary_rack = primary_rack
93+ vlan.secondary_rack = secondary_rack
94+ vlan.save()
95+ node.boot_interface = boot_interface
96+ node.boot_cluster_ip = secondary_rack_ip.ip
97+ node.save()
98+ self.assertEqual(secondary_rack, node.get_boot_rack_controller())
99+
100+ def test_get_boot_rack_controller_returns_primary_rack(self):
101+ node = factory.make_Node()
102+ fabric = factory.make_Fabric()
103+ vlan = fabric.get_default_vlan()
104+ subnet = factory.make_Subnet(vlan=vlan)
105+ boot_interface = factory.make_Interface(
106+ INTERFACE_TYPE.PHYSICAL, node=node, vlan=vlan)
107+ primary_rack = factory.make_RackController()
108+ primary_rack_interface = factory.make_Interface(
109+ INTERFACE_TYPE.PHYSICAL, node=primary_rack, vlan=vlan)
110+ factory.make_StaticIPAddress(
111+ alloc_type=IPADDRESS_TYPE.STICKY,
112+ ip=factory.pick_ip_in_Subnet(subnet),
113+ subnet=subnet, interface=primary_rack_interface)
114+ secondary_rack = factory.make_RackController()
115+ secondary_rack_interface = factory.make_Interface(
116+ INTERFACE_TYPE.PHYSICAL, node=secondary_rack, vlan=vlan)
117+ factory.make_StaticIPAddress(
118+ alloc_type=IPADDRESS_TYPE.STICKY,
119+ ip=factory.pick_ip_in_Subnet(subnet),
120+ subnet=subnet, interface=secondary_rack_interface)
121+ vlan.dhcp_on = True
122+ vlan.primary_rack = primary_rack
123+ vlan.secondary_rack = secondary_rack
124+ vlan.save()
125+ node.boot_interface = boot_interface
126+ node.save()
127+ self.assertEqual(primary_rack, node.get_boot_rack_controller())
128+
129 def test__register_request_event_saves_event(self):
130 node = factory.make_Node()
131 user = factory.make_User()
132
133=== modified file 'src/maasserver/preseed.py'
134--- src/maasserver/preseed.py 2016-03-09 06:54:33 +0000
135+++ src/maasserver/preseed.py 2016-03-17 20:11:48 +0000
136@@ -104,7 +104,7 @@
137
138 def curtin_maas_reporter(node, events_support=True):
139 token = NodeKey.objects.get_token_for_node(node)
140- rack_controller = node.get_boot_primary_rack_controller()
141+ rack_controller = node.get_boot_rack_controller()
142 base_url = rack_controller.url
143 if events_support:
144 return {
145@@ -271,7 +271,7 @@
146 osystem = node.get_osystem()
147 series = node.get_distro_series()
148 arch, subarch = node.split_arch()
149- rack_controller = node.get_boot_primary_rack_controller()
150+ rack_controller = node.get_boot_rack_controller()
151 try:
152 images = get_boot_images_for(
153 rack_controller, osystem, arch, subarch, series)
154@@ -332,7 +332,7 @@
155 series = node.get_distro_series()
156 template = load_preseed_template(
157 node, USERDATA_TYPE.CURTIN, osystem, series)
158- rack_controller = node.get_boot_primary_rack_controller()
159+ rack_controller = node.get_boot_rack_controller()
160 context = get_preseed_context(
161 osystem, series, rack_controller=rack_controller)
162 context.update(
163@@ -351,7 +351,7 @@
164 """
165 token = NodeKey.objects.get_token_for_node(node)
166 if rack_controller is None:
167- rack_controller = node.get_boot_primary_rack_controller()
168+ rack_controller = node.get_boot_rack_controller()
169 base_url = rack_controller.url
170 return {
171 'curtin_preseed': compose_cloud_init_preseed(node, token, base_url)
172@@ -620,7 +620,7 @@
173 :rtype: dict.
174 """
175 if rack_controller is None:
176- rack_controller = node.get_boot_primary_rack_controller()
177+ rack_controller = node.get_boot_rack_controller()
178 # Create the url and the url-data (POST parameters) used to turn off
179 # PXE booting once the install of the node is finished.
180 node_disable_pxe_url = absolute_reverse(
181@@ -672,7 +672,7 @@
182 :rtype: unicode.
183 """
184 template = load_preseed_template(node, prefix, osystem, release)
185- rack_controller = node.get_boot_primary_rack_controller()
186+ rack_controller = node.get_boot_rack_controller()
187 context = get_preseed_context(
188 osystem, release, rack_controller=rack_controller)
189 context.update(
190
191=== modified file 'src/maasserver/preseed_network.py'
192--- src/maasserver/preseed_network.py 2016-02-02 14:20:45 +0000
193+++ src/maasserver/preseed_network.py 2016-03-17 20:11:48 +0000
194@@ -52,7 +52,7 @@
195 self.network_config.append({
196 "type": "nameserver",
197 "address": get_dns_server_address(
198- rack_controller=self.node.get_boot_primary_rack_controller()),
199+ rack_controller=self.node.get_boot_rack_controller()),
200 "search": sorted(get_dns_search_paths()),
201 })
202
203
204=== modified file 'src/metadataserver/user_data/utils.py'
205--- src/metadataserver/user_data/utils.py 2016-02-02 14:20:45 +0000
206+++ src/metadataserver/user_data/utils.py 2016-03-17 20:11:48 +0000
207@@ -54,7 +54,7 @@
208 # The preseed context is a dict containing various configs that the
209 # templates can use.
210 preseed_context = get_preseed_context(
211- rack_controller=node.get_boot_primary_rack_controller())
212+ rack_controller=node.get_boot_rack_controller())
213 preseed_context['node'] = node
214
215 # Render the snippets in the main template.