diff --git a/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob/src/checkpoint_store.rs b/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob/src/checkpoint_store.rs index 29182d2318e..7f473fe1b37 100644 --- a/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob/src/checkpoint_store.rs +++ b/sdk/eventhubs/azure_messaging_eventhubs_checkpointstore_blob/src/checkpoint_store.rs @@ -73,12 +73,7 @@ impl BlobCheckpointStore { .blob_container_client .blob_client(blob_name.to_string()); - let options = BlobClientSetMetadataOptions { - metadata: Some(metadata.clone()), - ..Default::default() - }; - - let result = blob_client.set_metadata(Some(options)).await; + let result = blob_client.set_metadata(metadata.clone(), None).await; match result { Ok(r) => Ok(Self::process_storage_response_metadata( r.headers().get_optional_string(&LAST_MODIFIED), @@ -121,12 +116,13 @@ impl BlobCheckpointStore { "{:?} claiming ownership for {} with etag {:?}", metadata, blob_name, etag ); - let mut options = BlobClientSetMetadataOptions::default(); - if let Some(metadata) = &metadata { - options.metadata = Some(metadata.clone()); - } - options.if_match = etag.map(|ref e| e.to_string()); - let result = blob_client.set_metadata(Some(options)).await?; + let options = BlobClientSetMetadataOptions { + if_match: etag.map(|e| e.to_string()), + ..Default::default() + }; + let result = blob_client + .set_metadata(metadata.unwrap_or_default(), Some(options)) + .await?; return Self::process_storage_response_metadata( result.headers().get_optional_string(&LAST_MODIFIED), result.headers().get_optional_string(&ETAG), diff --git a/sdk/storage/azure_storage_blob/CHANGELOG.md b/sdk/storage/azure_storage_blob/CHANGELOG.md index 865fa518d70..1c58d086d45 100644 --- a/sdk/storage/azure_storage_blob/CHANGELOG.md +++ b/sdk/storage/azure_storage_blob/CHANGELOG.md @@ -1,14 +1,20 @@ # Release History -## 0.5.0 (Unreleased) +## 0.5.0 (2025-09-15) ### Features Added -### Breaking Changes +* Added support for `set_properties` to `BlobServiceClient`. +* Added support for `filter_blobs` to `BlobContainerClient` and `BlobServiceClient`. +* Added support for `set_tags` and `get_tags` to `BlobClient`. +* Added support for `get_account_info` to `BlobClient`, `BlobContainerClient`, and `BlobServiceClient`. +* Added support for `upload_blob_from_url` to `BlockBlobClient`. +* Added support for `get_page_ranges`, `update_sequence_number`, and `upload_pages_from_url` to `PageBlobClient`. +* Added support for `find_blobs_by_tags` to `BlobContainerClient` and `BlobServiceClient`. -### Bugs Fixed +### Breaking Changes -### Other Changes +* Made `metadata` a required parameter for `set_metadata` for `BlobContainerClient` and `BlobClient`. ## 0.4.0 (2025-08-05) diff --git a/sdk/storage/azure_storage_blob/assets.json b/sdk/storage/azure_storage_blob/assets.json index bad8863f670..4f9a9f3d8e7 100644 --- a/sdk/storage/azure_storage_blob/assets.json +++ b/sdk/storage/azure_storage_blob/assets.json @@ -1,6 +1,6 @@ { "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "rust", - "Tag": "rust/azure_storage_blob_094782fa40", + "Tag": "rust/azure_storage_blob_f9b39b45b4", "TagPrefix": "rust/azure_storage_blob" } \ No newline at end of file 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 877d7bf8713..8dd69275d71 100644 --- a/sdk/storage/azure_storage_blob/src/clients/blob_client.rs +++ b/sdk/storage/azure_storage_blob/src/clients/blob_client.rs @@ -165,7 +165,7 @@ impl BlobClient { /// # Arguments /// /// * `data` - The blob data to upload. - /// * `overwrite` - Whether the blob to be uploaded should overwrite the current data. If True, `upload_blob` will overwrite the existing data. + /// * `overwrite` - Whether the blob to be uploaded should overwrite the current data. If True, `upload()` will overwrite the existing data. /// If False, the operation will fail with ResourceExistsError. /// * `content_length` - Total length of the blob data to be uploaded. /// * `options` - Optional configuration for the request. @@ -194,12 +194,14 @@ impl BlobClient { /// /// # Arguments /// + /// * `metadata` - The metadata headers. /// * `options` - Optional configuration for the request. pub async fn set_metadata( &self, + metadata: HashMap, options: Option>, ) -> Result> { - self.client.set_metadata(options).await + self.client.set_metadata(metadata, options).await } /// Deletes the blob. diff --git a/sdk/storage/azure_storage_blob/src/generated/clients/blob_client.rs b/sdk/storage/azure_storage_blob/src/generated/clients/blob_client.rs index fd3a3a12f8e..6fab42f43db 100644 --- a/sdk/storage/azure_storage_blob/src/generated/clients/blob_client.rs +++ b/sdk/storage/azure_storage_blob/src/generated/clients/blob_client.rs @@ -37,7 +37,7 @@ use azure_core::{ time::to_rfc7231, tracing, Result, }; -use std::sync::Arc; +use std::{collections::HashMap, sync::Arc}; #[tracing::client] pub struct BlobClient { @@ -1695,10 +1695,12 @@ impl BlobClient { /// /// # Arguments /// + /// * `metadata` - The metadata headers. /// * `options` - Optional parameters for the request. #[tracing::function("Storage.Blob.Container.Blob.setMetadata")] pub async fn set_metadata( &self, + metadata: HashMap, options: Option>, ) -> Result> { let options = options.unwrap_or_default(); @@ -1751,10 +1753,8 @@ impl BlobClient { if let Some(lease_id) = options.lease_id { request.insert_header("x-ms-lease-id", lease_id); } - if let Some(metadata) = options.metadata { - for (k, v) in &metadata { - request.insert_header(format!("x-ms-meta-{k}"), v); - } + for (k, v) in &metadata { + request.insert_header(format!("x-ms-meta-{k}"), v); } request.insert_header("x-ms-version", &self.version); let rsp = self.pipeline.send(&ctx, &mut request).await?; 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 ff71846b0c0..cae5b48a49e 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 @@ -920,9 +920,6 @@ pub struct BlobClientSetMetadataOptions<'a> { /// If specified, the operation only succeeds if the resource's lease is active and matches this ID. pub lease_id: Option, - /// The metadata headers. - pub metadata: Option>, - /// Allows customization of the method call. pub method_options: ClientMethodOptions<'a>, diff --git a/sdk/storage/azure_storage_blob/tests/blob_client.rs b/sdk/storage/azure_storage_blob/tests/blob_client.rs index b824f506673..54ece2643d2 100644 --- a/sdk/storage/azure_storage_blob/tests/blob_client.rs +++ b/sdk/storage/azure_storage_blob/tests/blob_client.rs @@ -238,18 +238,16 @@ async fn test_set_blob_metadata(ctx: TestContext) -> Result<(), Box> // Set Metadata With Values let update_metadata = HashMap::from([("updated".to_string(), "values".to_string())]); - let set_metadata_options = BlobClientSetMetadataOptions { - metadata: Some(update_metadata.clone()), - ..Default::default() - }; - blob_client.set_metadata(Some(set_metadata_options)).await?; + blob_client + .set_metadata(update_metadata.clone(), None) + .await?; // Assert let response = blob_client.get_properties(None).await?; let response_metadata = response.metadata()?; assert_eq!(update_metadata, response_metadata); // Set Metadata No Values (Clear Metadata) - blob_client.set_metadata(None).await?; + blob_client.set_metadata(HashMap::new(), None).await?; // Assert let response = blob_client.get_properties(None).await?; let response_metadata = response.metadata()?; @@ -362,11 +360,12 @@ async fn test_leased_blob_operations(ctx: TestContext) -> Result<(), Box