mirror of
https://github.com/moghtech/komodo.git
synced 2026-10-29 08:04:54 +00:00
* setup network page * add Network, Image, Container * Docker ListItems and Inspects * frontend build * dev0 * network info working * fix cargo lock * dev1 * pages for the things * implement Active in dashboard * RunBuild update trigger list refresh * rename deployment executions to StartDeployment etc * add server level container control * dev2 * add Config field to Image * can get image labels from Config.Labels * mount container page * server show resource count * add GetContainerLog api * add _AllContainers api * dev3 * move ResourceTarget to entities mod * GetResourceMatchingContainer api * connect container to resource * dev4 add volume names to container list items * ts types * volume / image / network unused management * add image history to image page * fix PruneContainers incorret Operation * update cache for server for server after server actions * dev5 * add singapore to Hetzner * implement delete single network / image / volume api * dev6 * include "in use" on Docker Lists * add docker resource delete buttons * is nice * fix volume all in use * remove google font dependency * use host networking in test compose * implement Secret Variables (hidden in logs) * remove unneeded borrow * interpolate variables / secrets into extra args / onclone / onpull / command etc * validate empty strings before SelectItem * rename everything to Komodo * rename workspace to komodo * rc1
85 lines
2.0 KiB
Rust
85 lines
2.0 KiB
Rust
use std::{collections::HashMap, hash::Hash};
|
|
|
|
use komodo_client::busy::Busy;
|
|
use tokio::sync::RwLock;
|
|
|
|
#[derive(Default)]
|
|
pub struct Cache<K: PartialEq + Eq + Hash, T: Clone + Default> {
|
|
cache: RwLock<HashMap<K, T>>,
|
|
}
|
|
|
|
impl<
|
|
K: PartialEq + Eq + Hash + std::fmt::Debug + Clone,
|
|
T: Clone + Default,
|
|
> Cache<K, T>
|
|
{
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn get(&self, key: &K) -> Option<T> {
|
|
self.cache.read().await.get(key).cloned()
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn get_or_insert_default(&self, key: &K) -> T {
|
|
let mut lock = self.cache.write().await;
|
|
match lock.get(key).cloned() {
|
|
Some(item) => item,
|
|
None => {
|
|
let item: T = Default::default();
|
|
lock.insert(key.clone(), item.clone());
|
|
item
|
|
}
|
|
}
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn get_list(&self) -> Vec<T> {
|
|
let cache = self.cache.read().await;
|
|
cache.iter().map(|(_, e)| e.clone()).collect()
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn insert<Key>(&self, key: Key, val: T)
|
|
where
|
|
T: std::fmt::Debug,
|
|
Key: Into<K> + std::fmt::Debug,
|
|
{
|
|
self.cache.write().await.insert(key.into(), val);
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self, handler))]
|
|
pub async fn update_entry<Key>(
|
|
&self,
|
|
key: Key,
|
|
handler: impl Fn(&mut T),
|
|
) where
|
|
Key: Into<K> + std::fmt::Debug,
|
|
{
|
|
let mut cache = self.cache.write().await;
|
|
handler(cache.entry(key.into()).or_default());
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn clear(&self) {
|
|
self.cache.write().await.clear();
|
|
}
|
|
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn remove(&self, key: &K) {
|
|
self.cache.write().await.remove(key);
|
|
}
|
|
}
|
|
|
|
impl<
|
|
K: PartialEq + Eq + Hash + std::fmt::Debug + Clone,
|
|
T: Clone + Default + Busy,
|
|
> Cache<K, T>
|
|
{
|
|
#[instrument(level = "debug", skip(self))]
|
|
pub async fn busy(&self, id: &K) -> bool {
|
|
match self.get(id).await {
|
|
Some(state) => state.busy(),
|
|
None => false,
|
|
}
|
|
}
|
|
}
|