Merge "Follow-up for Implementation for UEFI iSCSI boot for ILO"

This commit is contained in:
Zuul 2018-01-31 16:54:18 +00:00 committed by Gerrit Code Review
commit eeeff800b3
5 changed files with 95 additions and 56 deletions

View File

@ -539,7 +539,6 @@ class IloVirtualMediaBoot(base.BootInterface):
:returns: None
:raises: IloOperationError, if some operation on iLO failed.
"""
LOG.debug("Cleaning up the instance.")
manager_utils.node_power_action(task, states.POWER_OFF)
disable_secure_boot_if_supported(task)
@ -550,16 +549,13 @@ class IloVirtualMediaBoot(base.BootInterface):
# It will clear iSCSI info from iLO
task.driver.management.clear_iscsi_boot_target(task)
driver_internal_info.pop('ilo_uefi_iscsi_boot', None)
task.node.driver_internal_info = driver_internal_info
task.node.save()
else:
_clean_up_boot_iso_for_instance(task.node)
driver_internal_info = task.node.driver_internal_info
driver_internal_info.pop('boot_iso_created_in_web_server', None)
driver_internal_info.pop('root_uuid_or_disk_id', None)
task.node.driver_internal_info = driver_internal_info
task.node.save()
ilo_common.cleanup_vmedia_boot(task)
task.node.driver_internal_info = driver_internal_info
task.node.save()
@METRICS.timer('IloVirtualMediaBoot.clean_up_ramdisk')
def clean_up_ramdisk(self, task):
@ -688,7 +684,6 @@ class IloPXEBoot(pxe.PXEBoot):
:returns: None
:raises: IloOperationError, if some operation on iLO failed.
"""
manager_utils.node_power_action(task, states.POWER_OFF)
disable_secure_boot_if_supported(task)
driver_internal_info = task.node.driver_internal_info

View File

@ -523,6 +523,7 @@ class IloManagement(base.ManagementInterface):
The initiator is set with the target details like
IQN, LUN, IP, Port etc.
:param task: a task from TaskManager.
:raises: MissingParameterValue if a required parameter is missing.
:raises: IloCommandNotSupportedInBiosError if system in BIOS boot mode.
:raises: IloError on an error from iLO.
"""
@ -532,20 +533,24 @@ class IloManagement(base.ManagementInterface):
volume = volume_target.VolumeTarget.get_by_uuid(task.context,
boot_volume)
properties = volume.properties
username = properties.get('auth_username', None)
password = properties.get('auth_password', None)
portal = properties['target_portal']
iqn = properties['target_iqn']
lun = properties['target_lun']
host, port = portal.split(':')
username = properties.get('auth_username')
password = properties.get('auth_password')
try:
portal = properties['target_portal']
iqn = properties['target_iqn']
lun = properties['target_lun']
host, port = portal.split(':')
except KeyError as e:
raise exception.MissingParameterValue(
_('Failed to get iSCSI target info for node '
'%(node)s. Error: %(error)s') % {'node': task.node.uuid,
'error': e})
ilo_object = ilo_common.get_ilo_object(task.node)
try:
if username is None:
ilo_object.set_iscsi_info(iqn, lun, host, port)
else:
ilo_object.set_iscsi_info(iqn, lun, host, port, 'CHAP',
username, password)
auth_method = 'CHAP' if username else None
ilo_object.set_iscsi_info(
iqn, lun, host, port, auth_method=auth_method,
username=username, password=password)
except ilo_error.IloCommandNotSupportedInBiosError as ilo_exception:
operation = (_("Setting of target IQN %(target_iqn)s for node "
"%(node)s")

View File

@ -702,14 +702,17 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
autospec=True)
@mock.patch.object(ilo_boot, '_validate_driver_info',
spec_set=True, autospec=True)
def test_validate_boot_from_volume(self, mock_val_driver_info,
storage_mock):
@mock.patch.object(ilo_boot, '_validate_instance_image_info',
spec_set=True, autospec=True)
def test_validate_boot_from_volume(self, mock_val_instance_image_info,
mock_val_driver_info, storage_mock):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
task.node.driver_info['ilo_deploy_iso'] = 'deploy-iso'
storage_mock.return_value = False
task.driver.boot.validate(task)
mock_val_driver_info.assert_called_once_with(task)
self.assertFalse(mock_val_instance_image_info.called)
@mock.patch.object(ilo_boot, 'prepare_node_for_deploy',
spec_set=True, autospec=True)
@ -911,8 +914,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
clear_iscsi_boot_target_mock.assert_called_once_with(mock.ANY,
task)
update_secure_boot_mode_mock.assert_called_once_with(task, False)
self.assertIsNone(self.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
autospec=True)
@ -929,7 +932,7 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
is_iscsi_boot_mock, cleanup_iso_mock, cleanup_vmedia_mock):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
is_iscsi_boot_mock.return_value = True
is_iscsi_boot_mock.return_value = False
task.driver.boot.clean_up_instance(task)
cleanup_iso_mock.assert_called_once_with(task.node)
cleanup_vmedia_mock.assert_called_once_with(task)
@ -976,6 +979,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
persistent=True)
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
def test_prepare_instance_whole_disk_image_local(self):
self.node.instance_info = {'capabilities': '{"boot_option": "local"}'}
@ -1012,6 +1017,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
mock.ANY, task, "12312642-09d3-467f-8e09-12385826a123")
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
autospec=True)
@ -1034,6 +1041,10 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
is_iscsi_boot_mock, cleanup_vmedia_boot_mock):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
driver_internal_info = task.node.driver_internal_info
driver_internal_info['ilo_uefi_iscsi_boot'] = True
task.node.driver_internal_info = driver_internal_info
task.node.save()
is_iscsi_boot_mock.return_value = True
get_boot_mode_mock.return_value = 'uefi'
task.driver.boot.prepare_instance(task)
@ -1043,6 +1054,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
task, boot_devices.ISCSIBOOT, persistent=True)
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
self.assertTrue(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(ilo_common, 'cleanup_vmedia_boot', spec_set=True,
autospec=True)
@ -1062,6 +1075,8 @@ class IloVirtualMediaBootTestCase(db_base.DbTestCase):
"in BIOS boot mode.",
task.driver.boot.prepare_instance, task)
cleanup_vmedia_boot_mock.assert_called_once_with(task)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
class IloPXEBootTestCase(db_base.DbTestCase):
@ -1153,6 +1168,33 @@ class IloPXEBootTestCase(db_base.DbTestCase):
update_secure_boot_mode_mock.assert_called_once_with(task, False)
pxe_cleanup_mock.assert_called_once_with(mock.ANY, task)
@mock.patch.object(deploy_utils, 'is_iscsi_boot',
spec_set=True, autospec=True)
@mock.patch.object(ilo_management.IloManagement, 'clear_iscsi_boot_target',
spec_set=True, autospec=True)
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
autospec=True)
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
autospec=True)
def test_clean_up_instance_boot_from_volume(self, node_power_mock,
update_secure_boot_mode_mock,
clear_iscsi_boot_target_mock,
is_iscsi_boot_mock):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
driver_internal_info = task.node.driver_internal_info
driver_internal_info['ilo_uefi_iscsi_boot'] = True
task.node.driver_internal_info = driver_internal_info
task.node.save()
is_iscsi_boot_mock.return_value = True
task.driver.boot.clean_up_instance(task)
clear_iscsi_boot_target_mock.assert_called_once_with(mock.ANY,
task)
node_power_mock.assert_called_once_with(task, states.POWER_OFF)
update_secure_boot_mode_mock.assert_called_once_with(task, False)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(deploy_utils, 'is_iscsi_boot',
spec_set=True, autospec=True)
@mock.patch.object(deploy_utils, 'get_boot_mode_for_deploy',
@ -1176,6 +1218,8 @@ class IloPXEBootTestCase(db_base.DbTestCase):
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
pxe_prepare_instance_mock.assert_called_once_with(mock.ANY, task)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(deploy_utils, 'is_iscsi_boot',
spec_set=True, autospec=True)
@ -1200,6 +1244,8 @@ class IloPXEBootTestCase(db_base.DbTestCase):
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
pxe_prepare_instance_mock.assert_called_once_with(mock.ANY, task)
self.assertIsNone(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(deploy_utils, 'is_iscsi_boot',
spec_set=True, autospec=True)
@ -1228,32 +1274,5 @@ class IloPXEBootTestCase(db_base.DbTestCase):
task, boot_devices.ISCSIBOOT, persistent=True)
update_boot_mode_mock.assert_called_once_with(task)
update_secure_boot_mode_mock.assert_called_once_with(task, True)
self.assertIsNone(self.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
@mock.patch.object(deploy_utils, 'is_iscsi_boot',
spec_set=True, autospec=True)
@mock.patch.object(ilo_management.IloManagement, 'clear_iscsi_boot_target',
spec_set=True, autospec=True)
@mock.patch.object(ilo_common, 'update_secure_boot_mode', spec_set=True,
autospec=True)
@mock.patch.object(manager_utils, 'node_power_action', spec_set=True,
autospec=True)
def test_clean_up_instance_boot_from_volume(self, node_power_mock,
update_secure_boot_mode_mock,
clear_iscsi_boot_target_mock,
is_iscsi_boot_mock):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
driver_internal_info = task.node.driver_internal_info
driver_internal_info['ilo_uefi_iscsi_boot'] = True
task.node.driver_internal_info = driver_internal_info
task.node.save()
is_iscsi_boot_mock.return_value = True
task.driver.boot.clean_up_instance(task)
clear_iscsi_boot_target_mock.assert_called_once_with(mock.ANY,
task)
node_power_mock.assert_called_once_with(task, states.POWER_OFF)
update_secure_boot_mode_mock.assert_called_once_with(task, False)
self.assertIsNone(self.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))
self.assertTrue(task.node.driver_internal_info.get(
'ilo_uefi_iscsi_boot'))

View File

@ -733,7 +733,8 @@ class IloManagementTestCase(db_base.DbTestCase):
task.driver.management.set_iscsi_boot_target(task)
ilo_object_mock.set_iscsi_info.assert_called_once_with(
'fake_iqn', 0, 'fake_host', '3260',
'CHAP', 'fake_username', 'fake_password')
auth_method='CHAP', username='fake_username',
password='fake_password')
@mock.patch.object(ilo_common, 'get_ilo_object', spec_set=True,
autospec=True)
@ -754,7 +755,8 @@ class IloManagementTestCase(db_base.DbTestCase):
ilo_object_mock = get_ilo_object_mock.return_value
task.driver.management.set_iscsi_boot_target(task)
ilo_object_mock.set_iscsi_info.assert_called_once_with(
'fake_iqn', 0, 'fake_host', '3260')
'fake_iqn', 0, 'fake_host', '3260', auth_method=None,
password=None, username=None)
@mock.patch.object(ilo_common, 'get_ilo_object', spec_set=True,
autospec=True)
@ -781,6 +783,24 @@ class IloManagementTestCase(db_base.DbTestCase):
task.driver.management.set_iscsi_boot_target,
task)
def test_set_iscsi_boot_target_missed_properties(self):
with task_manager.acquire(self.context, self.node.uuid,
shared=False) as task:
vol_id = uuidutils.generate_uuid()
obj_utils.create_test_volume_target(
self.context, node_id=self.node.id, volume_type='iscsi',
boot_index=0, volume_id='1234', uuid=vol_id,
properties={'target_iqn': 'fake_iqn',
'auth_username': 'fake_username',
'auth_password': 'fake_password'})
driver_internal_info = task.node.driver_internal_info
driver_internal_info['boot_from_volume'] = vol_id
task.node.driver_internal_info = driver_internal_info
task.node.save()
self.assertRaises(exception.MissingParameterValue,
task.driver.management.set_iscsi_boot_target,
task)
@mock.patch.object(ilo_common, 'get_ilo_object', spec_set=True,
autospec=True)
def test_set_iscsi_boot_target_in_bios(self, get_ilo_object_mock):

View File

@ -1,7 +1,7 @@
---
features:
- Enhanced boot interface 'ilo-pxe' and 'ilo-virtual-media' to support
firmware based booting from iSCSI volume.
firmware based booting from iSCSI volume in UEFI boot mode.
upgrade:
- The ``update_persistent_boot`` and ``[un]set_iscsi_info`` interfaces
of 'proliantutils' library has been enhanced to support booting from