Support "swift" for ramdisk_image_download_source

The ilo-virtual-media boot interface supports exposing Glance images via
a temporary URL. This change brings this support to Redfish and others.

Change-Id: Ie72bb5e62c29efa5eea1710e74f505329d28d726
This commit is contained in:
Dmitry Tantsur 2021-07-06 17:40:50 +02:00
parent 7dd26522b0
commit 8cb6057450
4 changed files with 48 additions and 7 deletions

View File

@ -201,7 +201,10 @@ opts = [
('local', _('This is the default behavior. '
'The image is downloaded, prepared and '
'cached locally, to be served from '
'the conductor.'))],
'the conductor.')),
('swift', _('Same as "http", but if the image '
'is a Glance UUID, it is exposed via a '
'Swift temporary URL.'))],
default='local',
mutable=True,
help=_('Specifies whether a boot iso image should be served '

View File

@ -26,6 +26,7 @@ from ironic_lib import utils as ironic_utils
from oslo_log import log
from ironic.common import exception
from ironic.common.glance_service import service_utils
from ironic.common.i18n import _
from ironic.common import images
from ironic.common import swift
@ -435,12 +436,18 @@ def _prepare_iso_image(task, kernel_href, ramdisk_href,
# NOTE(rpittau): if base_iso is defined as http address, we just access
# it directly.
if base_iso and download_source == 'http':
if base_iso.startswith(('http://', 'https://')):
return base_iso
LOG.debug("ramdisk_image_download_source set to http but "
"boot_iso is not an HTTP URL: %(boot_iso)s",
{"boot_iso": base_iso})
if base_iso:
if (download_source == 'swift'
and service_utils.is_glance_image(base_iso)):
base_iso = (
images.get_temp_url_for_glance_image(task.context, base_iso))
if download_source != 'local':
if base_iso.startswith(('http://', 'https://')):
return base_iso
LOG.debug("ramdisk_image_download_source set to http but "
"boot_iso is not an HTTP URL: %(boot_iso)s",
{"boot_iso": base_iso})
img_handler = ImageHandler(task.node.driver)

View File

@ -19,6 +19,7 @@ import tempfile
from unittest import mock
from oslo_utils import importutils
from oslo_utils import uuidutils
from ironic.common import images
from ironic.common import utils
@ -642,6 +643,29 @@ class RedfishImageUtilsTestCase(db_base.DbTestCase):
kernel_params='nofb nomodeset vga=normal', boot_mode='bios',
base_iso='/path/to/baseiso', inject_files=None)
@mock.patch.object(images, 'get_temp_url_for_glance_image',
autospec=True)
def test__prepare_iso_image_bootable_iso_from_swift(self, mock_temp_url):
with task_manager.acquire(self.context, self.node.uuid,
shared=True) as task:
base_image_url = uuidutils.generate_uuid()
self.config(ramdisk_image_download_source='swift', group='deploy')
url = image_utils._prepare_iso_image(
task, None, None, bootloader_href=None, root_uuid=None,
base_iso=base_image_url)
self.assertEqual(mock_temp_url.return_value, url)
mock_temp_url.assert_called_once_with(task.context, base_image_url)
def test__prepare_iso_image_bootable_iso_swift_noop(self):
with task_manager.acquire(self.context, self.node.uuid,
shared=True) as task:
base_image_url = 'http://bearmetal.net/boot.iso'
self.config(ramdisk_image_download_source='swift', group='deploy')
url = image_utils._prepare_iso_image(
task, None, None, bootloader_href=None, root_uuid=None,
base_iso=base_image_url)
self.assertEqual(url, base_image_url)
def test__find_param(self):
param_dict = {
'deploy_kernel': 'kernel',

View File

@ -0,0 +1,7 @@
---
features:
- |
The configuration option ``[deploy]ramdisk_image_download_source`` now
supports a new value ``swift``. If ``boot_iso`` or ``deploy_iso`` is a
Glance image, it will expose it via a Swift temporary URL. For other types
of images the new value works the same way as the existing ``http``.