use std::collections::HashMap;
use kube::core::DynamicObject;
pub enum Msg {
Reset {
generation: u64,
},
Applied {
generation: u64,
key: String,
obj: Box<DynamicObject>,
},
Deleted {
generation: u64,
key: String,
},
Synced {
generation: u64,
},
LogLines {
generation: u64,
lines: Vec<String>,
},
Metrics {
generation: u64,
data: HashMap<String, (i64, i64)>,
},
PulseData {
generation: u64,
data: Pulse,
},
XrayData {
generation: u64,
items: Vec<XrayItem>,
},
Detail {
generation: u64,
title: String,
lines: Vec<String>,
warn: Option<String>,
},
Events {
generation: u64,
title: String,
lines: Vec<String>,
},
LogsSaved {
generation: u64,
result: Result<std::path::PathBuf, String>,
},
ClipboardCopied {
generation: u64,
copied: bool,
success: String,
failure: String,
},
Namespaces {
generation: u64,
list: Vec<String>,
},
Contexts {
generation: u64,
list: Vec<String>,
},
ContextSwitched {
generation: u64,
name: String,
result: Result<Box<crate::k8s::Cluster>, String>,
},
Rbac {
generation: u64,
ns: String,
allowed: std::collections::HashSet<String>,
},
Error {
generation: u64,
error: String,
},
}
#[derive(Clone, Default)]
pub struct Pulse {
pub nodes_ready: usize,
pub nodes_total: usize,
pub pods_running: usize,
pub pods_pending: usize,
pub pods_failed: usize,
pub pods_succeeded: usize,
pub pods_total: usize,
pub deploys_ready: usize,
pub deploys_total: usize,
pub sts_ready: usize,
pub sts_total: usize,
pub ds_ready: usize,
pub ds_total: usize,
pub jobs_total: usize,
pub pvc_bound: usize,
pub pvc_total: usize,
}
#[derive(Clone)]
pub struct XrayItem {
pub depth: usize,
pub kind: String,
pub name: String,
pub ns: String,
pub status: String,
pub container: Option<String>,
}
pub fn row_key(obj: &DynamicObject) -> String {
match (&obj.metadata.namespace, &obj.metadata.name) {
(Some(ns), Some(name)) => format!("{ns}/{name}"),
(None, Some(name)) => name.clone(),
_ => obj
.metadata
.uid
.clone()
.unwrap_or_else(|| "<unknown>".into()),
}
}
#[derive(Default)]
pub struct Store {
items: HashMap<String, DynamicObject>,
pub synced: bool,
}
impl Store {
pub fn clear(&mut self) {
self.items.clear();
self.synced = false;
}
pub fn apply(&mut self, key: String, obj: DynamicObject) {
self.items.insert(key, obj);
}
pub fn remove(&mut self, key: &str) {
self.items.remove(key);
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn get(&self, key: &str) -> Option<&DynamicObject> {
self.items.get(key)
}
pub fn iter(&self) -> impl Iterator<Item = (&String, &DynamicObject)> {
self.items.iter()
}
}