Skip to content
This repository was archived by the owner on Oct 6, 2020. It is now read-only.

Commit 20b1673

Browse files
author
Francesco Cogno
authored
Add support for CosmosDB Get Partition Key Ranges REST API (#269)
1 parent 3eb8a80 commit 20b1673

14 files changed

+453
-3
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55

66
[![Build Status](https://travis-ci.org/MindFlavor/AzureSDKForRust.svg?branch=master)](https://travis-ci.org/MindFlavor/AzureSDKForRust) [![Coverage Status](https://coveralls.io/repos/MindFlavor/AzureSDKForRust/badge.svg?branch=master&service=github)](https://coveralls.io/github/MindFlavor/AzureSDKForRust?branch=master) ![stability-unstable](https://img.shields.io/badge/stability-unstable-yellow.svg)
77

8-
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/core_0.43.2) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/core_0.43.2) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/core_0.43.2)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
8+
[![tag](https://img.shields.io/github/tag/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/tree/cosmos_0.42.4) [![release](https://img.shields.io/github/release/mindflavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/releases/tag/cosmos_0.42.4) [![commitssince](https://img.shields.io/github/commits-since/mindflavor/AzureSDKForRust/cosmos_0.42.4)](https://github.com/MindFlavor/AzureSDKForRust/commits/master)
99

1010
[![GitHub contributors](https://img.shields.io/github/contributors/MindFlavor/AzureSDKForRust.svg)](https://github.com/MindFlavor/AzureSDKForRust/graphs/contributors)
1111

1212
Crate | Docs | Crates.io | Downloads | Downloads@Latest |
1313
-- | -- | -- | -- | -- |
1414
[azure_sdk_auth_aad](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_auth_aad) | [![docs](https://docs.rs/azure_sdk_auth_aad/badge.svg)](https://docs.rs/azure_sdk_auth_aad/0.42.2/azure_sdk_auth_aad) | [![Crate](https://img.shields.io/crates/v/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_auth_aad.svg)](https://crates.io/crates/azure_sdk_auth_aad)
1515
[azure_sdk_core](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_core) | [![docs](https://docs.rs/azure_sdk_core/badge.svg)](https://docs.rs/azure_sdk_core/0.43.2/azure_sdk_core) | [![Crate](https://img.shields.io/crates/v/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_core.svg)](https://crates.io/crates/azure_sdk_core)
16-
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.42.3/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
16+
[azure_sdk_cosmos](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_cosmos) | [![docs](https://docs.rs/azure_sdk_cosmos/badge.svg)](https://docs.rs/azure_sdk_cosmos/0.42.4/azure_sdk_cosmos) | [![Crate](https://img.shields.io/crates/v/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_cosmos.svg)](https://crates.io/crates/azure_sdk_cosmos)
1717
[azure_sdk_service_bus](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_service_bus) | [![docs](https://docs.rs/azure_sdk_service_bus/badge.svg)](https://docs.rs/azure_sdk_service_bus/0.44.0/azure_sdk_service_bus) | [![Crate](https://img.shields.io/crates/v/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_service_bus.svg)](https://crates.io/crates/azure_sdk_service_bus)
1818
[azure_sdk_storage_account](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_account) | [![docs](https://docs.rs/azure_sdk_storage_account/badge.svg)](https://docs.rs/azure_sdk_storage_account/0.40.4/azure_sdk_storage_account) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_account.svg)](https://crates.io/crates/azure_sdk_storage_account)
1919
[azure_sdk_storage_blob](https://github.com/MindFlavor/AzureSDKForRust/tree/master/azure_sdk_storage_blob) | [![docs](https://docs.rs/azure_sdk_storage_blob/badge.svg)](https://docs.rs/azure_sdk_storage_blob/0.43.2/azure_sdk_storage_blob) | [![Crate](https://img.shields.io/crates/v/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratedown](https://img.shields.io/crates/d/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob) | [![cratelastdown](https://img.shields.io/crates/dv/azure_sdk_storage_blob.svg)](https://crates.io/crates/azure_sdk_storage_blob)

azure_sdk_cosmos/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "azure_sdk_cosmos"
3-
version = "0.42.3"
3+
version = "0.42.4"
44
description = "Rust wrappers around Microsoft Azure REST APIs - Azure Cosmos DB crate"
55
readme = "README.md"
66
authors = ["Francesco Cogno <[email protected]>", "Max Gortman <[email protected]>"]
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use azure_sdk_cosmos::prelude::*;
2+
use std::error::Error;
3+
4+
#[tokio::main]
5+
async fn main() -> Result<(), Box<dyn Error>> {
6+
let database = std::env::args()
7+
.nth(1)
8+
.expect("please specify database name as first command line parameter");
9+
let collection = std::env::args()
10+
.nth(2)
11+
.expect("please specify collection name as second command line parameter");
12+
13+
let master_key =
14+
std::env::var("COSMOS_MASTER_KEY").expect("Set env variable COSMOS_MASTER_KEY first!");
15+
let account = std::env::var("COSMOS_ACCOUNT").expect("Set env variable COSMOS_ACCOUNT first!");
16+
17+
let authorization_token = AuthorizationToken::new_master(&master_key)?;
18+
let client = ClientBuilder::new(account, authorization_token.clone())?;
19+
let client = client.with_database(&database);
20+
let client = client.with_collection(&collection);
21+
22+
let resp = client.get_partition_key_ranges().execute().await?;
23+
println!("resp == {:#?}", resp);
24+
25+
Ok(())
26+
}

azure_sdk_cosmos/src/clients/client.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub(crate) enum ResourceType {
3131
Users,
3232
Permissions,
3333
Attachments,
34+
PartitionKeyRanges,
3435
}
3536

3637
pub trait CosmosUriBuilder {
@@ -332,6 +333,7 @@ fn string_to_sign(
332333
ResourceType::Users => "users",
333334
ResourceType::Permissions => "permissions",
334335
ResourceType::Attachments => "attachments",
336+
ResourceType::PartitionKeyRanges => "pkranges",
335337
},
336338
resource_link,
337339
time.to_lowercase()
@@ -347,6 +349,7 @@ fn generate_resource_link(u: &str) -> &str {
347349
"users",
348350
"permissions",
349351
"attachments",
352+
"pkranges",
350353
];
351354

352355
// store the element only if it does not end with dbs, colls or docs

azure_sdk_cosmos/src/clients/collection_client.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ where
101101
requests::ListStoredProceduresBuilder::new(self)
102102
}
103103

104+
fn get_partition_key_ranges(&self) -> requests::GetPartitionKeyRangesBuilder<'_, '_, CUB> {
105+
requests::GetPartitionKeyRangesBuilder::new(self)
106+
}
107+
104108
fn with_document<'c>(
105109
&'c self,
106110
document_name: &'c dyn DocumentName,

azure_sdk_cosmos/src/from_headers.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,13 @@ pub(crate) fn schema_version_from_headers(headers: &HeaderMap) -> Result<&str, A
244244
.to_str()?)
245245
}
246246

247+
pub(crate) fn server_from_headers(headers: &HeaderMap) -> Result<&str, AzureError> {
248+
Ok(headers
249+
.get(hyper::header::SERVER)
250+
.ok_or_else(|| AzureError::HeaderNotFound(hyper::header::SERVER.to_string()))?
251+
.to_str()?)
252+
}
253+
247254
pub(crate) fn service_version_from_headers(headers: &HeaderMap) -> Result<&str, AzureError> {
248255
Ok(headers
249256
.get(HEADER_SERVICE_VERSION)

azure_sdk_cosmos/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ pub(crate) mod from_headers;
2020
mod headers;
2121
mod indexing_directive;
2222
pub mod offer;
23+
mod partition_key_range;
2324
mod partition_keys;
2425
mod permission;
2526
mod permission_resource;
@@ -43,6 +44,7 @@ pub use self::document::{Document, DocumentName};
4344
pub use self::document_attributes::DocumentAttributes;
4445
pub use self::indexing_directive::IndexingDirective;
4546
pub use self::offer::Offer;
47+
pub use self::partition_key_range::PartitionKeyRange;
4648
pub use self::permission::{Permission, PermissionMode, PermissionName};
4749
pub use self::permission_resource::PermissionResource;
4850
pub use self::permission_token::PermissionToken;
@@ -609,6 +611,7 @@ where
609611
stored_procedure_name: &'c dyn StoredProcedureName,
610612
) -> StoredProcedureClient<'c, CUB>;
611613
fn list_stored_procedures(&self) -> requests::ListStoredProceduresBuilder<'_, CUB>;
614+
fn get_partition_key_ranges(&self) -> requests::GetPartitionKeyRangesBuilder<'_, '_, CUB>;
612615
fn with_document<'c>(
613616
&'c self,
614617
document_name: &'c dyn DocumentName,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#[derive(Debug, PartialEq, PartialOrd, Clone, Deserialize)]
2+
pub struct PartitionKeyRange {
3+
#[serde(rename = "_rid")]
4+
pub rid: String,
5+
pub id: String,
6+
#[serde(rename = "_etag")]
7+
pub etag: String,
8+
#[serde(rename = "minInclusive")]
9+
pub min_exclusive: String,
10+
#[serde(rename = "maxExclusive")]
11+
pub max_exclusive: String,
12+
#[serde(rename = "ridPrefix")]
13+
pub rid_prefix: u64,
14+
pub _self: String,
15+
#[serde(rename = "throughputFraction")]
16+
pub throughput_fraction: u64,
17+
pub status: String,
18+
// TODO: parents
19+
#[serde(rename = "_ts")]
20+
pub ts: u64,
21+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
{
2+
"name": "GetPartitionKeyRangesBuilder",
3+
"derive": "Debug, Clone",
4+
"uses": [
5+
"crate::clients::{CollectionClient, CosmosUriBuilder, ResourceType}",
6+
"crate::prelude::*",
7+
"crate::responses::*",
8+
"crate::CollectionClientRequired",
9+
"azure_sdk_core::errors::{check_status_extract_headers_and_body, AzureError}",
10+
"azure_sdk_core::modify_conditions::IfMatchCondition",
11+
"azure_sdk_core::prelude::*",
12+
"azure_sdk_core::{IfMatchConditionOption, IfMatchConditionSupport}",
13+
"chrono::{DateTime, Utc}",
14+
"hyper::StatusCode",
15+
"std::convert::TryInto"
16+
],
17+
"inline": true,
18+
"extra_types": [ "'a", "'b", "CUB" ],
19+
"extra_wheres": ["CUB: CosmosUriBuilder" ],
20+
"constructor_fields": [
21+
{
22+
"name": "collection_client",
23+
"field_type": "&'a CollectionClient<'a, CUB>",
24+
"trait_get": "CollectionClientRequired<'a, CUB>"
25+
}
26+
],
27+
"fields": [
28+
{
29+
"name": "if_match_condition",
30+
"field_type": "IfMatchCondition<'b>",
31+
"optional": true,
32+
"trait_get": "IfMatchConditionOption<'b>",
33+
"trait_set": "IfMatchConditionSupport<'b>"
34+
},
35+
{
36+
"name": "if_modified_since",
37+
"field_type": "&'b DateTime<Utc>",
38+
"optional": true,
39+
"trait_get": "IfModifiedSinceOption<'b>",
40+
"trait_set": "IfModifiedSinceSupport<'b>"
41+
},
42+
{
43+
"name": "user_agent",
44+
"field_type": "&'b str",
45+
"optional": true,
46+
"trait_get": "UserAgentOption<'b>",
47+
"trait_set": "UserAgentSupport<'b>"
48+
},
49+
{
50+
"name": "activity_id",
51+
"field_type": "&'b str",
52+
"optional": true,
53+
"trait_get": "ActivityIdOption<'b>",
54+
"trait_set": "ActivityIdSupport<'b>"
55+
},
56+
{
57+
"name": "consistency_level",
58+
"field_type": "ConsistencyLevel<'b>",
59+
"optional": true,
60+
"trait_get": "ConsistencyLevelOption<'b>",
61+
"trait_set": "ConsistencyLevelSupport<'b>"
62+
}
63+
]
64+
}

0 commit comments

Comments
 (0)