mod aws;
mod aws_sts;
mod azure;
mod azure_oauth;
pub mod broker;
pub mod dynamic;
mod gcp;
mod gcp_iam;
mod k8s;
mod registry;
pub mod residency;
mod resolver;
mod vault;
pub use aws::AwsSmSecretProvider;
pub use aws_sts::AwsStsProvider;
pub use azure::AzureKeyVaultProvider;
pub use azure_oauth::AzureOAuthProvider;
pub use gcp::GcpSecretManager;
pub use gcp_iam::GcpIamProvider;
pub use k8s::K8sSecretProvider;
pub use registry::get_provider;
pub use resolver::{resolve_keychain_entry, resolve_keychain_entry_with_meta};
pub use vault::VaultSecretProvider;
use std::sync::{Arc, OnceLock};
use async_trait::async_trait;
use crate::error::{AppError, AppResult};
#[derive(Debug, Clone, Default)]
pub struct SecretValue {
pub value: String,
pub version: Option<String>,
pub expires_at: Option<chrono::DateTime<chrono::Utc>>,
}
#[derive(Debug, Clone, Default)]
pub struct SecretRef {
pub name: String,
pub project: Option<String>,
pub version: Option<String>,
pub region: Option<String>,
}
#[async_trait]
pub trait SecretProvider: Send + Sync {
fn provider(&self) -> &'static str;
async fn fetch(&self, secret: &SecretRef) -> AppResult<SecretValue>;
}
pub fn server_region() -> &'static str {
static R: OnceLock<String> = OnceLock::new();
R.get_or_init(|| std::env::var("NOETL_SERVER_REGION").unwrap_or_default())
.as_str()
}
pub fn build_secret_provider(provider: &str) -> AppResult<Arc<dyn SecretProvider>> {
match provider {
"gcp" => Ok(Arc::new(GcpSecretManager::from_env()?)),
"gcp_iam" | "gcp_iamcredentials" => Ok(Arc::new(GcpIamProvider::from_env()?)),
"k8s" | "kubernetes" => Ok(Arc::new(K8sSecretProvider::from_env()?)),
"vault" => Ok(Arc::new(VaultSecretProvider::from_env()?)),
"aws" | "aws_sm" => Ok(Arc::new(AwsSmSecretProvider::from_env()?)),
"aws_sts" | "aws_iam" => Ok(Arc::new(AwsStsProvider::from_env()?)),
"azure" | "azure_kv" => Ok(Arc::new(AzureKeyVaultProvider::from_env()?)),
"azure_oauth" | "azure_aad" => Ok(Arc::new(AzureOAuthProvider::from_env()?)),
other => Err(AppError::Config(format!(
"unsupported keychain secret provider '{other}' \
(supported: gcp, gcp_iam, k8s, vault, aws, aws_sts, azure, azure_oauth)"
))),
}
}