diff --git a/src/api3.rs b/src/api3.rs index e20ebb09..fea385a3 100644 --- a/src/api3.rs +++ b/src/api3.rs @@ -1,49 +1,12 @@ use failure::*; -use std::collections::HashMap; -use lazy_static::lazy_static; -use std::sync::{Arc, Mutex}; - use crate::api::schema::*; use crate::api::router::*; use serde_json::{json, Value}; pub mod config; mod version; - -use crate::backup::datastore::*; - -lazy_static!{ - static ref datastore_map: Mutex>> = Mutex::new(HashMap::new()); -} - -fn lookup_datastore(name: &str) -> Result, Error> { - - let mut map = datastore_map.lock().unwrap(); - - if let Some(datastore) = map.get(name) { - return Ok(datastore.clone()); - } - - if let Ok(datastore) = DataStore::open(name) { - let datastore = Arc::new(datastore); - map.insert(name.to_string(), datastore.clone()); - return Ok(datastore); - } - - bail!("store not found"); -} - -// this is just a test for mutability/mutex handling - will remove later -fn test_sync_api_handler2(param: Value, _info: &ApiMethod) -> Result { - println!("This is a test {}", param); - - let datastore = lookup_datastore("store1")?; - - datastore.garbage_collection()?; - - Ok(json!(null)) -} +mod datastore; fn test_sync_api_handler(param: Value, _info: &ApiMethod) -> Result { println!("This is a test {}", param); @@ -91,11 +54,13 @@ pub fn router() -> Router { .get(ApiMethod::new( |_,_| Ok(json!([ {"subdir": "config"}, + {"subdir": "datastore"}, {"subdir": "version"}, {"subdir": "nodes"} ])), ObjectSchema::new("Directory index."))) .subdir("config", config::router()) + .subdir("datastore", datastore::router()) .subdir("version", version::router()) .subdir("nodes", nodes); diff --git a/src/api3/datastore.rs b/src/api3/datastore.rs new file mode 100644 index 00000000..df4c0f29 --- /dev/null +++ b/src/api3/datastore.rs @@ -0,0 +1,89 @@ +use failure::*; + +use std::collections::HashMap; +use lazy_static::lazy_static; +use std::sync::{Arc, Mutex}; + +use crate::api::schema::*; +use crate::api::router::*; +use serde_json::{json, Value}; + +use crate::config::datastore; + +use crate::backup::datastore::*; + +lazy_static!{ + static ref datastore_map: Mutex>> = Mutex::new(HashMap::new()); +} + +fn lookup_datastore(name: &str) -> Result, Error> { + + let mut map = datastore_map.lock().unwrap(); + + if let Some(datastore) = map.get(name) { + return Ok(datastore.clone()); + } + + if let Ok(datastore) = DataStore::open(name) { + let datastore = Arc::new(datastore); + map.insert(name.to_string(), datastore.clone()); + return Ok(datastore); + } + + bail!("store not found"); +} + +// this is just a test for mutability/mutex handling - will remove later +fn start_garbage_collection(param: Value, _info: &ApiMethod) -> Result { + + let name = param["name"].as_str().unwrap(); + + let datastore = lookup_datastore(name)?; + + println!("Starting garbage collection on store {}", name); + + datastore.garbage_collection()?; + + Ok(json!(null)) +} + +fn get_datastore_list(_param: Value, _info: &ApiMethod) -> Result { + + let config = datastore::config()?; + + Ok(config.convert_to_array("name")) +} + +pub fn router() -> Router { + + let datastore_info = Router::new() + .get(ApiMethod::new( + |_,_| Ok(json!([ + {"subdir": "status"}, + {"subdir": "gc" } + ])), + ObjectSchema::new("Directory index.") + .required("name", StringSchema::new("Datastore name."))) + ) + .subdir( + "gc", + Router::new() + .post(ApiMethod::new( + start_garbage_collection, + ObjectSchema::new("Start garbage collection.") + .required("name", StringSchema::new("Datastore name.")) + ) + )); + + + + let route = Router::new() + .get(ApiMethod::new( + get_datastore_list, + ObjectSchema::new("Directory index."))) + .match_all("name", datastore_info); + + + + route +}