Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement storage_blobs put_block_url #1289

Merged
merged 2 commits into from
Jun 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions sdk/storage_blobs/src/blob/operations/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ mod put_append_blob;
mod put_block;
mod put_block_blob;
mod put_block_list;
mod put_block_url;
mod put_page;
mod put_page_blob;
mod release_lease;
Expand Down Expand Up @@ -49,6 +50,7 @@ pub use put_append_blob::*;
pub use put_block::*;
pub use put_block_blob::*;
pub use put_block_list::*;
pub use put_block_url::*;
pub use put_page::*;
pub use put_page_blob::*;
pub use release_lease::*;
Expand Down
61 changes: 61 additions & 0 deletions sdk/storage_blobs/src/blob/operations/put_block_url.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
use crate::prelude::*;
use azure_core::{headers::*, prelude::*, RequestId, Url};
use azure_storage::{headers::consistency_from_headers, ConsistencyCRC64, ConsistencyMD5};
use time::OffsetDateTime;

operation! {
PutBlockUrl,
client: BlobClient,
block_id: BlockId,
url: Url,
?hash: Hash,
?lease_id: LeaseId
}

impl PutBlockUrlBuilder {
pub fn into_future(mut self) -> PutBlockUrl {
Box::pin(async move {
let mut url = self.client.url()?;

self.block_id.append_to_url_query(&mut url);
url.query_pairs_mut().append_pair("comp", "block");

let mut headers = Headers::new();
headers.insert(COPY_SOURCE, self.url.to_string());
headers.add(self.lease_id);

let mut request =
self.client
.finalize_request(url, azure_core::Method::Put, headers, None)?;

let response = self.client.send(&mut self.context, &mut request).await?;
PutBlockUrlResponse::from_headers(response.headers())
})
}
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PutBlockUrlResponse {
pub content_md5: Option<ConsistencyMD5>,
pub content_crc64: Option<ConsistencyCRC64>,
pub request_id: RequestId,
pub date: OffsetDateTime,
pub request_server_encrypted: bool,
}

impl PutBlockUrlResponse {
pub(crate) fn from_headers(headers: &Headers) -> azure_core::Result<PutBlockUrlResponse> {
let (content_md5, content_crc64) = consistency_from_headers(headers)?;
let request_id = request_id_from_headers(headers)?;
let date = date_from_headers(headers)?;
let request_server_encrypted = request_server_encrypted_from_headers(headers)?;

Ok(PutBlockUrlResponse {
content_md5,
content_crc64,
request_id,
date,
request_server_encrypted,
})
}
}
9 changes: 9 additions & 0 deletions sdk/storage_blobs/src/clients/blob_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,15 @@ impl BlobClient {
PutBlockBuilder::new(self.clone(), block_id.into(), body.into())
}

/// Creates a new block to be committed as part of a block blob, from a URL.
pub fn put_block_url(
&self,
block_id: impl Into<BlockId>,
copy_source: Url,
) -> PutBlockUrlBuilder {
PutBlockUrlBuilder::new(self.clone(), block_id.into(), copy_source)
}

/// Retrieve the list of blocks that have been uploaded as part of a block blob.
pub fn get_block_list(&self) -> GetBlockListBuilder {
GetBlockListBuilder::new(self.clone())
Expand Down