The following section describes the DMTF Redfish Storage Model storage model supported by iLO 5 based servers. The OEM HPE legacy Smart Storage model used by iLO 4 and supported by iLO 5 is deprecated with iLO 6 and later.
HPE ProLiant Gen10 servers and later implement the DMTF standard known as Platform Level Data Model for Redfish Device Enablement (PLDM for RDE). This open standard allows storage devices to host their own set of Redfish resources and capabilities which are rooted under the iLO /redfish/v1
root service. As a result, responses to Redfish client requests are provided by the controllers through the iLO.
Without the implementation of PLDM for RDE in either the iLO firmware or the storage controller firmware, the iLO responds to Redfish client requests using its own database of storage controller resources and properties, populated during Pre-OS tasks (POST).
For more information on HPE RDE support changes and limitations, refer to the Redfish Device Enablement (RDE) support section.
For updated information on the Redfish resources, corresponding URIs, and supported HTTP methods towards storage controllers implementing PLDM for RDE, refer to the HPE Storage Controllers Management Overview technical whitepaper.
Redfish responses from controllers implementing PLDM for RDE depend on the schema versions that are supported by each device and are likely to vary across each device vendor/family/model. Create and delete volume operations will also likely vary across devices.
As an example, NS204 storage devices don't support the DELETE volume request, while SR and MR controllers do. Refer to the Drive secure erase paragraph below for an example of NS204i volume deletion.
It is a good practice to verify that the server is powered on and that all the devices have been discovered before any operation to those devices.
As mentioned in step 1 of the Drive secure erase procedure below, the Oem.Hpe.DeviceDiscoveryComplete.DeviceDiscovery
property should be equal to vMainDeviceDiscoveryComplete
before any operation involving storage or network devices.
Refer to this article for more information concerning server states.
The following example retrieves the exhaustive list of storage device URIs using iLOrest and cURL. This list is composed of two RDE devices (DE040000
and DE042000
) and two direct attached devices (DA000005
and DA000006
).
ilorest list Members --select StorageCollection. --json
{
"Members": [
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DE040000/"
},
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DE042000/"
},
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DA000005/"
},
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DA000006/"
}
]
}
The following example retrieves the list of RDE storage devices only, using the iLOrest storagecontroller
command.
ilorest storagecontroller
---------------------------------
List of RDE storage devices
---------------------------------
DE040000: HPE MR216i-o Gen11: Health OK: Enabled
DE042000: HPE NS204i-u Gen11 Boot Controller: Health OK: Enabled
The following example retrieves the properties of a specific storage device.
ilorest list --select Storage.v \
--filter @odata.id="/redfish/v1/Systems/1/Storage/DA000001*" \
--json
The following example retrieves the URIs of the controllers attached to storage devices.
ilorest list members --selector=StorageControllerCollection --json
The following example retrieves the Status
property of a specific controller.
ilorest get Status --select StorageController. --filter Name="HPE MR216*" --json
The following example retrieves the drive list behind a specific RDE capable storage device and prints a few properties in human readable format. Append the --json
attribute to get the output in JSON format.
ilorest storagecontroller --storageid=DE040000 --physicaldrives
--------------------------------------------------
Drives on Storage DE040000
--------------------------------------------------
[2:1:2]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:2, Type SSD, Serial EDB9N5464I1309H68 - 480103981056 Bytes
[1:1:6]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 1:1:6, Type SSD, Serial EDB9N5464I1309H63 - 480103981056 Bytes
[2:1:1]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:1, Type SSD, Serial EDB9N5464I1309H69 - 480103981056 Bytes
[2:1:3]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:3, Type SSD, Serial EDB9N5464I1309H5Q - 480103981056 Bytes
[2:1:4]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:4, Type SSD, Serial EDB9N5464I1309H5I - 480103981056 Bytes
[1:1:5]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 1:1:5, Type SSD, Serial EDB9N5464I1309H5H - 480103981056 Bytes
[1:1:7]: 3.84TB 32G NVMe SSD, Model VO003840KYDMV, Location 1:1:7, Type SSD, Serial S70LNE0T801822 - 3840755982336 Bytes
[1:1:8]: 3.84TB 32G NVMe SSD, Model VO003840KYDMV, Location 1:1:8, Type SSD, Serial S70LNE0T902775 - 3840755982336 Bytes
The following example retrieves the drive properties of a specific drive
The following example retrieves the URIs of the controllers attached to storage devices.
ilorest list members --selector=StorageControllerCollection --json
iLO="<ilo-ip>"
# Retrieve Storage Device URIs
StorageDeviceList="$(curl --insecure --location --silent --user \
$user:password https://$iLO/redfish/v1/Systems/1/Storage | \
jq -r '.Members[] | ."@odata.id"' )"
for uri in $StorageDeviceList ; do
curl --insecure --location --silent --user \
$user:password https://${iLO}${uri}/Controllers | \
jq '.Members[]'
done
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DE040000/Controllers/0"
}
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DE042000/Controllers/0"
}
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DA000005/Controllers/0"
}
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DA000006/Controllers/0"
}
The following example retrieves the Status
property of a specific controller.
ilorest get Status --select StorageController. --filter Name="HPE MR216*" --json
# Retrieve Storage Device URIs
StorageDeviceList="$(curl --insecure --location --silent --user \
$user:password https://$iLO/redfish/v1/Systems/1/Storage | \
jq -r '.Members[] | ."@odata.id"' )"
ControllerUris=\
"$(\
for uri in $StorageDeviceList ; do
curl --insecure --location --silent --user $user:password \
https://${iLO}${uri}/Controllers | \
jq -r '.Members[] | ."@odata.id"'
done \
)"
{
"Status": {
"Health": "OK",
"State": "Enabled"
}
}
The following example retrieves the drive list behind a specific RDE capable storage device and prints a few properties in human readable format. Append the --json
attribute to get the output in JSON format.
ilorest storagecontroller --storageid=DE040000 --physicaldrives
--------------------------------------------------
Drives on Storage DE040000
--------------------------------------------------
[2:1:2]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:2, Type SSD, Serial EDB9N5464I1309H68 - 480103981056 Bytes
[1:1:6]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 1:1:6, Type SSD, Serial EDB9N5464I1309H63 - 480103981056 Bytes
[2:1:1]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:1, Type SSD, Serial EDB9N5464I1309H69 - 480103981056 Bytes
[2:1:3]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:3, Type SSD, Serial EDB9N5464I1309H5Q - 480103981056 Bytes
[2:1:4]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 2:1:4, Type SSD, Serial EDB9N5464I1309H5I - 480103981056 Bytes
[1:1:5]: 480GB 6G SATA SSD, Model MK000480GWXFF, Location 1:1:5, Type SSD, Serial EDB9N5464I1309H5H - 480103981056 Bytes
[1:1:7]: 3.84TB 32G NVMe SSD, Model VO003840KYDMV, Location 1:1:7, Type SSD, Serial S70LNE0T801822 - 3840755982336 Bytes
[1:1:8]: 3.84TB 32G NVMe SSD, Model VO003840KYDMV, Location 1:1:8, Type SSD, Serial S70LNE0T902775 - 3840755982336 Bytes
# Retrieve the Drive list behind controller DE040000
iLO=<ilo-ip>
User=<ilo-user>
DriveList=$(curl --silent --insecure --location -u $User:password \
https://$iLO/redfish/v1/Systems/1/Storage/DE040000 | \
jq '.Drives[]' | \
awk -F\" '{print $4}')
# For each drive URI, fetch properties (output truncated)
for d in $DriveList ; do
curl --silent --insecure --location -u $User:password \
https://${iLO}${d} | jq .
done
{
"@odata.etag": "\"e30afa80\"",
"@odata.id": "/redfish/v1/Chassis/DE040000/Drives/0",
"@odata.type": "#Drive.v1_17_0.Drive",
"Id": "0",
"Name": "480GB 6G SATA SSD",
"Status": {
"State": "Enabled",
"Health": "OK"
},
"Links": {
"Storage": {
"@odata.id": "/redfish/v1/Systems/1/Storage/DE040000"
},
"Chassis": {
"@odata.id": "/redfish/v1/Chassis/DE040000"
},
"Volumes@odata.count": 1,
"Volumes": [
{
"@odata.id": "/redfish/v1/Systems/1/Storage/DE040000/Volumes/239"
}
]
},
...
}
The following example retrieves the drive properties of a specific drive
GET /redfish/v1/Systems/1/Storage/{item}/Drives/{item}
Creating volumes in a storage controller supporting PLDM for RDE in write mode, is performed using a POST request toward the VolumeCollection
URI (/redfish/v1/Systems/{item}/Storage/{item}/Volumes
). The exhaustive list of required and optional parameters of such POST requests can be retrieved with a GET request toward /redfish/v1/Systems/1/Storage/{item}/Volumes/Capabilities
. This URI provides as well the possible values for each capability.
- The
Volumes/Capabilities
URI only exists on writable storage devices. - You can verify that POST requests are allowed to create volumes in a specific storage controller by checking the
Allow
response header of a GET request to its Volume collection URI. Refer to the next example for detail.
HEAD /redfish/v1/Systems/1/Storage/{item}/Volumes
The following example retrieves the Volumes/Capabilities
properties of a MR408i storage.
GET /redfish/v1/Systems/1/Storage/{item}/Volumes/Capabilities
The following example creates a RAID1 volume in a RDE capable MR storage device part of a Gen11/iLO 6 server. If you want to provide more parameters, consult the Volumes/Capabilities
features available for this device, as described above.
POST /redfish/v1/Systems/1/Storage/{item}/Volumes
Body:
{
"CapacityBytes": <Number>,
"StripSizeBytes": <Number>,
"DisplayName": "string",
"ReadCachePolicy": "string",
"RAIDType": "string",
"WriteCachePolicy": "string",
"Links": {
"Drives": [
{
"@odata.id": "/redfish/v1/Systems/1/Storage/{item}/Drives/0"
},
{
"@odata.id": "/redfish/v1/Systems/1/Storage/{item}/Drives/4"
}
]
}
}
The following example deletes volume 239 in RDE capable device DE040000
part of a Gen11/iLO 6 server.
DELETE /redfish/v1/Systems/1/Storage/{StorageId}/Volumes/{VolumeId}
Refer to the Drive secure erase section for deleting the NS204 volume.
Although volume deletion is sufficient for most use cases, data is still present on drives after this operation. In order to erase drive data, the DMTF proposes the Drive.SecureErase
action, in the Drive
schema.
The Drive.SecureErase
action may not be visible in the drive properties when the drive is part a volume. In this case, a volume deletion is necessary before the drive secure erase operation can occur.
Refer to the previous section for the generic way for deleting volumes.
Using the latest version of iLOrest and then cURL, the following examples performs several tasks to secure erase the drives of an NS204 storage device part of a Gen11/iLO 6 server. Adapt this workflow if you have more than one NS204 devices in your server.
Wait until the server is in the right state to have all storage devices visible. Refer to this article for more information concerning server states.
Locate NS204i storage device, volume and disks URIs.
TIPNS204 drives are not listed in the
DriveCollection
schema. Their URIs are under/redfish/v1/Sytems/1/Storage/{NS204Id}/Drives
, which is not in the DMTF's specificationAs a consequence, you'll have to extract the
Drives[]
array starting at the storage device URI.Deletion /
ResetToDefaults
of the logical volume to make theDrive.SecureErase
action visible on the corresponding drives.NOTEThe volume URI of NS204 storage devices does not allow DELETE requests. It is needed to use the
ResetToDefaults
action for that purpose.Secure erase disks and restart server.
ilorest login <ilo-ip> -u <ilo-user> -p password
# Wait until `DeviceDiscovery` == `vMainDeviceDiscoveryComplete`
while [[ "$(ilorest get --json --select ComputerSystem. --refresh | jq -r '.Oem.Hpe.DeviceDiscoveryComplete.DeviceDiscovery')" != "vMainDeviceDiscoveryComplete" ]]
do
echo -n "."
sleep 5
done
Same as above, but with cURL
iLO="<ilo-ip>"
User="<ilo-user>"
while [[ "$(curl --silent --insecure --location -u $User:password https://${iLO}/redfish/v1/Systems/1 | jq -r '.Oem.Hpe.DeviceDiscoveryComplete.DeviceDiscovery')" != "vMainDeviceDiscoveryComplete" ]]
do
echo -n "."
sleep 5
done
While the secure erase process is in progress, you can monitor its progress by monitoring the Operations[]
array and the Status
property of the disks being erased.
The following example retrieves the Operations[]
array and the drives status property using iLOrest and cURL.
ilorest list @odata.id Operations Status --filter @odata.id="/redfish/v1/Systems/1/Storage/DE042*" --json