use std::sync::Arc;
use std::time::Duration;
use kube::api::{Api, Patch, PatchParams};
use kube::runtime::controller::Action;
use kube::{Client, ResourceExt};
use serde_json::json;
use super::crd::{Function, FunctionStatus};
use super::{Error, Result};
const PENDING: &str = "Pending: the FaaS backend (functions API) is not yet available";
pub struct Ctx {
pub client: Client,
}
pub async fn reconcile(func: Arc<Function>, ctx: Arc<Ctx>) -> Result<Action> {
let ns = func.namespace().unwrap_or_else(|| "default".to_string());
let name = func.name_any();
let api: Api<Function> = Api::namespaced(ctx.client.clone(), &ns);
let status = json!({ "status": FunctionStatus { phase: Some(PENDING.to_string()) } });
api.patch_status(&name, &PatchParams::default(), &Patch::Merge(&status))
.await
.map_err(|e| Error::Other(format!("function status: {e}")))?;
tracing::debug!(function = %name, "function reconcile: awaiting FaaS backend");
Ok(Action::requeue(Duration::from_secs(3600)))
}