Merge "Redfish: Follow-up patch for update persistent device"
This commit is contained in:
commit
d85ef6498c
|
@ -82,9 +82,9 @@ class BIOSPendingSettings(base.ResourceBase):
|
|||
:param boot_mode: either sys_cons.BIOS_BOOT_MODE_LEGACY_BIOS,
|
||||
sys_cons.BIOS_BOOT_MODE_UEFI.
|
||||
"""
|
||||
bios_properties = {}
|
||||
bios_properties['BootMode'] = (
|
||||
mappings.GET_BIOS_BOOT_MODE_MAP_REV.get(boot_mode))
|
||||
bios_properties = {
|
||||
'BootMode': mappings.GET_BIOS_BOOT_MODE_MAP_REV.get(boot_mode)
|
||||
}
|
||||
|
||||
if boot_mode == sys_cons.BIOS_BOOT_MODE_UEFI:
|
||||
bios_properties['UefiOptimizedBoot'] = 'Enabled'
|
||||
|
@ -129,3 +129,23 @@ class BIOSBootSettings(base.ResourceBase):
|
|||
if val in boot_string:
|
||||
return key
|
||||
return sushy.BOOT_SOURCE_TARGET_NONE
|
||||
|
||||
def get_uefi_boot_string(self, mac):
|
||||
"""Get uefi iscsi boot string for the host
|
||||
|
||||
:returns: iscsi boot string for the system
|
||||
:raises: IloError, on an error from iLO.
|
||||
"""
|
||||
boot_sources = self.boot_sources
|
||||
if not boot_sources:
|
||||
msg = ('Boot sources are not found')
|
||||
LOG.debug(msg)
|
||||
raise exception.IloError(msg)
|
||||
|
||||
for boot_source in boot_sources:
|
||||
if (mac.upper() in boot_source['UEFIDevicePath'] and
|
||||
'iSCSI' in boot_source['UEFIDevicePath']):
|
||||
return boot_source['StructuredBootString']
|
||||
else:
|
||||
msg = ('MAC provided "%s" is Invalid' % mac)
|
||||
raise exception.IloInvalidInputError(msg)
|
||||
|
|
|
@ -21,17 +21,16 @@ from sushy.resources.system import system
|
|||
from proliantutils import exception
|
||||
from proliantutils import log
|
||||
from proliantutils.redfish.resources.system import bios
|
||||
from proliantutils.redfish.resources.system import constants as sys_cons
|
||||
from proliantutils.redfish.resources.system import mappings
|
||||
from proliantutils.redfish import utils
|
||||
|
||||
LOG = log.get_logger(__name__)
|
||||
|
||||
PERSISTENT_BOOT_DEVICE_MAP = {
|
||||
'CDROM': sys_cons.BOOT_SOURCE_TARGET_CD,
|
||||
'NETWORK': sys_cons.BOOT_SOURCE_TARGET_PXE,
|
||||
'ISCSI': sys_cons.BOOT_SOURCE_TARGET_UEFI_TARGET,
|
||||
'HDD': sys_cons.BOOT_SOURCE_TARGET_HDD
|
||||
'CDROM': sushy.BOOT_SOURCE_TARGET_CD,
|
||||
'NETWORK': sushy.BOOT_SOURCE_TARGET_PXE,
|
||||
'ISCSI': sushy.BOOT_SOURCE_TARGET_UEFI_TARGET,
|
||||
'HDD': sushy.BOOT_SOURCE_TARGET_HDD
|
||||
}
|
||||
|
||||
|
||||
|
@ -118,40 +117,27 @@ class HPESystem(system.System):
|
|||
:raises: IloError, on an error from iLO.
|
||||
:raises: IloInvalidInputError, if the given input is not valid.
|
||||
"""
|
||||
new_device = devices[0]
|
||||
tenure = 'Continuous' if persistent else 'Once'
|
||||
device = PERSISTENT_BOOT_DEVICE_MAP.get(devices[0].upper())
|
||||
|
||||
try:
|
||||
boot_sources = self.bios_settings.boot_settings.boot_sources
|
||||
except sushy.exceptions.SushyError:
|
||||
msg = ('The BIOS Boot Settings was not found.')
|
||||
raise exception.IloError(msg)
|
||||
|
||||
if devices[0].upper() in PERSISTENT_BOOT_DEVICE_MAP:
|
||||
new_device = PERSISTENT_BOOT_DEVICE_MAP[devices[0].upper()]
|
||||
|
||||
new_boot_settings = {}
|
||||
if new_device is 'UefiTarget':
|
||||
if device == sushy.BOOT_SOURCE_TARGET_UEFI_TARGET:
|
||||
if not mac:
|
||||
msg = ('Mac is needed for iscsi uefi boot')
|
||||
msg = ('Mac is needed for uefi iscsi boot')
|
||||
raise exception.IloInvalidInputError(msg)
|
||||
|
||||
boot_string = None
|
||||
for boot_source in boot_sources:
|
||||
if(mac.upper() in boot_source['UEFIDevicePath'] and
|
||||
'iSCSI' in boot_source['UEFIDevicePath']):
|
||||
boot_string = boot_source['StructuredBootString']
|
||||
break
|
||||
try:
|
||||
uefi_boot_string = (self.bios_settings.boot_settings.
|
||||
get_uefi_boot_string(mac))
|
||||
except sushy.exceptions.SushyError:
|
||||
msg = ('The BIOS Boot Settings was not found.')
|
||||
raise exception.IloError(msg)
|
||||
|
||||
if not boot_string:
|
||||
msg = ('MAC provided "%s" is Invalid' % mac)
|
||||
raise exception.IloInvalidInputError(msg)
|
||||
uefi_boot_settings = {
|
||||
'Boot': {'UefiTargetBootSourceOverride': uefi_boot_string}
|
||||
}
|
||||
self._conn.patch(self.path, data=uefi_boot_settings)
|
||||
elif device is None:
|
||||
device = sushy.BOOT_SOURCE_TARGET_NONE
|
||||
|
||||
uefi_boot_settings = {}
|
||||
uefi_boot_settings['Boot'] = (
|
||||
{'UefiTargetBootSourceOverride': boot_string})
|
||||
self._conn.patch(self._path, uefi_boot_settings)
|
||||
|
||||
new_boot_settings['Boot'] = {'BootSourceOverrideEnabled': tenure,
|
||||
'BootSourceOverrideTarget': new_device}
|
||||
self._conn.patch(self._path, new_boot_settings)
|
||||
tenure = (sushy.BOOT_SOURCE_ENABLED_CONTINUOUS
|
||||
if persistent else sushy.BOOT_SOURCE_ENABLED_ONCE)
|
||||
self.set_system_boot_source(device, enabled=tenure)
|
||||
|
|
|
@ -184,3 +184,32 @@ class BIOSBootSettingsTestCase(testtools.TestCase):
|
|||
exception.IloError,
|
||||
'Boot sources or persistent boot config order not found',
|
||||
self.bios_boot_inst.get_persistent_boot_device)
|
||||
|
||||
def test_get_uefi_boot_string(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_json = (json.loads(f.read())['Default'])
|
||||
self.bios_boot_inst.boot_sources = boot_json['BootSources']
|
||||
result = self.bios_boot_inst.get_uefi_boot_string('C4346BB7EF30')
|
||||
self.assertEqual(result, 'NIC.LOM.1.1.iSCSI')
|
||||
|
||||
def test_get_uefi_boot_string_boot_sources_is_none(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_json = (
|
||||
json.loads(f.read())['BIOS_boot_without_boot_sources'])
|
||||
self.bios_boot_inst.boot_sources = boot_json['BootSources']
|
||||
self.assertRaisesRegex(
|
||||
exception.IloError,
|
||||
'Boot sources are not found',
|
||||
self.bios_boot_inst.get_uefi_boot_string, '123456')
|
||||
|
||||
def test_get_uefi_boot_string_mac_invalid(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_json = (json.loads(f.read())['Default'])
|
||||
self.bios_boot_inst.boot_sources = boot_json['BootSources']
|
||||
self.assertRaisesRegex(
|
||||
exception.IloError,
|
||||
'MAC provided "123456" is Invalid',
|
||||
self.bios_boot_inst.get_uefi_boot_string, '123456')
|
||||
|
|
|
@ -23,6 +23,7 @@ from proliantutils import exception
|
|||
from proliantutils.redfish.resources.system import bios
|
||||
from proliantutils.redfish.resources.system import constants as sys_cons
|
||||
from proliantutils.redfish.resources.system import system
|
||||
from sushy.resources.system import system as sushy_system
|
||||
|
||||
|
||||
class HPESystemTestCase(testtools.TestCase):
|
||||
|
@ -81,37 +82,29 @@ class HPESystemTestCase(testtools.TestCase):
|
|||
self.sys_inst.bios_settings)
|
||||
self.conn.get.return_value.json.assert_not_called()
|
||||
|
||||
def test_update_persistent_boot_persistent(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios.json', 'r') as f:
|
||||
bios_mock = json.loads(f.read())
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as g:
|
||||
boot_mock = json.loads(g.read())
|
||||
self.conn.get.return_value.json.side_effect = [bios_mock['Default'],
|
||||
boot_mock['Default']]
|
||||
self.sys_inst.update_persistent_boot(['CDROM'], True)
|
||||
data = {}
|
||||
data['Boot'] = {'BootSourceOverrideEnabled': 'Continuous',
|
||||
'BootSourceOverrideTarget': 'Cd'}
|
||||
self.sys_inst._conn.patch.assert_called_once_with(
|
||||
'/redfish/v1/Systems/1', data)
|
||||
@mock.patch.object(sushy_system.System, 'set_system_boot_source')
|
||||
def test_update_persistent_boot_persistent(self,
|
||||
set_system_boot_source_mock):
|
||||
self.sys_inst.update_persistent_boot(['CDROM'], persistent=True)
|
||||
set_system_boot_source_mock.assert_called_once_with(
|
||||
sushy.BOOT_SOURCE_TARGET_CD,
|
||||
enabled=sushy.BOOT_SOURCE_ENABLED_CONTINUOUS)
|
||||
|
||||
def test_update_persistent_boot_not_persistent(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios.json', 'r') as f:
|
||||
bios_mock = json.loads(f.read())
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_mock = json.loads(f.read())
|
||||
self.conn.get.return_value.json.side_effect = [bios_mock['Default'],
|
||||
boot_mock['Default']]
|
||||
self.sys_inst.update_persistent_boot(['CDROM'], False)
|
||||
data = {}
|
||||
data['Boot'] = {'BootSourceOverrideEnabled': 'Once',
|
||||
'BootSourceOverrideTarget': 'Cd'}
|
||||
self.sys_inst._conn.patch.assert_called_once_with(
|
||||
'/redfish/v1/Systems/1', data)
|
||||
@mock.patch.object(sushy_system.System, 'set_system_boot_source')
|
||||
def test_update_persistent_boot_device_unknown_persistent(
|
||||
self, set_system_boot_source_mock):
|
||||
self.sys_inst.update_persistent_boot(['unknown'], persistent=True)
|
||||
set_system_boot_source_mock.assert_called_once_with(
|
||||
sushy.BOOT_SOURCE_TARGET_NONE,
|
||||
enabled=sushy.BOOT_SOURCE_ENABLED_CONTINUOUS)
|
||||
|
||||
@mock.patch.object(sushy_system.System, 'set_system_boot_source')
|
||||
def test_update_persistent_boot_not_persistent(
|
||||
self, set_system_boot_source_mock):
|
||||
self.sys_inst.update_persistent_boot(['CDROM'], persistent=False)
|
||||
set_system_boot_source_mock.assert_called_once_with(
|
||||
sushy.BOOT_SOURCE_TARGET_CD,
|
||||
enabled=sushy.BOOT_SOURCE_ENABLED_ONCE)
|
||||
|
||||
def test_update_persistent_boot_uefi_target(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
|
@ -119,49 +112,30 @@ class HPESystemTestCase(testtools.TestCase):
|
|||
bios_mock = json.loads(f.read())
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_mock = json.loads(f.read())
|
||||
self.conn.get.return_value.json.side_effect = [bios_mock['Default'],
|
||||
boot_mock['Default']]
|
||||
bios_boot_mock = json.loads(f.read())
|
||||
self.conn.get.return_value.json.reset()
|
||||
self.conn.get.return_value.json.side_effect = (
|
||||
[bios_mock['Default'], bios_boot_mock['Default']])
|
||||
self.sys_inst.update_persistent_boot(['ISCSI'], persistent=True,
|
||||
mac='C4346BB7EF30')
|
||||
data = {}
|
||||
data['Boot'] = {'UefiTargetBootSourceOverride': 'NIC.LOM.1.1.iSCSI'}
|
||||
new_data = {}
|
||||
new_data['Boot'] = {'BootSourceOverrideEnabled': 'Continuous',
|
||||
'BootSourceOverrideTarget': 'UefiTarget'}
|
||||
calls = [mock.call('/redfish/v1/Systems/1', data),
|
||||
mock.call('/redfish/v1/Systems/1', new_data)]
|
||||
uefi_boot_settings = {
|
||||
'Boot': {'UefiTargetBootSourceOverride': 'NIC.LOM.1.1.iSCSI'}
|
||||
}
|
||||
|
||||
calls = [mock.call('/redfish/v1/Systems/1', data=uefi_boot_settings),
|
||||
mock.call('/redfish/v1/Systems/1',
|
||||
data={'Boot':
|
||||
{'BootSourceOverrideTarget': 'UefiTarget',
|
||||
'BootSourceOverrideEnabled': 'Continuous'}})]
|
||||
self.sys_inst._conn.patch.assert_has_calls(calls)
|
||||
|
||||
def test_update_persistent_boot_uefi_target_without_mac(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios.json', 'r') as f:
|
||||
bios_mock = json.loads(f.read())
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_mock = json.loads(f.read())
|
||||
self.conn.get.return_value.json.side_effect = [bios_mock['Default'],
|
||||
boot_mock['Default']]
|
||||
self.assertRaisesRegex(
|
||||
exception.IloInvalidInputError,
|
||||
'Mac is needed for iscsi uefi boot',
|
||||
'Mac is needed for uefi iscsi boot',
|
||||
self.sys_inst.update_persistent_boot, ['ISCSI'], True, None)
|
||||
|
||||
def test_update_persistent_boot_uefi_target_invalid_mac(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios.json', 'r') as f:
|
||||
bios_mock = json.loads(f.read())
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios_boot.json', 'r') as f:
|
||||
boot_mock = json.loads(f.read())
|
||||
self.conn.get.return_value.json.side_effect = [bios_mock['Default'],
|
||||
boot_mock['Default']]
|
||||
self.assertRaisesRegex(
|
||||
exception.IloInvalidInputError,
|
||||
'MAC provided "12345678" is Invalid',
|
||||
self.sys_inst.update_persistent_boot, ['ISCSI'], True, '12345678')
|
||||
|
||||
def test_update_persistent_boot_fail(self):
|
||||
def test_update_persistent_boot_uefi_target_fail(self):
|
||||
with open('proliantutils/tests/redfish/'
|
||||
'json_samples/bios.json', 'r') as f:
|
||||
bios_mock = json.loads(f.read())
|
||||
|
@ -170,4 +144,4 @@ class HPESystemTestCase(testtools.TestCase):
|
|||
self.assertRaisesRegex(
|
||||
exception.IloError,
|
||||
'The BIOS Boot Settings was not found.',
|
||||
self.sys_inst.update_persistent_boot, ['CDROM'], True, None)
|
||||
self.sys_inst.update_persistent_boot, ['ISCSI'], True, '12345678')
|
||||
|
|
Loading…
Reference in New Issue