diff options
author | Dmitry Tantsur <dtantsur@protonmail.com> | 2022-01-19 13:27:44 +0100 |
---|---|---|
committer | Dmitry Tantsur <dtantsur@protonmail.com> | 2022-01-28 19:13:13 +0100 |
commit | a813c769e8d27803e87d46280db84607fdfce153 (patch) | |
tree | 2aced89fce0b491961f4fe65a768a7bf88a8f36c /ironic/drivers/modules | |
parent | 374d5e5a3037a6b985933e734e902b2e05d805bb (diff) | |
download | ironic-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')
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 |