From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 6F2BF1FF184 for ; Thu, 20 Nov 2025 15:51:28 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id A09AEBBBA; Thu, 20 Nov 2025 15:51:34 +0100 (CET) From: Stefan Hanreich To: pbs-devel@lists.proxmox.com Date: Thu, 20 Nov 2025 15:50:13 +0100 Message-ID: <20251120145031.550340-6-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251120145031.550340-1-s.hanreich@proxmox.com> References: <20251120145031.550340-1-s.hanreich@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.172 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment KAM_LAZY_DOMAIN_SECURITY 1 Sending domain does not have any anti-forgery methods RDNS_NONE 0.793 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_NONE 0.001 SPF: sender does not publish an SPF Record Subject: [pbs-devel] [PATCH proxmox 5/5] pbs-api-types: add fallback variants to enums in public API X-BeenThere: pbs-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Backup Server development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Backup Server development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pbs-devel-bounces@lists.proxmox.com Sender: "pbs-devel" In order to be able to provide forwards-compatibility in the Proxmox Datacenter Manager, add fallback variants to all enums that are exposed in the public API. This prevents breakage on PDM side whenever a new enum variant is added in PBS. The fallbacks are feature-guarded, so PBS can use the strict enums without having to handle any fallback variants. This is unnecessary, because pbs-api-types and proxmox-backup are updated in tandem, so proxmox-backup should never run into the situation of having to handle unknown variants. Only the datacenter manager will use this feature flag for now, since it needs to potentially handle unknown variants. Signed-off-by: Stefan Hanreich --- pbs-api-types/Cargo.toml | 4 +++ pbs-api-types/debian/control | 8 +++++- pbs-api-types/src/crypto.rs | 6 +++++ pbs-api-types/src/datastore.rs | 36 ++++++++++++++++++++++++++ pbs-api-types/src/file_restore.rs | 6 +++++ pbs-api-types/src/jobs.rs | 13 ++++++++++ pbs-api-types/src/key_derivation.rs | 6 +++++ pbs-api-types/src/ldap.rs | 9 +++++++ pbs-api-types/src/lib.rs | 12 +++++++++ pbs-api-types/src/maintenance.rs | 6 +++++ pbs-api-types/src/metrics.rs | 10 +++++++ pbs-api-types/src/node.rs | 5 ++++ pbs-api-types/src/tape/changer.rs | 6 +++++ pbs-api-types/src/tape/device.rs | 6 +++++ pbs-api-types/src/tape/drive.rs | 9 +++++++ pbs-api-types/src/tape/media_status.rs | 6 +++++ pbs-api-types/src/zfs.rs | 8 ++++++ 17 files changed, 155 insertions(+), 1 deletion(-) diff --git a/pbs-api-types/Cargo.toml b/pbs-api-types/Cargo.toml index dacbf6cd..eca67e9a 100644 --- a/pbs-api-types/Cargo.toml +++ b/pbs-api-types/Cargo.toml @@ -18,6 +18,7 @@ serde_plain.workspace = true proxmox-auth-api = { workspace = true, features = [ "api-types" ] } proxmox-apt-api-types.workspace = true +proxmox-fixed-string.workspace = true proxmox-human-byte.workspace = true proxmox-lang.workspace=true proxmox-s3-client = { workspace = true, features = [ "api-types" ] } @@ -25,3 +26,6 @@ proxmox-schema = { workspace = true, features = [ "api-macro" ] } proxmox-serde.workspace = true proxmox-time.workspace = true proxmox-uuid = { workspace = true, features = [ "serde" ] } + +[features] +enum-fallback = [] diff --git a/pbs-api-types/debian/control b/pbs-api-types/debian/control index 13dc4db4..cf21fdb8 100644 --- a/pbs-api-types/debian/control +++ b/pbs-api-types/debian/control @@ -13,6 +13,7 @@ Build-Depends-Arch: cargo:native , librust-proxmox-apt-api-types-2+default-dev (>= 2.0.2-~~) , librust-proxmox-auth-api-1+api-types-dev (>= 1.0.5-~~) , librust-proxmox-auth-api-1+default-dev (>= 1.0.5-~~) , + librust-proxmox-fixed-string-0.1+default-dev , librust-proxmox-human-byte-1+default-dev , librust-proxmox-lang-1+default-dev (>= 1.5-~~) , librust-proxmox-s3-client-1+api-types-dev (>= 1.2-~~) , @@ -45,6 +46,7 @@ Depends: librust-proxmox-apt-api-types-2+default-dev (>= 2.0.2-~~), librust-proxmox-auth-api-1+api-types-dev (>= 1.0.5-~~), librust-proxmox-auth-api-1+default-dev (>= 1.0.5-~~), + librust-proxmox-fixed-string-0.1+default-dev, librust-proxmox-human-byte-1+default-dev, librust-proxmox-lang-1+default-dev (>= 1.5-~~), librust-proxmox-s3-client-1+api-types-dev (>= 1.2-~~), @@ -61,11 +63,15 @@ Depends: librust-serde-plain-1+default-dev Provides: librust-pbs-api-types+default-dev (= ${binary:Version}), + librust-pbs-api-types+enum-fallback-dev (= ${binary:Version}), librust-pbs-api-types-1-dev (= ${binary:Version}), librust-pbs-api-types-1+default-dev (= ${binary:Version}), + librust-pbs-api-types-1+enum-fallback-dev (= ${binary:Version}), librust-pbs-api-types-1.0-dev (= ${binary:Version}), librust-pbs-api-types-1.0+default-dev (= ${binary:Version}), + librust-pbs-api-types-1.0+enum-fallback-dev (= ${binary:Version}), librust-pbs-api-types-1.0.6-dev (= ${binary:Version}), - librust-pbs-api-types-1.0.6+default-dev (= ${binary:Version}) + librust-pbs-api-types-1.0.6+default-dev (= ${binary:Version}), + librust-pbs-api-types-1.0.6+enum-fallback-dev (= ${binary:Version}) Description: API types for Proxmox Backup Server - Rust source code Source code for Debianized Rust crate "pbs-api-types" diff --git a/pbs-api-types/src/crypto.rs b/pbs-api-types/src/crypto.rs index d229eee0..536c53b4 100644 --- a/pbs-api-types/src/crypto.rs +++ b/pbs-api-types/src/crypto.rs @@ -3,6 +3,9 @@ use std::fmt::{self, Display}; use anyhow::Error; use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::api; #[api(default: "encrypt")] @@ -16,6 +19,9 @@ pub enum CryptMode { Encrypt, /// Only sign. SignOnly, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[derive(Debug, Eq, PartialEq, Hash, Clone, Deserialize, Serialize)] diff --git a/pbs-api-types/src/datastore.rs b/pbs-api-types/src/datastore.rs index a214ac25..7dd365c6 100644 --- a/pbs-api-types/src/datastore.rs +++ b/pbs-api-types/src/datastore.rs @@ -8,6 +8,9 @@ use anyhow::{bail, format_err, Error}; use const_format::concatcp; use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_human_byte::HumanByte; use proxmox_schema::{ api, const_regex, ApiStringFormat, ApiType, ArraySchema, EnumEntry, IntegerSchema, ReturnType, @@ -177,6 +180,9 @@ pub enum ChunkOrder { /// Iterate chunks in inode order #[default] Inode, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api] @@ -191,6 +197,9 @@ pub enum DataStoreMountStatus { /// Datastore is not removable, so there is no mount status. #[default] NonRemovable, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api] @@ -222,6 +231,9 @@ pub enum DatastoreFSyncLevel { /// and consistency. #[default] Filesystem, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } pub const GC_ATIME_CUTOFF_SCHEMA: Schema = IntegerSchema::new( @@ -297,6 +309,9 @@ pub enum DatastoreBackendType { Filesystem, /// S3 object store S3, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } serde_plain::derive_display_from_serialize!(DatastoreBackendType); serde_plain::derive_fromstr_from_deserialize!(DatastoreBackendType); @@ -382,6 +397,10 @@ impl FromStr for DatastoreBackendConfig { bail!("missing option bucket, required for backend type s3"); } } + #[cfg(feature = "enum-fallback")] + DatastoreBackendType::UnknownEnumValue(s) => { + bail!("unknown backend type: {s}"); + } } Ok(backend_config) } @@ -516,6 +535,9 @@ pub enum NotificationMode { /// Emit notification events to the notification system #[default] NotificationSystem, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } impl DataStoreConfig { @@ -576,6 +598,10 @@ impl DataStoreConfig { } } } + #[cfg(feature = "enum-fallback")] + Some(MaintenanceType::UnknownEnumValue(s)) => { + bail!("unknown maintenance type: {s}") + } None => { /* always OK */ } } @@ -697,6 +723,9 @@ pub enum VerifyState { Ok, /// Verification reported one or more errors Failed, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( @@ -1058,6 +1087,9 @@ pub enum BackupType { /// "Host" backups. Host, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), // NOTE: if you add new types, don't forget to adapt the iter below! } @@ -1067,6 +1099,8 @@ impl BackupType { BackupType::Vm => "vm", BackupType::Ct => "ct", BackupType::Host => "host", + #[cfg(feature = "enum-fallback")] + BackupType::UnknownEnumValue(_) => "unknown backup type", } } @@ -1076,6 +1110,8 @@ impl BackupType { BackupType::Ct => 0, BackupType::Host => 1, BackupType::Vm => 2, + #[cfg(feature = "enum-fallback")] + BackupType::UnknownEnumValue(_) => u8::MAX, } } diff --git a/pbs-api-types/src/file_restore.rs b/pbs-api-types/src/file_restore.rs index 90657d65..8093e2eb 100644 --- a/pbs-api-types/src/file_restore.rs +++ b/pbs-api-types/src/file_restore.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::api; #[api] @@ -27,4 +30,7 @@ pub enum FileRestoreFormat { Zip, /// TAR archive Tar, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs index 13317c9d..7e6dfb94 100644 --- a/pbs-api-types/src/jobs.rs +++ b/pbs-api-types/src/jobs.rs @@ -5,6 +5,9 @@ use const_format::concatcp; use regex::Regex; use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::*; use crate::{ @@ -134,6 +137,9 @@ pub enum Notify { Always, /// Send notifications for failed jobs only Error, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( @@ -549,6 +555,9 @@ pub enum SyncDirection { Pull, /// Sync direction push Push, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } impl std::fmt::Display for SyncDirection { @@ -556,6 +565,10 @@ impl std::fmt::Display for SyncDirection { match self { SyncDirection::Pull => f.write_str("pull"), SyncDirection::Push => f.write_str("push"), + #[cfg(feature = "enum-fallback")] + SyncDirection::UnknownEnumValue(s) => { + write!(f, "unknown sync direction: {s}") + } } } } diff --git a/pbs-api-types/src/key_derivation.rs b/pbs-api-types/src/key_derivation.rs index 8d6cbc89..57ae353a 100644 --- a/pbs-api-types/src/key_derivation.rs +++ b/pbs-api-types/src/key_derivation.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::api; use crate::CERT_FINGERPRINT_SHA256_SCHEMA; @@ -15,6 +18,9 @@ pub enum Kdf { Scrypt, /// Encrtypt the Key with a password using PBKDF2 PBKDF2, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } impl Default for Kdf { diff --git a/pbs-api-types/src/ldap.rs b/pbs-api-types/src/ldap.rs index 51146160..ff380ffe 100644 --- a/pbs-api-types/src/ldap.rs +++ b/pbs-api-types/src/ldap.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::{api, ApiStringFormat, ApiType, ArraySchema, Schema, StringSchema, Updater}; use super::{REALM_ID_SCHEMA, SINGLE_LINE_COMMENT_SCHEMA}; @@ -18,6 +21,9 @@ pub enum LdapMode { /// Secure LDAPS connection #[serde(rename = "ldaps")] Ldaps, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( @@ -145,6 +151,9 @@ pub enum RemoveVanished { Entry, /// Remove vanished properties from users (e.g. email) Properties, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } pub const LDAP_DOMAIN_SCHEMA: Schema = StringSchema::new("LDAP Domain").schema(); diff --git a/pbs-api-types/src/lib.rs b/pbs-api-types/src/lib.rs index 519f6f20..54547291 100644 --- a/pbs-api-types/src/lib.rs +++ b/pbs-api-types/src/lib.rs @@ -13,6 +13,9 @@ use proxmox_time::parse_daily_duration; use proxmox_auth_api::types::{APITOKEN_ID_REGEX_STR, USER_ID_REGEX_STR}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + pub use proxmox_schema::api_types::SAFE_ID_FORMAT as PROXMOX_SAFE_ID_FORMAT; pub use proxmox_schema::api_types::SAFE_ID_REGEX as PROXMOX_SAFE_ID_REGEX; pub use proxmox_schema::api_types::SAFE_ID_REGEX_STR as PROXMOX_SAFE_ID_REGEX_STR; @@ -269,6 +272,9 @@ pub enum NodePowerCommand { Reboot, /// Shutdown the server Shutdown, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api()] @@ -284,6 +290,9 @@ pub enum TaskStateType { Error, /// Unknown Unknown, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( @@ -337,6 +346,9 @@ pub enum RealmType { Ldap, /// An Active Directory (AD) realm Ad, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } serde_plain::derive_display_from_serialize!(RealmType); diff --git a/pbs-api-types/src/maintenance.rs b/pbs-api-types/src/maintenance.rs index a516a1d9..6b97ff10 100644 --- a/pbs-api-types/src/maintenance.rs +++ b/pbs-api-types/src/maintenance.rs @@ -2,6 +2,9 @@ use anyhow::{bail, Error}; use serde::{Deserialize, Serialize}; use std::borrow::Cow; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::{api, const_regex, ApiStringFormat, Schema, StringSchema}; const_regex! { @@ -51,6 +54,9 @@ pub enum MaintenanceType { Unmount, /// The S3 cache store is being refreshed. S3Refresh, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } serde_plain::derive_display_from_serialize!(MaintenanceType); serde_plain::derive_fromstr_from_deserialize!(MaintenanceType); diff --git a/pbs-api-types/src/metrics.rs b/pbs-api-types/src/metrics.rs index ee901276..5ce2c9fc 100644 --- a/pbs-api-types/src/metrics.rs +++ b/pbs-api-types/src/metrics.rs @@ -3,6 +3,10 @@ use serde::{Deserialize, Serialize}; use crate::{ HOST_PORT_SCHEMA, HTTP_URL_SCHEMA, PROXMOX_SAFE_ID_FORMAT, SINGLE_LINE_COMMENT_SCHEMA, }; + +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::{api, Schema, StringSchema, Updater}; pub const METRIC_SERVER_ID_SCHEMA: Schema = StringSchema::new("Metrics Server ID.") @@ -156,6 +160,9 @@ pub enum MetricServerType { /// InfluxDB UDP #[serde(rename = "influxdb-udp")] InfluxDbUdp, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( @@ -249,6 +256,9 @@ pub enum MetricDataType { Counter, /// derive. Derive, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } serde_plain::derive_display_from_serialize!(MetricDataType); diff --git a/pbs-api-types/src/node.rs b/pbs-api-types/src/node.rs index 4231f312..e5b3526c 100644 --- a/pbs-api-types/src/node.rs +++ b/pbs-api-types/src/node.rs @@ -3,6 +3,8 @@ use std::ffi::OsStr; use serde::{Deserialize, Serialize}; use proxmox_auth_api::types::Authid; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; use proxmox_schema::*; use crate::StorageStatus; @@ -86,6 +88,9 @@ pub enum BootMode { Efi, /// The BootMode is Legacy BIOS LegacyBios, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api] diff --git a/pbs-api-types/src/tape/changer.rs b/pbs-api-types/src/tape/changer.rs index df3823cf..1f818844 100644 --- a/pbs-api-types/src/tape/changer.rs +++ b/pbs-api-types/src/tape/changer.rs @@ -2,6 +2,9 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::{ api, ApiStringFormat, ArraySchema, IntegerSchema, Schema, StringSchema, Updater, }; @@ -102,6 +105,9 @@ pub enum MtxEntryKind { Slot, /// Import/Export Slot ImportExport, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( diff --git a/pbs-api-types/src/tape/device.rs b/pbs-api-types/src/tape/device.rs index ff335cdf..0fe2ae41 100644 --- a/pbs-api-types/src/tape/device.rs +++ b/pbs-api-types/src/tape/device.rs @@ -1,5 +1,8 @@ use ::serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::api; #[api()] @@ -27,6 +30,9 @@ pub enum DeviceKind { Changer, /// Normal SCSI tape device Tape, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api( diff --git a/pbs-api-types/src/tape/drive.rs b/pbs-api-types/src/tape/drive.rs index e00665cd..720ba5e4 100644 --- a/pbs-api-types/src/tape/drive.rs +++ b/pbs-api-types/src/tape/drive.rs @@ -2,6 +2,9 @@ use anyhow::{bail, Error}; use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::{api, IntegerSchema, Schema, StringSchema, Updater}; use crate::{OptionalDeviceIdentification, CHANGER_NAME_SCHEMA, PROXMOX_SAFE_ID_FORMAT}; @@ -136,6 +139,9 @@ pub enum TapeDensity { LTO8, /// LTO9 LTO9, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } impl TryFrom for TapeDensity { @@ -321,6 +327,9 @@ pub enum DeviceActivity { ReadingEncrypted, /// Writing encrypted data WritingEncrypted, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } impl TryFrom for DeviceActivity { diff --git a/pbs-api-types/src/tape/media_status.rs b/pbs-api-types/src/tape/media_status.rs index fdb4e6a0..4a5cc120 100644 --- a/pbs-api-types/src/tape/media_status.rs +++ b/pbs-api-types/src/tape/media_status.rs @@ -1,5 +1,8 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; + use proxmox_schema::api; #[api()] @@ -18,4 +21,7 @@ pub enum MediaStatus { Damaged, /// Media is marked as retired Retired, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } diff --git a/pbs-api-types/src/zfs.rs b/pbs-api-types/src/zfs.rs index 57fa5cf4..2cfbd403 100644 --- a/pbs-api-types/src/zfs.rs +++ b/pbs-api-types/src/zfs.rs @@ -1,5 +1,7 @@ use serde::{Deserialize, Serialize}; +#[cfg(feature = "enum-fallback")] +use proxmox_fixed_string::FixedString; use proxmox_schema::*; const_regex! { @@ -35,6 +37,9 @@ pub enum ZfsCompressionType { On, /// Disable compression. Off, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api()] @@ -54,6 +59,9 @@ pub enum ZfsRaidLevel { RaidZ2, /// RaidZ3 RaidZ3, + #[cfg(feature = "enum-fallback")] + #[serde(untagged)] + UnknownEnumValue(FixedString), } #[api()] -- 2.47.3 _______________________________________________ pbs-devel mailing list pbs-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel