Skip to content
Draft
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: 1 addition & 1 deletion sdk/storage/azure_storage_blob/assets.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "rust",
"Tag": "rust/azure_storage_blob_1e5e3b2c6c",
"Tag": "rust/azure_storage_blob_af9d9247c0",
"TagPrefix": "rust/azure_storage_blob"
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@ use crate::{
generated::models::BlobServiceClientGetAccountInfoResult,
models::{
BlobServiceClientFindBlobsByTagsOptions, BlobServiceClientGetAccountInfoOptions,
BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions,
BlobServiceClientSetPropertiesOptions, BlobServiceProperties, FilterBlobSegment,
ListContainersSegmentResponse,
BlobServiceClientGetPropertiesOptions, BlobServiceClientGetStatisticsOptions,
BlobServiceClientListContainersSegmentOptions, BlobServiceClientSetPropertiesOptions,
BlobServiceProperties, FilterBlobSegment, ListContainersSegmentResponse,
StorageServiceStats,
},
pipeline::StorageHeadersPolicy,
BlobContainerClient, BlobServiceClientOptions,
Expand Down Expand Up @@ -208,4 +209,17 @@ impl BlobServiceClient {
) -> Result<Response<BlobServiceClientGetAccountInfoResult, NoFormat>> {
self.client.get_account_info(options).await
}

/// 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_statistics(
&self,
options: Option<BlobServiceClientGetStatisticsOptions<'_>>,
) -> Result<Response<StorageServiceStats, XmlFormat>> {
self.client.get_statistics(options).await
}
}
29 changes: 15 additions & 14 deletions sdk/storage/azure_storage_blob/src/models/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,21 @@ pub use crate::generated::models::{
BlobPropertiesInternal, BlobServiceClientFindBlobsByTagsOptions,
BlobServiceClientGetAccountInfoOptions, BlobServiceClientGetAccountInfoResult,
BlobServiceClientGetAccountInfoResultHeaders, BlobServiceClientGetPropertiesOptions,
BlobServiceClientListContainersSegmentOptions, BlobServiceClientSetPropertiesOptions,
BlobServiceProperties, BlobTag, BlobTags, BlobTagsHeaders, BlobType, Block,
BlockBlobClientCommitBlockListOptions, BlockBlobClientCommitBlockListResult,
BlockBlobClientCommitBlockListResultHeaders, BlockBlobClientGetBlockListOptions,
BlockBlobClientQueryResult, BlockBlobClientQueryResultHeaders,
BlockBlobClientStageBlockFromUrlResult, BlockBlobClientStageBlockFromUrlResultHeaders,
BlockBlobClientStageBlockOptions, BlockBlobClientStageBlockResult,
BlockBlobClientStageBlockResultHeaders, BlockBlobClientUploadBlobFromUrlOptions,
BlockBlobClientUploadBlobFromUrlResult, BlockBlobClientUploadBlobFromUrlResultHeaders,
BlockBlobClientUploadOptions, BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders,
BlockList, BlockListHeaders, BlockListType, BlockLookupList, ContainerItem, CopyStatus,
CorsRule, DeleteSnapshotsOptionType, EncryptionAlgorithmType, FileShareTokenIntent,
FilterBlobItem, FilterBlobSegment, FilterBlobsIncludeItem, GeoReplicationStatusType,
ImmutabilityPolicyMode, LeaseDuration, LeaseState, LeaseStatus, ListBlobsFlatSegmentResponse,
BlobServiceClientGetStatisticsOptions, BlobServiceClientListContainersSegmentOptions,
BlobServiceClientSetPropertiesOptions, BlobServiceProperties, BlobTag, BlobTags,
BlobTagsHeaders, BlobType, Block, BlockBlobClientCommitBlockListOptions,
BlockBlobClientCommitBlockListResult, BlockBlobClientCommitBlockListResultHeaders,
BlockBlobClientGetBlockListOptions, BlockBlobClientQueryResult,
BlockBlobClientQueryResultHeaders, BlockBlobClientStageBlockFromUrlResult,
BlockBlobClientStageBlockFromUrlResultHeaders, BlockBlobClientStageBlockOptions,
BlockBlobClientStageBlockResult, BlockBlobClientStageBlockResultHeaders,
BlockBlobClientUploadBlobFromUrlOptions, BlockBlobClientUploadBlobFromUrlResult,
BlockBlobClientUploadBlobFromUrlResultHeaders, BlockBlobClientUploadOptions,
BlockBlobClientUploadResult, BlockBlobClientUploadResultHeaders, BlockList, BlockListHeaders,
BlockListType, BlockLookupList, ContainerItem, CopyStatus, CorsRule, DeleteSnapshotsOptionType,
EncryptionAlgorithmType, FileShareTokenIntent, FilterBlobItem, FilterBlobSegment,
FilterBlobsIncludeItem, GeoReplication, GeoReplicationStatusType, ImmutabilityPolicyMode,
LeaseDuration, LeaseState, LeaseStatus, ListBlobsFlatSegmentResponse,
ListBlobsFlatSegmentResponseHeaders, ListBlobsHierarchySegmentResponse,
ListBlobsHierarchySegmentResponseHeaders, ListBlobsIncludeItem, ListContainersIncludeType,
ListContainersSegmentResponse, Logging, Metrics, ObjectReplicationMetadata,
Expand Down
40 changes: 37 additions & 3 deletions sdk/storage/azure_storage_blob/tests/blob_service_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@

use azure_core::http::{RequestContent, XmlFormat};
use azure_core_test::{recorded, TestContext, TestMode};
use azure_storage_blob::format_filter_expression;
use azure_storage_blob::models::{
AccountKind, BlobServiceClientGetAccountInfoResultHeaders,
BlobServiceClientGetPropertiesOptions, BlobServiceClientListContainersSegmentOptions,
BlobServiceProperties, BlockBlobClientUploadOptions,
BlobServiceProperties, BlockBlobClientUploadOptions, GeoReplicationStatusType,
};
use azure_storage_blob::{format_filter_expression, BlobServiceClient, BlobServiceClientOptions};
use azure_storage_blob_test::{
create_test_blob, get_blob_name, get_blob_service_client, get_container_client,
get_container_name,
get_container_name, recorded_test_setup,
};
use futures::StreamExt;
use std::{collections::HashMap, error::Error, time::Duration};
Expand Down Expand Up @@ -261,3 +261,37 @@ async fn test_find_blobs_by_tags_service(ctx: TestContext) -> Result<(), Box<dyn
container_client_2.delete_container(None).await?;
Ok(())
}

// TODO: Mark as playback-only once that PR merges
#[recorded::test]
async fn test_get_service_stats(ctx: TestContext) -> Result<(), Box<dyn Error>> {
// Recording Setup
let recording = ctx.recording();
let (options, endpoint) = recorded_test_setup(recording);
let endpoint = endpoint.replace(
".blob.core.windows.net/",
"-secondary.blob.core.windows.net/",
);
let service_client_options = BlobServiceClientOptions {
client_options: options.clone(),
..Default::default()
};
let service_client = BlobServiceClient::new(
&endpoint,
Some(recording.credential()),
Some(service_client_options),
)?;

let service_stats = service_client.get_statistics(None).await?;

// Assert
let stats = service_stats.into_model()?;
assert!(stats.geo_replication.is_some());
assert_eq!(
GeoReplicationStatusType::Live,
stats.clone().geo_replication.unwrap().status.unwrap()
);
assert!(stats.geo_replication.unwrap().last_sync_time.is_some());

Ok(())
}