]>
Commit | Line | Data |
---|---|---|
a2479cfa | 1 | use std::path::PathBuf; |
6ce50400 | 2 | |
a2479cfa | 3 | use failure::*; |
5e62d19c | 4 | use serde_json::Value; |
6ce50400 | 5 | |
688fbe07 | 6 | use proxmox::api::{api, ApiMethod, Router, RpcEnvironment}; |
a2479cfa | 7 | |
66c49c21 | 8 | use crate::api2::types::*; |
a2479cfa | 9 | use crate::backup::*; |
567713b4 DM |
10 | use crate::config::datastore; |
11 | ||
688fbe07 DM |
12 | #[api( |
13 | input: { | |
14 | properties: {}, | |
15 | }, | |
16 | returns: { | |
17 | description: "List the configured datastores.", | |
18 | type: Array, | |
19 | items: { | |
20 | type: datastore::DataStoreConfig, | |
21 | }, | |
22 | }, | |
23 | )] | |
24 | /// List all datastores | |
25 | pub fn list_datastores( | |
6049b71f DM |
26 | _param: Value, |
27 | _info: &ApiMethod, | |
dd5495d6 | 28 | _rpcenv: &mut dyn RpcEnvironment, |
6049b71f | 29 | ) -> Result<Value, Error> { |
567713b4 | 30 | |
d0187a51 | 31 | let (config, digest) = datastore::config()?; |
b65eaac6 | 32 | |
d0187a51 | 33 | Ok(config.convert_to_array("name", Some(&digest))) |
ea0b8b6e DM |
34 | } |
35 | ||
688fbe07 DM |
36 | #[api( |
37 | protected: true, | |
38 | input: { | |
39 | properties: { | |
40 | name: { | |
41 | schema: DATASTORE_SCHEMA, | |
42 | }, | |
43 | comment: { | |
44 | optional: true, | |
454c13ed | 45 | schema: SINGLE_LINE_COMMENT_SCHEMA, |
688fbe07 DM |
46 | }, |
47 | path: { | |
48 | schema: datastore::DIR_NAME_SCHEMA, | |
49 | }, | |
50 | }, | |
51 | }, | |
52 | )] | |
53 | /// Create new datastore config. | |
54 | pub fn create_datastore(name: String, param: Value) -> Result<(), Error> { | |
ea0b8b6e | 55 | |
652c1190 DM |
56 | // fixme: locking ? |
57 | ||
688fbe07 | 58 | let datastore: datastore::DataStoreConfig = serde_json::from_value(param.clone())?; |
652c1190 | 59 | |
d0187a51 | 60 | let (mut config, _digest) = datastore::config()?; |
652c1190 | 61 | |
688fbe07 | 62 | if let Some(_) = config.sections.get(&name) { |
652c1190 DM |
63 | bail!("datastore '{}' already exists.", name); |
64 | } | |
65 | ||
688fbe07 DM |
66 | let path: PathBuf = datastore.path.clone().into(); |
67 | ||
68 | let backup_user = crate::backup::backup_user()?; | |
69 | let _store = ChunkStore::create(&name, path, backup_user.uid, backup_user.gid)?; | |
70 | ||
50af953e | 71 | config.set_data(&name, "datastore", &datastore)?; |
652c1190 DM |
72 | |
73 | datastore::save_config(&config)?; | |
74 | ||
688fbe07 | 75 | Ok(()) |
6ce50400 DM |
76 | } |
77 | ||
688fbe07 DM |
78 | #[api( |
79 | protected: true, | |
80 | input: { | |
81 | properties: { | |
82 | name: { | |
83 | schema: DATASTORE_SCHEMA, | |
84 | }, | |
85 | }, | |
86 | }, | |
87 | )] | |
88 | /// Remove a datastore configuration. | |
89 | pub fn delete_datastore(name: String) -> Result<(), Error> { | |
34d3ba52 DM |
90 | |
91 | // fixme: locking ? | |
92 | // fixme: check digest ? | |
93 | ||
d0187a51 | 94 | let (mut config, _digest) = datastore::config()?; |
34d3ba52 | 95 | |
688fbe07 DM |
96 | match config.sections.get(&name) { |
97 | Some(_) => { config.sections.remove(&name); }, | |
34d3ba52 DM |
98 | None => bail!("datastore '{}' does not exist.", name), |
99 | } | |
100 | ||
101 | datastore::save_config(&config)?; | |
102 | ||
688fbe07 | 103 | Ok(()) |
34d3ba52 DM |
104 | } |
105 | ||
255f378a | 106 | pub const ROUTER: Router = Router::new() |
688fbe07 DM |
107 | .get(&API_METHOD_LIST_DATASTORES) |
108 | .post(&API_METHOD_CREATE_DATASTORE) | |
109 | .delete(&API_METHOD_DELETE_DATASTORE); |