mod client;
pub use client::REPORTER;
pub(crate) use client::{kubeconfig_present, mode_for as client_mode};
mod memory;
use std::collections::BTreeMap;
use futures::future::BoxFuture;
use futures::stream::BoxStream;
use k8s_openapi::jiff::Timestamp;
pub use client::KubeClientApi;
pub use memory::MemoryKubeApi;
use crate::error::KubeError;
pub type ApiFuture<'a, T> = BoxFuture<'a, Result<T, KubeError>>;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct LeaseRecord {
pub holder: Option<String>,
pub lease_duration_secs: i32,
pub acquire_time: Option<Timestamp>,
pub renew_time: Option<Timestamp>,
pub transitions: u32,
pub resource_version: Option<String>,
}
impl LeaseRecord {
#[must_use]
pub fn held_by(&self, identity: &str) -> bool {
self.holder.as_deref() == Some(identity)
}
#[must_use]
pub fn is_free(&self) -> bool {
self.holder.as_deref().is_none_or(str::is_empty)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ConfigMapEvent {
Applied(BTreeMap<String, String>),
Deleted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EventKind {
Normal,
Warning,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PodEvent {
pub kind: EventKind,
pub reason: String,
pub action: String,
pub note: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PodRef {
pub namespace: String,
pub name: String,
pub uid: Option<String>,
}
pub trait KubeApi: Send + Sync + 'static {
fn server_version(&self) -> ApiFuture<'_, String>;
fn get_lease<'a>(
&'a self,
namespace: &'a str,
name: &'a str,
) -> ApiFuture<'a, Option<LeaseRecord>>;
fn create_lease<'a>(
&'a self,
namespace: &'a str,
name: &'a str,
record: &'a LeaseRecord,
) -> ApiFuture<'a, LeaseRecord>;
fn replace_lease<'a>(
&'a self,
namespace: &'a str,
name: &'a str,
record: &'a LeaseRecord,
) -> ApiFuture<'a, LeaseRecord>;
fn watch_config_map(
&self,
namespace: &str,
name: &str,
) -> BoxStream<'static, Result<ConfigMapEvent, KubeError>>;
fn publish_event<'a>(&'a self, pod: &'a PodRef, event: &'a PodEvent) -> ApiFuture<'a, ()>;
fn default_namespace(&self) -> String;
fn client(&self) -> Option<kube::Client> {
None
}
}