[edk2-devel] [PATCH 3/3] RedfishPkg: The functions for Redfish requests do not fully complied with specification

Chang, Abner via groups.io abner.chang=amd.com at groups.io
Wed Aug 17 04:00:13 UTC 2022


[AMD Official Use Only - General]

Hi Igor,
One question in line.

> -----Original Message-----
> From: Igor Kulchytskyy <igork at ami.com>
> Sent: Tuesday, August 16, 2022 9:25 AM
> To: devel at edk2.groups.io
> Cc: Chang, Abner <Abner.Chang at amd.com>; nickle.wang at hpe.com; Igor
> Kulchytskyy <igork at ami.com>; Chang, Abner <Abner.Chang at amd.com>
> Subject: [PATCH 3/3] RedfishPkg: The functions for Redfish requests do not fully
> complied with specification
> 
> [CAUTION: External Email]
> 
> There is no function to send POST request with the Content type which is
> different from "application/json".
> There is no function to send DELETE request with the body.
> 
> Cc: Abner Chang <abner.chang at amd.com>
> Cc: Nickle Wang <nickle.wang at hpe.com>
> Signed-off-by: Igor Kulchytskyy <igork at ami.com>
> ---
>  RedfishPkg/Include/Library/RedfishLib.h            |  80 +++++++++
>  RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c  | 189
> +++++++++++++++++++++
>  .../edk2libredfish/include/redfishService.h        |   8 +
>  .../RedfishLib/edk2libredfish/src/service.c        |  43 ++++-
>  4 files changed, 317 insertions(+), 3 deletions(-)
> 
> diff --git a/RedfishPkg/Include/Library/RedfishLib.h
> b/RedfishPkg/Include/Library/RedfishLib.h
> index b2488ab..d4b3246 100644
> --- a/RedfishPkg/Include/Library/RedfishLib.h
> +++ b/RedfishPkg/Include/Library/RedfishLib.h
> @@ -380,6 +380,49 @@ RedfishPatchToPayload (
>    OUT    REDFISH_RESPONSE  *RedResponse
>    );
> 
> +
> +/**
> +  Use HTTP POST to create new Redfish resource in the Resource Collection.
> +
> +  The POST request should be submitted to the Resource Collection in
> + which the new resource  is to belong. The Resource Collection is
> + addressed by URI. 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]    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 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
> +RedfishPostToUriEx (
Why not just name this function RedfishPostToUri without "Ex". There is no PostToUri function currently provided by RedfishLib.c yet.
I also see some trailing spaces in this source file by the way.
Abner

> +  IN     REDFISH_SERVICE   RedfishService,
> +  IN     CONST CHAR8       *Uri,
> +  IN     CONST CHAR8       *Content,
> +  IN     UINTN             ContentSize,
> +  IN     CONST CHAR8       *ContentType,
> +  OUT    REDFISH_RESPONSE  *RedResponse
> +  );
> +
> +
>  /**
>    Use HTTP POST to create a new resource in target payload.
> 
> @@ -451,6 +494,43 @@ RedfishDeleteByUri (
>    );
> 
>  /**
> +  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[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
> +                                  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
> +RedfishDeleteByUriEx (
> +  IN     REDFISH_SERVICE   RedfishService,
> +  IN     CONST CHAR8       *Uri,
> +  IN     CONST CHAR8       *Content,
> +  OUT    REDFISH_RESPONSE  *RedResponse
> +  );
> +
> +/**
>    Dump text in fractions.
> 
>    @param[in]  String   ASCII string to dump.
> diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> b/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> index 9f9d377..c52a518 100644
> --- a/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> +++ b/RedfishPkg/PrivateLibrary/RedfishLib/RedfishLib.c
> @@ -583,6 +583,104 @@ RedfishPatchToPayload (
>    return EFI_SUCCESS;
>  }
> 
> +
> +/**
> +  Use HTTP POST to create new Redfish resource in the Resource Collection.
> +
> +  The POST request should be submitted to the Resource Collection in
> + which the new resource  is to belong. The Resource Collection is
> + addressed by URI. 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]    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 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
> +RedfishPostToUriEx (
> +  IN     REDFISH_SERVICE   RedfishService,
> +  IN     CONST CHAR8       *Uri,
> +  IN     CONST CHAR8       *Content,
> +  IN     UINTN             ContentSize,
> +  IN     CONST CHAR8       *ContentType,
> +  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)postUriFromService (
> +                                  RedfishService,
> +                                  Uri,
> +                                  Content,
> +                                  ContentSize,
> +                                  ContentType,
> +                                  &(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;
> +}
> +
> +
>  /**
>    Use HTTP POST to create a new resource in target payload.
> 
> @@ -738,6 +836,97 @@ ON_EXIT:
>    return Status;
>  }
> 
> +
> +/**
> +  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[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
> +                                  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
> +RedfishDeleteByUriEx (
> +  IN     REDFISH_SERVICE   RedfishService,
> +  IN     CONST CHAR8       *Uri,
> +  IN     CONST CHAR8       *Content,
> +  OUT    REDFISH_RESPONSE  *RedResponse
> +  )
> +{
> +  EFI_STATUS        Status;
> +  EDKII_JSON_VALUE  JsonValue;
> +
> +  Status    = EFI_SUCCESS;
> +  JsonValue = NULL;
> +
> +  if ((RedfishService == NULL) || (Content == NULL) || (Uri == NULL) ||
> (RedResponse == NULL)) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  ZeroMem (RedResponse, sizeof (REDFISH_RESPONSE));
> +
> +  JsonValue = (EDKII_JSON_VALUE)deleteUriFromServiceEx (
> +                                  RedfishService,
> +                                  Uri,
> +                                  Content,
> +                                  &(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;
> +}
> +
>  /**
>    Dump text in fractions.
> 
> diff --git
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
> index 5c13b68..75afadc 100644
> ---
> a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfishService.h
> +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/include/redfis
> +++ hService.h
> @@ -129,6 +129,14 @@ deleteUriFromService (
>    EFI_HTTP_STATUS_CODE  **StatusCode
>    );
> 
> +json_t *
> +deleteUriFromServiceEx (
> +  redfishService        *service,
> +  const char            *uri,
> +  const char            *content,
> +  EFI_HTTP_STATUS_CODE  **StatusCode
> +  );
> +
>  redfishPayload *
>  getRedfishServiceRoot (
>    redfishService        *service,
> diff --git a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> index afa172b..b8bfabe 100644
> --- a/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> +++ b/RedfishPkg/PrivateLibrary/RedfishLib/edk2libredfish/src/service.c
> @@ -923,10 +923,12 @@ ON_EXIT:
>    return ret;
>  }
> 
> +
>  json_t *
> -deleteUriFromService (
> +deleteUriFromServiceEx (
>    redfishService        *service,
>    const char            *uri,
> +  const char            *content,
>    EFI_HTTP_STATUS_CODE  **StatusCode
>    )
>  {
> @@ -937,6 +939,8 @@ deleteUriFromService (
>    EFI_HTTP_REQUEST_DATA  *RequestData = NULL;
>    EFI_HTTP_MESSAGE       *RequestMsg  = NULL;
>    EFI_HTTP_MESSAGE       ResponseMsg;
> +  CHAR8                  ContentLengthStr[80];
> +  size_t                 contentLength;
> 
>    ret = NULL;
> 
> @@ -956,7 +960,7 @@ deleteUriFromService (
>    //
>    // Step 1: Create HTTP request message with 4 headers:
>    //
> -  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken || service-
> >basicAuthStr) ? 5 : 4);
> +  HttpIoHeader = HttpIoCreateHeader ((service->sessionToken ||
> + service->basicAuthStr) ? 8 : 7);
>    if (HttpIoHeader == NULL) {
>      ret = NULL;
>      goto ON_EXIT;
> @@ -979,6 +983,23 @@ deleteUriFromService (
>    Status = HttpIoSetHeader (HttpIoHeader, "Connection", "Keep-Alive");
>    ASSERT_EFI_ERROR (Status);
> 
> +  Status = HttpIoSetHeader (HttpIoHeader, "Content-Type",
> + "application/json");  ASSERT_EFI_ERROR (Status);
> +
> +  if(content != NULL){
> +      contentLength = strlen (content);
> +      AsciiSPrint (
> +        ContentLengthStr,
> +        sizeof (ContentLengthStr),
> +        "%lu",
> +        (UINT64)contentLength
> +        );
> +      Status = HttpIoSetHeader (HttpIoHeader, "Content-Length",
> ContentLengthStr);
> +      ASSERT_EFI_ERROR (Status);
> +      Status = HttpIoSetHeader (HttpIoHeader, "OData-Version", "4.0");
> +      ASSERT_EFI_ERROR (Status);
> +  }
> +
>    //
>    // Step 2: build the rest of HTTP request info.
>    //
> @@ -1003,7 +1024,12 @@ deleteUriFromService (
>    RequestMsg->Data.Request = RequestData;
>    RequestMsg->HeaderCount  = HttpIoHeader->HeaderCount;
>    RequestMsg->Headers      = HttpIoHeader->Headers;
> -
> +
> +  if(content != NULL){
> +      RequestMsg->BodyLength   = contentLength;
> +      RequestMsg->Body         = (VOID *)content;
> +  }
> +
>    ZeroMem (&ResponseMsg, sizeof (ResponseMsg));
> 
>    //
> @@ -1057,6 +1083,17 @@ ON_EXIT:
>    return ret;
>  }
> 
> +json_t *
> +deleteUriFromService (
> +  redfishService        *service,
> +  const char            *uri,
> +  EFI_HTTP_STATUS_CODE  **StatusCode
> +  )
> +{
> +  return deleteUriFromServiceEx(service, uri, NULL, StatusCode); }
> +
> +
>  redfishPayload *
>  getRedfishServiceRoot (
>    redfishService        *service,
> --
> 2.6.1.windows.1
> -The information contained in this message may be confidential and proprietary
> to American Megatrends (AMI). This communication is intended to be read only
> by the individual or entity to whom it is addressed or by their designee. If the
> reader of this message is not the intended recipient, you are on notice that any
> distribution of this message, in any form, is strictly prohibited. Please promptly
> notify the sender by reply e-mail or by telephone at 770-246-8600, and then
> delete or destroy all copies of the transmission.


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#92499): https://edk2.groups.io/g/devel/message/92499
Mute This Topic: https://groups.io/mt/93050698/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list