diff options
Diffstat (limited to 'zoned/src')
-rw-r--r-- | zoned/src/lib.rs | 41 | ||||
-rw-r--r-- | zoned/src/main.rs | 8 |
2 files changed, 34 insertions, 15 deletions
diff --git a/zoned/src/lib.rs b/zoned/src/lib.rs index dd35657..f8c78db 100644 --- a/zoned/src/lib.rs +++ b/zoned/src/lib.rs @@ -1,4 +1,4 @@ -use figment::{Error, Provider, Figment}; +use figment::Provider; use rocket::{get, post, serde::json::Json, Build, Rocket, State}; use rocket_okapi::{ openapi, openapi_get_routes, @@ -6,31 +6,41 @@ use rocket_okapi::{ settings::UrlObject, swagger_ui::{make_swagger_ui, SwaggerUIConfig}, }; -use serde::Serialize; +use serde::{Deserialize, Serialize}; use zone_core::{Container, PartialEqOrDefault}; -#[derive(Default, Serialize)] +#[derive(Default, Serialize, Deserialize)] pub struct Config { - pub zfs_config: zone_zfs::Config, pub rocket_config: rocket::Config, + + pub zfs_config: zone_zfs::Config, } impl Config { - pub fn new() -> Result<Config, Error> { + pub fn new() -> Result<Config, figment::Error> { Config::custom(zone_zfs::Config::figment(), rocket::Config::figment()) } pub fn custom<T: Provider, U: Provider>( zfs_provider: T, rocket_provider: U, - ) -> Result<Config, Error> { + ) -> Result<Config, figment::Error> { Ok(Config { - zfs_config: zone_zfs::Config::from(&zfs_provider)?, rocket_config: rocket::Config::from(&rocket_provider), + zfs_config: zone_zfs::Config::from(&zfs_provider)?, }) } } +/// # Test endpoint +/// +/// Returns a list of containers based on the query. +#[openapi(tag = "Testing")] +#[get("/test")] +pub fn test_endpoint(zfs_config: &State<zone_zfs::Config>) -> Json<String> { + Json(zfs_config.quota.to_owned()) +} + /// # List containers /// /// Returns a list of containers based on the query. @@ -48,12 +58,15 @@ pub fn container_list(container: Container) -> Json<Vec<Container>> { /// # Create container #[openapi(tag = "Container")] #[post("/container", data = "<container>")] -fn create_container(container: Json<Container>, config: &State<Config>) -> Json<Container> { +fn create_container( + container: Json<Container>, + zfs_config: &State<zone_zfs::Config>, +) -> Json<Container> { // let zone_config = ZoneConf::new().unwrap(); let container = zone_zfs::create_file_system( container.template.clone(), format!("{}-{}", container.user, container.id), - &config.zfs_config, + zfs_config, ); match container { @@ -62,9 +75,12 @@ fn create_container(container: Json<Container>, config: &State<Config>) -> Json< } } -pub fn build_rocket(config: Figment) -> Rocket<Build> { - rocket::custom(config) - .mount("/", openapi_get_routes![container_list, create_container,]) +pub fn build_rocket(config: Config) -> Rocket<Build> { + rocket::custom(config.rocket_config) + .mount( + "/", + openapi_get_routes![test_endpoint, container_list, create_container,], + ) .mount( "/swagger-ui/", make_swagger_ui(&SwaggerUIConfig { @@ -87,4 +103,5 @@ pub fn build_rocket(config: Figment) -> Rocket<Build> { ..Default::default() }), ) + .manage(config.zfs_config) } diff --git a/zoned/src/main.rs b/zoned/src/main.rs index 173a8b2..2ed1bb1 100644 --- a/zoned/src/main.rs +++ b/zoned/src/main.rs @@ -6,9 +6,11 @@ use zoned::Config; #[rocket::main] async fn main() { - let config = Figment::from(Serialized::defaults(Config::default())) - .merge(Toml::file("/etc/zoned/Config.toml")) - .merge(Env::prefixed("ZONED_")); + let config: Config = Figment::from(Serialized::defaults(Config::default())) + .merge(Toml::file(Env::var_or("ZONED_CONFIG", "/etc/zoned/Config.toml")).nested()) + .merge(Env::prefixed("ZONED_")) + .extract() + .expect("Failed to parse config"); match zoned::build_rocket(config).launch().await { Ok(()) => println!("Rocket shut down gracefully."), |