use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SecretBackend {
Keyring,
ConfigSeed,
Aws,
Gcp,
Azure,
Vault,
Kubernetes,
Plaintext,
}
#[derive(Clone, Deserialize, Serialize)]
#[non_exhaustive]
pub struct SecretsConfig {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub backend: Option<SecretBackend>,
pub seed: Option<String>,
pub aws_secret_name: Option<String>,
pub aws_region: Option<String>,
pub gcp_project: Option<String>,
pub gcp_secret_name: Option<String>,
pub azure_vault_url: Option<String>,
pub azure_secret_name: Option<String>,
#[serde(default = "default_keyring_service")]
pub keyring_service: String,
pub vault_addr: Option<String>,
#[serde(default = "default_vault_kv_mount")]
pub vault_kv_mount: String,
pub vault_secret_path: Option<String>,
#[serde(default = "default_vault_secret_key")]
pub vault_secret_key: String,
pub vault_namespace: Option<String>,
#[serde(default = "default_vault_auth_method")]
pub vault_auth_method: String,
pub vault_k8s_role: Option<String>,
#[serde(default = "default_vault_k8s_mount")]
pub vault_k8s_mount: String,
#[serde(default = "default_vault_k8s_jwt_path")]
pub vault_k8s_jwt_path: String,
pub vault_token: Option<String>,
pub vault_approle_role_id: Option<String>,
pub vault_approle_secret_id: Option<String>,
#[serde(default = "default_vault_approle_mount")]
pub vault_approle_mount: String,
#[serde(default)]
pub vault_skip_verify: bool,
pub k8s_secret_name: Option<String>,
pub k8s_namespace: Option<String>,
#[serde(default = "default_k8s_secret_key")]
pub k8s_secret_key: String,
#[serde(default)]
pub allow_plaintext: bool,
#[serde(default = "default_cache_ttl_secs")]
pub cache_ttl_secs: u64,
}
impl std::fmt::Debug for SecretsConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SecretsConfig")
.field("backend", &self.backend)
.field("seed", &self.seed.as_ref().map(|_| "<redacted>"))
.field("aws_secret_name", &self.aws_secret_name)
.field("aws_region", &self.aws_region)
.field("gcp_project", &self.gcp_project)
.field("gcp_secret_name", &self.gcp_secret_name)
.field("azure_vault_url", &self.azure_vault_url)
.field("azure_secret_name", &self.azure_secret_name)
.field("keyring_service", &self.keyring_service)
.field("vault_addr", &self.vault_addr)
.field("vault_kv_mount", &self.vault_kv_mount)
.field("vault_secret_path", &self.vault_secret_path)
.field("vault_secret_key", &self.vault_secret_key)
.field("vault_namespace", &self.vault_namespace)
.field("vault_auth_method", &self.vault_auth_method)
.field("vault_k8s_role", &self.vault_k8s_role)
.field("vault_k8s_mount", &self.vault_k8s_mount)
.field("vault_k8s_jwt_path", &self.vault_k8s_jwt_path)
.field(
"vault_token",
&self.vault_token.as_ref().map(|_| "<redacted>"),
)
.field("vault_approle_role_id", &self.vault_approle_role_id)
.field(
"vault_approle_secret_id",
&self.vault_approle_secret_id.as_ref().map(|_| "<redacted>"),
)
.field("vault_approle_mount", &self.vault_approle_mount)
.field("vault_skip_verify", &self.vault_skip_verify)
.field("k8s_secret_name", &self.k8s_secret_name)
.field("k8s_namespace", &self.k8s_namespace)
.field("k8s_secret_key", &self.k8s_secret_key)
.field("allow_plaintext", &self.allow_plaintext)
.field("cache_ttl_secs", &self.cache_ttl_secs)
.finish()
}
}
fn default_cache_ttl_secs() -> u64 {
60
}
fn default_keyring_service() -> String {
"vta".to_string()
}
fn default_vault_kv_mount() -> String {
"secret".to_string()
}
fn default_vault_secret_key() -> String {
"seed".to_string()
}
fn default_vault_auth_method() -> String {
"kubernetes".to_string()
}
fn default_vault_k8s_mount() -> String {
"kubernetes".to_string()
}
fn default_vault_k8s_jwt_path() -> String {
"/var/run/secrets/kubernetes.io/serviceaccount/token".to_string()
}
fn default_k8s_secret_key() -> String {
"seed".to_string()
}
fn default_vault_approle_mount() -> String {
"approle".to_string()
}
impl Default for SecretsConfig {
fn default() -> Self {
Self {
backend: None,
seed: None,
aws_secret_name: None,
aws_region: None,
gcp_project: None,
gcp_secret_name: None,
azure_vault_url: None,
azure_secret_name: None,
keyring_service: default_keyring_service(),
vault_addr: None,
vault_kv_mount: default_vault_kv_mount(),
vault_secret_path: None,
vault_secret_key: default_vault_secret_key(),
vault_namespace: None,
vault_auth_method: default_vault_auth_method(),
vault_k8s_role: None,
vault_k8s_mount: default_vault_k8s_mount(),
vault_k8s_jwt_path: default_vault_k8s_jwt_path(),
vault_token: None,
vault_approle_role_id: None,
vault_approle_secret_id: None,
vault_approle_mount: default_vault_approle_mount(),
vault_skip_verify: false,
k8s_secret_name: None,
k8s_namespace: None,
k8s_secret_key: default_k8s_secret_key(),
allow_plaintext: false,
cache_ttl_secs: default_cache_ttl_secs(),
}
}
}