From 7a7e9689a3c6c85912f3756bab5fc0536ae59f53 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Wed, 27 Nov 2019 12:46:22 +0100 Subject: [PATCH] Implement managed in-band inspection boot for redfish-virtual-media The current vmedia job is switched to test inspection as well. Change-Id: I077d9dd4b527fc090833587e62af352b20788458 Story: #1528920 Task: #37646 --- ironic/drivers/modules/redfish/boot.py | 18 ++++++++++++- .../unit/drivers/modules/redfish/test_boot.py | 21 ++++++++++++++++ ...h-managed-inspection-936341ffa8e1f22a.yaml | 6 +++++ zuul.d/ironic-jobs.yaml | 25 +++++++++++++------ zuul.d/project.yaml | 4 +-- 5 files changed, 64 insertions(+), 10 deletions(-) create mode 100644 releasenotes/notes/redfish-managed-inspection-936341ffa8e1f22a.yaml diff --git a/ironic/drivers/modules/redfish/boot.py b/ironic/drivers/modules/redfish/boot.py index 461195468e..a9e7372026 100644 --- a/ironic/drivers/modules/redfish/boot.py +++ b/ironic/drivers/modules/redfish/boot.py @@ -639,6 +639,21 @@ class RedfishVirtualMediaBoot(base.BootInterface): if task.driver.storage.should_write_image(task): self._validate_instance_info(task) + def validate_inspection(self, task): + """Validate that the node has required properties for inspection. + + :param task: A TaskManager instance with the node being checked + :raises: MissingParameterValue if node is missing one or more required + parameters + :raises: UnsupportedDriverExtension + """ + try: + self._validate_driver_info(task) + except exception.MissingParameterValue: + # Fall back to non-managed in-band inspection + raise exception.UnsupportedDriverExtension( + driver=task.node.driver, extension='inspection') + def prepare_ramdisk(self, task, ramdisk_params): """Prepares the boot of deploy or rescue ramdisk over virtual media. @@ -663,7 +678,8 @@ class RedfishVirtualMediaBoot(base.BootInterface): # modify the state of the node due to virtual media operations. if node.provision_state not in (states.DEPLOYING, states.CLEANING, - states.RESCUING): + states.RESCUING, + states.INSPECTING): return manager_utils.node_power_action(task, states.POWER_OFF) diff --git a/ironic/tests/unit/drivers/modules/redfish/test_boot.py b/ironic/tests/unit/drivers/modules/redfish/test_boot.py index 81036049f0..6d78cbb78f 100644 --- a/ironic/tests/unit/drivers/modules/redfish/test_boot.py +++ b/ironic/tests/unit/drivers/modules/redfish/test_boot.py @@ -531,6 +531,27 @@ class RedfishVirtualMediaBootTestCase(db_base.DbTestCase): self.assertRaises(exception.MissingParameterValue, task.driver.boot.validate, task) + @mock.patch.object(redfish_utils, 'parse_driver_info', autospec=True) + def test_validate_inspection(self, mock_parse_driver_info): + with task_manager.acquire(self.context, self.node.uuid, + shared=True) as task: + task.node.driver_info.update( + {'deploy_kernel': 'kernel', + 'deploy_ramdisk': 'ramdisk', + 'bootloader': 'bootloader'} + ) + + task.driver.boot.validate_inspection(task) + + mock_parse_driver_info.assert_called_once_with(task.node) + + @mock.patch.object(redfish_utils, 'parse_driver_info', autospec=True) + def test_validate_inspection_missing(self, mock_parse_driver_info): + with task_manager.acquire(self.context, self.node.uuid, + shared=True) as task: + self.assertRaises(exception.UnsupportedDriverExtension, + task.driver.boot.validate_inspection, task) + @mock.patch.object(redfish_boot.RedfishVirtualMediaBoot, '_prepare_deploy_iso', autospec=True) @mock.patch.object(redfish_boot.RedfishVirtualMediaBoot, diff --git a/releasenotes/notes/redfish-managed-inspection-936341ffa8e1f22a.yaml b/releasenotes/notes/redfish-managed-inspection-936341ffa8e1f22a.yaml new file mode 100644 index 0000000000..6abfa8108d --- /dev/null +++ b/releasenotes/notes/redfish-managed-inspection-936341ffa8e1f22a.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + The ``redfish-virtual-media`` boot interface now supports managing boot + for in-band inspection. This enables using virtual media instead of PXE + for in-band inspection. diff --git a/zuul.d/ironic-jobs.yaml b/zuul.d/ironic-jobs.yaml index 4530120e95..79939f7568 100644 --- a/zuul.d/ironic-jobs.yaml +++ b/zuul.d/ironic-jobs.yaml @@ -148,11 +148,12 @@ IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish - job: - name: ironic-tempest-partition-bios-redfish-vmedia - description: "Deploy ironic node over Redfish virtual media using legacy BIOS boot mode" + name: ironic-tempest-partition-uefi-redfish-vmedia + description: "Deploy ironic node over Redfish virtual media using UEFI boot mode" parent: ironic-tempest-partition-bios-redfish-pxe vars: devstack_localrc: + IRONIC_BOOT_MODE: uefi IRONIC_ENABLED_BOOT_INTERFACES: redfish-virtual-media IRONIC_VM_SPECS_RAM: 512 SWIFT_ENABLE_TEMPURLS: True @@ -164,13 +165,23 @@ s-proxy: True - job: - name: ironic-tempest-partition-uefi-redfish-vmedia - description: "Deploy ironic node over Redfish virtual media using UEFI boot mode" - parent: ironic-tempest-partition-bios-redfish-vmedia + name: ironic-inspector-tempest-partition-bios-redfish-vmedia + description: "Inspect and deploy ironic node over Redfish virtual media using legacy BIOS boot mode" + parent: ironic-tempest-partition-uefi-redfish-vmedia + required-projects: + - openstack/ironic-inspector vars: + # NOTE(dtantsur): the inspector job includes booting an instance too + tempest_test_regex: Inspector devstack_localrc: - IRONIC_BOOT_MODE: uefi - IRONIC_VM_SPECS_RAM: 512 + IRONIC_BOOT_MODE: bios + IRONIC_INSPECTOR_MANAGED_BOOT: True + IRONIC_INSPECTOR_NODE_NOT_FOUND_HOOK: '' + devstack_plugins: + ironic-inspector: https://opendev.org/openstack/ironic-inspector + devstack_services: + ironic-inspector: True + ironic-inspector-dhcp: True - job: name: ironic-tempest-pxe_ipmitool-postgres diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index 43d13fc168..7227596cd4 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -17,8 +17,6 @@ - ironic-grenade-dsvm-multinode-multitenant: voting: false - ironic-tempest-partition-bios-redfish-pxe - - ironic-tempest-partition-bios-redfish-vmedia: - voting: false - ironic-tempest-partition-uefi-redfish-vmedia - ironic-tempest-ipa-partition-pxe_ipmitool-tinyipa - ironic-tempest-ipa-partition-uefi-pxe_ipmitool-tinyipa @@ -38,6 +36,8 @@ voting: false - ironic-inspector-tempest-managed: voting: false + - ironic-inspector-tempest-partition-bios-redfish-vmedia: + voting: false - ironic-tempest-ipa-wholedisk-bios-ipmi-direct-dib-centos7: voting: false - bifrost-integration-tinyipa-ubuntu-xenial: