summaryrefslogtreecommitdiff
path: root/ironic/drivers/modules
diff options
context:
space:
mode:
authorDmitry Tantsur <dtantsur@protonmail.com>2022-01-19 13:27:44 +0100
committerDmitry Tantsur <dtantsur@protonmail.com>2022-01-28 19:13:13 +0100
commita813c769e8d27803e87d46280db84607fdfce153 (patch)
tree2aced89fce0b491961f4fe65a768a7bf88a8f36c /ironic/drivers/modules
parent374d5e5a3037a6b985933e734e902b2e05d805bb (diff)
downloadironic-a813c769e8d27803e87d46280db84607fdfce153.tar.gz
Explicit parameter to distinguish partition/whole-disk images
Using kernel/ramdisk makes no sense with local boot, we need a better way. We already have an internal image_type instance parameter, let's make it public. Glance support will be added in the next patch. Change-Id: I4ce5f7a2317d952f976194d2022328f4afbb0258
Diffstat (limited to 'ironic/drivers/modules')
-rw-r--r--ironic/drivers/modules/agent.py7
-rw-r--r--ironic/drivers/modules/ansible/playbooks/roles/configure/tasks/main.yaml4
-rw-r--r--ironic/drivers/modules/ansible/playbooks/roles/prepare/tasks/main.yaml2
-rw-r--r--ironic/drivers/modules/deploy_utils.py28
4 files changed, 30 insertions, 11 deletions
diff --git a/ironic/drivers/modules/agent.py b/ironic/drivers/modules/agent.py
index f309a1011..2dcd8a819 100644
--- a/ironic/drivers/modules/agent.py
+++ b/ironic/drivers/modules/agent.py
@@ -471,6 +471,13 @@ class AgentDeploy(CustomAgentDeploy):
deploy_utils.check_for_missing_params(params, error_msg)
+ image_type = node.instance_info.get('image_type')
+ if image_type and image_type not in images.VALID_IMAGE_TYPES:
+ raise exception.InvalidParameterValue(
+ _('Invalid image_type "%(value)s", valid are %(valid)s')
+ % {'value': image_type,
+ 'valid': ', '.join(images.VALID_IMAGE_TYPES)})
+
# NOTE(dtantsur): glance images contain a checksum; for file images we
# will recalculate the checksum anyway.
if (not service_utils.is_glance_image(image_source)
diff --git a/ironic/drivers/modules/ansible/playbooks/roles/configure/tasks/main.yaml b/ironic/drivers/modules/ansible/playbooks/roles/configure/tasks/main.yaml
index 9baa882a6..ed8d168c3 100644
--- a/ironic/drivers/modules/ansible/playbooks/roles/configure/tasks/main.yaml
+++ b/ironic/drivers/modules/ansible/playbooks/roles/configure/tasks/main.yaml
@@ -1,4 +1,4 @@
- import_tasks: mounts.yaml
- when: ironic.image.type | default('whole-disk-image') == 'partition'
+ when: ironic.image.type | default('whole-disk') == 'partition'
- import_tasks: grub.yaml
- when: ironic.image.type | default('whole-disk-image') == 'partition'
+ when: ironic.image.type | default('whole-disk') == 'partition'
diff --git a/ironic/drivers/modules/ansible/playbooks/roles/prepare/tasks/main.yaml b/ironic/drivers/modules/ansible/playbooks/roles/prepare/tasks/main.yaml
index e92aba69d..1c13bc523 100644
--- a/ironic/drivers/modules/ansible/playbooks/roles/prepare/tasks/main.yaml
+++ b/ironic/drivers/modules/ansible/playbooks/roles/prepare/tasks/main.yaml
@@ -1,2 +1,2 @@
- import_tasks: parted.yaml
- when: ironic.image.type | default('whole-disk-image') == 'partition'
+ when: ironic.image.type | default('whole-disk') == 'partition'
diff --git a/ironic/drivers/modules/deploy_utils.py b/ironic/drivers/modules/deploy_utils.py
index 1aeda7acf..812d00775 100644
--- a/ironic/drivers/modules/deploy_utils.py
+++ b/ironic/drivers/modules/deploy_utils.py
@@ -570,14 +570,21 @@ def validate_image_properties(task, deploy_info):
if not image_href:
image_href = boot_iso
- properties = []
- if boot_iso or task.node.driver_internal_info.get('is_whole_disk_image'):
- # No image properties are required in this case
+ boot_option = get_boot_option(task.node)
+
+ if (boot_iso
+ or task.node.driver_internal_info.get('is_whole_disk_image')
+ or boot_option == 'local'):
+ # No image properties are required in this case, but validate that the
+ # image at least looks reasonable.
+ try:
+ image_service.get_image_service(image_href, context=task.context)
+ except exception.ImageRefValidationFailed as e:
+ raise exception.InvalidParameterValue(err=e)
return
if service_utils.is_glance_image(image_href):
properties = ['kernel_id', 'ramdisk_id']
- boot_option = get_boot_option(task.node)
if boot_option == 'kickstart':
properties.append('stage2_id')
image_props = get_image_properties(task.context, image_href)
@@ -799,7 +806,8 @@ def get_image_instance_info(node):
"specified at the same time."))
info['boot_iso'] = boot_iso
else:
- if get_boot_option(node) == 'ramdisk':
+ boot_option = get_boot_option(node)
+ if boot_option == 'ramdisk':
# Ramdisk deploy does not require an image
info['kernel'] = node.instance_info.get('kernel')
info['ramdisk'] = node.instance_info.get('ramdisk')
@@ -809,6 +817,7 @@ def get_image_instance_info(node):
is_whole_disk_image = node.driver_internal_info.get(
'is_whole_disk_image')
if (not is_whole_disk_image
+ and boot_option != 'local'
and not service_utils.is_glance_image(image_source)):
info['kernel'] = node.instance_info.get('kernel')
info['ramdisk'] = node.instance_info.get('ramdisk')
@@ -846,8 +855,10 @@ def parse_instance_info(node):
i_info = {}
i_info['image_source'] = info.get('image_source')
iwdi = node.driver_internal_info.get('is_whole_disk_image')
+ boot_option = get_boot_option(node)
if not iwdi:
if (i_info['image_source']
+ and boot_option != 'local'
and not service_utils.is_glance_image(
i_info['image_source'])):
i_info['kernel'] = info.get('kernel')
@@ -1176,6 +1187,7 @@ def build_instance_info_for_deploy(task):
iwdi = node.driver_internal_info.get('is_whole_disk_image')
image_source = instance_info['image_source']
image_download_source = get_image_download_source(node)
+ boot_option = get_boot_option(task.node)
if service_utils.is_glance_image(image_source):
glance = image_service.GlanceImageService(context=task.context)
@@ -1198,7 +1210,7 @@ def build_instance_info_for_deploy(task):
instance_info['image_tags'] = image_info.get('tags', [])
instance_info['image_properties'] = image_info['properties']
- if not iwdi:
+ if not iwdi and boot_option != 'local':
instance_info['kernel'] = image_info['properties']['kernel_id']
instance_info['ramdisk'] = image_info['properties']['ramdisk_id']
elif (image_source.startswith('file://')
@@ -1209,11 +1221,11 @@ def build_instance_info_for_deploy(task):
instance_info['image_url'] = image_source
if not iwdi:
- instance_info['image_type'] = 'partition'
+ instance_info['image_type'] = images.IMAGE_TYPE_PARTITION
i_info = parse_instance_info(node)
instance_info.update(i_info)
else:
- instance_info['image_type'] = 'whole-disk-image'
+ instance_info['image_type'] = images.IMAGE_TYPE_WHOLE_DISK
return instance_info