Fix incorrect lsblk tag and add a virtual media job

Follow-up to 8dd6589e66d03e45e1d510601da9531a30842cff: PATH is not a
valid lsblk tag, we need to use KNAME with -p flag.

Also add a vmedia job to avoid breakages in the future. It's added
non-voting because we have a deadlock with this change:
https://review.opendev.org/c/openstack/ironic/+/783722

Change-Id: Ifffeac9c1c4d394526d655eaa14c9fe7bd3a1e5e
This commit is contained in:
Dmitry Tantsur 2021-03-30 12:21:00 +02:00
parent 49d123dd6e
commit afcc5d392c
4 changed files with 47 additions and 16 deletions

View File

@ -152,20 +152,21 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
execute_mock):
execute_mock.side_effect = processutils.ProcessExecutionError
self.assertIsNone(utils._find_vmedia_device_by_labels(['l1', 'l2']))
execute_mock.assert_called_once_with('lsblk', '-P', '-oPATH,LABEL')
execute_mock.assert_called_once_with('lsblk', '-p', '-P',
'-oKNAME,LABEL')
@mock.patch.object(utils, 'execute', autospec=True)
def test__find_vmedia_device_by_labels(self, execute_mock):
# NOTE(TheJulia): Case is intentionally mixed here to ensure
# proper matching occurs
disk_list = ('PATH="/dev/sda" LABEL=""\n'
'PATH="/dev/sda2" LABEL="Meow"\n'
'PATH="/dev/sda3" LABEL="Recovery HD"\n'
'PATH="/dev/sda1" LABEL="EFI"\n'
'PATH="/dev/sdb" LABEL=""\n'
'PATH="/dev/sdb1" LABEL=""\n'
'PATH="/dev/sdb2" LABEL=""\n'
'PATH="/dev/sdc" LABEL="meow"\n')
disk_list = ('KNAME="/dev/sda" LABEL=""\n'
'KNAME="/dev/sda2" LABEL="Meow"\n'
'KNAME="/dev/sda3" LABEL="Recovery HD"\n'
'KNAME="/dev/sda1" LABEL="EFI"\n'
'KNAME="/dev/sdb" LABEL=""\n'
'KNAME="/dev/sdb1" LABEL=""\n'
'KNAME="/dev/sdb2" LABEL=""\n'
'KNAME="/dev/sdc" LABEL="meow"\n')
invalid_disk = ('KNAME="sda1" SIZE="1610612736" TYPE="part" TRAN=""\n'
'KNAME="sda" SIZE="1610612736" TYPE="disk" '
'TRAN="sata"\n')
@ -178,7 +179,7 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
self.assertEqual('/dev/sdc',
utils._find_vmedia_device_by_labels(['cat', 'meOw']))
execute_mock.assert_has_calls([
mock.call('lsblk', '-P', '-oPATH,LABEL'),
mock.call('lsblk', '-p', '-P', '-oKNAME,LABEL'),
mock.call('lsblk', '-n', '-s', '-P', '-b',
'-oKNAME,TRAN,TYPE,SIZE', '/dev/sda2'),
mock.call('lsblk', '-n', '-s', '-P', '-b',
@ -187,12 +188,13 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
@mock.patch.object(utils, 'execute', autospec=True)
def test__find_vmedia_device_by_labels_not_found(self, execute_mock):
disk_list = ('PATH="/dev/sdb" LABEL="evil"\n'
'PATH="/dev/sdb1" LABEL="banana"\n'
'PATH="/dev/sdb2" LABEL=""\n')
disk_list = ('KNAME="/dev/sdb" LABEL="evil"\n'
'KNAME="/dev/sdb1" LABEL="banana"\n'
'KNAME="/dev/sdb2" LABEL=""\n')
execute_mock.return_value = (disk_list, '')
self.assertIsNone(utils._find_vmedia_device_by_labels(['l1', 'l2']))
execute_mock.assert_called_once_with('lsblk', '-P', '-oPATH,LABEL')
execute_mock.assert_called_once_with('lsblk', '-p', '-P',
'-oKNAME,LABEL')
@mock.patch.object(utils, '_check_vmedia_device', autospec=True)
@mock.patch.object(utils, '_find_vmedia_device_by_labels', autospec=True)

View File

@ -129,7 +129,7 @@ def _find_vmedia_device_by_labels(labels):
"""Find device matching any of the provided labels for virtual media"""
candidates = []
try:
lsblk_output, _e = execute('lsblk', '-P', '-oPATH,LABEL')
lsblk_output, _e = execute('lsblk', '-p', '-P', '-oKNAME,LABEL')
except processutils.ProcessExecutionError as e:
_early_log('Was unable to execute the lsblk command. %s', e)
return
@ -137,7 +137,7 @@ def _find_vmedia_device_by_labels(labels):
for device in ironic_utils.parse_device_tags(lsblk_output):
for label in labels:
if label.upper() == device['LABEL'].upper():
candidates.append(device['PATH'])
candidates.append(device['KNAME'])
for candidate in candidates:
# We explicitly take the device and run it past _check_vmedia_device

View File

@ -57,6 +57,33 @@
SWIFT_ENABLE_TEMPURLS: True
SWIFT_TEMPURL_KEY: secretkey
- job:
name: ipa-tempest-uefi-redfish-vmedia-src
parent: ironic-ipa-base
required-projects:
- opendev.org/openstack/sushy-tools
vars:
devstack_services:
s-account: True
s-container: True
s-object: True
s-proxy: True
devstack_localrc:
IRONIC_BOOT_MODE: uefi
IRONIC_DEPLOY_DRIVER: redfish
IRONIC_ENABLED_BOOT_INTERFACES: redfish-virtual-media
IRONIC_ENABLED_HARDWARE_TYPES: redfish
IRONIC_ENABLED_POWER_INTERFACES: redfish
IRONIC_ENABLED_MANAGEMENT_INTERFACES: redfish
IRONIC_TEMPEST_WHOLE_DISK_IMAGE: True
IRONIC_VM_EPHEMERAL_DISK: 0
# Ironic has to master a new image, and this CAN take longer as a
# result and makes this job VERY sensitive to heavy disk IO of the
# underlying hypervisor/cloud.
IRONIC_CALLBACK_TIMEOUT: 800
SWIFT_ENABLE_TEMPURLS: True
SWIFT_TEMPURL_KEY: secretkey
# used by diskimage-builder
- job:
name: ipa-tempest-bios-ipmi-iscsi-src

View File

@ -13,6 +13,8 @@
# wholedisk + partition on tempest
- ipa-tempest-bios-ipmi-direct-src
- ipa-tempest-bios-ipmi-iscsi-src
- ipa-tempest-uefi-redfish-vmedia-src:
voting: false
# NOTE(TheJulia): The cleaning tests run in standalone job has a
# high failure rate due to possible race during long running steps
# like deployment with raid setup. While we're working on a fix,