[pbs-devel] [RFC PATCH v2 proxmox-backup 1/7] api2: Introduce server features discovery mechanism

Christoph Heiss c.heiss at proxmox.com
Wed Jan 25 13:18:56 CET 2023


This is vaguely based on the idea to introduce some sort of API
compatibility mechansim, to detect whether e.g. a new API parameter is
supported by the server or not. [0]

Essentially, a new `features` field is added to the `/version` endpoint,
which is an array (of strings) of supported (backwards-incompatible)
features by the server. Clients can retrieve this and act accordingly.
Features are internally described as an enum, with kebab-case'd names
for external consumption through the API.

Some inspriration was taken from how proxmox backup support in QEMU
works, using `query-proxmox-support` command.

This is intended as a first proposal on how this mechanism could work.

[0] https://lists.proxmox.com/pipermail/pbs-devel/2023-January/005867.html ff.

Signed-off-by: Christoph Heiss <c.heiss at proxmox.com>
---
Changes v1 -> v2:
* New patch

 pbs-api-types/src/lib.rs | 9 +++++++++
 src/api2/version.rs      | 4 +++-
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs
index 5e043954..dda2bd5b 100644
--- a/pbs-api-types/src/lib.rs
+++ b/pbs-api-types/src/lib.rs
@@ -531,3 +531,12 @@ pub struct BasicRealmInfo {
     #[serde(skip_serializing_if = "Option::is_none")]
     pub comment: Option<String>,
 }
+
+#[api]
+#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+/// List of features a server can supported.
+pub enum ServerFeature {
+    /// Indicates that the `protected` parameter on the /finish endpoint is suppported
+    FinishHasProtectedParam,
+}
diff --git a/src/api2/version.rs b/src/api2/version.rs
index 0e91688b..0d6e66c4 100644
--- a/src/api2/version.rs
+++ b/src/api2/version.rs
@@ -3,6 +3,7 @@
 use anyhow::Error;
 use serde_json::{json, Value};

+use pbs_api_types::ServerFeature;
 use proxmox_router::{ApiHandler, ApiMethod, Permission, Router, RpcEnvironment};
 use proxmox_schema::ObjectSchema;

@@ -14,7 +15,8 @@ fn get_version(
     Ok(json!({
         "version": pbs_buildcfg::PROXMOX_PKG_VERSION,
         "release": pbs_buildcfg::PROXMOX_PKG_RELEASE,
-        "repoid": pbs_buildcfg::PROXMOX_PKG_REPOID
+        "repoid": pbs_buildcfg::PROXMOX_PKG_REPOID,
+        "features": [ServerFeature::FinishHasProtectedParam],
     }))
 }

--
2.34.1






More information about the pbs-devel mailing list