Redfish: Changed 'update_persistent_boot' to set 'UefiTarget' boot device.

Also removed 'mac' from 'set_one_time_boot'

Adds modification in 'update_persistent_boot' to set 'UefiTarget'
as boot device, without using 'mac'. Also removed 'mac' from
'set_one_time_boot' and 'update_persistent_boot'

Change-Id: If47f68d25d2e3a3a1b58606c415c53b108e90cc1
This commit is contained in:
paresh-sao 2018-01-09 11:13:42 +00:00
parent b3cc428789
commit cb362a6ce1
5 changed files with 105 additions and 48 deletions

View File

@ -538,11 +538,10 @@ class RedfishOperations(operations.IloOperations):
LOG.debug(msg)
raise exception.IloError(msg)
def update_persistent_boot(self, devices=[], mac=None):
def update_persistent_boot(self, devices=[]):
"""Changes the persistent boot device order for the host
:param devices: ordered list of boot devices
:param mac: intiator mac address, mandatory for iSCSI uefi boot
:raises: IloError, on an error from iLO.
:raises: IloInvalidInputError, if the given input is not valid.
"""
@ -557,7 +556,7 @@ class RedfishOperations(operations.IloOperations):
try:
sushy_system.update_persistent_boot(
devices, persistent=True, mac=mac)
devices, persistent=True)
except sushy.exceptions.SushyError as e:
msg = (self._('The Redfish controller failed to update '
'persistent boot device %(devices)s.'
@ -566,11 +565,10 @@ class RedfishOperations(operations.IloOperations):
LOG.debug(msg)
raise exception.IloError(msg)
def set_one_time_boot(self, device, mac=None):
def set_one_time_boot(self, device):
"""Configures a single boot from a specific device.
:param device: Device to be set as a one time boot device
:param mac: intiator mac address, optional parameter
:raises: IloError, on an error from iLO.
:raises: IloInvalidInputError, if the given input is not valid.
"""
@ -584,7 +582,7 @@ class RedfishOperations(operations.IloOperations):
try:
sushy_system.update_persistent_boot(
[device], persistent=False, mac=mac)
[device], persistent=False)
except sushy.exceptions.SushyError as e:
msg = (self._('The Redfish controller failed to set '
'one time boot device %(device)s. '

View File

@ -67,7 +67,10 @@ class HPESystem(system.System):
model = base.Field(['Model'])
rom_version = base.Field(['Oem', 'Hpe', 'Bios', 'Current',
'VersionString'])
uefi_target_override_devices = (base.Field([
'Boot',
'UefiTargetBootSourceOverride@Redfish.AllowableValues'],
adapter=list))
supported_boot_mode = base.MappedField(
['Oem', 'Hpe', 'Bios', 'UefiClass'], mappings.SUPPORTED_BOOT_MODE,
default=constants.SUPPORTED_LEGACY_BIOS_ONLY)
@ -133,8 +136,7 @@ class HPESystem(system.System):
return self._bios_settings
def update_persistent_boot(self, devices=[], persistent=False,
mac=None):
def update_persistent_boot(self, devices=[], persistent=False):
"""Changes the persistent boot device order in BIOS boot mode for host
Note: It uses first boot device from the devices and ignores rest.
@ -142,26 +144,30 @@ class HPESystem(system.System):
:param devices: ordered list of boot devices
:param persistent: Boolean flag to indicate if the device to be set as
a persistent boot device
:param mac: intiator mac address, mandotory for iSCSI uefi boot
:raises: IloError, on an error from iLO.
:raises: IloInvalidInputError, if the given input is not valid.
"""
device = PERSISTENT_BOOT_DEVICE_MAP.get(devices[0].upper())
if device == sushy.BOOT_SOURCE_TARGET_UEFI_TARGET:
if not mac:
msg = ('Mac is needed for uefi iscsi boot')
raise exception.IloInvalidInputError(msg)
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.')
uefi_devices = self.uefi_target_override_devices
iscsi_device = None
for uefi_device in uefi_devices:
if uefi_device is not None and 'iSCSI' in uefi_device:
iscsi_device = uefi_device
break
if iscsi_device is None:
msg = 'No UEFI iSCSI bootable device found on system.'
raise exception.IloError(msg)
except sushy.exceptions.SushyError as e:
msg = ('Unable to get uefi target override devices. '
'Error %s') % (str(e))
raise exception.IloError(msg)
uefi_boot_settings = {
'Boot': {'UefiTargetBootSourceOverride': uefi_boot_string}
'Boot': {'UefiTargetBootSourceOverride': iscsi_device}
}
self._conn.patch(self.path, data=uefi_boot_settings)
elif device is None:

View File

@ -423,5 +423,63 @@
"SKU": " ",
"SystemType": "Physical",
"UUID": "00000000-0000-0000-0000-000000000000"
}
},
"System_op_for_update_persistent_boot_uefi_target": {
"@odata.context": "/redfish/v1/$metadata#Systems/Members/$entity",
"@odata.etag": "W/\"0E79655D\"",
"@odata.id": "/redfish/v1/Systems/1/",
"@odata.type": "#ComputerSystem.v1_2_0.ComputerSystem",
"Actions": {
"#ComputerSystem.Reset": {
"ResetType@Redfish.AllowableValues": [
"On",
"ForceOff",
"ForceRestart",
"Nmi",
"PushPowerButton"
],
"target": "/redfish/v1/Systems/1/Actions/ComputerSystem.Reset/"
}
},
"HostName": "",
"Id": "1",
"IndicatorLED": "Off",
"Manufacturer": "HPE",
"Name": "Computer System",
"PowerState": "On",
"Boot": {
"BootSourceOverrideEnabled": "Once",
"BootSourceOverrideMode": "UEFI",
"BootSourceOverrideTarget": "Cd",
"BootSourceOverrideTarget@Redfish.AllowableValues": [
"None",
"Cd",
"Hdd",
"Usb",
"SDCard",
"Utilities",
"Diags",
"BiosSetup",
"Pxe",
"UefiShell",
"UefiHttp",
"UefiTarget"
],
"UefiTargetBootSourceOverride": "None",
"UefiTargetBootSourceOverride@Redfish.AllowableValues": [
"HD(1,GPT,4029CE09-5C2D-464D-9C2D-EC6E607F06A1,0x800,0x100000)/\\EFI\\redhat\\shim.efi",
"HD(1,GPT,4029CE09-5C2D-464D-9C2D-EC6E607F06A1,0x800,0x100000)/\\EFI\\ubuntu\\shimx64.efi",
"HD(1,GPT,7F14DF43-6600-420A-9950-C028836F6A5D,0x800,0x64000)/\\EFI\\centos\\shim.efi",
"PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x3,0x0,0x0)",
"PciRoot(0x3)/Pci(0x0,0x0)/Pci(0x0,0x0)/Scsi(0x0,0x0)",
"PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B3EEF886,0x0)/IPv4(172.17.1.32)/iSCSI(iqn.2001-04.com.paresh.boot:volume.bin,0x1,0x0,None,None,None,TCP)"
]
},
"SerialNumber": " ",
"SKU": " ",
"SystemType": "Physical",
"UUID": "00000000-0000-0000-0000-000000000000"
}
}

View File

@ -146,18 +146,14 @@ class HPESystemTestCase(testtools.TestCase):
def test_update_persistent_boot_uefi_target(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:
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')
'json_samples/system.json', 'r') as f:
system_json = (json.loads(f.read())[
'System_op_for_update_persistent_boot_uefi_target'])
self.sys_inst.uefi_target_override_devices = (system_json[
'Boot']['UefiTargetBootSourceOverride@Redfish.AllowableValues'])
self.sys_inst.update_persistent_boot(['ISCSI'], persistent=True)
uefi_boot_settings = {
'Boot': {'UefiTargetBootSourceOverride': 'NIC.LOM.1.1.iSCSI'}
'Boot': {'UefiTargetBootSourceOverride': 'PciRoot(0x0)/Pci(0x1C,0x0)/Pci(0x0,0x0)/MAC(98F2B3EEF886,0x0)/IPv4(172.17.1.32)/iSCSI(iqn.2001-04.com.paresh.boot:volume.bin,0x1,0x0,None,None,None,TCP)'} # noqa
}
calls = [mock.call('/redfish/v1/Systems/1', data=uefi_boot_settings),
@ -167,22 +163,21 @@ class HPESystemTestCase(testtools.TestCase):
'BootSourceOverrideEnabled': 'Continuous'}})]
self.sys_inst._conn.patch.assert_has_calls(calls)
def test_update_persistent_boot_uefi_target_without_mac(self):
self.assertRaisesRegex(
exception.IloInvalidInputError,
'Mac is needed for uefi iscsi boot',
self.sys_inst.update_persistent_boot, ['ISCSI'], True, None)
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())
self.conn.get.return_value.json.side_effect = (
[bios_mock['Default'], sushy.exceptions.SushyError])
def test_update_persistent_boot_uefi_no_iscsi_device(self):
self.assertRaisesRegex(
exception.IloError,
'The BIOS Boot Settings was not found.',
self.sys_inst.update_persistent_boot, ['ISCSI'], True, '12345678')
'No UEFI iSCSI bootable device found on system.',
self.sys_inst.update_persistent_boot, ['ISCSI'], True)
def test_update_persistent_boot_uefi_target_fail(self):
update_mock = mock.PropertyMock(
side_effect=sushy.exceptions.SushyError)
type(self.sys_inst).uefi_target_override_devices = update_mock
self.assertRaisesRegex(
exception.IloError,
'Unable to get uefi target override devices.',
self.sys_inst.update_persistent_boot, ['ISCSI'], True)
del type(self.sys_inst).uefi_target_override_devices
def test_pci_devices(self):
pci_dev_return_value = None

View File

@ -545,7 +545,7 @@ class RedfishOperationsTestCase(testtools.TestCase):
def test_update_persistent_boot(self, get_system_mock):
self.rf_client.update_persistent_boot(['NETWORK'])
(get_system_mock.return_value.update_persistent_boot.
assert_called_once_with(['NETWORK'], mac=None, persistent=True))
assert_called_once_with(['NETWORK'], persistent=True))
def test_update_persistent_boot_invalid_input(self):
self.assertRaisesRegex(
@ -568,7 +568,7 @@ class RedfishOperationsTestCase(testtools.TestCase):
def test_set_one_time_boot(self, get_system_mock):
self.rf_client.set_one_time_boot('CDROM')
(get_system_mock.return_value.update_persistent_boot.
assert_called_once_with(['CDROM'], mac=None, persistent=False))
assert_called_once_with(['CDROM'], persistent=False))
def test_set_one_time_boot_invalid_input(self):
self.assertRaisesRegex(