Merge ~alexsander-souza/maas:lp1914812_to_3_3 into maas:3.3

Proposed by Alexsander de Souza
Status: Merged
Approved by: Alexsander de Souza
Approved revision: c717ba9ac539cd525b95251c8a950043679f073b
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~alexsander-souza/maas:lp1914812_to_3_3
Merge into: maas:3.3
Diff against target: 317 lines (+131/-12)
6 files modified
src/maasserver/rpc/boot.py (+26/-4)
src/maasserver/rpc/tests/test_boot.py (+83/-8)
src/maasserver/rpc/tests/test_regionservice_calls.py (+1/-0)
src/provisioningserver/kernel_opts.py (+3/-0)
src/provisioningserver/rpc/region.py (+1/-0)
src/provisioningserver/tests/test_kernel_opts.py (+17/-0)
Reviewer Review Type Date Requested Status
Alexsander de Souza Approve
MAAS Lander Approve
Review via email: mp+449765@code.launchpad.net

Commit message

add support to quirks in the ephemeral kernel during xinstall

Some older OSes (like Centos/7) require that we tune the ephemeral OS kernel to match the capabilities of the one being deployed.

(cherry picked from commit 52f344ab28c0e615dcefc134922191fb6b944a9c)

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1914812_to_3_3 lp:~alexsander-souza/maas/+git/maas into -b 3.3 lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: c717ba9ac539cd525b95251c8a950043679f073b

review: Approve
Revision history for this message
Alexsander de Souza (alexsander-souza) wrote :

self-approve backport

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/rpc/boot.py b/src/maasserver/rpc/boot.py
2index 0f2636c..0ea34e9 100644
3--- a/src/maasserver/rpc/boot.py
4+++ b/src/maasserver/rpc/boot.py
5@@ -218,11 +218,13 @@ def get_boot_config_for_machine(machine, configs, purpose):
6 else:
7 osystem = configs["commissioning_osystem"]
8 series = configs["commissioning_distro_series"]
9+ final_osystem, final_series = osystem, series
10 else:
11 osystem = machine.get_osystem(default=configs["default_osystem"])
12 series = machine.get_distro_series(
13 default=configs["default_distro_series"]
14 )
15+ final_osystem, final_series = osystem, series
16 # XXX: roaksoax LP: #1739761 - Since the switch to squashfs (and
17 # drop of iscsi), precise is no longer deployable. To address a
18 # squashfs image is made available allowing it to be deployed in
19@@ -285,7 +287,7 @@ def get_boot_config_for_machine(machine, configs, purpose):
20 )
21 except ValidationError:
22 subarch = "no-such-kernel"
23- return osystem, series, subarch
24+ return osystem, series, subarch, final_osystem, final_series
25
26
27 def get_base_url_for_local_ip(local_ip, internal_domain):
28@@ -320,6 +322,15 @@ def get_final_boot_purpose(machine, arch, purpose):
29 return purpose
30
31
32+def get_quirks_kernel_opts(
33+ final_osystem: str, final_series: str
34+) -> str | None:
35+ if final_osystem == "centos":
36+ return "nvme-core.multipath=0"
37+
38+ return None
39+
40+
41 @synchronous
42 @transactional
43 def get_config(
44@@ -386,6 +397,7 @@ def get_config(
45 if log_port is None:
46 log_port = 514 # Fallback to default UDP syslog port.
47
48+ ephemeral_opts: str | None = None
49 # XXX: Instead of updating the machine directly, we should store the
50 # information and update the machine later. The current code doesn't
51 # work when you first boot a machine that has IPMI configured, since
52@@ -510,6 +522,7 @@ def get_config(
53 "log_port": log_port,
54 "extra_opts": "",
55 "http_boot": True,
56+ "ephemeral_opts": ephemeral_opts or "",
57 }
58
59 # Log the request into the event log for that machine.
60@@ -522,9 +535,13 @@ def get_config(
61 else:
62 event_log_pxe_request(machine, purpose)
63
64- osystem, series, subarch = get_boot_config_for_machine(
65- machine, configs, purpose
66- )
67+ (
68+ osystem,
69+ series,
70+ subarch,
71+ final_osystem,
72+ final_series,
73+ ) = get_boot_config_for_machine(machine, configs, purpose)
74
75 extra_kernel_opts = machine.get_effective_kernel_options(
76 default_kernel_opts=configs["kernel_opts"]
77@@ -548,6 +565,10 @@ def get_config(
78 extra_kernel_opts = merge_kparams_with_extra(
79 kparams, extra_kernel_opts
80 )
81+ if final_osystem != "ubuntu":
82+ ephemeral_opts = get_quirks_kernel_opts(
83+ final_osystem, final_series
84+ )
85 else:
86 purpose = "commissioning" # enlistment
87 if configs["use_rack_proxy"]:
88@@ -633,6 +654,7 @@ def get_config(
89 # As of MAAS 2.4 only HTTP boot is supported. This ensures MAAS 2.3
90 # rack controllers use HTTP boot as well.
91 "http_boot": True,
92+ "ephemeral_opts": ephemeral_opts or "",
93 }
94 if machine is not None:
95 params["system_id"] = machine.system_id
96diff --git a/src/maasserver/rpc/tests/test_boot.py b/src/maasserver/rpc/tests/test_boot.py
97index 858d7bd..937a946 100644
98--- a/src/maasserver/rpc/tests/test_boot.py
99+++ b/src/maasserver/rpc/tests/test_boot.py
100@@ -232,6 +232,7 @@ class TestGetConfig(MAASServerTestCase):
101 "log_port": 5247,
102 "extra_opts": "",
103 "http_boot": True,
104+ "ephemeral_opts": "",
105 },
106 config,
107 )
108@@ -277,6 +278,7 @@ class TestGetConfig(MAASServerTestCase):
109 "log_port": syslog_port,
110 "extra_opts": "",
111 "http_boot": True,
112+ "ephemeral_opts": "",
113 },
114 config,
115 )
116@@ -321,6 +323,7 @@ class TestGetConfig(MAASServerTestCase):
117 "log_port": 5247,
118 "extra_opts": "",
119 "http_boot": True,
120+ "ephemeral_opts": "",
121 },
122 config,
123 )
124@@ -1316,6 +1319,7 @@ class TestGetConfig(MAASServerTestCase):
125 rack_controller.system_id, local_ip, remote_ip, mac=mac
126 )
127 self.assertEqual(distro_series, observed_config["release"])
128+ self.assertEqual("", observed_config["ephemeral_opts"])
129
130 def test_returns_base_image_for_custom_ubuntu_image_xinstall(self):
131 self.patch(boot_module, "get_boot_filenames").return_value = (
132@@ -1348,8 +1352,34 @@ class TestGetConfig(MAASServerTestCase):
133 rack_controller.system_id, local_ip, remote_ip, mac=mac
134 )
135 expected_osystem, expected_series = custom_image.base_image.split("/")
136- self.assertEqual(observed_config["osystem"], expected_osystem)
137- self.assertEqual(observed_config["release"], expected_series)
138+ self.assertEqual(expected_osystem, observed_config["osystem"])
139+ self.assertEqual(expected_series, observed_config["release"])
140+ self.assertEqual("", observed_config["ephemeral_opts"])
141+
142+ def test_returns_quirks_for_centos_image_xinstall(self):
143+ osystem = Config.objects.get_config("default_osystem")
144+ release = Config.objects.get_config("default_distro_series")
145+ rack_controller = factory.make_RackController()
146+ local_ip = factory.make_ip_address()
147+ remote_ip = factory.make_ip_address()
148+ self.make_node(arch_name="amd64")
149+ node = factory.make_Node_with_Interface_on_Subnet(
150+ status=NODE_STATUS.DEPLOYING,
151+ osystem="centos",
152+ distro_series="centos71",
153+ architecture="amd64/generic",
154+ primary_rack=rack_controller,
155+ )
156+ mac = node.get_boot_interface().mac_address
157+ self.patch_autospec(boot_module, "event_log_pxe_request")
158+ observed_config = get_config(
159+ rack_controller.system_id, local_ip, remote_ip, mac=mac
160+ )
161+ self.assertEqual(osystem, observed_config["osystem"])
162+ self.assertEqual(release, observed_config["release"])
163+ self.assertEqual(
164+ "nvme-core.multipath=0", observed_config["ephemeral_opts"]
165+ )
166
167 # XXX: roaksoax LP: #1739761 - Deploying precise is now done using
168 # the commissioning ephemeral environment.
169@@ -1548,7 +1578,7 @@ class TestGetBootConfigForMachine(MAASServerTestCase):
170 ]
171 )
172
173- osystem, series, config_arch = get_boot_config_for_machine(
174+ osystem, series, config_arch, _, _ = get_boot_config_for_machine(
175 machine, configs, "xinstall"
176 )
177
178@@ -1582,7 +1612,7 @@ class TestGetBootConfigForMachine(MAASServerTestCase):
179 ]
180 )
181
182- osystem, series, config_arch = get_boot_config_for_machine(
183+ osystem, series, config_arch, _, _ = get_boot_config_for_machine(
184 machine, configs, "xinstall"
185 )
186
187@@ -1616,11 +1646,56 @@ class TestGetBootConfigForMachine(MAASServerTestCase):
188 ]
189 )
190
191- osystem, series, config_arch = get_boot_config_for_machine(
192+ osystem, series, config_arch, _, _ = get_boot_config_for_machine(
193 machine, configs, "xinstall"
194 )
195
196 # legacy custom images should use the default commissioning image as a base image
197- self.assertEqual(osystem, configs["commissioning_osystem"])
198- self.assertEqual(series, configs["commissioning_distro_series"])
199- self.assertEqual(config_arch, "generic")
200+ self.assertEqual(configs["commissioning_osystem"], osystem)
201+ self.assertEqual(configs["commissioning_distro_series"], series)
202+ self.assertEqual("generic", config_arch)
203+
204+ def test_get_boot_config_for_machine_centos(self):
205+ subarch = "generic"
206+ # We need a base image to be present. In fact, we always
207+ # needed that for the new image to boot.
208+ factory.make_default_ubuntu_release_bootable(arch=f"amd64/{subarch}")
209+ factory.make_usable_boot_resource(
210+ name="centos/7",
211+ architecture="amd64/generic",
212+ )
213+ machine = factory.make_Machine(
214+ architecture="amd64/generic",
215+ status=NODE_STATUS.DEPLOYING,
216+ osystem="centos",
217+ distro_series="7",
218+ )
219+ configs = Config.objects.get_configs(
220+ [
221+ "commissioning_osystem",
222+ "commissioning_distro_series",
223+ "enable_third_party_drivers",
224+ "default_min_hwe_kernel",
225+ "default_osystem",
226+ "default_distro_series",
227+ "kernel_opts",
228+ "use_rack_proxy",
229+ "maas_internal_domain",
230+ "remote_syslog",
231+ "maas_syslog_port",
232+ ]
233+ )
234+
235+ (
236+ osystem,
237+ series,
238+ config_arch,
239+ final_osystem,
240+ final_series,
241+ ) = get_boot_config_for_machine(machine, configs, "xinstall")
242+
243+ self.assertEqual(configs["commissioning_osystem"], osystem)
244+ self.assertEqual(configs["commissioning_distro_series"], series)
245+ self.assertEqual(subarch, config_arch)
246+ self.assertEqual("centos", final_osystem)
247+ self.assertEqual("7", final_series)
248diff --git a/src/maasserver/rpc/tests/test_regionservice_calls.py b/src/maasserver/rpc/tests/test_regionservice_calls.py
249index ddda99c..961caa9 100644
250--- a/src/maasserver/rpc/tests/test_regionservice_calls.py
251+++ b/src/maasserver/rpc/tests/test_regionservice_calls.py
252@@ -371,6 +371,7 @@ class TestRegionProtocol_GetBootConfig(MAASTransactionServerTestCase):
253 "fs_host",
254 "log_host",
255 "extra_opts",
256+ "ephemeral_opts",
257 ]
258 ),
259 )
260diff --git a/src/provisioningserver/kernel_opts.py b/src/provisioningserver/kernel_opts.py
261index d1a67af..b6fd6ef 100644
262--- a/src/provisioningserver/kernel_opts.py
263+++ b/src/provisioningserver/kernel_opts.py
264@@ -43,6 +43,7 @@ KernelParametersBase = namedtuple(
265 # verbatim to the kernel command line
266 "http_boot", # Used to make sure a MAAS 2.3 rack controller uses
267 # http_boot.
268+ "ephemeral_opts", # Same as 'extra_opts' but used only in the ephemeral OS
269 ),
270 )
271
272@@ -151,6 +152,8 @@ def compose_kernel_command_line(params):
273 # as it would be nice to have.
274 options += compose_logging_opts(params)
275 options += compose_arch_opts(params)
276+ if params.ephemeral_opts:
277+ options.append(params.ephemeral_opts)
278 cmdline_sep = get_curtin_kernel_cmdline_sep()
279 if params.extra_opts:
280 # Using --- before extra opts makes both d-i and Curtin install
281diff --git a/src/provisioningserver/rpc/region.py b/src/provisioningserver/rpc/region.py
282index 6c8ba93..779949b 100644
283--- a/src/provisioningserver/rpc/region.py
284+++ b/src/provisioningserver/rpc/region.py
285@@ -154,6 +154,7 @@ class GetBootConfig(amp.Command):
286 # will try to use TGT as Twisted sets optional parameters to False when
287 # not defined.
288 (b"http_boot", amp.Boolean(optional=True)),
289+ (b"ephemeral_opts", amp.Unicode(optional=True)),
290 ]
291 errors = {BootConfigNoResponse: b"BootConfigNoResponse"}
292
293diff --git a/src/provisioningserver/tests/test_kernel_opts.py b/src/provisioningserver/tests/test_kernel_opts.py
294index 1892a4f..ee31fa4 100644
295--- a/src/provisioningserver/tests/test_kernel_opts.py
296+++ b/src/provisioningserver/tests/test_kernel_opts.py
297@@ -439,3 +439,20 @@ class TestKernelOpts(MAASTestCase):
298 ]
299 ),
300 )
301+
302+ def test_xinstall_compose_kernel_command_line_ephemeral_opts(self):
303+ # ephemeral opts MUST appear before the separator
304+ mock_get_curtin_sep = self.patch(
305+ kernel_opts, "get_curtin_kernel_cmdline_sep"
306+ )
307+ sep = factory.make_name("sep")
308+ mock_get_curtin_sep.return_value = sep
309+
310+ ephem_opt = "EPHEMERAL_OPT=1"
311+ params = self.make_kernel_parameters(
312+ purpose="xinstall",
313+ ephemeral_opts=ephem_opt,
314+ )
315+ cmdline = compose_kernel_command_line(params)
316+ self.assertIn(ephem_opt, cmdline)
317+ self.assertTrue(cmdline.find(sep) > cmdline.find(ephem_opt))

Subscribers

People subscribed via source and target branches