From 168cf39aa029c6845432baf201536a6fdf2318f2 Mon Sep 17 00:00:00 2001 From: mii443 Date: Thu, 10 Oct 2024 10:18:30 +0000 Subject: [PATCH] adding container to pool automatically --- src/container_pool.rs | 56 +++++++++++++++++++++++++++++++++++++++---- src/docker.rs | 1 + src/event_handler.rs | 12 ++-------- src/main.rs | 8 ++++--- 4 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/container_pool.rs b/src/container_pool.rs index 37145d2..b1388ab 100644 --- a/src/container_pool.rs +++ b/src/container_pool.rs @@ -1,8 +1,15 @@ use std::sync::Arc; +use bollard::{ + container::{RemoveContainerOptions, StopContainerOptions}, + Docker, +}; use tokio::sync::Mutex; -use crate::{docker::Container, language::Language}; +use crate::{ + docker::{docker_ps, Container}, + language::Language, +}; pub struct ContainerPool { pub containers: Arc>>, @@ -25,6 +32,12 @@ impl ContainerPool { } }) { println!("Using container from pool"); + let container_pool = self.containers.clone(); + tokio::spawn(async move { + let container = Container::from_language(language).await; + container_pool.lock().await.push(container); + println!("Added contaienr to pool"); + }); let container = pool[i].clone(); pool.remove(i); container @@ -34,9 +47,42 @@ impl ContainerPool { } pub async fn add_container(&mut self, language: Language) { - self.containers - .lock() - .await - .push(Container::from_language(language).await); + println!("Adding container to pool... {}", language.image); + let container = Container::from_language(language).await; + self.containers.lock().await.push(container); + } + + pub async fn cleanup(&mut self) { + let docker = Docker::connect_with_local_defaults().unwrap(); + + let containers = docker_ps().await; + println!("{}", containers.len()); + for container in &containers { + if container + .names + .clone() + .unwrap_or_default() + .iter() + .find(|name| name.starts_with("/dockerbot-")) + .is_some() + { + println!("Stopping {}", container.id.clone().unwrap()); + let id = container.id.clone().unwrap(); + docker + .stop_container(&id, Some(StopContainerOptions { t: 5 })) + .await + .unwrap(); + docker + .remove_container( + &id, + Some(RemoveContainerOptions { + force: true, + ..Default::default() + }), + ) + .await + .unwrap(); + } + } } } diff --git a/src/docker.rs b/src/docker.rs index f220be6..bd7b03e 100644 --- a/src/docker.rs +++ b/src/docker.rs @@ -26,6 +26,7 @@ pub async fn docker_ps() -> Vec { let docker = Docker::connect_with_local_defaults().unwrap(); let options = ListContainersOptions:: { + all: true, ..Default::default() }; diff --git a/src/event_handler.rs b/src/event_handler.rs index 7754abb..a5f31c8 100644 --- a/src/event_handler.rs +++ b/src/event_handler.rs @@ -44,22 +44,14 @@ async fn on_message(ctx: &serenity::Context, data: &Data, new_message: &Message) let language = config.get_language(&String::from(language)); if let Some(language) = language { - let mut message = new_message - .reply(&ctx.http, format!("Creating {} container.", language.name)) - .await - .unwrap(); - let container = { let mut pool = data.container_pool.lock().await; pool.get_container(language.clone()).await }; let file_name = format!("{}.{}", container.name, language.extension.clone()); - message - .edit( - &ctx.http, - EditMessage::new().content(format!("Created: {}", container.id)), - ) + let mut message = new_message + .reply(&ctx.http, format!("Container created: {}", container.id)) .await .unwrap(); diff --git a/src/main.rs b/src/main.rs index bf92ad9..0cd7a5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -51,9 +51,11 @@ async fn main() -> Result<(), ()> { serenity::GatewayIntents::non_privileged() | serenity::GatewayIntents::MESSAGE_CONTENT; let mut pool = ContainerPool::new(); - for _ in 0..10 { - pool.add_container(config.get_language(&"Ruby".to_string()).unwrap()) - .await; + pool.cleanup().await; + for _ in 0..3 { + for language in &config.languages { + pool.add_container(language.clone()).await; + } } let framework = poise::Framework::builder()