refactor the main structure

This commit is contained in:
2023-09-25 21:09:21 +02:00
parent 40385bbae2
commit 8b13c52b97
11 changed files with 57 additions and 68 deletions

9
src/api/error.rs Normal file
View File

@@ -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,
}

2
src/api/mod.rs Normal file
View File

@@ -0,0 +1,2 @@
pub mod error;
pub mod routes;

View File

@@ -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<Controller>,
params: web::Query<ConainerParams>) -> impl Responder {
@@ -56,45 +40,18 @@ async fn delete_container(controller: web::Data<Controller>,
}
}
#[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
}

View File

@@ -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 {
}

View File

@@ -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<Vec<Instance>> {
pub fn load_instances(&mut self) -> Result<Vec<Instance>> {
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<Vec<(String, i64)>> {
pub fn load_images(&mut self) -> Result<Vec<(String, i64)>> {
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()

View File

@@ -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<Container>)>,

8
src/database/instance.rs Normal file
View File

@@ -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,
}

3
src/database/mod.rs Normal file
View File

@@ -0,0 +1,3 @@
pub mod exposer;
pub mod instance;
pub(in crate::database) mod direct_access;

View File

@@ -1,3 +1,4 @@
pub mod container;
pub mod network;
pub mod starter;
mod bind;

18
src/deploy/starter.rs Normal file
View File

@@ -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;
}

View File

@@ -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;
}