1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
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()
.into_iter()
.map(|c| {
c.try_into()
.unwrap_or_else(|_err| todo!("Log this error and return `Container::default()`"))
})
.filter(|c| container.eq_or_default(c))
.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(f) => Json(Container::try_from(f).expect("failed to convert")),
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)
}
|