use crate::{Config, Error, Result}; 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; use zone_nspawn::NSpawn; /// # Test endpoint /// /// Returns a list of containers based on the query. #[openapi(tag = "Testing")] #[get("/test")] pub fn test_endpoint(zfs: &State) -> Json { Json(zfs.config.pool_name.to_owned()) } /// List containers /// /// Returns a list of containers based on the query. #[openapi(tag = "Container")] #[get("/container/list?")] pub fn container_list(container: Container) -> Result>> { NSpawn::get_containers() .map(|v| container.filter_from(v)) .map(Json::from) .map_err(Error::from) } /// Create container /// /// Creates a new container volume from the provided container json data #[openapi(tag = "Container")] #[post("/container", data = "")] fn clone_container( container: Json, zfs: &State, ) -> Result> { zfs.clone_from_latest( format!("{}-{}", container.user, container.id).into(), container.template.to_owned().into(), )? .try_into() .map_err(Error::from) .map(Container::into) } pub fn build_rocket(config: &Config) -> Result> { let nspawn = zone_nspawn::NSpawn::custom(&config.nspawn_config).map_err(Error::from)?; let zfs = zone_zfs::ZFS::custom(&config.zfs_config).map_err(Error::from)?; Ok(rocket::custom(&config.rocket_config) .mount( "/", openapi_get_routes![test_endpoint, container_list, clone_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(nspawn) .manage(zfs)) }