use crate::model::{EstimatedInventory, Inventory};
use rocket::State;
use rocket::{get, serde::json::Json};
use rocket_okapi::{openapi, openapi_get_routes, swagger_ui::*};
pub struct Config {
pub boavizta_url: String,
}
pub async fn run(config: Config) -> Result<(), rocket::Error> {
let _rocket = rocket::build()
.mount(
"/",
openapi_get_routes![
index,
metrics,
inventory,
impacts,
impacts_from_arbitrary_inventory
],
)
.mount(
"/swagger-ui/",
make_swagger_ui(&SwaggerUIConfig {
url: "../openapi.json".to_owned(),
..Default::default()
}),
)
.manage(config)
.launch()
.await?;
Ok(())
}
#[openapi(skip)]
#[get("/")]
fn index(config: &State<Config>) -> String {
warn!("Getting request on /");
let version: String = crate::get_version();
format!("Cloud scanner metric server {} is running.\n\nUsing Boavizta API at: {}.\nMetrics are exposed on /metrics path and require passing a **region** in query string.\n e.g. http://localhost:8000/metrics?aws_region=eu-west-3 \n See also /swagger-ui .", version, config.boavizta_url)
}
#[openapi(tag = "metrics")]
#[get("/metrics?<aws_region>&<filter_tags>&<use_duration_hours>&<include_block_storage>")]
async fn metrics(
config: &State<Config>,
aws_region: &str,
filter_tags: Option<Vec<String>>,
use_duration_hours: Option<f32>,
include_block_storage: Option<bool>,
) -> String {
warn!("Getting something on /metrics");
let hours_use_time = use_duration_hours.unwrap_or(1.0);
warn!("Filtering on tags {:?}", filter_tags);
let metrics = crate::get_impacts_as_metrics(
&hours_use_time,
&filter_tags.unwrap_or_default(),
aws_region,
&config.boavizta_url,
include_block_storage.unwrap_or(false),
)
.await;
metrics.unwrap()
}
#[openapi(tag = "inventory")]
#[get("/inventory?<aws_region>&<filter_tags>&<include_block_storage>")]
async fn inventory(
_config: &State<Config>,
aws_region: &str,
filter_tags: Option<Vec<String>>,
include_block_storage: Option<bool>,
) -> Json<Inventory> {
warn!("Getting something on /inventory");
warn!("Filtering on tags {:?}", filter_tags);
Json(
crate::get_inventory(
&filter_tags.unwrap_or_default(),
aws_region,
include_block_storage.unwrap_or(false),
)
.await
.unwrap(),
)
}
#[openapi(tag = "impacts")]
#[get(
"/impacts?<aws_region>&<filter_tags>&<use_duration_hours>&<verbose_output>&<include_block_storage>"
)]
async fn impacts(
_config: &State<Config>,
aws_region: &str,
filter_tags: Option<Vec<String>>,
use_duration_hours: Option<f32>,
verbose_output: Option<bool>,
include_block_storage: Option<bool>,
) -> Json<EstimatedInventory> {
let hours_use_time = use_duration_hours.unwrap_or(1.0);
warn!(
"Requesting /impacts for a duration of {} hours",
hours_use_time
);
warn!("Filtering on tags {:?}", filter_tags);
let res = crate::estimate_impacts(
&hours_use_time,
&filter_tags.unwrap_or_default(),
aws_region,
&_config.boavizta_url,
verbose_output.unwrap_or(false),
include_block_storage.unwrap_or(false),
)
.await
.unwrap();
Json(res)
}
#[openapi(tag = "impacts")]
#[post(
"/impacts-from-arbitrary-inventory?<use_duration_hours>&<verbose_output>",
data = "<inventory>"
)]
async fn impacts_from_arbitrary_inventory(
_config: &State<Config>,
use_duration_hours: Option<f32>,
verbose_output: Option<bool>,
inventory: Json<Inventory>,
) -> Json<EstimatedInventory> {
let hours_use_time = use_duration_hours.unwrap_or(1.0);
let res = crate::estimate_impacts_of_inventory(
&hours_use_time,
&_config.boavizta_url,
verbose_output.unwrap_or(false),
inventory.into_inner(),
)
.await
.unwrap();
Json(res)
}