Skip to content

[Storage] set_legal_hold, set/get_immutability_policy for BlobClient, set/get_access_policy for ContainerClient, get_service_stats #2814

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

Draft
wants to merge 7 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
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
52 changes: 47 additions & 5 deletions sdk/storage/azure_storage_blob/src/clients/blob_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,18 @@ use crate::{
generated::clients::BlobClient as GeneratedBlobClient,
generated::models::{
BlobClientAcquireLeaseResult, BlobClientBreakLeaseResult, BlobClientChangeLeaseResult,
BlobClientDownloadResult, BlobClientGetPropertiesResult, BlobClientReleaseLeaseResult,
BlobClientRenewLeaseResult, BlockBlobClientCommitBlockListResult,
BlockBlobClientStageBlockResult, BlockBlobClientUploadResult,
BlobClientDeleteImmutabilityPolicyResult, BlobClientDownloadResult,
BlobClientGetPropertiesResult, BlobClientReleaseLeaseResult, BlobClientRenewLeaseResult,
BlobClientSetImmutabilityPolicyResult, BlobClientSetLegalHoldResult,
BlockBlobClientCommitBlockListResult, BlockBlobClientStageBlockResult,
BlockBlobClientUploadResult,
},
models::{
AccessTier, BlobClientAcquireLeaseOptions, BlobClientBreakLeaseOptions,
BlobClientChangeLeaseOptions, BlobClientDeleteOptions, BlobClientDownloadOptions,
BlobClientGetPropertiesOptions, BlobClientReleaseLeaseOptions, BlobClientRenewLeaseOptions,
BlobClientChangeLeaseOptions, BlobClientDeleteImmutabilityPolicyOptions,
BlobClientDeleteOptions, BlobClientDownloadOptions, BlobClientGetPropertiesOptions,
BlobClientReleaseLeaseOptions, BlobClientRenewLeaseOptions,
BlobClientSetImmutabilityPolicyOptions, BlobClientSetLegalHoldOptions,
BlobClientSetMetadataOptions, BlobClientSetPropertiesOptions, BlobClientSetTierOptions,
BlockBlobClientCommitBlockListOptions, BlockBlobClientUploadOptions, BlockList,
BlockListType, BlockLookupList,
Expand Down Expand Up @@ -313,4 +317,42 @@ impl BlobClient {
) -> Result<Response<BlobClientRenewLeaseResult, NoFormat>> {
self.client.renew_lease(lease_id, options).await
}

/// Sets a legal hold on the blob.
///
/// # Arguments
///
/// * `legal_hold` - Specifies the legal hold status to set on the blob.
/// * `options` - Optional configuration for the request.
pub async fn set_legal_hold(
&self,
legal_hold: bool,
options: Option<BlobClientSetLegalHoldOptions<'_>>,
) -> Result<Response<BlobClientSetLegalHoldResult, NoFormat>> {
self.client.set_legal_hold(legal_hold, options).await
}

/// Sets the immutability policy on the blob.
///
/// # Arguments
///
/// * `options` - Optional configuration for the request.
pub async fn set_immutability_policy(
&self,
options: Option<BlobClientSetImmutabilityPolicyOptions<'_>>,
) -> Result<Response<BlobClientSetImmutabilityPolicyResult, NoFormat>> {
self.client.set_immutability_policy(options).await
}

/// Deletes the immutability policy on the blob.
///
/// # Arguments
///
/// * `options` - Optional configuration for the request.
pub async fn delete_immutability_policy(
&self,
options: Option<BlobClientDeleteImmutabilityPolicyOptions<'_>>,
) -> Result<Response<BlobClientDeleteImmutabilityPolicyResult, NoFormat>> {
self.client.delete_immutability_policy(options).await
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,16 @@ use crate::{
BlobContainerClientAcquireLeaseResult, BlobContainerClientBreakLeaseResult,
BlobContainerClientChangeLeaseResult, BlobContainerClientGetPropertiesResult,
BlobContainerClientReleaseLeaseResult, BlobContainerClientRenewLeaseResult,
BlobContainerClientSetAccessPolicyResult,
},
models::{
BlobContainerClientAcquireLeaseOptions, BlobContainerClientBreakLeaseOptions,
BlobContainerClientChangeLeaseOptions, BlobContainerClientCreateOptions,
BlobContainerClientDeleteOptions, BlobContainerClientGetPropertiesOptions,
BlobContainerClientListBlobFlatSegmentOptions, BlobContainerClientReleaseLeaseOptions,
BlobContainerClientRenewLeaseOptions, BlobContainerClientSetMetadataOptions,
ListBlobsFlatSegmentResponse,
BlobContainerClientDeleteOptions, BlobContainerClientGetAccessPolicyOptions,
BlobContainerClientGetPropertiesOptions, BlobContainerClientListBlobFlatSegmentOptions,
BlobContainerClientReleaseLeaseOptions, BlobContainerClientRenewLeaseOptions,
BlobContainerClientSetAccessPolicyOptions, BlobContainerClientSetMetadataOptions,
ListBlobsFlatSegmentResponse, SignedIdentifier,
},
pipeline::StorageHeadersPolicy,
BlobClient, BlobContainerClientOptions,
Expand All @@ -23,7 +25,7 @@ use azure_core::{
credentials::TokenCredential,
http::{
policies::{BearerTokenCredentialPolicy, Policy},
NoFormat, PageIterator, Pager, Response, Url, XmlFormat,
NoFormat, PageIterator, Pager, RequestContent, Response, Url, XmlFormat,
},
Result,
};
Expand Down Expand Up @@ -242,4 +244,32 @@ impl BlobContainerClient {
) -> Result<Response<BlobContainerClientRenewLeaseResult, NoFormat>> {
self.client.renew_lease(lease_id, options).await
}

/// Sets the permissions for the specified container. The permissions indicate whether blobs in a
/// container may be accessed publicly.
///
/// # Arguments
///
/// * `container_acl` - The access control list for the container.
/// * `options` - Optional configuration for the request.
pub async fn set_access_policy(
&self,
container_acl: RequestContent<Vec<SignedIdentifier>>,
options: Option<BlobContainerClientSetAccessPolicyOptions<'_>>,
) -> Result<Response<BlobContainerClientSetAccessPolicyResult, NoFormat>> {
self.client.set_access_policy(container_acl, options).await
}

/// Gets the permissions for the specified container. The permissions indicate whether container data
/// may be accessed publicly.
///
/// # Arguments
///
/// * `options` - Optional configuration for the request.
pub async fn get_access_policy(
&self,
options: Option<BlobContainerClientGetAccessPolicyOptions<'_>>,
) -> Result<Response<Vec<SignedIdentifier>, XmlFormat>> {
self.client.get_access_policy(options).await
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
use crate::{
generated::clients::BlobServiceClient as GeneratedBlobServiceClient,
models::{
BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions,
ListContainersSegmentResponse, StorageServiceProperties,
BlobServiceClientGetPropertiesOptions, BlobServiceClientGetStatisticsOptions,
BlobServiceClientGetUserDelegationKeyOptions,
BlobServiceClientListContainersSegmentOptions, KeyInfo, ListContainersSegmentResponse,
StorageServiceProperties, StorageServiceStats, UserDelegationKey,
},
pipeline::StorageHeadersPolicy,
BlobContainerClient, BlobServiceClientOptions,
Expand All @@ -14,7 +16,7 @@ use azure_core::{
credentials::TokenCredential,
http::{
policies::{BearerTokenCredentialPolicy, Policy},
PageIterator, Response, Url, XmlFormat,
PageIterator, RequestContent, Response, Url, XmlFormat,
},
Result,
};
Expand Down Expand Up @@ -104,4 +106,32 @@ impl BlobServiceClient {
) -> Result<PageIterator<Response<ListContainersSegmentResponse, XmlFormat>>> {
self.client.list_containers_segment(options)
}

/// Retrieves statistics related to replication for the Blob service. It is only available on the secondary location endpoint
/// when read-access geo-redundant replication is enabled for the Storage account.
///
/// # Arguments
///
/// * `options` - Optional configuration for the request.
pub async fn get_service_stats(
&self,
options: Option<BlobServiceClientGetStatisticsOptions<'_>>,
) -> Result<Response<StorageServiceStats, XmlFormat>> {
// TODO: Propagate rename to .tsp
self.client.get_statistics(options).await
}

/// Retrieves a user delegation key for the Blob service. This is only a valid operation when using bearer token authentication.
///
/// # Arguments
///
/// * `key_info` - Key information such as when the key becomes valid and expires.
/// * `options` - Optional configuration for the request.
pub async fn get_user_delegation_key(
&self,
key_info: RequestContent<KeyInfo>,
options: Option<BlobServiceClientGetUserDelegationKeyOptions<'_>>,
) -> Result<Response<UserDelegationKey, XmlFormat>> {
self.client.get_user_delegation_key(key_info, options).await
}
}
43 changes: 25 additions & 18 deletions sdk/storage/azure_storage_blob/src/models/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
mod extensions;

pub use crate::generated::models::{
AccessTier, AppendBlobClientAppendBlockFromUrlOptions,
AccessPolicy, AccessTier, AppendBlobClientAppendBlockFromUrlOptions,
AppendBlobClientAppendBlockFromUrlResult, AppendBlobClientAppendBlockFromUrlResultHeaders,
AppendBlobClientAppendBlockOptions, AppendBlobClientAppendBlockResult,
AppendBlobClientAppendBlockResultHeaders, AppendBlobClientCreateOptions,
Expand All @@ -13,36 +13,43 @@ pub use crate::generated::models::{
BlobClientAcquireLeaseOptions, BlobClientAcquireLeaseResult,
BlobClientAcquireLeaseResultHeaders, BlobClientBreakLeaseOptions, BlobClientBreakLeaseResult,
BlobClientBreakLeaseResultHeaders, BlobClientChangeLeaseOptions, BlobClientChangeLeaseResult,
BlobClientChangeLeaseResultHeaders, BlobClientDeleteOptions, BlobClientDownloadOptions,
BlobClientChangeLeaseResultHeaders, BlobClientDeleteImmutabilityPolicyOptions,
BlobClientDeleteImmutabilityPolicyResult, BlobClientDeleteOptions, BlobClientDownloadOptions,
BlobClientDownloadResult, BlobClientDownloadResultHeaders, BlobClientGetPropertiesOptions,
BlobClientGetPropertiesResult, BlobClientGetPropertiesResultHeaders,
BlobClientReleaseLeaseOptions, BlobClientReleaseLeaseResult,
BlobClientReleaseLeaseResultHeaders, BlobClientRenewLeaseOptions, BlobClientRenewLeaseResult,
BlobClientRenewLeaseResultHeaders, BlobClientSetMetadataOptions,
BlobClientRenewLeaseResultHeaders, BlobClientSetImmutabilityPolicyOptions,
BlobClientSetImmutabilityPolicyResult, BlobClientSetImmutabilityPolicyResultHeaders,
BlobClientSetLegalHoldOptions, BlobClientSetLegalHoldResult, BlobClientSetMetadataOptions,
BlobClientSetPropertiesOptions, BlobClientSetTierOptions,
BlobContainerClientAcquireLeaseOptions, BlobContainerClientAcquireLeaseResult,
BlobContainerClientAcquireLeaseResultHeaders, BlobContainerClientBreakLeaseOptions,
BlobContainerClientBreakLeaseResult, BlobContainerClientBreakLeaseResultHeaders,
BlobContainerClientChangeLeaseOptions, BlobContainerClientChangeLeaseResult,
BlobContainerClientChangeLeaseResultHeaders, BlobContainerClientCreateOptions,
BlobContainerClientDeleteOptions, BlobContainerClientGetPropertiesOptions,
BlobContainerClientGetPropertiesResult, BlobContainerClientGetPropertiesResultHeaders,
BlobContainerClientListBlobFlatSegmentOptions, BlobContainerClientReleaseLeaseOptions,
BlobContainerClientReleaseLeaseResult, BlobContainerClientReleaseLeaseResultHeaders,
BlobContainerClientRenewLeaseOptions, BlobContainerClientRenewLeaseResult,
BlobContainerClientSetMetadataOptions, BlobImmutabilityPolicyMode,
BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions, BlobType,
BlockBlobClientCommitBlockListOptions, BlockBlobClientCommitBlockListResult,
BlockBlobClientCommitBlockListResultHeaders, BlockBlobClientGetBlockListOptions,
BlockBlobClientStageBlockOptions, BlockBlobClientStageBlockResult,
BlockBlobClientStageBlockResultHeaders, BlockBlobClientUploadOptions,
BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders, BlockList, BlockListType,
BlockLookupList, CopyStatus, LeaseState, LeaseStatus, ListBlobsFlatSegmentResponse,
ListContainersSegmentResponse, PageBlobClientClearPagesOptions, PageBlobClientClearPagesResult,
BlobContainerClientDeleteOptions, BlobContainerClientGetAccessPolicyOptions,
BlobContainerClientGetPropertiesOptions, BlobContainerClientGetPropertiesResult,
BlobContainerClientGetPropertiesResultHeaders, BlobContainerClientListBlobFlatSegmentOptions,
BlobContainerClientReleaseLeaseOptions, BlobContainerClientReleaseLeaseResult,
BlobContainerClientReleaseLeaseResultHeaders, BlobContainerClientRenewLeaseOptions,
BlobContainerClientRenewLeaseResult, BlobContainerClientSetAccessPolicyOptions,
BlobContainerClientSetAccessPolicyResult, BlobContainerClientSetMetadataOptions,
BlobImmutabilityPolicyMode, BlobServiceClientGetPropertiesOptions,
BlobServiceClientGetStatisticsOptions, BlobServiceClientGetUserDelegationKeyOptions,
BlobServiceClientListContainersSegmentOptions, BlobType, BlockBlobClientCommitBlockListOptions,
BlockBlobClientCommitBlockListResult, BlockBlobClientCommitBlockListResultHeaders,
BlockBlobClientGetBlockListOptions, BlockBlobClientStageBlockOptions,
BlockBlobClientStageBlockResult, BlockBlobClientStageBlockResultHeaders,
BlockBlobClientUploadOptions, BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders,
BlockList, BlockListType, BlockLookupList, CopyStatus, ImmutabilityPolicyMode, KeyInfo,
LeaseState, LeaseStatus, ListBlobsFlatSegmentResponse, ListContainersSegmentResponse,
PageBlobClientClearPagesOptions, PageBlobClientClearPagesResult,
PageBlobClientClearPagesResultHeaders, PageBlobClientCreateOptions, PageBlobClientCreateResult,
PageBlobClientCreateResultHeaders, PageBlobClientResizeOptions, PageBlobClientResizeResult,
PageBlobClientResizeResultHeaders, PageBlobClientUploadPagesOptions,
PageBlobClientUploadPagesResult, PageBlobClientUploadPagesResultHeaders, PublicAccessType,
RehydratePriority, StorageServiceProperties,
RehydratePriority, SignedIdentifier, StorageServiceProperties, StorageServiceStats,
UserDelegationKey,
};
pub use extensions::*;
15 changes: 15 additions & 0 deletions sdk/storage/azure_storage_blob/src/parsers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

use std::io::{Error, ErrorKind};

use azure_core::time::{to_rfc3339, OffsetDateTime};

/// Takes in an offset and a length, verifies alignment to a 512-byte boundary, and
/// returns the HTTP range in String format.
///
Expand Down Expand Up @@ -35,3 +37,16 @@ pub fn format_page_range(offset: u64, length: u64) -> Result<String, Error> {
let content_range = format!("bytes={}-{}", offset, end_range);
Ok(content_range)
}

// Truncates the milliseconds out
pub fn format_time_string(time: &OffsetDateTime) -> String {
let time_string = to_rfc3339(time);

match time_string.find('.') {
Some(dot_index) => {
let base = &time_string[..dot_index];
format!("{}Z", base)
}
None => time_string.to_string(),
}
}
Loading
Loading