void putBlob(BlobId blobId, BlobProperties properties, byte[] encryptionKey, byte[] usermetadata, byte[] data,
      ConnectedChannel channel) throws IOException {
    PutRequest putRequest0 =
        new PutRequest(1, "client1", blobId, properties, ByteBuffer.wrap(usermetadata), Unpooled.wrappedBuffer(data),
            properties.getBlobSize(), BlobType.DataBlob, encryptionKey == null ? null : ByteBuffer.wrap(encryptionKey));
    PutResponse response0 = PutResponse.readFrom(channel.sendAndReceive(putRequest0).getInputStream());
    Assert.assertEquals(ServerErrorCode.NoError, response0.getError());
  }
Uploads a single blob to ambry server node
@param blobId the {@link BlobId} that needs to be put
@param properties the {@link BlobProperties} of the blob being uploaded
@param usermetadata the user metadata of the blob being uploaded
@param data the blob content of the blob being uploaded
@param channel the {@link ConnectedChannel} to use to send and receive data
@throws IOException
ambry-server/src/integration-test/java/com/github/ambry/server/ServerHardDeleteTest.java