Post by max on Jul 15, 2020 15:44:53 GMT
Hi,
When wanting to "reset" a server, our software used to query /redfish/v1/Systems/<system name> and look at the ResetType@Redfish.AllowableValues field, to see if we can use ForceRestart, GracefulRestart, or if we need to send ForceOff -> sleep some time -> On.
This is needed because some vendors did not bother to implement ForeceRestart -even though they all do support "chassis power reset" through RCMP+ protocol-, while others do.
An annoyance I wrote about before in 2017 ( Make implementation common reset types mandatory thread)
We noticed however that some vendors are now no longer sending ResetType@Redfish.AllowableValues with the system information, but seems to provide a "@redfish.ActionInfo" instead with that information.
E.g. Lenovo SR635 sends:
And if you then query /redfish/v1/Systems/Self/ResetActionInfo you get the same info as before:
Apparently this construct is allowed in the newer Redfish specification version, but needless to say this breaks any and all existing software that was written before "@redfish.ActionInfo" was part of the spec.
Can anybody enlighten me why this breaking change was made?
The Redfish protocol offers a lot of flexibility for system vendors about what way they chose to implement things, but that makes it very hard for client software developers to deal with the different implementations.
When wanting to "reset" a server, our software used to query /redfish/v1/Systems/<system name> and look at the ResetType@Redfish.AllowableValues field, to see if we can use ForceRestart, GracefulRestart, or if we need to send ForceOff -> sleep some time -> On.
This is needed because some vendors did not bother to implement ForeceRestart -even though they all do support "chassis power reset" through RCMP+ protocol-, while others do.
An annoyance I wrote about before in 2017 ( Make implementation common reset types mandatory thread)
We noticed however that some vendors are now no longer sending ResetType@Redfish.AllowableValues with the system information, but seems to provide a "@redfish.ActionInfo" instead with that information.
E.g. Lenovo SR635 sends:
{
"@odata.context":"/redfish/v1/$metadata#ComputerSystem.ComputerSystem",
"@odata.etag":"\"1594825713\"",
"@odata.id":"/redfish/v1/Systems/Self",
"@odata.type":"#ComputerSystem.v1_7_0.ComputerSystem",
"Actions":{
"#ComputerSystem.Reset":{
"@Redfish.ActionInfo":"/redfish/v1/Systems/Self/ResetActionInfo",
"@Redfish.OperationApplyTimeSupport":{
"@odata.type":"#Settings.v1_2_1.Settings.OperationApplyTimeSupport",
"MaintenanceWindowDurationInSeconds":600,
"MaintenanceWindowResource":{
"@odata.id":"/redfish/v1/Systems/Self"
},
"SupportedValues":[
"Immediate",
"AtMaintenanceWindowStart"
]
},
"target":"/redfish/v1/Systems/Self/Actions/ComputerSystem.Reset"
}
},
"AssetTag":"Free form asset tag",
"Boot":{
"BootOptions":{
"@odata.id":"/redfish/v1/Systems/Self/BootOptions"
},
"BootSourceOverrideEnabled":"Disabled",
"BootSourceOverrideEnabled@Redfish.AllowableValues":[
"Disabled",
"Once",
"Continuous"
],
"BootSourceOverrideMode":"Legacy",
"BootSourceOverrideMode@Redfish.AllowableValues":[
"Legacy",
"UEFI"
],
"BootSourceOverrideTarget":"None",
"BootSourceOverrideTarget@Redfish.AllowableValues":[
"None",
"Pxe",
"Floppy",
"Cd",
"Usb",
"Hdd",
"BiosSetup",
"Diags"
],
"Certificates":{
"@odata.id":"/redfish/v1/Systems/Self/Boot/Certificates"
}
},
"Description":"System Self",
"EthernetInterfaces":{
"@odata.id":"/redfish/v1/Systems/Self/EthernetInterfaces"
},
"Id":"Self",
"IndicatorLED":"Off",
"IndicatorLED@Redfish.AllowableValues":[
"Lit",
"Blinking",
"Off"
],
"Links":{
"Chassis":[
{
"@odata.id":"/redfish/v1/Chassis/Self"
}
],
"Chassis@odata.count":1,
"ManagedBy":[
{
"@odata.id":"/redfish/v1/Managers/Self"
}
],
"ManagedBy@odata.count":1,
"PoweredBy":[
{
"@odata.id":"/redfish/v1/Chassis/Self/Power#/PowerSupplies/1"
},
{
"@odata.id":"/redfish/v1/Chassis/Self/Power#/PowerSupplies/0"
}
],
"PoweredBy@odata.count":2
},
"LogServices":{
"@odata.id":"/redfish/v1/Systems/Self/LogServices"
},
"Manufacturer":" ",
"Memory":{
"@odata.id":"/redfish/v1/Systems/Self/Memory"
},
"MemoryDomains":{
"@odata.id":"/redfish/v1/Systems/Self/MemoryDomains"
},
"Model":" ",
"Name":"System",
"NetworkInterfaces":{
"@odata.id":"/redfish/v1/Systems/Self/NetworkInterfaces"
},
"PartNumber":" ",
"PowerState":"Off",
"Processors":{
"@odata.id":"/redfish/v1/Systems/Self/Processors"
},
"SKU":" ",
"SecureBoot":{
"@odata.id":"/redfish/v1/Systems/Self/SecureBoot"
},
"SerialNumber":" ",
"SimpleStorage":{
"@odata.id":"/redfish/v1/Systems/Self/SimpleStorage"
},
"Status":{
"Health":"OK",
"HealthRollup":"OK",
"State":"Enabled"
},
"Storage":{
"@odata.id":"/redfish/v1/Systems/Self/Storage"
},
"SystemType":"Physical"
}
And if you then query /redfish/v1/Systems/Self/ResetActionInfo you get the same info as before:
{
"@odata.context":"/redfish/v1/$metadata#ActionInfo.ActionInfo",
"@odata.etag":"\"1594825760\"",
"@odata.id":"/redfish/v1/Systems/Self/ResetActionInfo",
"@odata.type":"#ActionInfo.v1_1_1.ActionInfo",
"Description":"This action is used to reset the Systems",
"Id":"ResetAction",
"Name":"ResetAction",
"Parameters":[
{
"AllowableValues":[
"GracefulShutdown",
"ForceOff",
"On",
"ForceRestart"
],
"DataType":"String",
"Name":"ResetType",
"Required":true
}
]
}
Apparently this construct is allowed in the newer Redfish specification version, but needless to say this breaks any and all existing software that was written before "@redfish.ActionInfo" was part of the spec.
Can anybody enlighten me why this breaking change was made?
The Redfish protocol offers a lot of flexibility for system vendors about what way they chose to implement things, but that makes it very hard for client software developers to deal with the different implementations.