pub mod audit;
pub mod credentials;
pub mod providers;
pub mod tenants;
pub mod tokens;
use std::sync::Arc;
use std::time::{SystemTime, UNIX_EPOCH};
pub use audit::{AuditSink, FileAudit, InMemoryAudit, TracingAudit};
pub use credentials::{CredentialStore, InMemoryCredentials, Secret};
pub use providers::{
CachingCredentials, CredentialProvider, EksGetTokenProvider, GitHubAppProvider, MintedSecret,
pkcs8_from_pem, spawn_refresher,
};
pub use tenants::Tenants;
pub use tokens::{SigV4Mint, Tokens};
pub fn now_ms() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |d| d.as_millis() as u64)
}
pub struct ControlPlane {
pub tokens: Tokens,
pub tenants: Tenants,
pub credentials: Arc<dyn CredentialStore>,
pub audit: Arc<dyn AuditSink>,
}
impl ControlPlane {
pub fn new(credentials: Arc<dyn CredentialStore>, audit: Arc<dyn AuditSink>) -> Self {
Self {
tokens: Tokens::new(),
tenants: Tenants::new(),
credentials,
audit,
}
}
pub fn with_defaults() -> (Self, Arc<InMemoryCredentials>) {
let credentials = Arc::new(InMemoryCredentials::new());
let plane = Self::new(credentials.clone(), Arc::new(TracingAudit));
(plane, credentials)
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
mod tests {
use super::*;
#[test]
fn now_ms_is_nonzero() {
assert!(now_ms() > 0);
}
#[test]
fn with_defaults_wires_components() {
let (plane, creds) = ControlPlane::with_defaults();
creds.insert("github-app", Secret::new("tok"));
assert!(plane.credentials.resolve("github-app").is_some());
}
}