aboutsummaryrefslogtreecommitdiffstats
path: root/zoned/src
diff options
context:
space:
mode:
Diffstat (limited to 'zoned/src')
-rw-r--r--zoned/src/api.rs81
-rw-r--r--zoned/src/lib.rs103
-rw-r--r--zoned/src/main.rs4
3 files changed, 86 insertions, 102 deletions
diff --git a/zoned/src/api.rs b/zoned/src/api.rs
new file mode 100644
index 0000000..c77e639
--- /dev/null
+++ b/zoned/src/api.rs
@@ -0,0 +1,81 @@
+use rocket::{get, post, serde::json::Json, Build, Rocket, State};
+use rocket_okapi::{
+ openapi, openapi_get_routes,
+ rapidoc::{make_rapidoc, GeneralConfig, HideShowConfig, RapiDocConfig},
+ settings::UrlObject,
+ swagger_ui::{make_swagger_ui, SwaggerUIConfig},
+};
+use zone_core::{Container, PartialEqOrDefault};
+
+/// # 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.
+#[openapi(tag = "Container")]
+#[get("/container/list?<container..>")]
+pub fn container_list(container: Container) -> Json<Vec<Container>> {
+ zone_nspawn::get_containers()
+ .iter()
+ .filter(|c| container.eq_or_default(c))
+ .cloned()
+ .collect::<Vec<Container>>()
+ .into()
+}
+
+/// Create container
+#[openapi(tag = "Container")]
+#[post("/container", data = "<container>")]
+fn create_container(
+ container: Json<Container>,
+ zfs_config: &State<zone_zfs::Config>,
+) -> Json<Container> {
+ let container = zone_zfs::create_file_system(
+ container.template.clone(),
+ format!("{}-{}", container.user, container.id),
+ zfs_config,
+ );
+
+ match container {
+ Ok(c) => Json(c.into()),
+ Err(_err) => todo!("Respond with error message"),
+ }
+}
+
+pub fn build_rocket(config: crate::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 {
+ url: "../openapi.json".to_owned(),
+ ..Default::default()
+ }),
+ )
+ .mount(
+ "/rapidoc/",
+ make_rapidoc(&RapiDocConfig {
+ general: GeneralConfig {
+ spec_urls: vec![UrlObject::new("General", "../openapi.json")],
+ ..Default::default()
+ },
+ hide_show: HideShowConfig {
+ allow_spec_url_load: false,
+ allow_spec_file_load: false,
+ ..Default::default()
+ },
+ ..Default::default()
+ }),
+ )
+ .manage(config.zfs_config)
+}
diff --git a/zoned/src/lib.rs b/zoned/src/lib.rs
index f8c78db..f17530f 100644
--- a/zoned/src/lib.rs
+++ b/zoned/src/lib.rs
@@ -1,107 +1,10 @@
-use figment::Provider;
-use rocket::{get, post, serde::json::Json, Build, Rocket, State};
-use rocket_okapi::{
- openapi, openapi_get_routes,
- rapidoc::{make_rapidoc, GeneralConfig, HideShowConfig, RapiDocConfig},
- settings::UrlObject,
- swagger_ui::{make_swagger_ui, SwaggerUIConfig},
-};
use serde::{Deserialize, Serialize};
-use zone_core::{Container, PartialEqOrDefault};
#[derive(Default, Serialize, Deserialize)]
pub struct Config {
- pub rocket_config: rocket::Config,
+ pub(crate) rocket_config: rocket::Config,
- pub zfs_config: zone_zfs::Config,
+ pub(crate) zfs_config: zone_zfs::Config,
}
-impl Config {
- 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, figment::Error> {
- Ok(Config {
- 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.
-#[openapi(tag = "Container")]
-#[get("/container/list?<container..>")]
-pub fn container_list(container: Container) -> Json<Vec<Container>> {
- zone_nspawn::get_containers()
- .iter()
- .filter(|c| container.eq_or_default(c))
- .cloned()
- .collect::<Vec<Container>>()
- .into()
-}
-
-/// # Create container
-#[openapi(tag = "Container")]
-#[post("/container", data = "<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),
- zfs_config,
- );
-
- match container {
- Ok(c) => Json(c.into()),
- Err(_err) => todo!("Respond with error message"),
- }
-}
-
-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 {
- url: "../openapi.json".to_owned(),
- ..Default::default()
- }),
- )
- .mount(
- "/rapidoc/",
- make_rapidoc(&RapiDocConfig {
- general: GeneralConfig {
- spec_urls: vec![UrlObject::new("General", "../openapi.json")],
- ..Default::default()
- },
- hide_show: HideShowConfig {
- allow_spec_url_load: false,
- allow_spec_file_load: false,
- ..Default::default()
- },
- ..Default::default()
- }),
- )
- .manage(config.zfs_config)
-}
+pub mod api;
diff --git a/zoned/src/main.rs b/zoned/src/main.rs
index 2ed1bb1..5ca2862 100644
--- a/zoned/src/main.rs
+++ b/zoned/src/main.rs
@@ -2,7 +2,7 @@ use figment::{
providers::{Env, Format, Serialized, Toml},
Figment,
};
-use zoned::Config;
+use zoned::{api, Config};
#[rocket::main]
async fn main() {
@@ -12,7 +12,7 @@ async fn main() {
.extract()
.expect("Failed to parse config");
- match zoned::build_rocket(config).launch().await {
+ match api::build_rocket(config).launch().await {
Ok(()) => println!("Rocket shut down gracefully."),
Err(err) => eprintln!("Rocket had an error: {}", err),
};