void undeleteBlobAndVerify(String blobId, HttpHeaders getExpectedHeaders, boolean isPrivate, String accountName,
      String containerName, byte[] usermetadata, Container container) throws ExecutionException, InterruptedException {
    HttpHeaders headers = new DefaultHttpHeaders();
    headers.set(RestUtils.Headers.BLOB_ID, blobId);
    headers.set(RestUtils.Headers.SERVICE_ID, "updateBlobTtlAndVerify");
    FullHttpRequest httpRequest = buildRequest(HttpMethod.PUT, "/" + Operations.UNDELETE, headers, null);
    NettyClient.ResponseParts responseParts = nettyClient.sendRequest(httpRequest, null, null).get();
    verifyUndeleteBlobResponse(responseParts);
    getBlobInfoAndVerify(blobId, GetOption.None, getExpectedHeaders, isPrivate, accountName, containerName,
        usermetadata, container);
  }
Undelete given {@code blobId} and verifies it by doing a BlobInfo.
@param blobId the blob ID of the blob to update and verify.
@param getExpectedHeaders the expected headers in the getBlobInfo response after the TTL update.
@param isPrivate {@code true} if the blob is expected to be private
@param accountName the expected account name in the response.
@param containerName the expected container name in response.
@param usermetadata if non-null, this is expected to come as the body.
@throws ExecutionException
@throws InterruptedException
ambry-frontend/src/integration-test/java/com/github/ambry/frontend/FrontendIntegrationTestBase.java