From 60c8b33327ec314874a729c0e2909c2d0afb5d64 Mon Sep 17 00:00:00 2001 From: JR Conlin Date: Tue, 23 Jan 2024 14:58:48 -0800 Subject: [PATCH] feat: Be more clear and consistent about features around `dual` (#557) This patch makes the feature sets consistent between the major crates. Closes #SYNC-4075 --- .cargo/audit.toml | 1 + autoconnect/Cargo.toml | 5 ++++- autoconnect/autoconnect-settings/Cargo.toml | 3 +++ autoconnect/autoconnect-settings/src/app_state.rs | 10 +++++++++- autoendpoint/Cargo.toml | 4 ++-- autoendpoint/src/extractors/authorization_check.rs | 6 +++--- autopush-common/Cargo.toml | 1 + autopush-common/src/db/mod.rs | 7 ++++++- 8 files changed, 29 insertions(+), 8 deletions(-) diff --git a/.cargo/audit.toml b/.cargo/audit.toml index a08bce80..01cf1b87 100644 --- a/.cargo/audit.toml +++ b/.cargo/audit.toml @@ -8,4 +8,5 @@ ignore = [ "RUSTSEC-2023-0052", # Bound by Rusoto 0.47, Rustls 0.20, hyper-rustls 0.22, a2 0.8 "RUSTSEC-2023-0065", # Bound by tokio-tungstenite "RUSTSEC-2024-0003", # Bound by hyper 0.12 + "RUSTSEC-2024-0006", # Bound by Rusoto 0.42 ] diff --git a/autoconnect/Cargo.toml b/autoconnect/Cargo.toml index ad6a7b74..8b64d5be 100644 --- a/autoconnect/Cargo.toml +++ b/autoconnect/Cargo.toml @@ -53,6 +53,9 @@ actix-service = "2.0" docopt = "1.1" [features] -emulator = ["bigtable"] +default = ["dynamodb"] bigtable = ["autopush_common/bigtable", "autoconnect_settings/bigtable"] +dynamodb = ["autopush_common/dynamodb", "autoconnect_settings/dynamodb"] +dual = ["bigtable", "dynamodb"] +emulator = ["bigtable"] log_vapid = [] diff --git a/autoconnect/autoconnect-settings/Cargo.toml b/autoconnect/autoconnect-settings/Cargo.toml index e574fd22..81f7ae2f 100644 --- a/autoconnect/autoconnect-settings/Cargo.toml +++ b/autoconnect/autoconnect-settings/Cargo.toml @@ -22,5 +22,8 @@ autoconnect_common.workspace = true autopush_common.workspace = true [features] +default = ["dynamodb"] +dynamodb = [] bigtable = ["autopush_common/bigtable"] emulator = ["bigtable"] +dual = ["bigtable", "dynamodb"] diff --git a/autoconnect/autoconnect-settings/src/app_state.rs b/autoconnect/autoconnect-settings/src/app_state.rs index 3dc1e4ea..8b5e91cf 100644 --- a/autoconnect/autoconnect-settings/src/app_state.rs +++ b/autoconnect/autoconnect-settings/src/app_state.rs @@ -2,6 +2,10 @@ use std::{sync::Arc, time::Duration}; #[cfg(feature = "bigtable")] use autopush_common::db::bigtable::BigTableClientImpl; +#[cfg(all(feature = "bigtable", feature = "dynamodb"))] +use autopush_common::db::dual::DualClientImpl; +#[cfg(feature = "dynamodb")] +use autopush_common::db::dynamodb::DdbClientImpl; use cadence::StatsdClient; use fernet::{Fernet, MultiFernet}; use tokio::sync::RwLock; @@ -10,7 +14,7 @@ use autoconnect_common::{ broadcast::BroadcastChangeTracker, megaphone::init_and_spawn_megaphone_updater, registry::ClientRegistry, }; -use autopush_common::db::{client::DbClient, dynamodb::DdbClientImpl, DbSettings, StorageType}; +use autopush_common::db::{client::DbClient, DbSettings, StorageType}; use autopush_common::errors::{ApcErrorKind, Result}; use crate::{Settings, ENV_PREFIX}; @@ -71,12 +75,16 @@ impl AppState { db_settings: settings.db_settings.clone(), }; let storage_type = StorageType::from_dsn(&db_settings.dsn); + #[allow(unused)] let db: Box = match storage_type { + #[cfg(feature = "dynamodb")] StorageType::DynamoDb => Box::new(DdbClientImpl::new(metrics.clone(), &db_settings)?), #[cfg(feature = "bigtable")] StorageType::BigTable => { Box::new(BigTableClientImpl::new(metrics.clone(), &db_settings)?) } + #[cfg(all(feature = "bigtable", feature = "dynamodb"))] + StorageType::Dual => Box::new(DualClientImpl::new(metrics.clone(), &db_settings)?), _ => panic!( "Invalid Storage type {:?}. Check {}__DB_DSN.", storage_type, diff --git a/autoendpoint/Cargo.toml b/autoendpoint/Cargo.toml index eb11b565..da1d7fd0 100644 --- a/autoendpoint/Cargo.toml +++ b/autoendpoint/Cargo.toml @@ -68,7 +68,7 @@ tokio = { workspace = true, features = ["fs", "macros"] } [features] default = ["dynamodb"] +bigtable = ["autopush_common/bigtable"] dynamodb = ["autopush_common/dynamodb"] -emulator = ["bigtable"] dual = ["bigtable", "dynamodb"] -bigtable = ["autopush_common/bigtable"] +emulator = ["bigtable"] diff --git a/autoendpoint/src/extractors/authorization_check.rs b/autoendpoint/src/extractors/authorization_check.rs index 75505365..2a39147b 100644 --- a/autoendpoint/src/extractors/authorization_check.rs +++ b/autoendpoint/src/extractors/authorization_check.rs @@ -99,7 +99,7 @@ mod test { // hopefully no-op type test to check locally generated tokens. let uaid: Uuid = "729e5104f5f04abc9196085340317dea".parse().unwrap(); let auth_keys = ["HJVPy4ZwF4Yz_JdvXTL8hRcwIhv742vC60Tg5Ycrvw8=".to_owned()].to_vec(); - let token = AuthorizationCheck::generate_token(auth_keys.get(0).unwrap(), &uaid).unwrap(); + let token = AuthorizationCheck::generate_token(auth_keys.first().unwrap(), &uaid).unwrap(); AuthorizationCheck::validate_token(&token, &uaid, &auth_keys)?; Ok(()) @@ -115,7 +115,7 @@ mod test { // the following token was generated using the old python application. let legacy_token = "f694963453adf5dedcc379bbdd6900d692b6e09f1c91f44169bfcd2f941bf36c"; // pop the firstkey off of the auth_key list. - let selected = auth_keys.get(0).unwrap(); + let selected = auth_keys.first().unwrap(); let token = AuthorizationCheck::generate_token(selected, &uaid).unwrap(); assert_eq!(&token, legacy_token); @@ -126,7 +126,7 @@ mod test { fn test_token_extractor() -> ApiResult<()> { let uaid: Uuid = "729e5104f5f04abc9196085340317dea".parse().unwrap(); let auth_keys = ["HJVPy4ZwF4Yz_JdvXTL8hRcwIhv742vC60Tg5Ycrvw8=".to_owned()].to_vec(); - let token = AuthorizationCheck::generate_token(auth_keys.get(0).unwrap(), &uaid).unwrap(); + let token = AuthorizationCheck::generate_token(auth_keys.first().unwrap(), &uaid).unwrap(); assert!(get_token_from_auth_header(&format!("bearer {}", &token)).is_some()); assert!(get_token_from_auth_header(&format!("webpush {}", &token)).is_some()); diff --git a/autopush-common/Cargo.toml b/autopush-common/Cargo.toml index aeaec519..aa56ab06 100644 --- a/autopush-common/Cargo.toml +++ b/autopush-common/Cargo.toml @@ -80,6 +80,7 @@ actix-rt = "2.8" default = ["dynamodb"] bigtable = ["dep:google-cloud-rust-raw", "dep:grpcio", "dep:protobuf"] dynamodb = ["dep:rusoto_core", "dep:rusoto_credential", "dep:rusoto_dynamodb"] +dual = ["dynamodb", "bigtable"] emulator = [ "bigtable", ] # used for testing big table, requires an external bigtable emulator running. diff --git a/autopush-common/src/db/mod.rs b/autopush-common/src/db/mod.rs index b59c0c08..2fe8392f 100644 --- a/autopush-common/src/db/mod.rs +++ b/autopush-common/src/db/mod.rs @@ -58,12 +58,17 @@ pub enum StorageType { } /// The type of storage to use. +#[allow(clippy::vec_init_then_push)] // Because we are only pushing on feature flags. impl StorageType { fn available<'a>() -> Vec<&'a str> { #[allow(unused_mut)] - let mut result = ["DynamoDB"].to_vec(); + let mut result: Vec<&str> = Vec::new(); + #[cfg(feature = "dynamodb")] + result.push("DynamoDB"); #[cfg(feature = "bigtable")] result.push("Bigtable"); + #[cfg(all(feature = "bigtable", feature = "dynamodb"))] + result.push("Dual"); result }