27
from provisioningserver.pxe import tftppath
28
from provisioningserver.testing.config import ConfigFixture
28
from provisioningserver.boot import tftppath
29
from provisioningserver.boot.pxe import PXEBootMethod
30
from provisioningserver.boot.uefi import UEFIBootMethod
31
from provisioningserver.testing.config import set_tftp_root
29
32
from testtools.content import text_content
30
33
from testtools.matchers import (
103
106
return [compose_download_kernel_name(arch, release), 'initrd.gz']
109
def compose_uefi_dir(archive, release):
110
"""File locations expected to be found in the archive for UEFI netboot.
112
:param archive: Archive directory (corresponding to the script's ARCHIVE
113
setting, except here it's a filesystem path not a URL).
114
:param release: distro release
115
:return: A 2-tuple of:
116
* Base path of the current/ dir.
117
* Requisite files for this archive.
119
basepath = os.path.join(
120
archive, 'dists', release, 'main', 'uefi', 'grub2-amd64', 'current')
121
return basepath, ['grubnetx64.efi.signed']
106
124
def generate_md5sums(basepath):
107
125
"""Write MD5SUMS file at basepath."""
116
134
def compose_tftp_bootloader_path(tftproot):
117
135
"""Compose path for MAAS TFTP bootloader."""
118
return tftppath.locate_tftp_path(
119
tftppath.compose_bootloader_path(), tftproot)
122
def compose_tftp_path(tftproot, arch, release, purpose, *path):
136
pxe_method = PXEBootMethod()
137
return tftppath.locate_tftp_path(
138
pxe_method.bootloader_path, tftproot)
141
def compose_tftp_uefi_bootloader_path(tftproot):
142
"""Compose path for MAAS UEFI TFTP bootloader."""
143
uefi_method = UEFIBootMethod()
144
return tftppath.locate_tftp_path(
145
uefi_method.bootloader_path, tftproot)
148
def compose_tftp_path(tftproot, arch, release, label, purpose, *path):
123
149
"""Compose path for MAAS TFTP files for given architecture.
125
151
After the TFTP root directory and the architecture, just append any path
129
155
return os.path.join(
130
156
tftppath.locate_tftp_path(
131
tftppath.compose_image_path(arch[0], arch[1], release, purpose),
157
tftppath.compose_image_path(
158
arch[0], arch[1], release, label, purpose),
147
174
super(TestImportPXEFiles, self).setUp()
175
raise unittest.SkipTest(
176
"XXX rvb 2014-03-21 bug=1295479: Disabled. The "
177
"maas-import-pxe-files script has been replaced with a "
178
"new version to use simplestreams v2's data. These tests need "
179
"to be completely refactored.")
148
180
self.tftproot = self.make_dir()
149
self.config = {"tftp": {"root": self.tftproot}}
150
self.config_fixture = ConfigFixture(self.config)
151
self.useFixture(self.config_fixture)
181
self.config_fixture = self.useFixture(set_tftp_root(self.tftproot))
153
183
def get_arch(self):
154
184
"""Return an existing, supported architecture/subarchitecture pair."""
168
198
for filename in compose_download_filenames(arch, release):
169
199
factory.make_file(download, filename)
170
200
generate_md5sums(basepath)
201
uefi_archive, uefi_filenames = compose_uefi_dir(archive, release)
202
os.makedirs(uefi_archive)
203
for uefi in uefi_filenames:
204
factory.make_file(uefi_archive, uefi)
173
207
def call_script(self, archive_dir, tftproot, arch=None, release=None):
186
220
'MAIN_ARCHIVE': 'file://%s' % archive_dir,
187
221
'PORTS_ARCHIVE': 'file://%s' % archive_dir,
222
'STABLE_RELEASE': release,
188
223
# Substitute curl for wget; it accepts file:// URLs.
189
224
'DOWNLOAD': 'curl -O --silent',
190
225
'PATH': os.pathsep.join(path),
194
229
# Suppress GPG checks as we can't sign the file from
196
231
'IGNORE_GPG': '1',
232
# Don't check for broken efinet, so arch will be
233
# correct for the download.
234
'CHECK_BROKEN_EFINET': '0',
235
# Skip shim.efi.sifned, as we don't want it to really
236
# download the package
237
'SKIP_SHIM_SIGNED': '1',
198
239
env.update(self.config_fixture.environ)
199
240
if arch is not None:
229
270
expected_contents = read_file('/usr/lib/syslinux', 'pxelinux.0')
230
271
self.assertThat(tftp_path, FileContains(expected_contents))
273
def test_procures_uefi_grubnet(self):
274
arch = self.get_arch()
276
archive = self.make_downloads(arch=arch, release=release)
277
self.call_script(archive, self.tftproot, arch=arch, release=release)
278
tftp_path = os.path.join(self.tftproot, 'grubx64.efi')
279
uefi_archive, _ = compose_uefi_dir(archive, release)
280
expected_contents = read_file(uefi_archive, 'grubnetx64.efi.signed')
281
self.assertThat(tftp_path, FileContains(expected_contents))
283
def test_updates_uefi_grubnet(self):
284
arch = self.get_arch()
286
archive = self.make_downloads(arch=arch, release=release)
287
tftp_path = os.path.join(self.tftproot, 'grubx64.efi')
288
with open(tftp_path, 'w') as existing_file:
289
existing_file.write(factory.getRandomString())
290
self.call_script(archive, self.tftproot, arch=arch, release=release)
291
uefi_archive, _ = compose_uefi_dir(archive, release)
292
expected_contents = read_file(uefi_archive, 'grubnetx64.efi.signed')
293
self.assertThat(tftp_path, FileContains(expected_contents))
232
295
def test_procures_install_image(self):
233
296
arch = self.get_arch()
234
297
release = 'precise'
235
298
archive = self.make_downloads(arch=arch, release=release)
236
299
self.call_script(archive, self.tftproot, arch=arch, release=release)
237
300
tftp_path = compose_tftp_path(
238
self.tftproot, arch, release, 'install', 'linux')
301
self.tftproot, arch, release, 'release', 'install', 'linux')
239
302
_, download_path = compose_download_dir(archive, arch, release)
240
303
expected_contents = read_file(
241
304
download_path, compose_download_kernel_name(arch, release))
245
308
arch = self.get_arch()
246
309
release = 'precise'
247
310
tftp_path = compose_tftp_path(
248
self.tftproot, arch, release, 'install', 'linux')
311
self.tftproot, arch, release, 'release', 'install', 'linux')
249
312
os.makedirs(os.path.dirname(tftp_path))
250
313
with open(tftp_path, 'w') as existing_file:
251
314
existing_file.write(factory.getRandomString())
262
325
archive = self.make_downloads(arch=arch, release=release)
263
326
self.call_script(archive, self.tftproot, arch=arch, release=release)
264
327
tftp_path = compose_tftp_path(
265
self.tftproot, arch, release, 'install', 'linux')
328
self.tftproot, arch, release, 'release', 'install', 'linux')
266
329
backdate(tftp_path)
267
330
original_timestamp = get_write_time(tftp_path)
268
331
self.call_script(archive, self.tftproot, arch=arch, release=release)
281
344
# The script does not install the broken image, and does not fail.
282
345
installed_kernel = compose_tftp_path(
283
self.tftproot, arch, release, 'initrd.gz')
346
self.tftproot, arch, release, 'release', 'initrd.gz')
284
347
self.assertThat(installed_kernel, Not(DirExists()))