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

Commit

Permalink
Add support for CosmosDB Get Partition Key Ranges REST API (#269)
Browse files Browse the repository at this point in the history
  • Loading branch information
Francesco Cogno authored May 14, 2020
1 parent 3eb8a80 commit 20b1673
Show file tree
Hide file tree
Showing 14 changed files with 453 additions and 3 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@

[![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)

[![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)
[![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)

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

Crate | Docs | Crates.io | Downloads | Downloads@Latest |
-- | -- | -- | -- | -- |
[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)
[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)
[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)
[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)
[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)
[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)
[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)
Expand Down
2 changes: 1 addition & 1 deletion azure_sdk_cosmos/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "azure_sdk_cosmos"
version = "0.42.3"
version = "0.42.4"
description = "Rust wrappers around Microsoft Azure REST APIs - Azure Cosmos DB crate"
readme = "README.md"
authors = ["Francesco Cogno <[email protected]>", "Max Gortman <[email protected]>"]
Expand Down
26 changes: 26 additions & 0 deletions azure_sdk_cosmos/examples/key_ranges00.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use azure_sdk_cosmos::prelude::*;
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let database = std::env::args()
.nth(1)
.expect("please specify database name as first command line parameter");
let collection = std::env::args()
.nth(2)
.expect("please specify collection name as second command line parameter");

let master_key =
std::env::var("COSMOS_MASTER_KEY").expect("Set env variable COSMOS_MASTER_KEY first!");
let account = std::env::var("COSMOS_ACCOUNT").expect("Set env variable COSMOS_ACCOUNT first!");

let authorization_token = AuthorizationToken::new_master(&master_key)?;
let client = ClientBuilder::new(account, authorization_token.clone())?;
let client = client.with_database(&database);
let client = client.with_collection(&collection);

let resp = client.get_partition_key_ranges().execute().await?;
println!("resp == {:#?}", resp);

Ok(())
}
3 changes: 3 additions & 0 deletions azure_sdk_cosmos/src/clients/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ pub(crate) enum ResourceType {
Users,
Permissions,
Attachments,
PartitionKeyRanges,
}

pub trait CosmosUriBuilder {
Expand Down Expand Up @@ -332,6 +333,7 @@ fn string_to_sign(
ResourceType::Users => "users",
ResourceType::Permissions => "permissions",
ResourceType::Attachments => "attachments",
ResourceType::PartitionKeyRanges => "pkranges",
},
resource_link,
time.to_lowercase()
Expand All @@ -347,6 +349,7 @@ fn generate_resource_link(u: &str) -> &str {
"users",
"permissions",
"attachments",
"pkranges",
];

// store the element only if it does not end with dbs, colls or docs
Expand Down
4 changes: 4 additions & 0 deletions azure_sdk_cosmos/src/clients/collection_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,10 @@ where
requests::ListStoredProceduresBuilder::new(self)
}

fn get_partition_key_ranges(&self) -> requests::GetPartitionKeyRangesBuilder<'_, '_, CUB> {
requests::GetPartitionKeyRangesBuilder::new(self)
}

fn with_document<'c>(
&'c self,
document_name: &'c dyn DocumentName,
Expand Down
7 changes: 7 additions & 0 deletions azure_sdk_cosmos/src/from_headers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,13 @@ pub(crate) fn schema_version_from_headers(headers: &HeaderMap) -> Result<&str, A
.to_str()?)
}

pub(crate) fn server_from_headers(headers: &HeaderMap) -> Result<&str, AzureError> {
Ok(headers
.get(hyper::header::SERVER)
.ok_or_else(|| AzureError::HeaderNotFound(hyper::header::SERVER.to_string()))?
.to_str()?)
}

pub(crate) fn service_version_from_headers(headers: &HeaderMap) -> Result<&str, AzureError> {
Ok(headers
.get(HEADER_SERVICE_VERSION)
Expand Down
3 changes: 3 additions & 0 deletions azure_sdk_cosmos/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub(crate) mod from_headers;
mod headers;
mod indexing_directive;
pub mod offer;
mod partition_key_range;
mod partition_keys;
mod permission;
mod permission_resource;
Expand All @@ -43,6 +44,7 @@ pub use self::document::{Document, DocumentName};
pub use self::document_attributes::DocumentAttributes;
pub use self::indexing_directive::IndexingDirective;
pub use self::offer::Offer;
pub use self::partition_key_range::PartitionKeyRange;
pub use self::permission::{Permission, PermissionMode, PermissionName};
pub use self::permission_resource::PermissionResource;
pub use self::permission_token::PermissionToken;
Expand Down Expand Up @@ -609,6 +611,7 @@ where
stored_procedure_name: &'c dyn StoredProcedureName,
) -> StoredProcedureClient<'c, CUB>;
fn list_stored_procedures(&self) -> requests::ListStoredProceduresBuilder<'_, CUB>;
fn get_partition_key_ranges(&self) -> requests::GetPartitionKeyRangesBuilder<'_, '_, CUB>;
fn with_document<'c>(
&'c self,
document_name: &'c dyn DocumentName,
Expand Down
21 changes: 21 additions & 0 deletions azure_sdk_cosmos/src/partition_key_range.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#[derive(Debug, PartialEq, PartialOrd, Clone, Deserialize)]
pub struct PartitionKeyRange {
#[serde(rename = "_rid")]
pub rid: String,
pub id: String,
#[serde(rename = "_etag")]
pub etag: String,
#[serde(rename = "minInclusive")]
pub min_exclusive: String,
#[serde(rename = "maxExclusive")]
pub max_exclusive: String,
#[serde(rename = "ridPrefix")]
pub rid_prefix: u64,
pub _self: String,
#[serde(rename = "throughputFraction")]
pub throughput_fraction: u64,
pub status: String,
// TODO: parents
#[serde(rename = "_ts")]
pub ts: u64,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
{
"name": "GetPartitionKeyRangesBuilder",
"derive": "Debug, Clone",
"uses": [
"crate::clients::{CollectionClient, CosmosUriBuilder, ResourceType}",
"crate::prelude::*",
"crate::responses::*",
"crate::CollectionClientRequired",
"azure_sdk_core::errors::{check_status_extract_headers_and_body, AzureError}",
"azure_sdk_core::modify_conditions::IfMatchCondition",
"azure_sdk_core::prelude::*",
"azure_sdk_core::{IfMatchConditionOption, IfMatchConditionSupport}",
"chrono::{DateTime, Utc}",
"hyper::StatusCode",
"std::convert::TryInto"
],
"inline": true,
"extra_types": [ "'a", "'b", "CUB" ],
"extra_wheres": ["CUB: CosmosUriBuilder" ],
"constructor_fields": [
{
"name": "collection_client",
"field_type": "&'a CollectionClient<'a, CUB>",
"trait_get": "CollectionClientRequired<'a, CUB>"
}
],
"fields": [
{
"name": "if_match_condition",
"field_type": "IfMatchCondition<'b>",
"optional": true,
"trait_get": "IfMatchConditionOption<'b>",
"trait_set": "IfMatchConditionSupport<'b>"
},
{
"name": "if_modified_since",
"field_type": "&'b DateTime<Utc>",
"optional": true,
"trait_get": "IfModifiedSinceOption<'b>",
"trait_set": "IfModifiedSinceSupport<'b>"
},
{
"name": "user_agent",
"field_type": "&'b str",
"optional": true,
"trait_get": "UserAgentOption<'b>",
"trait_set": "UserAgentSupport<'b>"
},
{
"name": "activity_id",
"field_type": "&'b str",
"optional": true,
"trait_get": "ActivityIdOption<'b>",
"trait_set": "ActivityIdSupport<'b>"
},
{
"name": "consistency_level",
"field_type": "ConsistencyLevel<'b>",
"optional": true,
"trait_get": "ConsistencyLevelOption<'b>",
"trait_set": "ConsistencyLevelSupport<'b>"
}
]
}
Loading

0 comments on commit 20b1673

Please sign in to comment.