Fix incorrect lsblk tag and add a virtual media job
Follow-up to 8dd6589e66
: 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:
@@ -152,20 +152,21 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
|
|||||||
execute_mock):
|
execute_mock):
|
||||||
execute_mock.side_effect = processutils.ProcessExecutionError
|
execute_mock.side_effect = processutils.ProcessExecutionError
|
||||||
self.assertIsNone(utils._find_vmedia_device_by_labels(['l1', 'l2']))
|
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)
|
@mock.patch.object(utils, 'execute', autospec=True)
|
||||||
def test__find_vmedia_device_by_labels(self, execute_mock):
|
def test__find_vmedia_device_by_labels(self, execute_mock):
|
||||||
# NOTE(TheJulia): Case is intentionally mixed here to ensure
|
# NOTE(TheJulia): Case is intentionally mixed here to ensure
|
||||||
# proper matching occurs
|
# proper matching occurs
|
||||||
disk_list = ('PATH="/dev/sda" LABEL=""\n'
|
disk_list = ('KNAME="/dev/sda" LABEL=""\n'
|
||||||
'PATH="/dev/sda2" LABEL="Meow"\n'
|
'KNAME="/dev/sda2" LABEL="Meow"\n'
|
||||||
'PATH="/dev/sda3" LABEL="Recovery HD"\n'
|
'KNAME="/dev/sda3" LABEL="Recovery HD"\n'
|
||||||
'PATH="/dev/sda1" LABEL="EFI"\n'
|
'KNAME="/dev/sda1" LABEL="EFI"\n'
|
||||||
'PATH="/dev/sdb" LABEL=""\n'
|
'KNAME="/dev/sdb" LABEL=""\n'
|
||||||
'PATH="/dev/sdb1" LABEL=""\n'
|
'KNAME="/dev/sdb1" LABEL=""\n'
|
||||||
'PATH="/dev/sdb2" LABEL=""\n'
|
'KNAME="/dev/sdb2" LABEL=""\n'
|
||||||
'PATH="/dev/sdc" LABEL="meow"\n')
|
'KNAME="/dev/sdc" LABEL="meow"\n')
|
||||||
invalid_disk = ('KNAME="sda1" SIZE="1610612736" TYPE="part" TRAN=""\n'
|
invalid_disk = ('KNAME="sda1" SIZE="1610612736" TYPE="part" TRAN=""\n'
|
||||||
'KNAME="sda" SIZE="1610612736" TYPE="disk" '
|
'KNAME="sda" SIZE="1610612736" TYPE="disk" '
|
||||||
'TRAN="sata"\n')
|
'TRAN="sata"\n')
|
||||||
@@ -178,7 +179,7 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
|
|||||||
self.assertEqual('/dev/sdc',
|
self.assertEqual('/dev/sdc',
|
||||||
utils._find_vmedia_device_by_labels(['cat', 'meOw']))
|
utils._find_vmedia_device_by_labels(['cat', 'meOw']))
|
||||||
execute_mock.assert_has_calls([
|
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',
|
mock.call('lsblk', '-n', '-s', '-P', '-b',
|
||||||
'-oKNAME,TRAN,TYPE,SIZE', '/dev/sda2'),
|
'-oKNAME,TRAN,TYPE,SIZE', '/dev/sda2'),
|
||||||
mock.call('lsblk', '-n', '-s', '-P', '-b',
|
mock.call('lsblk', '-n', '-s', '-P', '-b',
|
||||||
@@ -187,12 +188,13 @@ class GetAgentParamsTestCase(ironic_agent_base.IronicAgentTest):
|
|||||||
|
|
||||||
@mock.patch.object(utils, 'execute', autospec=True)
|
@mock.patch.object(utils, 'execute', autospec=True)
|
||||||
def test__find_vmedia_device_by_labels_not_found(self, execute_mock):
|
def test__find_vmedia_device_by_labels_not_found(self, execute_mock):
|
||||||
disk_list = ('PATH="/dev/sdb" LABEL="evil"\n'
|
disk_list = ('KNAME="/dev/sdb" LABEL="evil"\n'
|
||||||
'PATH="/dev/sdb1" LABEL="banana"\n'
|
'KNAME="/dev/sdb1" LABEL="banana"\n'
|
||||||
'PATH="/dev/sdb2" LABEL=""\n')
|
'KNAME="/dev/sdb2" LABEL=""\n')
|
||||||
execute_mock.return_value = (disk_list, '')
|
execute_mock.return_value = (disk_list, '')
|
||||||
self.assertIsNone(utils._find_vmedia_device_by_labels(['l1', 'l2']))
|
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, '_check_vmedia_device', autospec=True)
|
||||||
@mock.patch.object(utils, '_find_vmedia_device_by_labels', autospec=True)
|
@mock.patch.object(utils, '_find_vmedia_device_by_labels', autospec=True)
|
||||||
|
@@ -129,7 +129,7 @@ def _find_vmedia_device_by_labels(labels):
|
|||||||
"""Find device matching any of the provided labels for virtual media"""
|
"""Find device matching any of the provided labels for virtual media"""
|
||||||
candidates = []
|
candidates = []
|
||||||
try:
|
try:
|
||||||
lsblk_output, _e = execute('lsblk', '-P', '-oPATH,LABEL')
|
lsblk_output, _e = execute('lsblk', '-p', '-P', '-oKNAME,LABEL')
|
||||||
except processutils.ProcessExecutionError as e:
|
except processutils.ProcessExecutionError as e:
|
||||||
_early_log('Was unable to execute the lsblk command. %s', e)
|
_early_log('Was unable to execute the lsblk command. %s', e)
|
||||||
return
|
return
|
||||||
@@ -137,7 +137,7 @@ def _find_vmedia_device_by_labels(labels):
|
|||||||
for device in ironic_utils.parse_device_tags(lsblk_output):
|
for device in ironic_utils.parse_device_tags(lsblk_output):
|
||||||
for label in labels:
|
for label in labels:
|
||||||
if label.upper() == device['LABEL'].upper():
|
if label.upper() == device['LABEL'].upper():
|
||||||
candidates.append(device['PATH'])
|
candidates.append(device['KNAME'])
|
||||||
|
|
||||||
for candidate in candidates:
|
for candidate in candidates:
|
||||||
# We explicitly take the device and run it past _check_vmedia_device
|
# We explicitly take the device and run it past _check_vmedia_device
|
||||||
|
@@ -57,6 +57,33 @@
|
|||||||
SWIFT_ENABLE_TEMPURLS: True
|
SWIFT_ENABLE_TEMPURLS: True
|
||||||
SWIFT_TEMPURL_KEY: secretkey
|
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
|
# used by diskimage-builder
|
||||||
- job:
|
- job:
|
||||||
name: ipa-tempest-bios-ipmi-iscsi-src
|
name: ipa-tempest-bios-ipmi-iscsi-src
|
||||||
|
@@ -13,6 +13,8 @@
|
|||||||
# wholedisk + partition on tempest
|
# wholedisk + partition on tempest
|
||||||
- ipa-tempest-bios-ipmi-direct-src
|
- ipa-tempest-bios-ipmi-direct-src
|
||||||
- ipa-tempest-bios-ipmi-iscsi-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
|
# NOTE(TheJulia): The cleaning tests run in standalone job has a
|
||||||
# high failure rate due to possible race during long running steps
|
# high failure rate due to possible race during long running steps
|
||||||
# like deployment with raid setup. While we're working on a fix,
|
# like deployment with raid setup. While we're working on a fix,
|
||||||
|
Reference in New Issue
Block a user