Skip to content

Commit 58e3d8f

Browse files
committed
This commit contains the following changes:
* Regenerated client based on new TSP * Switching set and get metadata to use the generated client. * Added get_statistics * Updated samples to show how to pass realistic parameters.
1 parent 22f5a62 commit 58e3d8f

22 files changed

+969
-924
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sdk/storage/assets.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"AssetsRepo": "Azure/azure-sdk-assets",
33
"AssetsRepoPrefixPath": "rust",
4-
"Tag": "rust/azure_storage_79cfa5e62f",
4+
"Tag": "rust/azure_storage_5ed46ef9da",
55
"TagPrefix": "rust/azure_storage"
66
}

sdk/storage/azure_storage_queue/examples/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ This directory contains a set of example for the use of the Storage Queue client
66

77
The following environment variables need to be set:
88

9-
- AZURE_QUEUE_STORAGE_ACCOUNT=https://<storage_account_name>.queue.core.windows.net/ - needs to include "https://" and trailing '/'
9+
- AZURE_QUEUE_STORAGE_ACCOUNT_NAME=<storage_account_name>
1010

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,32 @@
11
pub fn get_endpoint() -> String {
22
// Retrieve the storage account endpoint from environment variable.
3-
let endpoint = std::env::var("AZURE_QUEUE_STORAGE_ACCOUNT");
4-
let endpoint = match endpoint {
3+
let storage_account_name = std::env::var("AZURE_QUEUE_STORAGE_ACCOUNT_NAME");
4+
let storage_account_name = match storage_account_name {
55
Ok(url) => url,
66
Err(_) => {
7-
eprintln!("Environment variable AZURE_QUEUE_STORAGE_ACCOUNT is not set");
7+
eprintln!("Environment variable AZURE_QUEUE_STORAGE_ACCOUNT_NAME is not set");
88
std::process::exit(1);
99
}
1010
};
1111

12-
// Validate endpoint format
13-
if !endpoint.ends_with("/") || !endpoint.starts_with("https://") {
14-
eprintln!("Endpoint must start with 'https://' and end with '/'");
15-
std::process::exit(1);
16-
}
17-
endpoint
12+
format!("https://{}.queue.core.windows.net/", storage_account_name)
13+
}
14+
15+
// This function is used only for the queue service client example, hence the `allow(dead_code)` attribute.
16+
#[allow(dead_code)]
17+
pub fn get_secondary_endpoint() -> String {
18+
// Retrieve the storage account endpoint from environment variable.
19+
let storage_account_name = std::env::var("AZURE_QUEUE_STORAGE_ACCOUNT_NAME");
20+
let storage_account_name = match storage_account_name {
21+
Ok(url) => url,
22+
Err(_) => {
23+
eprintln!("Environment variable AZURE_QUEUE_STORAGE_ACCOUNT_NAME is not set");
24+
std::process::exit(1);
25+
}
26+
};
27+
28+
format!(
29+
"https://{}-secondary.queue.core.windows.net/",
30+
storage_account_name
31+
)
1832
}

sdk/storage/azure_storage_queue/examples/queue_client.rs

Lines changed: 87 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ use helpers::endpoint::get_endpoint;
55
use helpers::logs::log_operation_result;
66
use helpers::random_queue_name::get_random_queue_name;
77

8-
use azure_core::http::RequestContent;
98
use azure_identity::DefaultAzureCredential;
109
use azure_storage_queue::{
1110
clients::QueueClient,
1211
models::{
13-
QueueMessage, QueueMessageIdOperationGroupClientUpdateOptions,
14-
QueueMessagesOperationGroupClientDequeueOptions,
15-
QueueMessagesOperationGroupClientPeekOptions,
12+
ListOfSignedIdentifier, QueueClientDequeueOptions, QueueClientGetMetadataResultHeaders,
13+
QueueClientPeekOptions, QueueClientSetMetadataOptions, QueueClientUpdateOptions,
14+
QueueMessage,
1615
},
1716
};
1817

@@ -59,12 +58,12 @@ async fn send_and_update_message(
5958
"Updating message with ID: {} and pop receipt: {}",
6059
message_id, pop_receipt
6160
);
62-
let message_xml_string = quick_xml::se::to_string(&QueueMessage {
61+
let queue_message = QueueMessage {
6362
message_text: Some("Updated message text from Rust".to_string()),
64-
});
65-
let update_option = QueueMessageIdOperationGroupClientUpdateOptions {
63+
};
64+
let update_option = QueueClientUpdateOptions {
6665
// Serialize the message text as bytes for the update
67-
queue_message: Some(RequestContent::from(message_xml_string?.into_bytes())),
66+
queue_message: Some(queue_message.try_into()?),
6867
..Default::default()
6968
};
7069
let update_result = queue_client
@@ -78,20 +77,86 @@ async fn send_and_update_message(
7877
Ok(())
7978
}
8079

81-
async fn get_and_set_access_policies(
80+
async fn set_and_get_access_policies(
8281
queue_client: &QueueClient,
8382
) -> Result<(), Box<dyn std::error::Error>> {
83+
// .checked_add(std::time::Duration::from_secs(3600)) // 1 hour from now
84+
// .ok_or("Failed to calculate expiry time")?;
85+
// let acl = ListOfSignedIdentifier {
86+
// items: Some(vec![SignedIdentifier {
87+
// id: Some("policy1".to_string()),
88+
// access_policy: Some(AccessPolicy {
89+
// start: Some(OffsetDateTime::now_utc()),
90+
// expiry: Some(expiry_time.into()),
91+
// permission: Some("raup".to_string()),
92+
// }),
93+
// }]),
94+
// };
95+
96+
// let acl_xml = quick_xml::se::to_string(&acl);
97+
// println!("Access Policy XML: {}", acl_xml?);
98+
99+
// let acl_xml = "<SignedIdentifiers>
100+
// <SignedIdentifier>
101+
// <AccessPolicy>
102+
// <Expiry>2025-06-27T15:02:39.351158345Z</Expiry>
103+
// <Permission>raup</Permission>
104+
// <Start>2025-06-26T14:02:39.351160525Z</Start>
105+
// </AccessPolicy>
106+
// <Id>MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI=</Id>
107+
// </SignedIdentifier>
108+
// </SignedIdentifiers>";
109+
110+
// let result = queue_client
111+
// .set_access_policy(acl_xml.try_into()?, None)
112+
// .await;
113+
// TODO: Fix set and get access policies
114+
let acl = ListOfSignedIdentifier {
115+
..Default::default()
116+
};
117+
let result = queue_client.set_access_policy(acl.try_into()?, None).await;
118+
log_operation_result(&result, "set_access_policy");
119+
84120
let result = queue_client.get_access_policy(None).await;
85121
log_operation_result(&result, "get_access_policy");
86-
87122
let properties = result.unwrap().into_body().await?;
88-
let properties_xml = quick_xml::se::to_string(&properties)?;
89-
let properties_bytes = properties_xml.into_bytes();
123+
if let Some(policies) = properties.items {
124+
for policy in policies {
125+
println!(
126+
"Access Policy - Id: {}, Start: {:?}, Expiry: {:?}, Permissions: {}",
127+
&policy.id.unwrap_or_default(),
128+
policy.access_policy.clone().unwrap().start.unwrap(),
129+
policy.access_policy.clone().unwrap().expiry.unwrap(),
130+
policy.access_policy.clone().unwrap().permission.unwrap()
131+
);
132+
}
133+
} else {
134+
println!("No access policies found.");
135+
}
90136

91-
let result = queue_client
92-
.set_access_policy(RequestContent::from(properties_bytes), None)
93-
.await;
94-
log_operation_result(&result, "set_access_policy");
137+
Ok(())
138+
}
139+
140+
async fn set_and_get_metadata(
141+
queue_client: &QueueClient,
142+
) -> Result<(), Box<dyn std::error::Error>> {
143+
let metadata_options = Some(QueueClientSetMetadataOptions {
144+
metadata: Some(HashMap::from([
145+
("key1".to_string(), "value1".to_string()),
146+
("key2".to_string(), "value2".to_string()),
147+
])),
148+
..Default::default()
149+
});
150+
let result = queue_client.set_metadata(metadata_options).await;
151+
log_operation_result(&result, "set_metadata");
152+
153+
let result = queue_client.get_metadata(None).await;
154+
log_operation_result(&result, "get_metadata");
155+
156+
let metadata = result.unwrap().metadata().unwrap_or_default();
157+
for (key, value) in metadata {
158+
println!("Metadata - {}: {}", key, value);
159+
}
95160

96161
Ok(())
97162
}
@@ -106,7 +171,7 @@ async fn peek_and_receive_messages(
106171
.enqueue_message("Message 2 from Rust Queue SDK", None)
107172
.await;
108173

109-
let options = QueueMessagesOperationGroupClientPeekOptions {
174+
let options = QueueClientPeekOptions {
110175
number_of_messages: Some(5),
111176
..Default::default()
112177
};
@@ -127,7 +192,7 @@ async fn peek_and_receive_messages(
127192
}
128193
}
129194

130-
let options = QueueMessagesOperationGroupClientDequeueOptions {
195+
let options = QueueClientDequeueOptions {
131196
number_of_messages: Some(5),
132197
..Default::default()
133198
};
@@ -161,10 +226,6 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
161226
let queue_name = get_random_queue_name();
162227
let queue_client = QueueClient::new(&endpoint, &queue_name, credential.clone(), None)?;
163228

164-
// Get queue service properties
165-
let result = queue_client.get_properties(None).await;
166-
log_operation_result(&result, "get_properties");
167-
168229
// Create and manage queue
169230
let result = queue_client.create(None).await;
170231
log_operation_result(&result, "create");
@@ -175,10 +236,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
175236
let result = queue_client.create_if_not_exists(None).await;
176237
log_operation_result(&result, "create_if_not_exists");
177238

178-
// Set queue metadata
179-
let metadata = HashMap::from([("key1", "value1"), ("key2", "value2")]);
180-
let result = queue_client.set_metadata(Some(metadata)).await;
181-
log_operation_result(&result, "set_metadata");
239+
// Set and get queue metadata
240+
set_and_get_metadata(&queue_client).await?;
182241

183242
let result = queue_client.enqueue_message("Example Message", None).await;
184243
log_operation_result(&result, "enqueue_message");
@@ -203,7 +262,8 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
203262
// Receive messages
204263
peek_and_receive_messages(&queue_client).await?;
205264

206-
get_and_set_access_policies(&queue_client).await?;
265+
// Set and get access policies
266+
set_and_get_access_policies(&queue_client).await?;
207267

208268
// Cleanup
209269
let result = queue_client.delete(None).await;

0 commit comments

Comments
 (0)