]> git.proxmox.com Git - proxmox-backup.git/blame - src/api2/config/datastore.rs
src/api2/config/remotes.rs: improve api, implement update and read
[proxmox-backup.git] / src / api2 / config / datastore.rs
CommitLineData
a2479cfa 1use std::path::PathBuf;
6ce50400 2
a2479cfa 3use failure::*;
5e62d19c 4use serde_json::Value;
6ce50400 5
688fbe07 6use proxmox::api::{api, ApiMethod, Router, RpcEnvironment};
a2479cfa 7
66c49c21 8use crate::api2::types::*;
a2479cfa 9use crate::backup::*;
567713b4
DM
10use 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
25pub 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.
54pub 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.
89pub 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 106pub 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);