Use per-node external_http_url for boot ISO

When the per-node external_http_url feature was introduced by
c197a2d8b2, it only applied to a config
floppy. This fix ensures that it is also used for the boot ISO, both
when it is generated locally (by _prepare_iso_image()) or just cached
locally (by prepare_remote_image()).

Change-Id: Ic241da6845b4d97fd29888e28cc1d9ee34e182c1
Closes-Bug: #2044314
This commit is contained in:
Zane Bitter 2023-11-23 14:36:44 +13:00
parent a367151914
commit 0d59e25cf8
3 changed files with 62 additions and 4 deletions

View File

@ -374,7 +374,8 @@ def prepare_remote_image(task, image_url, file_name='boot.iso',
tmp_file = os.path.join(temp_dir, file_name)
cache.fetch_image(image_url, tmp_file,
ctx=task.context, force_raw=False)
return img_handler.publish_image(tmp_file, file_name)
node_http_url = task.node.driver_info.get("external_http_url")
return img_handler.publish_image(tmp_file, file_name, node_http_url)
def cleanup_remote_image(task, file_name):
@ -478,8 +479,9 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href,
boot_mode=boot_mode,
inject_files=inject_files)
node_http_url = task.node.driver_info.get("external_http_url")
image_url = img_handler.publish_image(
boot_iso_tmp_file, iso_object_name)
boot_iso_tmp_file, iso_object_name, node_http_url)
LOG.debug("Created ISO %(name)s in object store for node %(node)s, "
"exposed as temporary URL "

View File

@ -401,7 +401,7 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase):
object_name = 'boot-%s.iso' % task.node.uuid
mock_publish_image.assert_called_once_with(
mock.ANY, mock.ANY, object_name)
mock.ANY, mock.ANY, object_name, None)
mock_create_boot_iso.assert_called_once_with(
mock.ANY, mock.ANY, 'http://kernel/img', 'http://ramdisk/img',
@ -431,6 +431,38 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase):
root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123',
inject_files=None)
@mock.patch.object(image_utils.ImageHandler, 'publish_image',
autospec=True)
@mock.patch.object(images, 'create_boot_iso', autospec=True)
def test__prepare_iso_image_with_node_external_http_url(
self, mock_create_boot_iso, mock_publish_image):
self.config(default_boot_mode='uefi', group='deploy')
with task_manager.acquire(self.context, self.node.uuid,
shared=True) as task:
override_url = 'https://node.external/'
task.node.driver_info.update(external_http_url=override_url)
expected_url = 'https://node.external/c.f?e=f'
mock_publish_image.return_value = expected_url
url = image_utils._prepare_iso_image(
task, 'http://kernel/img', 'http://ramdisk/img',
'http://bootloader/img', root_uuid=task.node.uuid)
object_name = 'boot-%s.iso' % task.node.uuid
mock_publish_image.assert_called_once_with(
mock.ANY, mock.ANY, object_name, override_url)
mock_create_boot_iso.assert_called_once_with(
mock.ANY, mock.ANY, 'http://kernel/img', 'http://ramdisk/img',
boot_mode='uefi', esp_image_href='http://bootloader/img',
kernel_params='nofb vga=normal',
root_uuid='1be26c0b-03f2-4d2e-ae87-c02d7f33c123',
inject_files=None)
self.assertEqual(expected_url, url)
@mock.patch.object(image_utils.ImageHandler, 'publish_image',
autospec=True)
@mock.patch.object(images, 'create_boot_iso', autospec=True)
@ -451,7 +483,7 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase):
object_name = 'boot-%s.iso' % task.node.uuid
mock_publish_image.assert_called_once_with(
mock.ANY, mock.ANY, object_name)
mock.ANY, mock.ANY, object_name, None)
mock_create_boot_iso.assert_called_once_with(
mock.ANY, mock.ANY, 'http://kernel/img', 'http://ramdisk/img',
@ -939,6 +971,25 @@ cafile = /etc/ironic-python-agent/ironic.crt
mock_cache.return_value.fetch_image.assert_called_once_with(
base_image_url, mock.ANY, ctx=task.context, force_raw=False)
@mock.patch.object(image_utils.ImageHandler, 'publish_image',
autospec=True)
@mock.patch.object(image_utils, 'ISOImageCache', autospec=True)
def test_prepare_remote_image_local_external_http_url(self,
mock_cache,
mock_publish_image):
with task_manager.acquire(self.context, self.node.uuid,
shared=True) as task:
override_url = 'https://node.external/'
task.node.driver_info.update(external_http_url=override_url)
base_image_url = 'http://bearmetal.net/boot.iso'
url = image_utils.prepare_remote_image(task, base_image_url)
self.assertEqual(mock_publish_image.return_value, url)
mock_cache.return_value.fetch_image.assert_called_once_with(
base_image_url, mock.ANY, ctx=task.context, force_raw=False)
mock_publish_image.assert_called_once_with(
mock.ANY, mock.ANY, mock.ANY, override_url)
@mock.patch.object(image_utils.ImageHandler, 'publish_image',
autospec=True)
def test_prepare_remote_image_custom_cache(self, mock_publish_image):

View File

@ -0,0 +1,5 @@
---
fixes:
- |
The per-node ``external_http_url`` setting in the driver info is now used
for a boot ISO. Previously this setting was only used for a config floppy.