[pbs-devel] [PATCH proxmox-backup] add datastore info api call
Oguz Bektas
o.bektas at proxmox.com
Wed Oct 21 16:01:59 CEST 2020
to be able to copy/paste easily when adding a new PBS datastore remote
in PVE
Signed-off-by: Oguz Bektas <o.bektas at proxmox.com>
---
src/api2/admin/datastore.rs | 55 +++++++++++++++++++++++++++++++++++++
src/api2/types/mod.rs | 23 ++++++++++++++++
2 files changed, 78 insertions(+)
diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 91ca3570..41059f98 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -25,6 +25,7 @@ use pxar::EntryKind;
use crate::api2::types::*;
use crate::api2::node::rrd::create_value_from_rrd;
+use crate::config::network::{self};
use crate::backup::*;
use crate::config::datastore;
use crate::config::cached_user_info::CachedUserInfo;
@@ -36,6 +37,7 @@ use crate::tools::{
AsyncChannelWriter, AsyncReaderStream, WrappedReaderStream,
};
+use crate::tools::cert::CertInfo;
use crate::config::acl::{
PRIV_DATASTORE_AUDIT,
PRIV_DATASTORE_MODIFY,
@@ -448,6 +450,54 @@ pub fn status(
crate::tools::disks::disk_usage(&datastore.base_path())
}
+#[api(
+ input: {
+ properties: {
+ store: {
+ schema: DATASTORE_SCHEMA,
+ },
+ },
+ },
+ returns: {
+ type: DataStoreInfo,
+ },
+ access: {
+ permission: &Permission::Privilege(&["datastore", "{store}"], PRIV_DATASTORE_READ, true),
+ },
+)]
+/// Get information about the datastore.
+///
+/// Provides PBS node fingerprint, address and datastore name
+pub fn info(
+ store: String,
+ _info: &ApiMethod,
+ _rpcenv: &mut dyn RpcEnvironment,
+) -> Result<DataStoreInfo, Error> {
+ let _datastore = DataStore::lookup_datastore(&store)?;
+ let cert = CertInfo::new()?;
+ let fingerprint = cert.fingerprint()?;
+
+ // get all possible interface IP addresses since there's
+ // no explicit way to tell which is needed
+ let (config, _) = network::config()?;
+ let mut address_list = Vec::new();
+ for (_ , interface) in config.interfaces.iter() {
+ if let Some(cidr) = &interface.cidr {
+ address_list.push(cidr.to_owned());
+ }
+ }
+
+ let result_item = DataStoreInfo {
+ name: store,
+ address_list,
+ fingerprint,
+ };
+
+ Ok(result_item)
+}
+
+
+
#[api(
input: {
properties: {
@@ -1673,6 +1723,11 @@ const DATASTORE_INFO_SUBDIRS: SubdirMap = &[
&Router::new()
.get(&API_METHOD_LIST_GROUPS)
),
+ (
+ "info",
+ &Router::new()
+ .get(&API_METHOD_INFO)
+ ),
(
"notes",
&Router::new()
diff --git a/src/api2/types/mod.rs b/src/api2/types/mod.rs
index f97db557..9e61f15c 100644
--- a/src/api2/types/mod.rs
+++ b/src/api2/types/mod.rs
@@ -1070,3 +1070,26 @@ pub struct APTUpdateInfo {
/// URL under which the package's changelog can be retrieved
pub change_log_url: String,
}
+
+#[api(
+ properties: {
+ "address-list": {
+ description: "List of IPs from node",
+ type: Array,
+ items: {
+ description: "CIDR",
+ type: String,
+ },
+ },
+})]
+#[derive(Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+/// Necessary information for adding a remote
+pub struct DataStoreInfo {
+ /// Name of the datastore
+ pub name: String,
+ /// Available IP addresses from the node
+ pub address_list: Vec<String>,
+ /// x509 fingerprint of the node
+ pub fingerprint: String,
+}
--
2.20.1
More information about the pbs-devel
mailing list