use crate::constants::requeue; use crate::error::ReconciliationError; use crate::test_controller::context::{new_context, Context}; use crate::test_controller::reconcile::reconcile; use futures::StreamExt; use kube_runtime::controller::Action as RequeueAction; use kube_runtime::{controller, watcher, Controller}; use log::{debug, error}; use std::sync::Arc; use testsys_model::Test; mod action; mod context; mod reconcile; pub(super) async fn run_test_controller(client: kube::Client) { let context = new_context(client); Controller::new(context.api().clone(), watcher::Config::default()) .run(reconcile, handle_reconciliation_error, context) .for_each(|reconciliation_result| async move { if let Err(reconciliation_err) = reconciliation_result { match &reconciliation_err { controller::Error::ObjectNotFound { .. } => { debug!("Object is gone: {}", reconciliation_err) } _ => error!("Error during reconciliation: {}", reconciliation_err), } } }) .await; } /// `handle_reconciliation_error` is called when `reconcile` returns an error. fn handle_reconciliation_error(_: Arc, e: &ReconciliationError, _: Context) -> RequeueAction { error!("Reconciliation error: {}", e); requeue() }