use super::*;
pub const REPLICATION_STRATEGY_ASYNC_ACTIVE_PASSIVE: &str = "async-active-passive";
pub const REPLICATION_STRATEGY_SYNCHRONOUS: &str = "synchronous";
pub const REPLICATION_STRATEGY_QUORUM: &str = "quorum";
pub const REPLICATION_STRATEGY_ACTIVE_ACTIVE: &str = "active-active";
const REPLICATION_STRATEGY_CAPABILITIES: &[&str] = &[
"native-support-state",
"semantic-parity",
"configuration-admin-surface",
"security-governance-impact",
"observability-evidence",
"failure-mode-behavior",
"validation-test-coverage",
"product-specific-caveats",
];
const REPLICATION_STRATEGY_CAVEATS: &[&str] = &[
"BucketWarden supports explicit asynchronous active-passive replication runs.",
"Replication preserves version identity, delete markers, Object Lock state, encryption metadata, and audit-relevant state.",
"Synchronous, quorum, and active-active strategies are tracked but fail closed outside the current runtime boundary.",
];
const REPLICATION_STRATEGY_FAILURE_MODES: &[&str] = &[
"unsupported-strategy-rejected",
"missing-destination-skipped",
"encrypted-object-skipped-when-disabled",
"replication-lag-visible-as-pending",
];
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct ReplicationStrategySupportEntry {
pub strategy: &'static str,
pub native_support: bool,
pub semantic_parity: &'static str,
pub failure_mode: &'static str,
pub caveat: &'static str,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
pub struct ReplicationStrategySupportReport {
pub active_strategy: &'static str,
pub supported_strategies: Vec<&'static str>,
pub unsupported_strategies: Vec<&'static str>,
pub capabilities: Vec<&'static str>,
pub failure_modes: Vec<&'static str>,
pub caveats: Vec<&'static str>,
pub entries: Vec<ReplicationStrategySupportEntry>,
}
impl BucketWarden {
pub fn replication_strategy_support_report(&self) -> ReplicationStrategySupportReport {
ReplicationStrategySupportReport {
active_strategy: REPLICATION_STRATEGY_ASYNC_ACTIVE_PASSIVE,
supported_strategies: vec![REPLICATION_STRATEGY_ASYNC_ACTIVE_PASSIVE],
unsupported_strategies: vec![
REPLICATION_STRATEGY_SYNCHRONOUS,
REPLICATION_STRATEGY_QUORUM,
REPLICATION_STRATEGY_ACTIVE_ACTIVE,
],
capabilities: REPLICATION_STRATEGY_CAPABILITIES.to_vec(),
failure_modes: REPLICATION_STRATEGY_FAILURE_MODES.to_vec(),
caveats: REPLICATION_STRATEGY_CAVEATS.to_vec(),
entries: vec![
ReplicationStrategySupportEntry {
strategy: REPLICATION_STRATEGY_ASYNC_ACTIVE_PASSIVE,
native_support: true,
semantic_parity: "Explicit operator-triggered active-passive replication over BucketWarden object versions.",
failure_mode: "Lag is visible as PENDING or MISSING_DESTINATION until an operator run completes.",
caveat: "Replication is deterministic runtime replay, not an AWS cross-region replication SLA.",
},
ReplicationStrategySupportEntry {
strategy: REPLICATION_STRATEGY_SYNCHRONOUS,
native_support: false,
semantic_parity: "No write-acknowledged synchronous replica commit semantics are claimed.",
failure_mode: "Synchronous strategy selection is rejected as unsupported.",
caveat: "Synchronous replication needs a consensus or two-phase commit boundary before support.",
},
ReplicationStrategySupportEntry {
strategy: REPLICATION_STRATEGY_QUORUM,
native_support: false,
semantic_parity: "No quorum write, read repair, or replica voting semantics are claimed.",
failure_mode: "Quorum strategy selection is rejected as unsupported.",
caveat: "Quorum replication requires distributed placement and failure-domain decisions.",
},
ReplicationStrategySupportEntry {
strategy: REPLICATION_STRATEGY_ACTIVE_ACTIVE,
native_support: false,
semantic_parity: "No multi-writer conflict resolution or split-brain semantics are claimed.",
failure_mode: "Active-active strategy selection is rejected as unsupported.",
caveat: "Active-active replication requires explicit conflict semantics before support.",
},
],
}
}
pub fn ensure_replication_strategy_supported(
&self,
strategy: &str,
) -> Result<(), RuntimeError> {
let report = self.replication_strategy_support_report();
if report.supported_strategies.contains(&strategy) {
Ok(())
} else {
Err(RuntimeError::UnsupportedReplicationStrategy(
strategy.to_string(),
))
}
}
}