RedfishPkg/RedfishLib: introduce new interfaces.
Add two new interface: RedfishServiceInPayload() and RedfishPutToUri() for Redfish HTTP protocol implementation. Fix several typos and add missing JsonLib in INF file. Signed-off-by: Nickle Wang <nicklew@nvidia.com> Cc: Abner Chang <abner.chang@amd.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Nick Ramirez <nramirez@nvidia.com> Reviewed-by: Abner Chang <abner.chang@amd.com>
This commit is contained in:
committed by
mergify[bot]
parent
9bb5ef1287
commit
cf68ff6130
@@ -4,6 +4,7 @@
|
||||
|
||||
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
|
||||
(C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
|
||||
Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
@@ -167,6 +168,30 @@ RedfishJsonInPayload (
|
||||
return ((redfishPayload *)Payload)->json;
|
||||
}
|
||||
|
||||
/**
|
||||
This function returns the Redfish service of a REDFISH_PAYLOAD.
|
||||
|
||||
Caller doesn't need to free the returned JSON value because it will be released
|
||||
in corresponding RedfishCleanupService() function.
|
||||
|
||||
@param[in] Payload A REDFISH_PAYLOAD instance.
|
||||
|
||||
@return Redfish service of the payload.
|
||||
|
||||
**/
|
||||
REDFISH_SERVICE
|
||||
EFIAPI
|
||||
RedfishServiceInPayload (
|
||||
IN REDFISH_PAYLOAD Payload
|
||||
)
|
||||
{
|
||||
if (Payload == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ((redfishPayload *)Payload)->service;
|
||||
}
|
||||
|
||||
/**
|
||||
Fill the input RedPath string with system UUID from SMBIOS table or use the customized
|
||||
ID if FromSmbios == FALSE.
|
||||
@@ -244,7 +269,7 @@ RedfishBuildPathWithSystemUuid (
|
||||
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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -304,7 +329,7 @@ RedfishGetByService (
|
||||
@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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -367,7 +392,7 @@ RedfishGetByUri (
|
||||
@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:
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -440,7 +465,7 @@ RedfishGetByPayload (
|
||||
@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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -527,10 +552,10 @@ ON_EXIT:
|
||||
redfish response data.
|
||||
|
||||
@param[in] Target The target payload to be updated.
|
||||
@param[in] Payload Palyoad with properties to be changed.
|
||||
@param[in] Payload Payload 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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -601,7 +626,7 @@ RedfishPatchToPayload (
|
||||
@param[in] ContentType Type of the Content to be send to Redfish service
|
||||
@param[out] RedResponse Pointer to the Redfish response data.
|
||||
|
||||
@retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -619,8 +644,8 @@ RedfishPostToUri (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
IN CONST CHAR8 *Content,
|
||||
IN UINTN ContentSize,
|
||||
IN CONST CHAR8 *ContentType,
|
||||
IN UINTN ContentSize OPTIONAL,
|
||||
IN CONST CHAR8 *ContentType OPTIONAL,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
@@ -694,7 +719,7 @@ ON_EXIT:
|
||||
@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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -762,7 +787,7 @@ RedfishPostToPayload (
|
||||
@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
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -850,7 +875,7 @@ ON_EXIT:
|
||||
@param[in] Content JSON represented properties to be deleted.
|
||||
@param[out] RedResponse Pointer to the Redfish response data.
|
||||
|
||||
@retval EFI_SUCCESS The opeartion is successful, indicates the HTTP StatusCode is not
|
||||
@retval EFI_SUCCESS The operation 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.
|
||||
@@ -1060,7 +1085,7 @@ RedfishFreeResponse (
|
||||
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] OdataTypeName OdataType will be retrieved from mapping list.
|
||||
@param[in] OdataTypeMappingList The list of OdataType.
|
||||
@param[in] OdataTypeMappingListSize The number of mapping list
|
||||
|
||||
@@ -1127,7 +1152,7 @@ RedfishIsPayloadCollection (
|
||||
@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_SUCCESS Collection size is returned in CollectionSize
|
||||
@return EFI_INVALID_PARAMETER The payload is not a collection.
|
||||
**/
|
||||
EFI_STATUS
|
||||
@@ -1217,3 +1242,103 @@ RedfishCheckIfRedpathExist (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Use HTTP PUT to create new Redfish resource in the Resource Collection.
|
||||
|
||||
This function uses the RedfishService to put 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[in] ContentSize Size of the Content to be send to Redfish service
|
||||
@param[in] ContentType Type of the Content to be send to Redfish service
|
||||
@param[out] RedResponse Pointer to the Redfish response data.
|
||||
|
||||
@retval EFI_SUCCESS The operation 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
|
||||
RedfishPutToUri (
|
||||
IN REDFISH_SERVICE RedfishService,
|
||||
IN CONST CHAR8 *Uri,
|
||||
IN CONST CHAR8 *Content,
|
||||
IN UINTN ContentSize OPTIONAL,
|
||||
IN CONST CHAR8 *ContentType OPTIONAL,
|
||||
OUT REDFISH_RESPONSE *RedResponse
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_JSON_VALUE JsonValue;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
JsonValue = NULL;
|
||||
|
||||
if ((RedfishService == NULL) || (Uri == NULL) || (Content == NULL) || (RedResponse == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
|
||||
|
||||
JsonValue = (EDKII_JSON_VALUE)putUriFromServiceEx (
|
||||
RedfishService,
|
||||
Uri,
|
||||
Content,
|
||||
ContentSize,
|
||||
ContentType,
|
||||
&(RedResponse->Headers),
|
||||
&(RedResponse->HeaderCount),
|
||||
&(RedResponse->StatusCode)
|
||||
);
|
||||
|
||||
//
|
||||
// 1. If the returned StatusCode is NULL, indicates any error happen.
|
||||
//
|
||||
if (RedResponse->StatusCode == NULL) {
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
//
|
||||
// 2. If the returned StatusCode is not NULL and the value is not 2XX, indicates any error happen.
|
||||
// NOTE: If there is any error message returned from server, it will be returned in
|
||||
// Payload within RedResponse.
|
||||
//
|
||||
if ((*(RedResponse->StatusCode) < HTTP_STATUS_200_OK) || \
|
||||
(*(RedResponse->StatusCode) > HTTP_STATUS_206_PARTIAL_CONTENT))
|
||||
{
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
if (JsonValue != NULL) {
|
||||
RedResponse->Payload = createRedfishPayload (JsonValue, RedfishService);
|
||||
if (RedResponse->Payload == NULL) {
|
||||
//
|
||||
// Ignore the error when create RedfishPayload, just free the JsonValue since it's not what
|
||||
// we care about if the returned StatusCode is 2XX.
|
||||
//
|
||||
JsonValueFree (JsonValue);
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
Reference in New Issue
Block a user