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
14 changes: 11 additions & 3 deletions api/src/v1/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,20 @@ use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
#[serde(rename_all = "kebab-case")]
pub enum StorageClass {
/// Append tail latency under 400 milliseconds with s2.dev.
/// Append tail latency under 400 ms with s2.dev.
Standard,
/// Append tail latency under 40 milliseconds with s2.dev.
/// Append tail latency under 40 ms with s2.dev.
Express,
/// Append tail latency under 4 ms with s2.dev.
Native,
}

impl From<StorageClass> for s2_common::config::StorageClass {
fn from(value: StorageClass) -> Self {
match value {
StorageClass::Express => Self::Express,
StorageClass::Standard => Self::Standard,
StorageClass::Native => Self::Native,
}
}
}
Expand All @@ -29,6 +32,7 @@ impl From<s2_common::config::StorageClass> for StorageClass {
match value {
s2_common::config::StorageClass::Express => Self::Express,
s2_common::config::StorageClass::Standard => Self::Standard,
s2_common::config::StorageClass::Native => Self::Native,
}
}
}
Expand Down Expand Up @@ -598,7 +602,11 @@ mod tests {
use super::*;

fn gen_storage_class() -> impl Strategy<Value = StorageClass> {
prop_oneof![Just(StorageClass::Standard), Just(StorageClass::Express)]
prop_oneof![
Just(StorageClass::Standard),
Just(StorageClass::Express),
Just(StorageClass::Native),
]
}

fn gen_timestamping_mode() -> impl Strategy<Value = TimestampingMode> {
Expand Down
3 changes: 2 additions & 1 deletion cli/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,8 @@
"type": "string",
"enum": [
"standard",
"express"
"express",
"native"
]
},
"RetentionPolicy": {
Expand Down
3 changes: 3 additions & 0 deletions cli/src/apply.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ fn storage_class_from_sdk(storage_class: s2_sdk::types::StorageClass) -> Storage
match storage_class {
s2_sdk::types::StorageClass::Standard => StorageClass::Standard,
s2_sdk::types::StorageClass::Express => StorageClass::Express,
s2_sdk::types::StorageClass::Native => StorageClass::Native,
}
}

Expand Down Expand Up @@ -127,6 +128,7 @@ fn storage_class_to_sdk(
match storage_class {
s2_resource_spec::StorageClass::Standard => s2_sdk::types::StorageClass::Standard,
s2_resource_spec::StorageClass::Express => s2_sdk::types::StorageClass::Express,
s2_resource_spec::StorageClass::Native => s2_sdk::types::StorageClass::Native,
}
}

Expand Down Expand Up @@ -311,6 +313,7 @@ fn format_storage_class(sc: StorageClass) -> &'static str {
match sc {
StorageClass::Standard => "standard",
StorageClass::Express => "express",
StorageClass::Native => "native",
}
}

Expand Down
3 changes: 3 additions & 0 deletions cli/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@ pub use sdk::types::LocationName;
pub enum StorageClass {
Standard,
Express,
Native,
}

#[derive(ValueEnum, Debug, Clone, Serialize)]
Expand Down Expand Up @@ -322,6 +323,7 @@ impl From<StorageClass> for sdk::types::StorageClass {
match class {
StorageClass::Standard => sdk::types::StorageClass::Standard,
StorageClass::Express => sdk::types::StorageClass::Express,
StorageClass::Native => sdk::types::StorageClass::Native,
}
}
}
Expand All @@ -331,6 +333,7 @@ impl From<sdk::types::StorageClass> for StorageClass {
match class {
sdk::types::StorageClass::Standard => StorageClass::Standard,
sdk::types::StorageClass::Express => StorageClass::Express,
sdk::types::StorageClass::Native => StorageClass::Native,
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions common/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ pub enum StorageClass {
#[default]
#[strum(serialize = "express")]
Express = 2,
#[strum(serialize = "native")]
Native = 3,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
Expand Down
4 changes: 3 additions & 1 deletion resource-spec/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ pub struct StreamConfig {
pub enum StorageClass {
Standard,
Express,
Native,
}

impl schemars::JsonSchema for StorageClass {
Expand All @@ -81,7 +82,7 @@ impl schemars::JsonSchema for StorageClass {
schemars::json_schema!({
"type": "string",
"description": "Storage class for recent writes.",
"enum": ["standard", "express"]
"enum": ["standard", "express", "native"]
})
}
}
Expand All @@ -91,6 +92,7 @@ impl From<StorageClass> for s2_common::config::StorageClass {
match s {
StorageClass::Standard => Self::Standard,
StorageClass::Express => Self::Express,
StorageClass::Native => Self::Native,
}
}
}
Expand Down
26 changes: 20 additions & 6 deletions sdk/src/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -734,17 +734,20 @@ impl<T> Page<T> {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
/// Storage class for recent appends.
pub enum StorageClass {
/// Standard storage class that offers append latencies under `500ms`.
/// Append tail latency under 400 ms with s2.dev.
Standard,
/// Express storage class that offers append latencies under `50ms`.
/// Append tail latency under 40 ms with s2.dev.
Express,
/// Append tail latency under 4 ms with s2.dev.
Native,
}

impl From<api::config::StorageClass> for StorageClass {
fn from(value: api::config::StorageClass) -> Self {
match value {
api::config::StorageClass::Standard => StorageClass::Standard,
api::config::StorageClass::Express => StorageClass::Express,
api::config::StorageClass::Native => StorageClass::Native,
}
}
}
Expand All @@ -754,6 +757,7 @@ impl From<StorageClass> for api::config::StorageClass {
match value {
StorageClass::Standard => api::config::StorageClass::Standard,
StorageClass::Express => api::config::StorageClass::Express,
StorageClass::Native => api::config::StorageClass::Native,
}
}
}
Expand Down Expand Up @@ -4115,11 +4119,21 @@ mod tests {
// -- StorageClass --

#[rstest]
#[case::standard(StorageClass::Standard)]
#[case::express(StorageClass::Express)]
fn storage_class_roundtrip(#[case] sdk: StorageClass) {
#[case::standard(StorageClass::Standard, "standard", 1)]
#[case::express(StorageClass::Express, "express", 2)]
#[case::native(StorageClass::Native, "native", 3)]
fn storage_class_roundtrip(#[case] sdk: StorageClass, #[case] wire: &str, #[case] repr: u8) {
let api: api::config::StorageClass = sdk.into();
let back: StorageClass = api.into();
assert_eq!(serde_json::to_value(api).unwrap(), wire);
let decoded: api::config::StorageClass =
serde_json::from_value(serde_json::json!(wire)).unwrap();
let common: s2_common::config::StorageClass = decoded.into();
assert_eq!(common as u8, repr);
assert_eq!(
s2_common::config::StorageClass::from_repr(repr),
Some(common)
);
let back: StorageClass = api::config::StorageClass::from(common).into();
assert_eq!(back, sdk);
}

Expand Down
Loading