From 9da786c16fb9542c68c486060bb56ee74bd547f0 Mon Sep 17 00:00:00 2001 From: Nickle Wang Date: Tue, 2 Jan 2024 17:22:22 +0800 Subject: RedfishPkg: introduce RedfishHttpLib RedfishHttpLib is a wrapper library for Redfish feature drivers to call Redfish HTTP Protocol easily. Signed-off-by: Nickle Wang Cc: Abner Chang Cc: Igor Kulchytskyy Cc: Nick Ramirez Reviewed-by: Abner Chang Reviewed-by: Igor Kulchytskyy --- RedfishPkg/Include/Library/RedfishHttpLib.h | 326 ++++++++++++ RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c | 585 +++++++++++++++++++++ .../Library/RedfishHttpLib/RedfishHttpLib.inf | 43 ++ RedfishPkg/RedfishLibs.dsc.inc | 3 +- RedfishPkg/RedfishPkg.dec | 5 + RedfishPkg/RedfishPkg.dsc | 3 +- 6 files changed, 963 insertions(+), 2 deletions(-) create mode 100644 RedfishPkg/Include/Library/RedfishHttpLib.h create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c create mode 100644 RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf diff --git a/RedfishPkg/Include/Library/RedfishHttpLib.h b/RedfishPkg/Include/Library/RedfishHttpLib.h new file mode 100644 index 0000000000..39b2098139 --- /dev/null +++ b/RedfishPkg/Include/Library/RedfishHttpLib.h @@ -0,0 +1,326 @@ +/** @file + This file defines the Redfish HTTP library interface. + + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef REDFISH_HTTP_LIB_H_ +#define REDFISH_HTTP_LIB_H_ + +#include + +/** + This function create Redfish service. It's caller's responsibility to free returned + Redfish service by calling FreeService (). + + @param[in] RedfishConfigServiceInfo Redfish config service information. + + @retval REDFISH_SERVICE Redfish service is created. + @retval NULL Errors occur. + +**/ +REDFISH_SERVICE +RedfishCreateService ( + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo + ); + +/** + This function free resources in Redfish service. RedfishService is no longer available + after this function returns successfully. + + @param[in] RedfishService Pointer to Redfish service to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishCleanupService ( + IN REDFISH_SERVICE RedfishService + ); + +/** + This function returns JSON value in given RedfishPayload. Returned JSON value + is a reference to the JSON value in RedfishPayload. Any modification to returned + JSON value will change JSON value in RedfishPayload. + + @param[in] RedfishPayload Pointer to Redfish payload. + + @retval EDKII_JSON_VALUE JSON value is returned. + @retval NULL Errors occur. + +**/ +EDKII_JSON_VALUE +RedfishJsonInPayload ( + IN REDFISH_PAYLOAD RedfishPayload + ); + +/** + This function free resources in Request. Request is no longer available + after this function returns successfully. + + @param[in] Request HTTP request to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeRequest ( + IN REDFISH_REQUEST *Request + ); + +/** + This function free resources in Response. Response is no longer available + after this function returns successfully. + + @param[in] Response HTTP response to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeResponse ( + IN REDFISH_RESPONSE *Response + ); + +/** + This function expire the cached response of given URI. + + @param[in] Uri Target response of URI. + + @retval EFI_SUCCESS Target response is expired successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpExpireResponse ( + IN EFI_STRING Uri + ); + +/** + Get redfish resource from given resource URI with cache mechanism + supported. It's caller's responsibility to Response by calling + RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP GET. + @param[in] Uri Target resource URI. + @param[in] Request Additional request context. This is optional. + @param[out] Response HTTP response from redfish service. + @param[in] UseCache If it is TRUE, this function will search for + cache first. If it is FALSE, this function + will query Redfish URI directly. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpGetResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN REDFISH_REQUEST *Request OPTIONAL, + OUT REDFISH_RESPONSE *Response, + IN BOOLEAN UseCache + ); + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PATCH. + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PATCH. + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP DELETE. + @param[in] Uri Target resource URI. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + OUT REDFISH_RESPONSE *Response + ); + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP DELETE. + @param[in] Uri Target resource URI. + @param[in] Content JSON represented properties to be deleted. This is + optional. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content if Content is not NULL. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content OPTIONAL, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ); + +#endif diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c new file mode 100644 index 0000000000..e199527ba6 --- /dev/null +++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.c @@ -0,0 +1,585 @@ +/** @file + Redfish HTTP cache library helps Redfish application to get Redfish resource + from BMC with cache mechanism enabled. + + Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include + +EDKII_REDFISH_HTTP_PROTOCOL *mRedfishHttpProtocol = NULL; + +/** + This function create Redfish service. It's caller's responsibility to free returned + Redfish service by calling FreeService (). + + @param[in] RedfishConfigServiceInfo Redfish config service information. + + @retval REDFISH_SERVICE Redfish service is created. + @retval NULL Errors occur. + +**/ +REDFISH_SERVICE +RedfishCreateService ( + IN REDFISH_CONFIG_SERVICE_INFORMATION *RedfishConfigServiceInfo + ) +{ + if (mRedfishHttpProtocol == NULL) { + return NULL; + } + + return mRedfishHttpProtocol->CreateService ( + mRedfishHttpProtocol, + RedfishConfigServiceInfo + ); +} + +/** + This function free resources in Redfish service. RedfishService is no longer available + after this function returns successfully. + + @param[in] RedfishService Pointer to Redfish service to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishCleanupService ( + IN REDFISH_SERVICE RedfishService + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeService ( + mRedfishHttpProtocol, + RedfishService + ); +} + +/** + This function returns JSON value in given RedfishPayload. Returned JSON value + is a reference to the JSON value in RedfishPayload. Any modification to returned + JSON value will change JSON value in RedfishPayload. + + @param[in] RedfishPayload Pointer to Redfish payload. + + @retval EDKII_JSON_VALUE JSON value is returned. + @retval NULL Errors occur. + +**/ +EDKII_JSON_VALUE +RedfishJsonInPayload ( + IN REDFISH_PAYLOAD RedfishPayload + ) +{ + if (mRedfishHttpProtocol == NULL) { + return NULL; + } + + return mRedfishHttpProtocol->JsonInPayload ( + mRedfishHttpProtocol, + RedfishPayload + ); +} + +/** + This function free resources in Request. Request is no longer available + after this function returns successfully. + + @param[in] Request HTTP request to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeRequest ( + IN REDFISH_REQUEST *Request + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeRequest ( + mRedfishHttpProtocol, + Request + ); +} + +/** + This function free resources in Response. Response is no longer available + after this function returns successfully. + + @param[in] Response HTTP response to be released. + + @retval EFI_SUCCESS Resource is released successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpFreeResponse ( + IN REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->FreeResponse ( + mRedfishHttpProtocol, + Response + ); +} + +/** + This function expire the cached response of given URI. + + @param[in] Uri Target response of URI. + + @retval EFI_SUCCESS Target response is expired successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpExpireResponse ( + IN EFI_STRING Uri + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->ExpireResponse ( + mRedfishHttpProtocol, + Uri + ); +} + +/** + Get redfish resource from given resource URI with cache mechanism + supported. It's caller's responsibility to Response by calling + RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP GET. + @param[in] Uri Target resource URI. + @param[in] Request Additional request context. This is optional. + @param[out] Response HTTP response from redfish service. + @param[in] UseCache If it is TRUE, this function will search for + cache first. If it is FALSE, this function + will query Redfish URI directly. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpGetResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN REDFISH_REQUEST *Request OPTIONAL, + OUT REDFISH_RESPONSE *Response, + IN BOOLEAN UseCache + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->GetResource ( + mRedfishHttpProtocol, + Service, + Uri, + Request, + Response, + UseCache + ); +} + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PATCH. + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PatchResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP PATCH to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PATCH. + @param[in] Uri Target resource URI. + @param[in] Content Data to patch. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPatchResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PatchResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PutResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP PUT to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP PUT. + @param[in] Uri Target resource URI. + @param[in] Content Data to put. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPutResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PutResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PostResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP POST to send redfish resource to given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP POST. + @param[in] Uri Target resource URI. + @param[in] Content Data to post. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpPostResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->PostResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP DELETE. + @param[in] Uri Target resource URI. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResource ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->DeleteResource ( + mRedfishHttpProtocol, + Service, + Uri, + NULL, + 0, + NULL, + Response + ); +} + +/** + Perform HTTP DELETE to delete redfish resource on given resource URI. + It's caller's responsibility to free Response by calling RedfishHttpFreeResponse (). + + @param[in] Service Redfish service instance to perform HTTP DELETE. + @param[in] Uri Target resource URI. + @param[in] Content JSON represented properties to be deleted. This is + optional. + @param[in] ContentSize Size of the Content to be send to Redfish service. + This is optional. When ContentSize is 0, ContentSize + is the size of Content if Content is not NULL. + @param[in] ContentType Type of the Content to be send to Redfish service. + This is optional. + @param[out] Response HTTP response from redfish service. + + @retval EFI_SUCCESS Resource is returned successfully. + @retval Others Errors occur. + +**/ +EFI_STATUS +RedfishHttpDeleteResourceEx ( + IN REDFISH_SERVICE Service, + IN EFI_STRING Uri, + IN CHAR8 *Content OPTIONAL, + IN UINTN ContentSize OPTIONAL, + IN CHAR8 *ContentType OPTIONAL, + OUT REDFISH_RESPONSE *Response + ) +{ + if (mRedfishHttpProtocol == NULL) { + return EFI_NOT_READY; + } + + return mRedfishHttpProtocol->DeleteResource ( + mRedfishHttpProtocol, + Service, + Uri, + Content, + ContentSize, + ContentType, + Response + ); +} + +/** + Callback function when gEdkIIRedfishHttpProtocolGuid is installed. + + @param[in] Event Event whose notification function is being invoked. + @param[in] Context Pointer to the notification function's context. +**/ +VOID +EFIAPI +RedfishHttpProtocolIsReady ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + if (mRedfishHttpProtocol != NULL) { + gBS->CloseEvent (Event); + return; + } + + Status = gBS->LocateProtocol ( + &gEdkIIRedfishHttpProtocolGuid, + NULL, + (VOID **)&mRedfishHttpProtocol + ); + if (EFI_ERROR (Status)) { + return; + } + + gBS->CloseEvent (Event); +} + +/** + + Initial HTTP library instance. + + @param[in] ImageHandle The image handle. + @param[in] SystemTable The system table. + + @retval EFI_SUCCESS Initial library successfully. + @retval Other Return error status. + +**/ +EFI_STATUS +EFIAPI +RedfishHttpConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + VOID *Registration; + + EfiCreateProtocolNotifyEvent ( + &gEdkIIRedfishHttpProtocolGuid, + TPL_CALLBACK, + RedfishHttpProtocolIsReady, + NULL, + &Registration + ); + + return EFI_SUCCESS; +} diff --git a/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf new file mode 100644 index 0000000000..fd53b8c2ed --- /dev/null +++ b/RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf @@ -0,0 +1,43 @@ +## @file +# Redfish HTTP library is wrapper library for application to call Redfish +# HTTP protocol easily. +# +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = RedfishHttpLib + FILE_GUID = 62855D9B-441B-436B-9CA6-B7FEB7ABF54E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = RedfishHttpLib| DXE_DRIVER UEFI_DRIVER + CONSTRUCTOR = RedfishHttpConstructor + +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + RedfishHttpLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + RedfishPkg/RedfishPkg.dec + +[LibraryClasses] + BaseLib + DebugLib + UefiLib + UefiBootServicesTableLib + +[Protocols] + gEdkIIRedfishHttpProtocolGuid ## CONSUMES ## + +[depex] + TRUE + diff --git a/RedfishPkg/RedfishLibs.dsc.inc b/RedfishPkg/RedfishLibs.dsc.inc index 5426957da8..55846aaa9d 100644 --- a/RedfishPkg/RedfishLibs.dsc.inc +++ b/RedfishPkg/RedfishLibs.dsc.inc @@ -6,7 +6,7 @@ # of EDKII network library classes. # # (C) Copyright 2021 Hewlett Packard Enterprise Development LP
-# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -21,5 +21,6 @@ RedfishPlatformCredentialLib|RedfishPkg/Library/RedfishPlatformCredentialIpmiLib/RedfishPlatformCredentialIpmiLib.inf HiiUtilityLib|RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf RedfishPlatformConfigLib|RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf + RedfishHttpLib|RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf !endif diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec index 114f8d2ad8..1a9c9ed7bc 100644 --- a/RedfishPkg/RedfishPkg.dec +++ b/RedfishPkg/RedfishPkg.dec @@ -69,6 +69,11 @@ # RedfishPlatformConfigLib|Include/Library/RedfishPlatformConfigLib.h + ## @libraryclass Provides the library functions to access Redfish HTTP + # protocol. + # + RedfishHttpLib|Include/Library/RedfishHttpLib.h + [LibraryClasses.Common.Private] ## @libraryclass Provides the private C runtime library functions. # CRT library is currently used by edk2 JsonLib (open source diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index 5849e7cf9e..b0150043a9 100644 --- a/RedfishPkg/RedfishPkg.dsc +++ b/RedfishPkg/RedfishPkg.dsc @@ -4,7 +4,7 @@ # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.
# (C) Copyright 2021 Hewlett-Packard Enterprise Development LP. # Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved. -# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved. # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -74,5 +74,6 @@ RedfishPkg/Library/RedfishDebugLib/RedfishDebugLib.inf RedfishPkg/Library/HiiUtilityLib/HiiUtilityLib.inf RedfishPkg/Library/RedfishPlatformConfigLib/RedfishPlatformConfigLib.inf + RedfishPkg/Library/RedfishHttpLib/RedfishHttpLib.inf !include RedfishPkg/Redfish.dsc.inc -- cgit v1.2.3