adding container to pool automatically

This commit is contained in:
mii443
2024-10-10 10:18:30 +00:00
parent c188b4ecb5
commit 168cf39aa0
4 changed files with 59 additions and 18 deletions

View File

@ -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<Mutex<Vec<Container>>>,
@ -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();
}
}
}
}

View File

@ -26,6 +26,7 @@ pub async fn docker_ps() -> Vec<ContainerSummary> {
let docker = Docker::connect_with_local_defaults().unwrap();
let options = ListContainersOptions::<String> {
all: true,
..Default::default()
};

View File

@ -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();

View File

@ -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()