mirror of
https://github.com/moghtech/komodo.git
synced 2025-12-05 19:17:36 -06: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
96 lines
2.4 KiB
Rust
96 lines
2.4 KiB
Rust
use anyhow::Context;
|
|
use async_timing_util::{
|
|
unix_timestamp_ms, wait_until_timelength, Timelength, ONE_DAY_MS,
|
|
};
|
|
use futures::future::join_all;
|
|
use mungos::{find::find_collect, mongodb::bson::doc};
|
|
use periphery_client::api::image::PruneImages;
|
|
|
|
use crate::{config::core_config, state::db_client};
|
|
|
|
use super::periphery_client;
|
|
|
|
pub fn spawn_prune_loop() {
|
|
tokio::spawn(async move {
|
|
loop {
|
|
wait_until_timelength(Timelength::OneDay, 5000).await;
|
|
let (images_res, stats_res, alerts_res) =
|
|
tokio::join!(prune_images(), prune_stats(), prune_alerts());
|
|
if let Err(e) = images_res {
|
|
error!("error in pruning images | {e:#}");
|
|
}
|
|
if let Err(e) = stats_res {
|
|
error!("error in pruning stats | {e:#}");
|
|
}
|
|
if let Err(e) = alerts_res {
|
|
error!("error in pruning alerts | {e:#}");
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
async fn prune_images() -> anyhow::Result<()> {
|
|
let futures = find_collect(&db_client().await.servers, None, None)
|
|
.await
|
|
.context("failed to get servers from db")?
|
|
.into_iter()
|
|
// This could be done in the mongo query, but rather have rust type system guarantee this.
|
|
.filter(|server| server.config.auto_prune)
|
|
.map(|server| async move {
|
|
(
|
|
async {
|
|
periphery_client(&server)?.request(PruneImages {}).await
|
|
}
|
|
.await,
|
|
server,
|
|
)
|
|
});
|
|
|
|
for (res, server) in join_all(futures).await {
|
|
if let Err(e) = res {
|
|
error!(
|
|
"failed to prune images on server {} ({}) | {e:#}",
|
|
server.name, server.id
|
|
)
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
async fn prune_stats() -> anyhow::Result<()> {
|
|
if core_config().keep_stats_for_days == 0 {
|
|
return Ok(());
|
|
}
|
|
let delete_before_ts = (unix_timestamp_ms()
|
|
- core_config().keep_stats_for_days as u128 * ONE_DAY_MS)
|
|
as i64;
|
|
let res = db_client()
|
|
.await
|
|
.stats
|
|
.delete_many(doc! {
|
|
"ts": { "$lt": delete_before_ts }
|
|
})
|
|
.await?;
|
|
info!("deleted {} stats from db", res.deleted_count);
|
|
Ok(())
|
|
}
|
|
|
|
async fn prune_alerts() -> anyhow::Result<()> {
|
|
if core_config().keep_alerts_for_days == 0 {
|
|
return Ok(());
|
|
}
|
|
let delete_before_ts = (unix_timestamp_ms()
|
|
- core_config().keep_alerts_for_days as u128 * ONE_DAY_MS)
|
|
as i64;
|
|
let res = db_client()
|
|
.await
|
|
.alerts
|
|
.delete_many(doc! {
|
|
"ts": { "$lt": delete_before_ts }
|
|
})
|
|
.await?;
|
|
info!("deleted {} alerts from db", res.deleted_count);
|
|
Ok(())
|
|
}
|