From 8b13c52b97a31c0a822a5b092076420f54eb720d Mon Sep 17 00:00:00 2001 From: groche97 Date: Mon, 25 Sep 2023 21:09:21 +0200 Subject: [PATCH] refactor the main structure --- src/api/error.rs | 9 ++++ src/api/mod.rs | 2 + src/{server.rs => api/routes.rs} | 53 ++----------------- src/controller/mod.rs | 5 +- .../mod.rs => database/direct_access.rs} | 16 ++---- src/{conf/storage.rs => database/exposer.rs} | 4 +- src/database/instance.rs | 8 +++ src/database/mod.rs | 3 ++ src/deploy/mod.rs | 1 + src/deploy/starter.rs | 18 +++++++ src/main.rs | 6 +-- 11 files changed, 57 insertions(+), 68 deletions(-) create mode 100644 src/api/error.rs create mode 100644 src/api/mod.rs rename src/{server.rs => api/routes.rs} (55%) rename src/{conf/mod.rs => database/direct_access.rs} (93%) rename src/{conf/storage.rs => database/exposer.rs} (96%) create mode 100644 src/database/instance.rs create mode 100644 src/database/mod.rs create mode 100644 src/deploy/starter.rs diff --git a/src/api/error.rs b/src/api/error.rs new file mode 100644 index 0000000..29bba73 --- /dev/null +++ b/src/api/error.rs @@ -0,0 +1,9 @@ +use derive_more::{Display, Error}; + +impl actix_web::error::ResponseError for ReturnedError{} + +#[derive(Debug, Display, Error)] +#[display(fmt = "my error: {}", name)] +pub struct ReturnedError { + pub name: String, +} diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 0000000..e1f10f7 --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,2 @@ +pub mod error; +pub mod routes; diff --git a/src/server.rs b/src/api/routes.rs similarity index 55% rename from src/server.rs rename to src/api/routes.rs index 479dcc9..ddd6db4 100644 --- a/src/server.rs +++ b/src/api/routes.rs @@ -1,19 +1,8 @@ -use actix_web::{get, patch, post, put, delete, web, App, HttpResponse, HttpServer, Responder}; -use bollard::Docker; -use derive_more::{Display, Error}; -use log::info; -use serde::Deserialize; -use env_logger; - +use actix_web::{patch, put, delete, web, App, HttpServer, Responder}; +use crate::api::error::ReturnedError; use crate::controller::Controller; - -#[derive(Debug, Display, Error)] -#[display(fmt = "my error: {}", name)] -pub struct ReturnedError { - name: String, -} - -impl actix_web::error::ResponseError for ReturnedError{} +use crate::deploy::starter; +use serde::Deserialize; #[derive(Debug, Deserialize)] struct ConainerParams { @@ -27,11 +16,6 @@ struct ConainerStopParams { name: String, } -#[get("/")] -async fn hello() -> impl Responder { - HttpResponse::Ok().body("Hello world!") -} - #[put("/container")] async fn create_container(controller: web::Data, params: web::Query) -> impl Responder { @@ -56,45 +40,18 @@ async fn delete_container(controller: web::Data, } } -#[post("/echo")] -async fn echo(req_body: String) -> impl Responder { - HttpResponse::Ok().body(req_body) -} - -async fn manual_hello() -> impl Responder { - HttpResponse::Ok().body("Hey there!") -} - pub async fn start() -> std::io::Result<()> { - let docker = match Docker::connect_with_local_defaults() { - Ok(d) => d, - Err(e) => panic!("error:{}",e.to_string()), - }; - env_logger::init_from_env(env_logger::Env::new().default_filter_or("debug")); - let controller = match Controller::new(docker, - "customnetwork".to_string(), - "172.20.0.0/24".to_string()).await { - Ok(c) => c, - Err(e) => panic!("error: {}",e), - }; - controller.load_all_instances().await; + let controller = starter::start_docker().await; let data = web::Data::new(controller); HttpServer::new(move || { App::new() .wrap(actix_web::middleware::Logger::default()) .app_data(data.clone()) - .service(hello) .service(create_container) .service(stop_container) .service(delete_container) - .service(echo) - .route("/hey", web::get().to(manual_hello)) }) .bind(("127.0.0.1", 8080))? .run() .await } - - - - diff --git a/src/controller/mod.rs b/src/controller/mod.rs index 42179aa..d07a69a 100644 --- a/src/controller/mod.rs +++ b/src/controller/mod.rs @@ -2,8 +2,8 @@ use bollard::Docker; use bollard::errors::Error; use crate::deploy; use crate::deploy::container::Container; -use crate::conf::storage::MemStorage; -use crate::conf::Instance; +use crate::database::exposer::MemStorage; +use crate::database::instance::Instance; use std::sync::Mutex; use log::error; @@ -140,3 +140,4 @@ impl Controller { } + diff --git a/src/conf/mod.rs b/src/database/direct_access.rs similarity index 93% rename from src/conf/mod.rs rename to src/database/direct_access.rs index cf023d0..985bfac 100644 --- a/src/conf/mod.rs +++ b/src/database/direct_access.rs @@ -1,7 +1,6 @@ use rusqlite::{Connection, Result}; use fallible_iterator::FallibleIterator; - -pub mod storage; +use crate::database::instance::Instance; const PATH: &str = "mdeploy.db"; @@ -12,15 +11,6 @@ pub struct ConfServer{ ip_base_limit: u8, } -#[derive(Clone)] -pub struct Instance { - id: i64, - pub docker_id: String, - pub ip: String, - pub domain: String, - pub image: i64, -} - pub struct InstanceStorage { con: Connection, } @@ -57,7 +47,7 @@ impl InstanceStorage { Ok(()) } - fn load_instances(&mut self) -> Result> { + pub fn load_instances(&mut self) -> Result> { let mut stmt = self.con.prepare("select id, docker_id, ip, domain, image from l_instances")?; let mut rows = stmt.query([])?; rows.map(|r| Ok(Instance{ @@ -69,7 +59,7 @@ impl InstanceStorage { })).collect() } - fn load_images(&mut self) -> Result> { + pub fn load_images(&mut self) -> Result> { let mut stmt = self.con.prepare("select id, name from images")?; let mut rows = stmt.query([])?; rows.map(|row| Ok((row.get::<_, String>(1)?, row.get::<_, i64>(0)?))).collect() diff --git a/src/conf/storage.rs b/src/database/exposer.rs similarity index 96% rename from src/conf/storage.rs rename to src/database/exposer.rs index 9f1bfe1..b991aca 100644 --- a/src/conf/storage.rs +++ b/src/database/exposer.rs @@ -1,8 +1,8 @@ use std::collections::hash_map::HashMap; use rusqlite::Error; use crate::deploy::container::Container; -use crate::conf::InstanceStorage; -use crate::conf::Instance; +use crate::database::direct_access::InstanceStorage; +use crate::database::instance::Instance; pub struct MemStorage { containers: Vec<(Instance, Option)>, diff --git a/src/database/instance.rs b/src/database/instance.rs new file mode 100644 index 0000000..4010f86 --- /dev/null +++ b/src/database/instance.rs @@ -0,0 +1,8 @@ +#[derive(Clone)] +pub struct Instance { + pub id: i64, + pub docker_id: String, + pub ip: String, + pub domain: String, + pub image: i64, +} diff --git a/src/database/mod.rs b/src/database/mod.rs new file mode 100644 index 0000000..6b19e83 --- /dev/null +++ b/src/database/mod.rs @@ -0,0 +1,3 @@ +pub mod exposer; +pub mod instance; +pub(in crate::database) mod direct_access; diff --git a/src/deploy/mod.rs b/src/deploy/mod.rs index d1994d8..3009e85 100644 --- a/src/deploy/mod.rs +++ b/src/deploy/mod.rs @@ -1,3 +1,4 @@ pub mod container; pub mod network; +pub mod starter; mod bind; diff --git a/src/deploy/starter.rs b/src/deploy/starter.rs new file mode 100644 index 0000000..4430953 --- /dev/null +++ b/src/deploy/starter.rs @@ -0,0 +1,18 @@ +use bollard::Docker; +use crate::controller::Controller; + +pub async fn start_docker() -> Controller{ + let docker = match Docker::connect_with_local_defaults() { + Ok(d) => d, + Err(e) => panic!("error:{}",e.to_string()), + }; + env_logger::init_from_env(env_logger::Env::new().default_filter_or("debug")); + let controller = match Controller::new(docker, + "customnetwork".to_string(), + "172.20.0.0/24".to_string()).await { + Ok(c) => c, + Err(e) => panic!("error: {}",e), + }; + controller.load_all_instances().await; + return controller; +} diff --git a/src/main.rs b/src/main.rs index 4db9a6f..da66080 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,9 @@ mod deploy; -mod server; -mod conf; +mod api; +mod database; mod controller; #[actix_web::main] async fn main() { - server::start().await; + api::routes::start().await; }