pub mod catalog;
pub mod catalog_projection;
pub mod catalog_refresh;
pub mod catalog_store;
pub mod control_plane;
pub mod models_dev;
pub mod secrets;
#[cfg(test)]
pub(crate) mod fakes;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BackendPath {
RequestPath,
OffRequestPath,
ControlPlane,
SnapshotCompilation,
Background,
}
impl BackendPath {
pub const fn on_request_path(self) -> bool {
matches!(self, Self::RequestPath)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BackendKind {
None,
InMemory,
Redis,
Postgres,
Stdout,
Otlp,
ModelsDev,
ExternalSecretManager,
}
impl BackendKind {
pub const fn durable_control_plane(self) -> bool {
matches!(self, Self::Postgres)
}
pub const fn as_str(self) -> &'static str {
match self {
Self::None => "none",
Self::InMemory => "in-memory",
Self::Redis => "redis",
Self::Postgres => "postgres",
Self::Stdout => "stdout",
Self::Otlp => "otlp",
Self::ModelsDev => "models.dev",
Self::ExternalSecretManager => "external-secret-manager",
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Responsibility {
pub contract: &'static str,
pub responsibility: &'static str,
pub path: BackendPath,
pub permitted: &'static [BackendKind],
}
impl Responsibility {
pub fn permits(&self, kind: BackendKind) -> bool {
self.permitted.contains(&kind)
}
}
pub const RESPONSIBILITIES: &[Responsibility] = &[
Responsibility {
contract: "ControlPlaneStore",
responsibility: "durable desired state: revisions, manifests, resource versions, audit",
path: BackendPath::ControlPlane,
permitted: &[BackendKind::Postgres],
},
Responsibility {
contract: "SecretStore",
responsibility: "wrapped secret material and unwrapping",
path: BackendPath::SnapshotCompilation,
permitted: &[BackendKind::Postgres, BackendKind::ExternalSecretManager],
},
Responsibility {
contract: "CatalogSource",
responsibility: "model metadata ingestion",
path: BackendPath::Background,
permitted: &[BackendKind::ModelsDev],
},
Responsibility {
contract: "CatalogStore",
responsibility: "durable retention of imported catalogue snapshots",
path: BackendPath::Background,
permitted: &[BackendKind::Postgres, BackendKind::InMemory],
},
Responsibility {
contract: "BudgetStore",
responsibility: "spend caps",
path: BackendPath::RequestPath,
permitted: &[
BackendKind::None,
BackendKind::InMemory,
BackendKind::Redis,
BackendKind::Postgres,
],
},
Responsibility {
contract: "RateLimiter",
responsibility: "inbound admission",
path: BackendPath::RequestPath,
permitted: &[BackendKind::None, BackendKind::InMemory, BackendKind::Redis],
},
Responsibility {
contract: "RevocationStore",
responsibility: "precise minted-token jti revocation",
path: BackendPath::RequestPath,
permitted: &[BackendKind::None, BackendKind::Redis, BackendKind::Postgres],
},
Responsibility {
contract: "UsageSink",
responsibility: "durable usage rows",
path: BackendPath::OffRequestPath,
permitted: &[
BackendKind::Stdout,
BackendKind::Otlp,
BackendKind::Postgres,
],
},
];
pub fn responsibility(contract: &str) -> Option<&'static Responsibility> {
RESPONSIBILITIES.iter().find(|r| r.contract == contract)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Capability {
TransactionalWrites,
OptimisticConcurrency,
IdempotentWrites,
TransactionalAudit,
ChangeNotification,
EnvelopeEncryption,
ExternalKeyManagement,
IncrementalRefresh,
PriceMetadata,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Capabilities(&'static [Capability]);
impl Capabilities {
pub const NONE: Self = Self(&[]);
pub const fn new(capabilities: &'static [Capability]) -> Self {
Self(capabilities)
}
pub fn has(&self, capability: Capability) -> bool {
self.0.contains(&capability)
}
pub fn iter(&self) -> impl Iterator<Item = Capability> + '_ {
self.0.iter().copied()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FailureCategory {
Unavailable,
Conflict,
NotFound,
Invalid,
Denied,
Corrupt,
}
impl FailureCategory {
pub const fn retryable(self) -> bool {
matches!(self, Self::Unavailable)
}
}
pub trait BackendFailure: std::error::Error {
fn category(&self) -> FailureCategory;
fn retryable(&self) -> bool {
self.category().retryable()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn redis_is_never_a_durable_control_plane_backend() {
assert!(!BackendKind::Redis.durable_control_plane());
for contract in ["ControlPlaneStore", "SecretStore", "CatalogSource"] {
let responsibility = responsibility(contract).expect("declared responsibility");
assert!(
!responsibility.permits(BackendKind::Redis),
"{contract} must not permit Redis"
);
}
}
#[test]
fn durable_control_plane_backends_are_permitted_control_plane_implementations() {
let control_plane = responsibility("ControlPlaneStore").expect("declared responsibility");
for kind in control_plane.permitted {
assert!(
kind.durable_control_plane(),
"{} may hold durable state, so it must be durable",
kind.as_str()
);
}
}
#[test]
fn control_plane_contracts_are_off_the_request_path() {
for contract in ["ControlPlaneStore", "SecretStore", "CatalogSource"] {
let responsibility = responsibility(contract).expect("declared responsibility");
assert!(
!responsibility.path.on_request_path(),
"{contract} must not be reachable from an inference request"
);
}
}
#[test]
fn request_path_seams_stay_declared_as_such() {
for contract in ["BudgetStore", "RateLimiter", "RevocationStore"] {
let responsibility = responsibility(contract).expect("declared responsibility");
assert_eq!(responsibility.path, BackendPath::RequestPath);
assert!(
responsibility.permits(BackendKind::None),
"{contract} must remain opt-in so Tier 0 stays stateless"
);
}
let usage = responsibility("UsageSink").expect("declared responsibility");
assert_eq!(usage.path, BackendPath::OffRequestPath);
}
#[test]
fn responsibilities_are_unique_and_have_implementations() {
let mut seen = std::collections::BTreeSet::new();
for responsibility in RESPONSIBILITIES {
assert!(
seen.insert(responsibility.contract),
"duplicate contract {}",
responsibility.contract
);
assert!(
!responsibility.permitted.is_empty(),
"{} has no permitted implementation",
responsibility.contract
);
}
assert_eq!(seen.len(), 8, "the responsibility table is exhaustive");
}
#[test]
fn only_unavailability_is_retryable() {
assert!(FailureCategory::Unavailable.retryable());
for category in [
FailureCategory::Conflict,
FailureCategory::NotFound,
FailureCategory::Invalid,
FailureCategory::Denied,
FailureCategory::Corrupt,
] {
assert!(!category.retryable(), "{category:?} must not be retried");
}
}
#[test]
fn capabilities_are_declared_not_probed() {
const CAPS: Capabilities = Capabilities::new(&[Capability::TransactionalWrites]);
assert!(CAPS.has(Capability::TransactionalWrites));
assert!(!CAPS.has(Capability::ChangeNotification));
assert!(Capabilities::NONE.is_empty());
assert_eq!(CAPS.iter().count(), 1);
}
}