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 6fd57b8900..1f2c04bec8 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 @@ -3,7 +3,10 @@ use crate::{ generated::clients::BlobServiceClient as GeneratedBlobServiceClient, - models::{BlobServiceClientGetPropertiesOptions, StorageServiceProperties}, + models::{ + BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions, + ListContainersSegmentResponse, StorageServiceProperties, + }, pipeline::StorageHeadersPolicy, BlobContainerClient, BlobServiceClientOptions, }; @@ -11,7 +14,7 @@ use azure_core::{ credentials::TokenCredential, http::{ policies::{BearerTokenCredentialPolicy, Policy}, - Response, Url, XmlFormat, + PageIterator, Response, Url, XmlFormat, }, Result, }; @@ -89,4 +92,16 @@ impl BlobServiceClient { ) -> Result> { self.client.get_properties(options).await } + + /// Returns a list of the containers under the specified Storage account. + /// + /// # Arguments + /// + /// * `options` - Optional configuration for the request. + pub fn list_containers( + &self, + options: Option>, + ) -> Result>> { + self.client.list_containers_segment(options) + } } diff --git a/sdk/storage/azure_storage_blob/src/lib.rs b/sdk/storage/azure_storage_blob/src/lib.rs index 0e8fa822ae..ce480edf26 100644 --- a/sdk/storage/azure_storage_blob/src/lib.rs +++ b/sdk/storage/azure_storage_blob/src/lib.rs @@ -23,12 +23,13 @@ pub mod models { BlobContainerClientGetPropertiesOptions, BlobContainerClientGetPropertiesResult, BlobContainerClientGetPropertiesResultHeaders, BlobContainerClientListBlobFlatSegmentOptions, BlobContainerClientSetMetadataOptions, - BlobImmutabilityPolicyMode, BlobServiceClientGetPropertiesOptions, BlobType, + BlobImmutabilityPolicyMode, BlobServiceClientGetPropertiesOptions, + BlobServiceClientListContainersSegmentOptions, BlobType, BlockBlobClientCommitBlockListOptions, BlockBlobClientCommitBlockListResult, BlockBlobClientGetBlockListOptions, BlockBlobClientStageBlockOptions, BlockBlobClientStageBlockResult, BlockBlobClientUploadOptions, BlockBlobClientUploadResult, BlockList, BlockListType, BlockLookupList, CopyStatus, LeaseState, LeaseStatus, - ListBlobsFlatSegmentResponse, PublicAccessType, RehydratePriority, - StorageServiceProperties, + ListBlobsFlatSegmentResponse, ListContainersSegmentResponse, PublicAccessType, + RehydratePriority, StorageServiceProperties, }; } 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 0077ef903b..4cf523bddc 100644 --- a/sdk/storage/azure_storage_blob/tests/blob_service_client.rs +++ b/sdk/storage/azure_storage_blob/tests/blob_service_client.rs @@ -4,6 +4,7 @@ use azure_core_test::{recorded, TestContext}; use azure_storage_blob::models::BlobServiceClientGetPropertiesOptions; use azure_storage_blob_test::get_blob_service_client; +use futures::StreamExt; use std::error::Error; #[recorded::test] @@ -22,3 +23,69 @@ async fn test_get_service_properties(ctx: TestContext) -> Result<(), Box Result<(), Box> { +// // Recording Setup +// let recording = ctx.recording(); +// let service_client = get_blob_service_client(recording)?; +// let container_names = [ +// "testcontainer1".to_string(), +// "testcontainer2".to_string(), +// "testcontainer3".to_string(), +// "testcontainer4".to_string(), +// ]; +// let mut container_clients = Vec::new(); +// for container_name in container_names.clone() { +// let container_client = service_client.blob_container_client(container_name); +// container_client.create_container(None).await?; +// container_clients.push(container_client); +// } + +// // Assert +// let mut pager_response = service_client.list_containers(None)?; +// while let Some(page) = pager_response.next().await { +// let current_page = page.unwrap().into_body().await?; +// let container_list = current_page.container_items; +// for container in container_list { +// let container_name = container.name.unwrap(); +// assert!(container_names.contains(&container_name)); +// } +// } + +// for container_client in container_clients { +// container_client.delete_container(None).await?; +// } + +// Ok(()) +// } + +#[recorded::test] +async fn test_list_containers_singleton(ctx: TestContext) -> Result<(), Box> { + // Recording Setup + let recording = ctx.recording(); + let service_client = get_blob_service_client(recording)?; + let container_client = service_client.blob_container_client("testcontainer".to_string()); + container_client.create_container(None).await?; + + // Assert + let mut pager_response = service_client.list_containers(None)?; + while let Some(page) = pager_response.next().await { + let current_page = page.unwrap().into_body().await?; + let container_list = current_page.container_items; + for container in container_list { + println!("Is Deleted Option Some: {}", container.delete.is_some()); + println!("Is Metadata Option Some: {}", container.metadata.is_some()); + println!("Is Name Option Some: {}", container.name.is_some()); + println!( + "Is Properties Option Some: {}", + container.properties.is_some() + ); + println!("Is Version Option Some: {}", container.version.is_some()); + } + } + + container_client.delete_container(None).await?; + + Ok(()) +}