use crate::error::KubeError;
use crate::kind::KubeResource;
use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ReconcileResult {
Done,
Requeue(Duration),
RequeueWithProgress(Duration),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub struct ReconcileRequest {
pub namespace: Option<String>,
pub name: String,
}
#[async_trait::async_trait]
pub trait Reconciler<R: KubeResource>: Send + Sync {
async fn reconcile(
&self,
req: &ReconcileRequest,
) -> Result<ReconcileResult, KubeError>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reconcile_request_round_trips_via_json() {
let r = ReconcileRequest {
namespace: Some("default".into()),
name: "my-pod".into(),
};
let s = serde_json::to_string(&r).unwrap();
let back: ReconcileRequest = serde_json::from_str(&s).unwrap();
assert_eq!(r, back);
}
#[test]
fn cluster_scoped_request_has_no_namespace() {
let r = ReconcileRequest { namespace: None, name: "my-crd".into() };
let s = serde_json::to_string(&r).unwrap();
assert!(s.contains("\"namespace\":null"));
}
#[test]
fn reconcile_result_variants() {
let _ = ReconcileResult::Done;
let _ = ReconcileResult::Requeue(Duration::from_secs(30));
let _ = ReconcileResult::RequeueWithProgress(Duration::from_secs(5));
}
}