| /** @file | |
| This library provides a set of utility APIs that allow to create/read/update/delete | |
| (CRUD) Redfish resources and provide basic query abilities by using [URI/RedPath] | |
| (https://github.com/DMTF/libredfish). | |
| The query language is based on XPath (https://www.w3.org/TR/1999/REC-xpath-19991116/). | |
| This library and query language essentially treat the entire Redfish Service like it | |
| was a single JSON document. In other words whenever it encounters an odata.id in JSON | |
| document, it will retrieve the new JSON document (if needed). We name the path as | |
| RedPath: | |
| Expression Description | |
| nodename Selects the JSON entity with the name "nodename". | |
| If the value of nodename is an object with "@odata.id", | |
| it will continue get the value from "@odata.id". | |
| / Selects from the root node | |
| [index] Selects the index number JSON entity from an array or | |
| object. If the JSON entity is one collection (has | |
| Members & Members@odata.count), means to get the index | |
| member in "Members". Index number >=1, 1 means to return | |
| the first instance. | |
| [XXX] Operation on JSON entity. | |
| If the JSON entity is one collection (has Members & | |
| Members@odata.count), means to get all elements in | |
| "Members". If the JSON entity is one array, means to | |
| get all elements in array. Others will match the nodename | |
| directly (e.g. JSON_OBJECT, JSON_STRING, JSON_TRUE, | |
| JSON_FALSE, JSON_INTEGER). | |
| [nodename] Selects all the elements from an JSON entity that | |
| contain a property named "nodename" | |
| [name=value] Selects all the elements from an JSON entity where | |
| the property "name" is equal to "value" | |
| [name~value] Selects all the elements from an JSON entity where | |
| the string property "name" is equal to "value" using | |
| case insensitive comparison. | |
| [name<value] Selects all the elements from an JSON entity where | |
| the property "name" is less than "value" | |
| [name<=value] Selects all the elements from an JSON entity where | |
| the property "name" is less than or equal to "value" | |
| [name>value] Selects all the elements from an JSON entity where | |
| the property "name" is greater than "value" | |
| [name>=value] Selects all the elements from an JSON entity where | |
| the property "name" is greater than or equal to "value" | |
| Some examples: | |
| /v1/Chassis[1] - Will return the first Chassis instance. | |
| /v1/Chassis[SKU=1234] - Will return all Chassis instances with a SKU field equal to 1234. | |
| /v1/Systems[Storage] - Will return all the System instances that have Storage field populated. | |
| Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
| (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef REDFISH_LIB_H_ | |
| #define REDFISH_LIB_H_ | |
| #include <Library/JsonLib.h> | |
| #include <Protocol/Http.h> | |
| #include <Protocol/EdkIIRedfishConfigHandler.h> | |
| #define ODATA_TYPE_NAME_MAX_SIZE 128 | |
| #define ODATA_TYPE_MAX_SIZE 128 | |
| /// | |
| /// Library class public defines | |
| /// | |
| typedef VOID *REDFISH_SERVICE; | |
| typedef VOID *REDFISH_PAYLOAD; | |
| /// | |
| /// Library class public structures/unions | |
| /// | |
| typedef struct { | |
| EFI_HTTP_STATUS_CODE *StatusCode; | |
| UINTN HeaderCount; | |
| EFI_HTTP_HEADER *Headers; | |
| REDFISH_PAYLOAD Payload; | |
| } REDFISH_RESPONSE; | |
| /// | |
| /// Odata type-name mapping structure. | |
| /// | |
| typedef struct { | |
| CONST CHAR8 OdataTypeName[ODATA_TYPE_NAME_MAX_SIZE]; | |
| CONST CHAR8 OdataType[ODATA_TYPE_MAX_SIZE]; | |
| } REDFISH_ODATA_TYPE_MAPPING; | |
| /** | |
| This function uses REST EX protocol provided in RedfishConfigServiceInfo. | |
| The service enumerator will also handle the authentication flow automatically | |
| if HTTP basic auth or Redfish session login is configured to use. | |
| Callers are responsible for freeing the returned service by RedfishCleanupService(). | |
| @param[in] RedfishConfigServiceInfo Redfish service information the EFI Redfish | |
| feature driver communicates with. | |
| @return New created Redfish Service, or NULL if error happens. | |
| **/ | |
| REDFISH_SERVICE | |
| EFIAPI | |
| RedfishCreateService ( | |
| IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo | |
| ); | |
| /** | |
| Free the Service and all its related resources. | |
| @param[in] RedfishService The Service to access the Redfish resources. | |
| **/ | |
| VOID | |
| EFIAPI | |
| RedfishCleanupService ( | |
| IN REDFISH_SERVICE RedfishService | |
| ); | |
| /** | |
| Create REDFISH_PAYLOAD instance in local with JSON represented resource value and | |
| the Redfish Service. | |
| The returned REDFISH_PAYLOAD can be used to create or update Redfish resource in | |
| server side. | |
| Callers are responsible for freeing the returned payload by RedfishCleanupPayload(). | |
| @param[in] Value JSON Value of the redfish resource. | |
| @param[in] RedfishService The Service to access the Redfish resources. | |
| @return REDFISH_PAYLOAD instance of the resource, or NULL if error happens. | |
| **/ | |
| REDFISH_PAYLOAD | |
| EFIAPI | |
| RedfishCreatePayload ( | |
| IN EDKII_JSON_VALUE Value, | |
| IN REDFISH_SERVICE RedfishService | |
| ); | |
| /** | |
| Free the RedfishPayload and all its related resources. | |
| @param[in] Payload Payload to be freed. | |
| **/ | |
| VOID | |
| EFIAPI | |
| RedfishCleanupPayload ( | |
| IN REDFISH_PAYLOAD Payload | |
| ); | |
| /** | |
| This function returns the decoded JSON value of a REDFISH_PAYLOAD. | |
| Caller doesn't need to free the returned JSON value because it will be released | |
| in corresponding RedfishCleanupPayload() function. | |
| @param[in] Payload A REDFISH_PAYLOAD instance. | |
| @return Decoded JSON value of the payload. | |
| **/ | |
| EDKII_JSON_VALUE | |
| EFIAPI | |
| RedfishJsonInPayload ( | |
| IN REDFISH_PAYLOAD Payload | |
| ); | |
| /** | |
| Fill the input RedPath string with system UUID from SMBIOS table or use the customized | |
| ID if FromSmbios == FALSE. | |
| This is a helper function to build a RedPath string which can be used to address | |
| a Redfish resource for this computer system. The input PathString must have a Systems | |
| note in format of "Systems[UUID=%g]" or "Systems[UUID~%g]" to fill the UUID value. | |
| Example: | |
| Use "/v1/Systems[UUID=%g]/Bios" to build a RedPath to address the "Bios" resource | |
| for this computer system. | |
| @param[in] RedPath RedPath format to be build. | |
| @param[in] FromSmbios Get system UUID from SMBIOS as computer system instance ID. | |
| @param[in] IdString The computer system instance ID. | |
| @return Full RedPath with system UUID inside, or NULL if error happens. | |
| **/ | |
| CHAR8 * | |
| EFIAPI | |
| RedfishBuildPathWithSystemUuid ( | |
| IN CONST CHAR8 *RedPath, | |
| IN BOOLEAN FromSmbios, | |
| IN CHAR8 *IdString OPTIONAL | |
| ); | |
| /** | |
| Get a redfish response addressed by a RedPath string, including HTTP StatusCode, Headers | |
| and Payload which record any HTTP response messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] RedfishService The Service to access the Redfish resources. | |
| @param[in] RedPath RedPath string to address a resource, must start | |
| from the root node. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX. The corresponding redfish resource has | |
| been returned in Payload within RedResponse. | |
| @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned Payload is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is NULL, indicates any error happen. | |
| 3. If the returned StatusCode is not 2XX, indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishGetByService ( | |
| IN REDFISH_SERVICE RedfishService, | |
| IN CONST CHAR8 *RedPath, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Get a redfish response addressed by URI, including HTTP StatusCode, Headers | |
| and Payload which record any HTTP response messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] RedfishService The Service to access the URI resources. | |
| @param[in] URI String to address a resource. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX. The corresponding redfish resource has | |
| been returned in Payload within RedResponse. | |
| @retval EFI_INVALID_PARAMETER RedfishService, RedPath, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned Payload is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is NULL, indicates any error happen. | |
| 3. If the returned StatusCode is not 2XX, indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishGetByUri ( | |
| IN REDFISH_SERVICE RedfishService, | |
| IN CONST CHAR8 *Uri, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Get a redfish response addressed by the input Payload and relative RedPath string, | |
| including HTTP StatusCode, Headers and Payload which record any HTTP response messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] Payload A existing REDFISH_PAYLOAD instance. | |
| @param[in] RedPath Relative RedPath string to address a resource inside Payload. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful: | |
| 1. The HTTP StatusCode is NULL and the returned Payload in | |
| RedResponse is not NULL, indicates the Redfish resource has | |
| been parsed from the input payload directly. | |
| 2. The HTTP StatusCode is not NULL and the value is 2XX, | |
| indicates the corresponding redfish resource has been returned | |
| in Payload within RedResponse. | |
| @retval EFI_INVALID_PARAMETER Payload, RedPath, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned Payload is NULL, indicates any error happen. | |
| 2. If StatusCode is not NULL and the returned value of StatusCode | |
| is not 2XX, indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishGetByPayload ( | |
| IN REDFISH_PAYLOAD Payload, | |
| IN CONST CHAR8 *RedPath, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Use HTTP PATCH to perform updates on pre-existing Redfish resource. | |
| This function uses the RedfishService to patch a Redfish resource addressed by | |
| Uri (only the relative path is required). Changes to one or more properties within | |
| the target resource are represented in the input Content, properties not specified | |
| in Content won't be changed by this request. The corresponding redfish response will | |
| returned, including HTTP StatusCode, Headers and Payload which record any HTTP response | |
| messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] RedfishService The Service to access the Redfish resources. | |
| @param[in] Uri Relative path to address the resource. | |
| @param[in] Content JSON represented properties to be update. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX. The Redfish resource will be returned | |
| in Payload within RedResponse if server send it back in the HTTP | |
| response message body. | |
| @retval EFI_INVALID_PARAMETER RedfishService, Uri, Content, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned StatusCode is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is not NULL and the value is not 2XX, | |
| indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishPatchToUri ( | |
| IN REDFISH_SERVICE RedfishService, | |
| IN CONST CHAR8 *Uri, | |
| IN CONST CHAR8 *Content, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Use HTTP PATCH to perform updates on target payload. Patch to odata.id in Payload directly. | |
| This function uses the Payload to patch the Target. Changes to one or more properties | |
| within the target resource are represented in the input Payload, properties not specified | |
| in Payload won't be changed by this request. The corresponding redfish response will | |
| returned, including HTTP StatusCode, Headers and Payload which record any HTTP response | |
| messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] Target The target payload to be updated. | |
| @param[in] Payload Palyoad with properties to be changed. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX. The Redfish resource will be returned | |
| in Payload within RedResponse if server send it back in the HTTP | |
| response message body. | |
| @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned StatusCode is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is not NULL and the value is not 2XX, | |
| indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishPatchToPayload ( | |
| IN REDFISH_PAYLOAD Target, | |
| IN REDFISH_PAYLOAD Payload, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Use HTTP POST to create a new resource in target payload. | |
| The POST request should be submitted to the Resource Collection in which the new resource | |
| is to belong. The Resource Collection is addressed by Target payload. The Redfish may | |
| ignore any service controlled properties. The corresponding redfish response will returned, | |
| including HTTP StatusCode, Headers and Payload which record any HTTP response messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] Target Target payload of the Resource Collection. | |
| @param[in] Payload The new resource to be created. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX. The Redfish resource will be returned | |
| in Payload within RedResponse if server send it back in the HTTP | |
| response message body. | |
| @retval EFI_INVALID_PARAMETER Target, Payload, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned StatusCode is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is not NULL and the value is not 2XX, | |
| indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishPostToPayload ( | |
| IN REDFISH_PAYLOAD Target, | |
| IN REDFISH_PAYLOAD Payload, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Use HTTP DELETE to remove a resource. | |
| This function uses the RedfishService to remove a Redfish resource which is addressed | |
| by input Uri (only the relative path is required). The corresponding redfish response will | |
| returned, including HTTP StatusCode, Headers and Payload which record any HTTP response | |
| messages. | |
| Callers are responsible for freeing the HTTP StatusCode, Headers and Payload returned in | |
| redfish response data. | |
| @param[in] RedfishService The Service to access the Redfish resources. | |
| @param[in] Uri Relative path to address the resource. | |
| @param[out] RedResponse Pointer to the Redfish response data. | |
| @retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not | |
| NULL and the value is 2XX, the Redfish resource has been removed. | |
| If there is any message returned from server, it will be returned | |
| in Payload within RedResponse. | |
| @retval EFI_INVALID_PARAMETER RedfishService, Uri, or RedResponse is NULL. | |
| @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. Callers can get | |
| more error info from returned HTTP StatusCode, Headers and Payload | |
| within RedResponse: | |
| 1. If the returned StatusCode is NULL, indicates any error happen. | |
| 2. If the returned StatusCode is not NULL and the value is not 2XX, | |
| indicates any error happen. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| RedfishDeleteByUri ( | |
| IN REDFISH_SERVICE RedfishService, | |
| IN CONST CHAR8 *Uri, | |
| OUT REDFISH_RESPONSE *RedResponse | |
| ); | |
| /** | |
| Dump text in fractions. | |
| @param[in] String ASCII string to dump. | |
| **/ | |
| VOID | |
| RedfishDumpJsonStringFractions ( | |
| IN CHAR8 *String | |
| ); | |
| /** | |
| Extract the JSON text content from REDFISH_PAYLOAD and dump to debug console. | |
| @param[in] Payload The Redfish payload to dump. | |
| **/ | |
| VOID | |
| RedfishDumpPayload ( | |
| IN REDFISH_PAYLOAD Payload | |
| ); | |
| /** | |
| Dump text in JSON value. | |
| @param[in] JsonValue The Redfish JSON value to dump. | |
| **/ | |
| VOID | |
| RedfishDumpJson ( | |
| IN EDKII_JSON_VALUE JsonValue | |
| ); | |
| /** | |
| This function will cleanup the HTTP header and Redfish payload resources. | |
| @param[in] StatusCode The status code in HTTP response message. | |
| @param[in] HeaderCount Number of HTTP header structures in Headers list. | |
| @param[in] Headers Array containing list of HTTP headers. | |
| @param[in] Payload The Redfish payload to dump. | |
| **/ | |
| VOID | |
| RedfishFreeResponse ( | |
| IN EFI_HTTP_STATUS_CODE *StatusCode, | |
| IN UINTN HeaderCount, | |
| IN EFI_HTTP_HEADER *Headers, | |
| IN REDFISH_PAYLOAD Payload | |
| ); | |
| /** | |
| Check if the "@odata.type" in Payload is valid or not. | |
| @param[in] Payload The Redfish payload to be checked. | |
| @param[in] OdataTypeName OdataType will be retrived from mapping list. | |
| @param[in] OdataTypeMappingList The list of OdataType. | |
| @param[in] OdataTypeMappingListSize The number of mapping list | |
| @return TRUE if the "@odata.type" in Payload is valid, otherwise FALSE. | |
| **/ | |
| BOOLEAN | |
| RedfishIsValidOdataType ( | |
| IN REDFISH_PAYLOAD Payload, | |
| IN CONST CHAR8 *OdataTypeName, | |
| IN REDFISH_ODATA_TYPE_MAPPING *OdataTypeMappingList, | |
| IN UINTN OdataTypeMappingListSize | |
| ); | |
| /** | |
| Check if the payload is collection | |
| @param[in] Payload The Redfish payload to be checked. | |
| @return TRUE if the payload is collection. | |
| **/ | |
| BOOLEAN | |
| RedfishIsPayloadCollection ( | |
| IN REDFISH_PAYLOAD Payload | |
| ); | |
| /** | |
| Get collection size. | |
| @param[in] Payload The Redfish collection payload | |
| @param[in] CollectionSize Size of this collection | |
| @return EFI_SUCCESS Coolection size is returned in CollectionSize | |
| @return EFI_INVALID_PARAMETER The payload is not a collection. | |
| **/ | |
| EFI_STATUS | |
| RedfishGetCollectionSize ( | |
| IN REDFISH_PAYLOAD Payload, | |
| IN UINTN *CollectionSize | |
| ); | |
| /** | |
| Get Redfish payload of collection member | |
| @param[in] Payload The Redfish collection payload | |
| @param[in] Index Index of collection member | |
| @return NULL Fail to get collection member. | |
| @return Non NULL Payload is returned. | |
| **/ | |
| REDFISH_PAYLOAD | |
| RedfishGetPayloadByIndex ( | |
| IN REDFISH_PAYLOAD Payload, | |
| IN UINTN Index | |
| ); | |
| /** | |
| Check and return Redfish resource of the given Redpath. | |
| @param[in] RedfishService Pointer to REDFISH_SERVICE | |
| @param[in] Redpath Redpath of the resource. | |
| @param[in] Response Optional return the resource. | |
| @return EFI_STATUS | |
| **/ | |
| EFI_STATUS | |
| RedfishCheckIfRedpathExist ( | |
| IN REDFISH_SERVICE RedfishService, | |
| IN CHAR8 *Redpath, | |
| IN REDFISH_RESPONSE *Response OPTIONAL | |
| ); | |
| /** | |
| This function returns the string of Redfish service version. | |
| @param[in] RedfishService Redfish service instance. | |
| @param[out] ServiceVersionStr Redfish service string. | |
| @return EFI_STATUS | |
| **/ | |
| EFI_STATUS | |
| RedfishGetServiceVersion ( | |
| IN REDFISH_SERVICE RedfishService, | |
| OUT CHAR8 **ServiceVersionStr | |
| ); | |
| /** | |
| This function returns the string of Redfish service version. | |
| @param[in] ServiceVerisonStr The string of Redfish service version. | |
| @param[in] Url The URL to build Redpath with ID. | |
| Start with "/", for example "/Registries" | |
| @param[in] Id ID string | |
| @param[out] Redpath Pointer to retrive Redpath, caller has to free | |
| the memory allocated for this string. | |
| @return EFI_STATUS | |
| **/ | |
| EFI_STATUS | |
| RedfishBuildRedpathUseId ( | |
| IN CHAR8 *ServiceVerisonStr, | |
| IN CHAR8 *Url, | |
| IN CHAR8 *Id, | |
| OUT CHAR8 **Redpath | |
| ); | |
| #endif |