diff --git a/sdk/storage/azure_storage_blob/src/clients/blob_client.rs b/sdk/storage/azure_storage_blob/src/clients/blob_client.rs index c19b1f5c25..c9c024e339 100644 --- a/sdk/storage/azure_storage_blob/src/clients/blob_client.rs +++ b/sdk/storage/azure_storage_blob/src/clients/blob_client.rs @@ -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, @@ -304,4 +308,42 @@ impl BlobClient { ) -> Result> { 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>, + ) -> Result> { + 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>, + ) -> Result> { + 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>, + ) -> Result> { + self.client.delete_immutability_policy(options).await + } } diff --git a/sdk/storage/azure_storage_blob/src/clients/blob_container_client.rs b/sdk/storage/azure_storage_blob/src/clients/blob_container_client.rs index 312a85c08a..e41a9fbe9e 100644 --- a/sdk/storage/azure_storage_blob/src/clients/blob_container_client.rs +++ b/sdk/storage/azure_storage_blob/src/clients/blob_container_client.rs @@ -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, @@ -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, }; @@ -233,4 +235,32 @@ impl BlobContainerClient { ) -> Result> { 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, XmlFormat>, + options: Option>, + ) -> Result> { + 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>, + ) -> Result, XmlFormat>> { + self.client.get_access_policy(options).await + } } diff --git a/sdk/storage/azure_storage_blob/src/clients/blob_service_client.rs b/sdk/storage/azure_storage_blob/src/clients/blob_service_client.rs index 3ce4326ac4..e7c8ee2a78 100644 --- a/sdk/storage/azure_storage_blob/src/clients/blob_service_client.rs +++ b/sdk/storage/azure_storage_blob/src/clients/blob_service_client.rs @@ -4,8 +4,10 @@ use crate::{ generated::clients::BlobServiceClient as GeneratedBlobServiceClient, models::{ - BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions, - ListContainersSegmentResponse, StorageServiceProperties, + BlobServiceClientGetPropertiesOptions, BlobServiceClientGetServiceStatsOptions, + BlobServiceClientGetUserDelegationKeyOptions, + BlobServiceClientListContainersSegmentOptions, KeyInfo, ListContainersSegmentResponse, + StorageServiceProperties, StorageServiceStats, UserDelegationKey, }, pipeline::StorageHeadersPolicy, BlobContainerClient, BlobServiceClientOptions, @@ -14,7 +16,7 @@ use azure_core::{ credentials::TokenCredential, http::{ policies::{BearerTokenCredentialPolicy, Policy}, - PageIterator, Response, Url, XmlFormat, + PageIterator, RequestContent, Response, Url, XmlFormat, }, Result, }; @@ -95,4 +97,17 @@ impl BlobServiceClient { ) -> Result>> { 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>, + ) -> Result> { + self.client.get_service_stats(options).await + } } diff --git a/sdk/storage/azure_storage_blob/src/generated/clients/blob_service_client.rs b/sdk/storage/azure_storage_blob/src/generated/clients/blob_service_client.rs index 1cfd4fc4d1..f1bd2ef891 100644 --- a/sdk/storage/azure_storage_blob/src/generated/clients/blob_service_client.rs +++ b/sdk/storage/azure_storage_blob/src/generated/clients/blob_service_client.rs @@ -8,7 +8,7 @@ use crate::generated::{ models::{ BlobServiceClientFilterBlobsOptions, BlobServiceClientGetAccountInfoOptions, BlobServiceClientGetAccountInfoResult, BlobServiceClientGetPropertiesOptions, - BlobServiceClientGetStatisticsOptions, BlobServiceClientGetUserDelegationKeyOptions, + BlobServiceClientGetServiceStatsOptions, BlobServiceClientGetUserDelegationKeyOptions, BlobServiceClientListContainersSegmentOptions, BlobServiceClientSetPropertiesOptions, FilterBlobSegment, KeyInfo, ListContainersSegmentResponse, StorageServiceProperties, StorageServiceStats, UserDelegationKey, @@ -250,9 +250,9 @@ impl BlobServiceClient { /// /// * `options` - Optional parameters for the request. #[tracing::function("Storage.Blob.getStatistics")] - pub async fn get_statistics( + pub async fn get_service_stats( &self, - options: Option>, + options: Option>, ) -> Result> { let options = options.unwrap_or_default(); let ctx = Context::with_context(&options.method_options.context); diff --git a/sdk/storage/azure_storage_blob/src/generated/models/enums.rs b/sdk/storage/azure_storage_blob/src/generated/models/enums.rs index 8e776e64f9..e7b5b06d22 100644 --- a/sdk/storage/azure_storage_blob/src/generated/models/enums.rs +++ b/sdk/storage/azure_storage_blob/src/generated/models/enums.rs @@ -187,15 +187,6 @@ create_extensible_enum!( (Unavailable, "unavailable") ); -create_enum!( - #[doc = r#"The immutability policy mode used in requests."#] - ImmutabilityPolicyMode, - #[doc = r#"The immutability policy is locked."#] - (Locked, "Locked"), - #[doc = r#"The immutability policy is unlocked."#] - (Unlocked, "Unlocked") -); - create_enum!( #[doc = r#"The lease duration."#] LeaseDuration, diff --git a/sdk/storage/azure_storage_blob/src/generated/models/header_traits.rs b/sdk/storage/azure_storage_blob/src/generated/models/header_traits.rs index 7a09d50746..60d2f79787 100644 --- a/sdk/storage/azure_storage_blob/src/generated/models/header_traits.rs +++ b/sdk/storage/azure_storage_blob/src/generated/models/header_traits.rs @@ -2650,7 +2650,7 @@ impl PageListHeaders for Response { } } -/// Provides access to typed response headers for `BlobServiceClient::get_statistics()` +/// Provides access to typed response headers for `BlobServiceClient::get_service_stats()` pub trait StorageServiceStatsHeaders: private::Sealed { fn date(&self) -> Result>; } diff --git a/sdk/storage/azure_storage_blob/src/generated/models/method_options.rs b/sdk/storage/azure_storage_blob/src/generated/models/method_options.rs index f2e9d8a910..8388d8ac96 100644 --- a/sdk/storage/azure_storage_blob/src/generated/models/method_options.rs +++ b/sdk/storage/azure_storage_blob/src/generated/models/method_options.rs @@ -4,10 +4,10 @@ // Code generated by Microsoft (R) Rust Code Generator. DO NOT EDIT. use super::{ - AccessTier, BlobCopySourceTags, BlobDeleteType, DeleteSnapshotsOptionType, - EncryptionAlgorithmType, FileShareTokenIntent, FilterBlobsIncludeItem, ImmutabilityPolicyMode, - ListBlobsIncludeItem, ListContainersIncludeType, PremiumPageBlobAccessTier, PublicAccessType, - RehydratePriority, + AccessTier, BlobCopySourceTags, BlobDeleteType, BlobImmutabilityPolicyMode, + DeleteSnapshotsOptionType, EncryptionAlgorithmType, FileShareTokenIntent, + FilterBlobsIncludeItem, ListBlobsIncludeItem, ListContainersIncludeType, + PremiumPageBlobAccessTier, PublicAccessType, RehydratePriority, }; use azure_core::{fmt::SafeDebug, http::ClientMethodOptions, time::OffsetDateTime}; use std::collections::HashMap; @@ -241,7 +241,7 @@ pub struct AppendBlobClientCreateOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, @@ -443,7 +443,7 @@ pub struct BlobClientCopyFromUrlOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, @@ -841,7 +841,7 @@ pub struct BlobClientSetImmutabilityPolicyOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// Allows customization of the method call. pub method_options: ClientMethodOptions<'a>, @@ -1073,7 +1073,7 @@ pub struct BlobClientStartCopyFromUrlOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, @@ -1584,9 +1584,9 @@ pub struct BlobServiceClientGetPropertiesOptions<'a> { pub timeout: Option, } -/// Options to be passed to `BlobServiceClient::get_statistics()` +/// Options to be passed to `BlobServiceClient::get_service_stats()` #[derive(Clone, Default, SafeDebug)] -pub struct BlobServiceClientGetStatisticsOptions<'a> { +pub struct BlobServiceClientGetServiceStatsOptions<'a> { /// An opaque, globally-unique, client-generated string identifier for the request. pub client_request_id: Option, @@ -1736,7 +1736,7 @@ pub struct BlockBlobClientCommitBlockListOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, @@ -2124,7 +2124,7 @@ pub struct BlockBlobClientUploadOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, @@ -2316,7 +2316,7 @@ pub struct PageBlobClientCreateOptions<'a> { pub immutability_policy_expiry: Option, /// Specifies the immutability policy mode to set on the blob. - pub immutability_policy_mode: Option, + pub immutability_policy_mode: Option, /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, diff --git a/sdk/storage/azure_storage_blob/src/models/mod.rs b/sdk/storage/azure_storage_blob/src/models/mod.rs index 2e16cddd51..c44c823b1c 100644 --- a/sdk/storage/azure_storage_blob/src/models/mod.rs +++ b/sdk/storage/azure_storage_blob/src/models/mod.rs @@ -4,7 +4,7 @@ mod extensions; pub use crate::generated::models::{ - AccessTier, AppendBlobClientAppendBlockFromUrlOptions, + AccessPolicy, AccessTier, AppendBlobClientAppendBlockFromUrlOptions, AppendBlobClientAppendBlockFromUrlResult, AppendBlobClientAppendBlockFromUrlResultHeaders, AppendBlobClientAppendBlockOptions, AppendBlobClientAppendBlockResult, AppendBlobClientAppendBlockResultHeaders, AppendBlobClientCreateOptions, @@ -13,40 +13,47 @@ 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, BlobFlatListSegment, BlobImmutabilityPolicyMode, - BlobItemInternal, BlobMetadata, BlobName, BlobPropertiesInternal, - BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions, BlobTag, - BlobTags, BlobType, Block, BlockBlobClientCommitBlockListOptions, - BlockBlobClientCommitBlockListResult, BlockBlobClientCommitBlockListResultHeaders, - BlockBlobClientGetBlockListOptions, BlockBlobClientStageBlockOptions, - BlockBlobClientStageBlockResult, BlockBlobClientStageBlockResultHeaders, - BlockBlobClientUploadOptions, BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders, - BlockList, BlockListType, BlockLookupList, ContainerItem, CopyStatus, CorsRule, LeaseDuration, - LeaseState, LeaseStatus, ListBlobsFlatSegmentResponse, ListBlobsIncludeItem, - ListContainersIncludeType, ListContainersSegmentResponse, Logging, Metrics, - ObjectReplicationMetadata, PageBlobClientClearPagesOptions, PageBlobClientClearPagesResult, + BlobContainerClientDeleteOptions, BlobContainerClientGetAccessPolicyOptions, + BlobContainerClientGetPropertiesOptions, BlobContainerClientGetPropertiesResult, + BlobContainerClientGetPropertiesResultHeaders, BlobContainerClientListBlobFlatSegmentOptions, + BlobContainerClientReleaseLeaseOptions, BlobContainerClientReleaseLeaseResult, + BlobContainerClientReleaseLeaseResultHeaders, BlobContainerClientRenewLeaseOptions, + BlobContainerClientRenewLeaseResult, BlobContainerClientSetAccessPolicyOptions, + BlobContainerClientSetAccessPolicyResult, BlobContainerClientSetMetadataOptions, + BlobFlatListSegment, BlobImmutabilityPolicyMode, BlobItemInternal, BlobMetadata, BlobName, + BlobPropertiesInternal, BlobServiceClientGetPropertiesOptions, + BlobServiceClientGetServiceStatsOptions, BlobServiceClientGetUserDelegationKeyOptions, + BlobServiceClientListContainersSegmentOptions, BlobTag, BlobTags, BlobType, Block, + BlockBlobClientCommitBlockListOptions, BlockBlobClientCommitBlockListResult, + BlockBlobClientCommitBlockListResultHeaders, BlockBlobClientGetBlockListOptions, + BlockBlobClientStageBlockOptions, BlockBlobClientStageBlockResult, + BlockBlobClientStageBlockResultHeaders, BlockBlobClientUploadOptions, + BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders, BlockList, BlockListType, + BlockLookupList, ContainerItem, CopyStatus, CorsRule, KeyInfo, LeaseDuration, LeaseState, + LeaseStatus, ListBlobsFlatSegmentResponse, ListBlobsIncludeItem, ListContainersIncludeType, + ListContainersSegmentResponse, Logging, Metrics, ObjectReplicationMetadata, + PageBlobClientClearPagesOptions, PageBlobClientClearPagesResult, PageBlobClientClearPagesResultHeaders, PageBlobClientCreateOptions, PageBlobClientCreateResult, PageBlobClientCreateResultHeaders, PageBlobClientResizeOptions, PageBlobClientResizeResult, PageBlobClientResizeResultHeaders, PageBlobClientUploadPagesOptions, PageBlobClientUploadPagesResult, PageBlobClientUploadPagesResultHeaders, - PremiumPageBlobAccessTier, PublicAccessType, RehydratePriority, RetentionPolicy, StaticWebsite, - StorageServiceProperties, + PremiumPageBlobAccessTier, PublicAccessType, RehydratePriority, RetentionPolicy, + SignedIdentifier, StaticWebsite, StorageServiceProperties, StorageServiceStats, + UserDelegationKey, }; pub use extensions::*; diff --git a/sdk/storage/azure_storage_blob/src/parsers.rs b/sdk/storage/azure_storage_blob/src/parsers.rs index e3c36c42d5..24bc134da4 100644 --- a/sdk/storage/azure_storage_blob/src/parsers.rs +++ b/sdk/storage/azure_storage_blob/src/parsers.rs @@ -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. /// diff --git a/sdk/storage/azure_storage_blob/tests/blob_client.rs b/sdk/storage/azure_storage_blob/tests/blob_client.rs index 5d5818b2f9..c73bc0a30e 100644 --- a/sdk/storage/azure_storage_blob/tests/blob_client.rs +++ b/sdk/storage/azure_storage_blob/tests/blob_client.rs @@ -3,18 +3,20 @@ use azure_core::{ http::{RequestContent, StatusCode}, + time::{Duration, OffsetDateTime}, Bytes, }; use azure_core_test::{recorded, TestContext}; use azure_storage_blob::models::{ AccessTier, BlobClientAcquireLeaseResultHeaders, BlobClientChangeLeaseResultHeaders, BlobClientDownloadOptions, BlobClientDownloadResultHeaders, BlobClientGetPropertiesOptions, - BlobClientGetPropertiesResultHeaders, BlobClientSetMetadataOptions, - BlobClientSetPropertiesOptions, BlobClientSetTierOptions, BlockBlobClientUploadOptions, - LeaseState, + BlobClientGetPropertiesResultHeaders, BlobClientSetImmutabilityPolicyOptions, + BlobClientSetImmutabilityPolicyResultHeaders, BlobClientSetMetadataOptions, + BlobClientSetPropertiesOptions, BlobClientSetTierOptions, BlobImmutabilityPolicyMode, + BlockBlobClientUploadOptions, LeaseState, }; use azure_storage_blob_test::{create_test_blob, get_blob_name, get_container_client}; -use std::{collections::HashMap, error::Error, time::Duration}; +use std::{collections::HashMap, error::Error}; use tokio::time; #[recorded::test] @@ -308,7 +310,7 @@ async fn test_blob_lease_operations(ctx: TestContext) -> Result<(), Box Result<(), Box Result<(), Box> { + //TODO: Need separate accounts, need a test account with versioning enabled + // Recording Setup + let recording = ctx.recording(); + let container_client = get_container_client(recording, false).await?; + let blob_client = container_client.blob_client(get_blob_name(recording)); + container_client.create_container(None).await?; + create_test_blob(&blob_client).await?; + + // Set Legal Hold + blob_client.set_legal_hold(true, None).await?; + let response = blob_client.get_properties(None).await?; + // Assert + let legal_hold = response.legal_hold()?; + assert!(legal_hold.unwrap()); + + // Attempt Operation While Legal Hold Active + let response = blob_client.delete(None).await; + // Assert + let error = response.unwrap_err().http_status(); + assert_eq!(StatusCode::Conflict, error.unwrap()); + + // Remove Legal Hold + blob_client.set_legal_hold(false, None).await?; + let response = blob_client.get_properties(None).await?; + // Assert + let legal_hold = response.legal_hold()?; + assert!(!legal_hold.unwrap()); + + blob_client.delete(None).await?; + + // Hitting an error to delete despite also manually deleting all Blobs (and verifying its empty state in Azure Portal) + // However, deleting in Azure Portal works. + container_client.delete_container(None).await?; + Ok(()) +} + +#[recorded::test] +async fn test_immutability_policy(ctx: TestContext) -> Result<(), Box> { + //TODO: Need separate accounts, need a test account with versioning enabled + // Recording Setup + let recording = ctx.recording(); + let container_client = get_container_client(recording, false).await?; + let blob_client = container_client.blob_client(get_blob_name(recording)); + container_client.create_container(None).await?; + create_test_blob(&blob_client).await?; + let test_expiry_time = Some(OffsetDateTime::now_utc() + Duration::minutes(5)); + + // Set Immutability Policy + let immutability_policy_options = BlobClientSetImmutabilityPolicyOptions { + immutability_policy_expiry: test_expiry_time.clone(), + immutability_policy_mode: Some(BlobImmutabilityPolicyMode::Unlocked), + ..Default::default() + }; + let response = blob_client + .set_immutability_policy(Some(immutability_policy_options)) + .await?; + + // Assert + // ERRORS: Error: Error { context: Full(Custom { kind: DataConversion, error: Error { context: Message { kind: DataConversion, message: "unknown variant of BlobImmutabilityPolicyMode found: \"unlocked\"" } } }, + // "unable to parse header 'HeaderName(\"x-ms-immutability-policy-mode\"): HeaderValue' + // into azure_storage_blob::generated::models::enums::BlobImmutabilityPolicyMode") } + let mode = response.immutability_policy_mode()?; + let expires_on = response.immutability_policy_expires_on()?; + + assert_eq!(BlobImmutabilityPolicyMode::Unlocked, mode.unwrap()); + assert_eq!(test_expiry_time, expires_on); + + // Delete Immutability Policy + blob_client.delete_immutability_policy(None).await?; + let response = blob_client.get_properties(None).await?; + + // Assert + // let mode = response.immutability_policy_mode()?; + // let expires_on = response.immutability_policy_expires_on()?; + // assert!(mode.is_none()); + // assert!(expires_on.is_none()); + + // Also can't delete container here same error as legal hold + // container_client.delete_container(None).await?; + Ok(()) +} diff --git a/sdk/storage/azure_storage_blob/tests/blob_container_client.rs b/sdk/storage/azure_storage_blob/tests/blob_container_client.rs index 79ebc320f9..5ab6354733 100644 --- a/sdk/storage/azure_storage_blob/tests/blob_container_client.rs +++ b/sdk/storage/azure_storage_blob/tests/blob_container_client.rs @@ -1,18 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -use azure_core::http::StatusCode; +use azure_core::{ + http::{RequestContent, StatusCode, XmlFormat}, + time::{Duration, OffsetDateTime}, +}; use azure_core_test::{recorded, TestContext}; use azure_storage_blob::models::{ - BlobContainerClientAcquireLeaseResultHeaders, BlobContainerClientChangeLeaseResultHeaders, - BlobContainerClientGetPropertiesResultHeaders, BlobContainerClientListBlobFlatSegmentOptions, - BlobContainerClientSetMetadataOptions, BlobType, LeaseState, + AccessPolicy, BlobContainerClientAcquireLeaseResultHeaders, + BlobContainerClientChangeLeaseResultHeaders, BlobContainerClientGetPropertiesResultHeaders, + BlobContainerClientListBlobFlatSegmentOptions, BlobContainerClientSetMetadataOptions, BlobType, + LeaseState, SignedIdentifier, }; use azure_storage_blob_test::{ create_test_blob, get_blob_service_client, get_container_client, get_container_name, }; use futures::{StreamExt, TryStreamExt}; -use std::{collections::HashMap, error::Error, time::Duration}; +use std::{collections::HashMap, error::Error}; use tokio::time; #[recorded::test] @@ -247,7 +251,7 @@ async fn test_container_lease_operations(ctx: TestContext) -> Result<(), Box Result<(), Box Result<(), Box> { + // Recording Setup + let recording = ctx.recording(); + let container_client = get_container_client(recording, false).await?; + container_client.create_container(None).await?; + + // Set Access Policy w/ Policy Defined + let access_policy = AccessPolicy { + expiry: Some(OffsetDateTime::now_utc() + Duration::seconds(10)), + permission: Some("rw".to_string()), + start: Some(OffsetDateTime::now_utc()), + }; + let signed_identifier = SignedIdentifier { + access_policy: Some(access_policy), + id: None, + }; + + container_client + .set_access_policy(signed_identifier.try_into()?, None) + .await?; + + // Assert + // let access_policy_response = container_client.get_access_policy(None).await?; + // let signed_identifier = access_policy_response.into_body().await?; + // let access_policy = signed_identifier.access_policy.unwrap(); + + // assert!(signed_identifier.id.is_some()); + // assert!(access_policy.start.is_some()); + // assert!(access_policy.expiry.is_some()); + // assert_eq!("rw", access_policy.permission.unwrap()); + + // container_client.delete_container(None).await?; + Ok(()) +} diff --git a/sdk/storage/azure_storage_blob/tests/blob_service_client.rs b/sdk/storage/azure_storage_blob/tests/blob_service_client.rs index db5ac45d91..91b1acff84 100644 --- a/sdk/storage/azure_storage_blob/tests/blob_service_client.rs +++ b/sdk/storage/azure_storage_blob/tests/blob_service_client.rs @@ -122,3 +122,19 @@ async fn test_list_containers_with_continuation(ctx: TestContext) -> Result<(), Ok(()) } + +#[recorded::test] +async fn test_get_service_stats(ctx: TestContext) -> Result<(), Box> { + //TODO: Need playback only, need secondary-enabled GRS account to record against + // Recording Setup + let recording = ctx.recording(); + let service_client = get_blob_service_client(recording)?; + + let response = service_client.get_service_stats(None).await?; + + // Assert + let storage_service_stats = response.into_body().await?; + assert!(storage_service_stats.geo_replication.is_some()); + + Ok(()) +} diff --git a/sdk/storage/azure_storage_blob/tsp-location.yaml b/sdk/storage/azure_storage_blob/tsp-location.yaml index effaaffe80..e2a850cc29 100644 --- a/sdk/storage/azure_storage_blob/tsp-location.yaml +++ b/sdk/storage/azure_storage_blob/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/storage/Microsoft.BlobStorage commit: 107ee0188cea644df542eb028052d671eb8293d5 repo: Azure/azure-rest-api-specs -additionalDirectories: +additionalDirectories: