Skip to content

Commit eb3b2be

Browse files
committed
feat: support multiple secrets service
1 parent b019d7c commit eb3b2be

5 files changed

Lines changed: 31 additions & 34 deletions

File tree

config.yaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,16 @@ writer_side:
4141
# Uncomment to enable secrets fetched from external providers (e.g. AWS Secrets Manager).
4242
# Secrets are cached in memory with configurable TTL and passed to hooks as a third argument.
4343
# Key pattern: oramacore_<collection_uuid>_<secretKey>
44+
# Multiple providers can be specified as a list; secrets are merged (later entries override).
4445
# secrets_manager:
45-
# aws:
46+
# - aws:
4647
# region: us-east-1
4748
# ttl: 5m
4849
# access_key_id: test
4950
# secret_access_key: test
51+
# - local:
52+
# secrets:
53+
# col1_TOKEN: my-token
5054

5155

5256
# Replace the following value with your own API key
@@ -169,12 +173,16 @@ reader_side:
169173
# Uncomment to enable secrets fetched from external providers (e.g. AWS Secrets Manager).
170174
# Secrets are cached in memory with configurable TTL and passed to hooks as a third argument.
171175
# Key pattern: oramacore_<collection_uuid>_<secretKey>
176+
# Multiple providers can be specified as a list; secrets are merged (later entries override).
172177
# secrets_manager:
173-
# aws:
178+
# - aws:
174179
# region: us-east-1
175180
# ttl: 5m
176181
# access_key_id: test
177182
# secret_access_key: test
183+
# - local:
184+
# secrets:
185+
# col1_TOKEN: my-token
178186

179187
# Uncomment to enable customer JWT validation for search requests.
180188
# This allows customers to use their own identity provider (IdP) for authentication.

src/collection_manager/sides/read/mod.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pub use collection::CollectionStats;
1919
use duration_str::deserialize_duration;
2020
use notify::NotifierConfig;
2121
use orama_js_pool::OutputChannel;
22-
use oramacore_lib::secrets::{SecretsManagerConfig, SecretsService};
22+
use oramacore_lib::secrets::{SecretsProviderConfig, SecretsService};
2323
use oramacore_lib::shelves::ShelfId;
2424
use std::sync::Arc;
2525
use std::time::Duration;
@@ -83,7 +83,7 @@ pub struct ReadSideConfig {
8383
#[serde(default)]
8484
pub hooks: HooksConfig,
8585
pub jwt: Option<JwtConfig>,
86-
pub secrets_manager: Option<SecretsManagerConfig>,
86+
pub secrets_manager: Option<Vec<SecretsProviderConfig>>,
8787
}
8888

8989
#[derive(Debug, Deserialize, Clone, Copy)]
@@ -269,15 +269,14 @@ impl ReadSide {
269269
.await
270270
.context("Cannot create JWT manager")?;
271271

272-
// Initialize secrets service if configured, otherwise use an empty fallback
273272
let secrets_service = match config.secrets_manager {
274-
Some(secrets_config) => {
273+
Some(configs) if !configs.is_empty() => {
275274
info!("Initializing secrets service");
276-
SecretsService::try_new(secrets_config)
275+
SecretsService::try_new(configs)
277276
.await
278277
.context("Cannot create secrets service")?
279278
}
280-
None => SecretsService::empty(),
279+
_ => SecretsService::empty(),
281280
};
282281

283282
let read_side = ReadSide {

src/collection_manager/sides/write/mod.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ use crate::{
7676
use oramacore_lib::fs::BufferedFile;
7777
use oramacore_lib::generic_kv::{KVConfig, KVWriteOperation, KV};
7878
use oramacore_lib::pin_rules::PinRulesWriterError;
79-
use oramacore_lib::secrets::{SecretsManagerConfig, SecretsService};
79+
use oramacore_lib::secrets::{SecretsProviderConfig, SecretsService};
8080

8181
#[derive(Error, Debug)]
8282
pub enum WriteError {
@@ -145,7 +145,7 @@ pub struct WriteSideConfig {
145145
pub output: OutputSideChannelType,
146146
pub config: CollectionsWriterConfig,
147147
pub jwt: Option<JwtConfig>,
148-
pub secrets_manager: Option<SecretsManagerConfig>,
148+
pub secrets_manager: Option<Vec<SecretsProviderConfig>>,
149149
}
150150

151151
pub struct WriteSide {
@@ -282,15 +282,14 @@ impl WriteSide {
282282

283283
let training_sets = TrainingSetInterface::new(kv.clone());
284284

285-
// Initialize secrets service if configured, otherwise use an empty fallback
286285
let secrets_service = match config.secrets_manager {
287-
Some(secrets_config) => {
286+
Some(configs) if !configs.is_empty() => {
288287
info!("Initializing secrets service");
289-
SecretsService::try_new(secrets_config)
288+
SecretsService::try_new(configs)
290289
.await
291290
.context("Cannot create secrets service")?
292291
}
293-
None => SecretsService::empty(),
292+
_ => SecretsService::empty(),
294293
};
295294

296295
let write_side = Self {

src/tests/hook_transform_after_search.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::Context;
44
use futures::FutureExt;
55
use oramacore_lib::hook_storage::HookType;
66
use oramacore_lib::secrets::local::LocalSecretsConfig;
7-
use oramacore_lib::secrets::SecretsManagerConfig;
7+
use oramacore_lib::secrets::SecretsProviderConfig;
88
use serde_json::json;
99

1010
use crate::tests::utils::{create_oramacore_config, init_log, wait_for, TestContext};
@@ -497,15 +497,12 @@ async fn test_transform_after_search_receives_values_and_secrets() {
497497
let collection_id = TestContext::generate_collection_id();
498498
let col_id_str = collection_id.to_string();
499499

500-
let secrets_config = SecretsManagerConfig {
501-
aws: None,
502-
local: Some(LocalSecretsConfig {
503-
secrets: HashMap::from([(
504-
format!("{col_id_str}_TOKEN"),
505-
"search_token_789".to_string(),
506-
)]),
507-
}),
508-
};
500+
let secrets_config = vec![SecretsProviderConfig::Local(LocalSecretsConfig {
501+
secrets: HashMap::from([(
502+
format!("{col_id_str}_TOKEN"),
503+
"search_token_789".to_string(),
504+
)]),
505+
})];
509506

510507
let mut config = create_oramacore_config();
511508
config.writer_side.master_api_key = TestContext::generate_api_key();

src/tests/hook_transform_before_save.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::Context;
44
use futures::FutureExt;
55
use oramacore_lib::hook_storage::HookType;
66
use oramacore_lib::secrets::local::LocalSecretsConfig;
7-
use oramacore_lib::secrets::SecretsManagerConfig;
7+
use oramacore_lib::secrets::SecretsProviderConfig;
88
use serde_json::json;
99

1010
use crate::tests::utils::{create_oramacore_config, init_log, wait_for, TestContext};
@@ -575,15 +575,9 @@ async fn test_transform_before_save_receives_values_and_secrets() {
575575
let collection_id = TestContext::generate_collection_id();
576576
let col_id_str = collection_id.to_string();
577577

578-
let secrets_config = SecretsManagerConfig {
579-
aws: None,
580-
local: Some(LocalSecretsConfig {
581-
secrets: HashMap::from([(
582-
format!("{col_id_str}_TOKEN"),
583-
"save_token_789".to_string(),
584-
)]),
585-
}),
586-
};
578+
let secrets_config = vec![SecretsProviderConfig::Local(LocalSecretsConfig {
579+
secrets: HashMap::from([(format!("{col_id_str}_TOKEN"), "save_token_789".to_string())]),
580+
})];
587581

588582
let mut config = create_oramacore_config();
589583
config.writer_side.master_api_key = TestContext::generate_api_key();

0 commit comments

Comments
 (0)