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

Proposed by Lee Trager
Status: Merged
Approved by: Lee Trager
Approved revision: no longer in the source branch.
Merged at revision: 5079
Proposed branch: lp:~ltrager/maas/lp1587896
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 232 lines (+28/-46)
7 files modified
src/maasserver/models/node.py (+0/-2)
src/maasserver/models/tests/test_node.py (+0/-5)
src/provisioningserver/refresh/__init__.py (+11/-13)
src/provisioningserver/refresh/tests/test_refresh.py (+14/-16)
src/provisioningserver/rpc/cluster.py (+0/-1)
src/provisioningserver/rpc/clusterservice.py (+2/-5)
src/provisioningserver/rpc/tests/test_clusterservice.py (+1/-4)
To merge this branch: bzr merge lp:~ltrager/maas/lp1587896
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
Gavin Panella (community) Approve
Review via email: mp+296356@code.launchpad.net

Commit message

Don't gather swap information on controllers and only get the architecture, not the subarchitecture from archdetect.

To post a comment you must log in.
Revision history for this message
Gavin Panella (allenap) wrote :

Seems good, but I want Blake to take a look at the architecture fix before you land it.

review: Approve
Revision history for this message
Lee Trager (ltrager) wrote :

The architecture fix was actually pointed out by Blake. archdetect outputs as amd64/efi on UEFI machines, I didn't notice this as I've been testing with libvirt which emulates a traditional BIOS. This modifies refreshes to mimic commissioning and only take the architecture part from archdetect, not the subarch.

http://bazaar.launchpad.net/~maas-committers/maas/trunk/view/head:/etc/maas/templates/commissioning-user-data/snippets/maas_enlist.sh#L72

Revision history for this message
Blake Rouse (blake-rouse) :
review: Needs Fixing
Revision history for this message
Lee Trager (ltrager) wrote :

Updated to properly handle the subarch.

Revision history for this message
Blake Rouse (blake-rouse) wrote :

Thanks for the fix. Looks good!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/maasserver/models/node.py'
2--- src/maasserver/models/node.py 2016-06-06 18:28:04 +0000
3+++ src/maasserver/models/node.py 2016-06-06 19:15:31 +0000
4@@ -3641,8 +3641,6 @@
5 self.osystem = response['osystem']
6 if response['distro_series'] != '':
7 self.distro_series = response['distro_series']
8- if response['swap_size'] > 0:
9- self.swap_size = response['swap_size']
10 self.update_interfaces(response['interfaces'])
11 self.save()
12
13
14=== modified file 'src/maasserver/models/tests/test_node.py'
15--- src/maasserver/models/tests/test_node.py 2016-06-06 18:28:04 +0000
16+++ src/maasserver/models/tests/test_node.py 2016-06-06 19:15:31 +0000
17@@ -6908,7 +6908,6 @@
18 'architecture': rackcontroller.architecture,
19 'osystem': '',
20 'distro_series': '',
21- 'swap_size': 0,
22 'interfaces': {},
23 })
24
25@@ -6934,7 +6933,6 @@
26 'architecture': rackcontroller.architecture,
27 'osystem': '',
28 'distro_series': '',
29- 'swap_size': 0,
30 'interfaces': {},
31 })
32
33@@ -6951,7 +6949,6 @@
34 rackcontroller = factory.make_RackController(status=NODE_STATUS.NEW)
35 osystem = factory.make_name('osystem')
36 distro_series = factory.make_name('distro_series')
37- swap_size = random.randint(1, 1024)
38 interfaces = {
39 "eth0": {
40 "type": "physical",
41@@ -6971,7 +6968,6 @@
42 'architecture': rackcontroller.architecture,
43 'osystem': osystem,
44 'distro_series': distro_series,
45- 'swap_size': swap_size,
46 'interfaces': interfaces
47 })
48
49@@ -6979,7 +6975,6 @@
50 rackcontroller = reload_object(rackcontroller)
51 self.assertEquals(osystem, rackcontroller.osystem)
52 self.assertEquals(distro_series, rackcontroller.distro_series)
53- self.assertEquals(swap_size, rackcontroller.swap_size)
54 self.assertIsNotNone(
55 Interface.objects.filter(
56 node=rackcontroller,
57
58=== modified file 'src/provisioningserver/refresh/__init__.py'
59--- src/provisioningserver/refresh/__init__.py 2016-05-31 17:03:01 +0000
60+++ src/provisioningserver/refresh/__init__.py 2016-06-06 19:15:31 +0000
61@@ -16,6 +16,10 @@
62 geturl,
63 )
64 from provisioningserver.refresh.node_info_scripts import NODE_INFO_SCRIPTS
65+from provisioningserver.utils.shell import (
66+ call_and_check,
67+ ExternalProcessError,
68+)
69 from provisioningserver.utils.twisted import synchronous
70
71
72@@ -24,20 +28,14 @@
73
74 def get_architecture():
75 """Get the architecture of the running system."""
76- proc = subprocess.Popen('archdetect', stdout=subprocess.PIPE)
77- stdout, stderr = proc.communicate()
78- if proc.returncode != 0:
79+ try:
80+ stdout = call_and_check('archdetect')
81+ except ExternalProcessError:
82 return ''
83- return stdout.strip().decode('utf-8')
84-
85-
86-def get_swap_size():
87- """Get the current swap size of the running system."""
88- with open('/proc/meminfo') as f:
89- for line in f:
90- if 'SwapTotal' in line:
91- return int(line.split()[1]) * 1000
92- return 0
93+ arch, subarch = stdout.strip().split('/')
94+ if arch in ['i386', 'amd64', 'arm64', 'ppc64el']:
95+ subarch = 'generic'
96+ return '%s/%s' % (arch, subarch)
97
98
99 def get_os_release():
100
101=== modified file 'src/provisioningserver/refresh/tests/test_refresh.py'
102--- src/provisioningserver/refresh/tests/test_refresh.py 2016-05-31 17:03:01 +0000
103+++ src/provisioningserver/refresh/tests/test_refresh.py 2016-06-06 19:15:31 +0000
104@@ -9,7 +9,6 @@
105 import os
106 from pathlib import Path
107 import random
108-import re
109 import tempfile
110 from textwrap import dedent
111 from unittest.mock import sentinel
112@@ -29,22 +28,21 @@
113
114
115 class TestHelpers(MAASTestCase):
116- def test_get_architecture_returns_arch(self):
117- architecture = refresh.get_architecture()
118- self.assertIsInstance(architecture, str)
119- self.assertIsNot('', architecture)
120+ def test_get_architecture_returns_arch_with_generic(self):
121+ arch = random.choice(['i386', 'amd64', 'arm64', 'ppc64el'])
122+ subarch = factory.make_name('subarch')
123+ self.patch(refresh, 'call_and_check').return_value = (
124+ "%s/%s" % (arch, subarch))
125+ ret_arch = refresh.get_architecture()
126+ self.assertEquals("%s/generic" % arch, ret_arch)
127
128- def test_get_swap_size_proc_meminfo_exists(self):
129- # This is a canary incase /proc/meminfo ever goes away
130- self.assertTrue(os.path.exists('/proc/meminfo'))
131- # Test that /proc/meminfo still provides SwapTotal
132- regex = re.compile('^SwapTotal:\s+[0-9]+ kB\n$')
133- with open('/proc/meminfo') as f:
134- for line in f:
135- result = regex.match(line)
136- if result is not None:
137- return
138- self.assertTrue(False, '/proc/meminfo does not contain SwapTotal')
139+ def test_get_architecture_returns_arch_with_subarch(self):
140+ arch = factory.make_name('arch')
141+ subarch = factory.make_name('subarch')
142+ architecture = "%s/%s" % (arch, subarch)
143+ self.patch(refresh, 'call_and_check').return_value = architecture
144+ ret_arch = refresh.get_architecture()
145+ self.assertEquals(architecture, ret_arch)
146
147 def test_get_os_release_etc_os_release_exists(self):
148 # This is a canary incase /etc/os-release ever goes away
149
150=== modified file 'src/provisioningserver/rpc/cluster.py'
151--- src/provisioningserver/rpc/cluster.py 2016-05-12 19:07:37 +0000
152+++ src/provisioningserver/rpc/cluster.py 2016-06-06 19:15:31 +0000
153@@ -453,7 +453,6 @@
154 (b"architecture", amp.Unicode()),
155 (b"osystem", amp.Unicode()),
156 (b"distro_series", amp.Unicode()),
157- (b"swap_size", amp.Integer()),
158 (b"interfaces", StructureAsJSON()),
159 ]
160 errors = {}
161
162=== modified file 'src/provisioningserver/rpc/clusterservice.py'
163--- src/provisioningserver/rpc/clusterservice.py 2016-05-12 19:07:37 +0000
164+++ src/provisioningserver/rpc/clusterservice.py 2016-06-06 19:15:31 +0000
165@@ -39,7 +39,6 @@
166 from provisioningserver.refresh import (
167 get_architecture,
168 get_os_release,
169- get_swap_size,
170 refresh,
171 )
172 from provisioningserver.rpc import (
173@@ -385,12 +384,11 @@
174 def perform_refresh():
175 architecture = get_architecture()
176 os_release = get_os_release()
177- swap_size = get_swap_size()
178 interfaces, _ = get_interfaces_definition()
179- return architecture, os_release, swap_size, interfaces
180+ return architecture, os_release, interfaces
181
182 def cb_result(result):
183- architecture, os_release, swap_size, interfaces = result
184+ architecture, os_release, interfaces = result
185 if 'ID' in os_release:
186 osystem = os_release['ID']
187 elif 'NAME' in os_release:
188@@ -407,7 +405,6 @@
189 'architecture': architecture,
190 'osystem': osystem,
191 'distro_series': distro_series,
192- 'swap_size': swap_size,
193 'interfaces': interfaces
194 }
195
196
197=== modified file 'src/provisioningserver/rpc/tests/test_clusterservice.py'
198--- src/provisioningserver/rpc/tests/test_clusterservice.py 2016-05-13 15:14:05 +0000
199+++ src/provisioningserver/rpc/tests/test_clusterservice.py 2016-06-06 19:15:31 +0000
200@@ -1956,7 +1956,7 @@
201 clusterservice, 'deferToThread')
202 mock_deferToThread.side_effect = [
203 succeed(None),
204- succeed(('', {}, 0, {})),
205+ succeed(('', {}, {})),
206 ]
207
208 system_id = factory.make_name('system_id')
209@@ -1987,7 +1987,6 @@
210 architecture = factory.make_name("architecture")
211 osystem = factory.make_name("osystem")
212 distro_series = factory.make_name("distro_series")
213- swap_size = random.randint(1, 100)
214 os_release = {
215 'ID': osystem,
216 'UBUNTU_CODENAME': distro_series,
217@@ -1996,7 +1995,6 @@
218 self.patch(clusterservice, 'get_architecture').return_value = (
219 architecture)
220 self.patch(clusterservice, 'get_os_release').return_value = os_release
221- self.patch(clusterservice, 'get_swap_size').return_value = swap_size
222
223 response = yield call_responder(
224 Cluster(), cluster.RefreshRackControllerInfo, {
225@@ -2010,7 +2008,6 @@
226 {
227 'osystem': osystem,
228 'distro_series': distro_series,
229- 'swap_size': swap_size,
230 'architecture': architecture,
231 'interfaces': get_all_interfaces_definition(),
232 }, response)