use std::collections::{HashMap, HashSet, VecDeque};
use super::host_state::ViewMode;
use crate::containers::{ContainerInspect, ContainerRuntime};
#[derive(Debug, Clone)]
pub struct RefreshQueueItem {
pub alias: String,
pub askpass: Option<String>,
pub cached_runtime: Option<ContainerRuntime>,
pub has_tunnel: bool,
}
#[derive(Debug, Default)]
pub struct RefreshBatch {
pub queue: VecDeque<RefreshQueueItem>,
pub in_flight: usize,
pub total: usize,
pub completed: usize,
pub in_flight_aliases: HashSet<String>,
}
pub const REFRESH_MAX_PARALLEL: usize = 4;
#[derive(Debug, Clone)]
pub struct ContainerExecRequest {
pub alias: String,
pub askpass: Option<String>,
pub runtime: ContainerRuntime,
pub container_id: String,
pub container_name: String,
pub command: Option<String>,
}
#[derive(Debug, Clone)]
pub struct ContainerLogsRequest {
pub alias: String,
pub askpass: Option<String>,
pub runtime: ContainerRuntime,
pub container_id: String,
pub container_name: String,
}
#[derive(Debug, Clone)]
pub struct ContainerActionRequest {
pub alias: String,
pub askpass: Option<String>,
pub runtime: ContainerRuntime,
pub container_id: String,
pub container_name: String,
pub action: crate::containers::ContainerAction,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ContainersSortMode {
#[default]
AlphaHost,
AlphaContainer,
}
impl ContainersSortMode {
pub fn next(self) -> Self {
match self {
ContainersSortMode::AlphaHost => ContainersSortMode::AlphaContainer,
ContainersSortMode::AlphaContainer => ContainersSortMode::AlphaHost,
}
}
pub fn label(self) -> &'static str {
match self {
ContainersSortMode::AlphaHost => "A-Z host",
ContainersSortMode::AlphaContainer => "A-Z container",
}
}
pub fn to_key(self) -> &'static str {
match self {
ContainersSortMode::AlphaHost => "alpha_host",
ContainersSortMode::AlphaContainer => "alpha_container",
}
}
pub fn from_key(s: &str) -> Self {
match s {
"alpha_container" => ContainersSortMode::AlphaContainer,
_ => ContainersSortMode::AlphaHost,
}
}
}
#[derive(Debug, Clone)]
pub struct InspectCacheEntry {
pub timestamp: u64,
pub result: Result<ContainerInspect, String>,
}
#[derive(Debug, Default)]
pub struct InspectCache {
pub entries: HashMap<String, InspectCacheEntry>,
pub in_flight: HashSet<String>,
}
#[derive(Debug, Clone)]
pub struct LogsCacheEntry {
pub timestamp: u64,
pub result: Result<Vec<String>, String>,
}
#[derive(Debug, Default)]
pub struct LogsCache {
pub entries: HashMap<String, LogsCacheEntry>,
pub in_flight: HashSet<String>,
}
pub const INSPECT_CACHE_TTL_SECS: u64 = 30;
pub const LOGS_CACHE_TTL_SECS: u64 = 30;
pub const LOGS_TAIL: usize = 50;
pub const LIST_CACHE_TTL_SECS: u64 = 30;
#[derive(Debug)]
pub struct ContainersOverviewState {
pub sort_mode: ContainersSortMode,
pub inspect_cache: InspectCache,
pub logs_cache: LogsCache,
pub refresh_batch: Option<RefreshBatch>,
pub auto_list_in_flight: HashSet<String>,
pub view_mode: ViewMode,
pub collapsed_hosts: HashSet<String>,
pub view_cache:
std::cell::RefCell<Option<(u64, Vec<crate::ui::containers_overview::ContainerListItem>)>>,
}
impl Default for ContainersOverviewState {
fn default() -> Self {
Self {
sort_mode: ContainersSortMode::default(),
inspect_cache: InspectCache::default(),
logs_cache: LogsCache::default(),
refresh_batch: None,
auto_list_in_flight: HashSet::new(),
view_mode: ViewMode::Detailed,
collapsed_hosts: HashSet::new(),
view_cache: std::cell::RefCell::new(None),
}
}
}
impl InspectCache {
pub fn fresh(&self, container_id: &str, now: u64) -> Option<&InspectCacheEntry> {
self.entries
.get(container_id)
.filter(|e| now.saturating_sub(e.timestamp) < INSPECT_CACHE_TTL_SECS)
}
}
impl LogsCache {
pub fn fresh(&self, container_id: &str, now: u64) -> Option<&LogsCacheEntry> {
self.entries
.get(container_id)
.filter(|e| now.saturating_sub(e.timestamp) < LOGS_CACHE_TTL_SECS)
}
}