[pdm-devel] [PATCH proxmox-api-types 1/2] regenerate and adapt to rng changes

Dominik Csapak d.csapak at proxmox.com
Fri Apr 18 11:32:53 CEST 2025


the recent changes for rng in qemu-server:
18fc321e (refactor: move rng related code into its own module)

converted the rng0 format to a proper registered format, which changes
its name, so we have to adapt the renaming of the enum variants.

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 pve-api-types/generate.pl            |   6 +-
 pve-api-types/src/generated/code.rs  |   2 +
 pve-api-types/src/generated/types.rs | 306 ++++++++++++++++++++-------
 3 files changed, 238 insertions(+), 76 deletions(-)

diff --git a/pve-api-types/generate.pl b/pve-api-types/generate.pl
index 8be737b..c7ce9a6 100644
--- a/pve-api-types/generate.pl
+++ b/pve-api-types/generate.pl
@@ -89,9 +89,9 @@ Schema2Rust::register_enum_variant('QemuConfigEfidisk0Efitype::2m' => 'Mb2');
 Schema2Rust::register_enum_variant('QemuConfigEfidisk0Efitype::4m' => 'Mb4');
 Schema2Rust::register_enum_variant('QemuConfigHugepages::2' => 'Mb2');
 Schema2Rust::register_enum_variant('QemuConfigHugepages::1024' => 'Mb1024');
-Schema2Rust::register_enum_variant('QemuConfigRng0Source::/dev/urandom', => 'DevUrandom');
-Schema2Rust::register_enum_variant('QemuConfigRng0Source::/dev/random', => 'DevRandom');
-Schema2Rust::register_enum_variant('QemuConfigRng0Source::/dev/hwrng', => 'DevHwrng');
+Schema2Rust::register_enum_variant('PveQmRngSource::/dev/urandom', => 'DevUrandom');
+Schema2Rust::register_enum_variant('PveQmRngSource::/dev/random', => 'DevRandom');
+Schema2Rust::register_enum_variant('PveQmRngSource::/dev/hwrng', => 'DevHwrng');
 Schema2Rust::register_enum_variant('QemuConfigTpmstate0Version::v1.2' => 'V1_2');
 Schema2Rust::register_enum_variant('QemuConfigTpmstate0Version::v2.0' => 'V2_0');
 
diff --git a/pve-api-types/src/generated/code.rs b/pve-api-types/src/generated/code.rs
index 401d3bc..42f9e37 100644
--- a/pve-api-types/src/generated/code.rs
+++ b/pve-api-types/src/generated/code.rs
@@ -80,6 +80,8 @@
 /// - /cluster/jobs/schedule-analyze
 /// - /cluster/log
 /// - /cluster/mapping
+/// - /cluster/mapping/dir
+/// - /cluster/mapping/dir/{id}
 /// - /cluster/mapping/pci
 /// - /cluster/mapping/pci/{id}
 /// - /cluster/mapping/usb
diff --git a/pve-api-types/src/generated/types.rs b/pve-api-types/src/generated/types.rs
index 5a656ba..c64da8b 100644
--- a/pve-api-types/src/generated/types.rs
+++ b/pve-api-types/src/generated/types.rs
@@ -3818,6 +3818,10 @@ pub struct ProxmoxRemote {
 #[api(
     default_key: "type",
     properties: {
+        "allow-smt": {
+            default: true,
+            optional: true,
+        },
         "kernel-hashes": {
             default: false,
             optional: true,
@@ -3838,19 +3842,27 @@ pub struct ProxmoxRemote {
 /// Object.
 #[derive(Debug, serde::Deserialize, serde::Serialize)]
 pub struct PveQemuSevFmt {
+    /// Sets policy bit to allow Simultaneous Multi Threading (SMT) (Ignored
+    /// unless for SEV-SNP)
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "allow-smt")]
+    pub allow_smt: Option<bool>,
+
     /// Add kernel hashes to guest firmware for measured linux kernel launch
     #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
     #[serde(default, skip_serializing_if = "Option::is_none")]
     #[serde(rename = "kernel-hashes")]
     pub kernel_hashes: Option<bool>,
 
-    /// Sets policy bit 0 to 1 to disallow debugging of guest
+    /// Sets policy bit to disallow debugging of guest
     #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
     #[serde(default, skip_serializing_if = "Option::is_none")]
     #[serde(rename = "no-debug")]
     pub no_debug: Option<bool>,
 
-    /// Sets policy bit 1 to 1 to disallow key sharing with other guests
+    /// Sets policy bit to disallow key sharing with other guests (Ignored for
+    /// SEV-SNP)
     #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
     #[serde(default, skip_serializing_if = "Option::is_none")]
     #[serde(rename = "no-key-sharing")]
@@ -3862,7 +3874,7 @@ pub struct PveQemuSevFmt {
 
 #[api]
 /// Enable standard SEV with type='std' or enable experimental SEV-ES with the
-/// 'es' option.
+/// 'es' option or enable experimental SEV-SNP with the 'snp' option.
 #[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
 pub enum PveQemuSevFmtType {
     #[serde(rename = "std")]
@@ -3871,6 +3883,9 @@ pub enum PveQemuSevFmtType {
     #[serde(rename = "es")]
     /// es.
     Es,
+    #[serde(rename = "snp")]
+    /// snp.
+    Snp,
 }
 serde_plain::derive_display_from_serialize!(PveQemuSevFmtType);
 serde_plain::derive_fromstr_from_deserialize!(PveQemuSevFmtType);
@@ -4531,9 +4546,6 @@ pub enum PveQmIdeFormat {
     #[serde(rename = "raw")]
     /// raw.
     Raw,
-    #[serde(rename = "cow")]
-    /// cow.
-    Cow,
     #[serde(rename = "qcow")]
     /// qcow.
     Qcow,
@@ -4667,6 +4679,64 @@ pub struct PveQmIpconfig {
     pub ip6: Option<String>,
 }
 
+#[api(
+    default_key: "source",
+    properties: {
+        max_bytes: {
+            default: 1024,
+            optional: true,
+            type: Integer,
+        },
+        period: {
+            default: 1000,
+            optional: true,
+            type: Integer,
+        },
+        source: {
+            type: PveQmRngSource,
+        },
+    },
+)]
+/// Object.
+#[derive(Debug, serde::Deserialize, serde::Serialize)]
+pub struct PveQmRng {
+    /// Maximum bytes of entropy allowed to get injected into the guest every
+    /// 'period' milliseconds. Use `0` to disable limiting (potentially
+    /// dangerous!).
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_i64")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub max_bytes: Option<i64>,
+
+    /// Every 'period' milliseconds the entropy-injection quota is reset,
+    /// allowing the guest to retrieve another 'max_bytes' of entropy.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_i64")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub period: Option<i64>,
+
+    pub source: PveQmRngSource,
+}
+
+#[api]
+/// The file on the host to gather entropy from. Using urandom does *not*
+/// decrease security in any meaningful way, as it's still seeded from real
+/// entropy, and the bytes provided will most likely be mixed with real entropy
+/// on the guest as well. '/dev/hwrng' can be used to pass through a hardware
+/// RNG from the host.
+#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+pub enum PveQmRngSource {
+    #[serde(rename = "/dev/urandom")]
+    /// /dev/urandom.
+    DevUrandom,
+    #[serde(rename = "/dev/random")]
+    /// /dev/random.
+    DevRandom,
+    #[serde(rename = "/dev/hwrng")]
+    /// /dev/hwrng.
+    DevHwrng,
+}
+serde_plain::derive_display_from_serialize!(PveQmRngSource);
+serde_plain::derive_fromstr_from_deserialize!(PveQmRngSource);
+
 #[api(
     properties: {
         base64: {
@@ -5345,7 +5415,7 @@ QEMU_CONFIG_VMSTATESTORAGE_RE = r##"^(?i:[a-z][a-z0-9\-_.]*[a-z0-9])$"##;
             optional: true,
         },
         rng0: {
-            format: &ApiStringFormat::PropertyString(&QemuConfigRng0::API_SCHEMA),
+            format: &ApiStringFormat::PropertyString(&PveQmRng::API_SCHEMA),
             optional: true,
             type: String,
         },
@@ -5454,6 +5524,9 @@ QEMU_CONFIG_VMSTATESTORAGE_RE = r##"^(?i:[a-z][a-z0-9\-_.]*[a-z0-9])$"##;
         virtio: {
             type: QemuConfigVirtioArray,
         },
+        virtiofs: {
+            type: QemuConfigVirtiofsArray,
+        },
         vmgenid: {
             default: "1 (autogenerated)",
             optional: true,
@@ -5842,6 +5915,11 @@ pub struct QemuConfig {
     #[serde(flatten)]
     pub virtio: QemuConfigVirtioArray,
 
+    /// Configuration for sharing a directory between host and guest using
+    /// Virtio-fs.
+    #[serde(flatten)]
+    pub virtiofs: QemuConfigVirtiofsArray,
+
     /// Set VM Generation ID. Use '1' to autogenerate on create or update, pass
     /// '0' to disable explicitly.
     #[serde(default, skip_serializing_if = "Option::is_none")]
@@ -5994,6 +6072,16 @@ generate_array_field! {
     }
     virtio
 }
+generate_array_field! {
+    QemuConfigVirtiofsArray [ 10 ] :
+    r#"Configuration for sharing a directory between host and guest using Virtio-fs."#,
+    String => {
+        description: "Configuration for sharing a directory between host and guest using Virtio-fs.",
+        format: &ApiStringFormat::PropertyString(&QemuConfigVirtiofs::API_SCHEMA),
+        type: String,
+    }
+    virtiofs
+}
 
 #[api(
     default_key: "enabled",
@@ -6389,6 +6477,14 @@ serde_plain::derive_fromstr_from_deserialize!(QemuConfigLock);
 #[api(
     default_key: "type",
     properties: {
+        "enable-s3": {
+            default: false,
+            optional: true,
+        },
+        "enable-s4": {
+            default: false,
+            optional: true,
+        },
         type: {
             max_length: 40,
             optional: true,
@@ -6403,6 +6499,20 @@ serde_plain::derive_fromstr_from_deserialize!(QemuConfigLock);
 /// Object.
 #[derive(Debug, serde::Deserialize, serde::Serialize)]
 pub struct QemuConfigMachine {
+    /// Enables S3 power state. Defaults to false beginning with machine types
+    /// 9.2+pve1, true before.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "enable-s3")]
+    pub enable_s3: Option<bool>,
+
+    /// Enables S4 power state. Defaults to false beginning with machine types
+    /// 9.2+pve1, true before.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "enable-s4")]
+    pub enable_s4: Option<bool>,
+
     /// Specifies the QEMU machine type.
     #[serde(default, skip_serializing_if = "Option::is_none")]
     #[serde(rename = "type")]
@@ -6735,65 +6845,6 @@ pub enum QemuConfigOstype {
 serde_plain::derive_display_from_serialize!(QemuConfigOstype);
 serde_plain::derive_fromstr_from_deserialize!(QemuConfigOstype);
 
-#[api(
-    default_key: "source",
-    properties: {
-        max_bytes: {
-            default: 1024,
-            optional: true,
-            type: Integer,
-        },
-        period: {
-            default: 1000,
-            optional: true,
-            type: Integer,
-        },
-        source: {
-            type: QemuConfigRng0Source,
-        },
-    },
-)]
-/// Object.
-#[derive(Debug, serde::Deserialize, serde::Serialize)]
-pub struct QemuConfigRng0 {
-    /// Maximum bytes of entropy allowed to get injected into the guest every
-    /// 'period' milliseconds. Prefer a lower value when using '/dev/random' as
-    /// source. Use `0` to disable limiting (potentially dangerous!).
-    #[serde(deserialize_with = "proxmox_login::parse::deserialize_i64")]
-    #[serde(default, skip_serializing_if = "Option::is_none")]
-    pub max_bytes: Option<i64>,
-
-    /// Every 'period' milliseconds the entropy-injection quota is reset,
-    /// allowing the guest to retrieve another 'max_bytes' of entropy.
-    #[serde(deserialize_with = "proxmox_login::parse::deserialize_i64")]
-    #[serde(default, skip_serializing_if = "Option::is_none")]
-    pub period: Option<i64>,
-
-    pub source: QemuConfigRng0Source,
-}
-
-#[api]
-/// The file on the host to gather entropy from. In most cases '/dev/urandom'
-/// should be preferred over '/dev/random' to avoid entropy-starvation issues on
-/// the host. Using urandom does *not* decrease security in any meaningful way,
-/// as it's still seeded from real entropy, and the bytes provided will most
-/// likely be mixed with real entropy on the guest as well. '/dev/hwrng' can be
-/// used to pass through a hardware RNG from the host.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
-pub enum QemuConfigRng0Source {
-    #[serde(rename = "/dev/urandom")]
-    /// /dev/urandom.
-    DevUrandom,
-    #[serde(rename = "/dev/random")]
-    /// /dev/random.
-    DevRandom,
-    #[serde(rename = "/dev/hwrng")]
-    /// /dev/hwrng.
-    DevHwrng,
-}
-serde_plain::derive_display_from_serialize!(QemuConfigRng0Source);
-serde_plain::derive_fromstr_from_deserialize!(QemuConfigRng0Source);
-
 const_regex! {
 
 QEMU_CONFIG_SATA_SERIAL_RE = r##"^[-%a-zA-Z0-9_.!~*'()]*$"##;
@@ -8226,6 +8277,88 @@ pub struct QemuConfigVirtio {
     pub werror: Option<PveQmIdeWerror>,
 }
 
+const_regex! {
+
+QEMU_CONFIG_VIRTIOFS_DIRID_RE = r##"^(?i:[a-z][a-z0-9_-]+)$"##;
+
+}
+
+#[api(
+    default_key: "dirid",
+    properties: {
+        cache: {
+            optional: true,
+            type: QemuConfigVirtiofsCache,
+        },
+        "direct-io": {
+            default: false,
+            optional: true,
+        },
+        dirid: {
+            format: &ApiStringFormat::Pattern(&QEMU_CONFIG_VIRTIOFS_DIRID_RE),
+            type: String,
+        },
+        "expose-acl": {
+            default: false,
+            optional: true,
+        },
+        "expose-xattr": {
+            default: false,
+            optional: true,
+        },
+    },
+)]
+/// Object.
+#[derive(Debug, serde::Deserialize, serde::Serialize)]
+pub struct QemuConfigVirtiofs {
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub cache: Option<QemuConfigVirtiofsCache>,
+
+    /// Honor the O_DIRECT flag passed down by guest applications.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "direct-io")]
+    pub direct_io: Option<bool>,
+
+    /// Mapping identifier of the directory mapping to be shared with the guest.
+    /// Also used as a mount tag inside the VM.
+    pub dirid: String,
+
+    /// Enable support for POSIX ACLs (enabled ACL implies xattr) for this
+    /// mount.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "expose-acl")]
+    pub expose_acl: Option<bool>,
+
+    /// Enable support for extended attributes for this mount.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    #[serde(rename = "expose-xattr")]
+    pub expose_xattr: Option<bool>,
+}
+
+#[api]
+/// The caching policy the file system should use (auto, always, metadata,
+/// never).
+#[derive(Clone, Copy, Debug, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
+pub enum QemuConfigVirtiofsCache {
+    #[serde(rename = "auto")]
+    /// auto.
+    Auto,
+    #[serde(rename = "always")]
+    /// always.
+    Always,
+    #[serde(rename = "metadata")]
+    /// metadata.
+    Metadata,
+    #[serde(rename = "never")]
+    /// never.
+    Never,
+}
+serde_plain::derive_display_from_serialize!(QemuConfigVirtiofsCache);
+serde_plain::derive_fromstr_from_deserialize!(QemuConfigVirtiofsCache);
+
 #[api(
     properties: {
         allowed_nodes: {
@@ -8249,6 +8382,11 @@ pub struct QemuConfigVirtio {
             },
             type: Array,
         },
+        "mapped-resource-info": {
+            description: "Object of mapped resources with additional information such if they're live migratable.",
+            properties: {},
+            type: Object,
+        },
         "mapped-resources": {
             items: {
                 description: "A mapped resource",
@@ -8268,22 +8406,27 @@ pub struct QemuConfigVirtio {
 /// Object.
 #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
 pub struct QemuMigratePreconditions {
-    /// List nodes allowed for offline migration, only passed if VM is offline
+    /// List of nodes allowed for migration.
     #[serde(default, skip_serializing_if = "Option::is_none")]
     pub allowed_nodes: Option<Vec<String>>,
 
     /// List local disks including CD-Rom, unused and not referenced disks
     pub local_disks: Vec<QemuMigratePreconditionsLocalDisks>,
 
-    /// List local resources e.g. pci, usb
+    /// List local resources (e.g. pci, usb) that block migration.
     pub local_resources: Vec<String>,
 
-    /// List of mapped resources e.g. pci, usb
+    /// Object of mapped resources with additional information such if they're
+    /// live migratable.
+    #[serde(rename = "mapped-resource-info")]
+    pub mapped_resource_info: serde_json::Value,
+
+    /// List of mapped resources e.g. pci, usb. Deprecated, use
+    /// 'mapped-resource-info' instead.
     #[serde(rename = "mapped-resources")]
     pub mapped_resources: Vec<String>,
 
-    /// List not allowed nodes with additional information, only passed if VM is
-    /// offline
+    /// List of not allowed nodes with additional information.
     #[serde(default, skip_serializing_if = "Option::is_none")]
     pub not_allowed_nodes: Option<QemuMigratePreconditionsNotAllowedNodes>,
 
@@ -8339,8 +8482,7 @@ pub struct QemuMigratePreconditionsLocalDisks {
         },
     },
 )]
-/// List not allowed nodes with additional information, only passed if VM is
-/// offline
+/// List of not allowed nodes with additional information.
 #[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
 pub struct QemuMigratePreconditionsNotAllowedNodes {
     /// A list of not available storages.
@@ -8415,6 +8557,10 @@ pub struct QemuMigratePreconditionsNotAllowedNodes {
             optional: true,
             type: String,
         },
+        serial: {
+            default: false,
+            optional: true,
+        },
         spice: {
             default: false,
             optional: true,
@@ -8533,6 +8679,11 @@ pub struct QemuStatus {
     #[serde(rename = "running-qemu")]
     pub running_qemu: Option<String>,
 
+    /// Guest has serial device configured.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub serial: Option<bool>,
+
     /// QEMU VGA configuration supports spice.
     #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
     #[serde(default, skip_serializing_if = "Option::is_none")]
@@ -9459,6 +9610,10 @@ serde_plain::derive_fromstr_from_deserialize!(VersionResponseConsole);
             optional: true,
             type: String,
         },
+        serial: {
+            default: false,
+            optional: true,
+        },
         status: {
             type: IsRunning,
         },
@@ -9562,6 +9717,11 @@ pub struct VmEntry {
     #[serde(rename = "running-qemu")]
     pub running_qemu: Option<String>,
 
+    /// Guest has serial device configured.
+    #[serde(deserialize_with = "proxmox_login::parse::deserialize_bool")]
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub serial: Option<bool>,
+
     pub status: IsRunning,
 
     /// The current configured tags, if any
-- 
2.39.5





More information about the pdm-devel mailing list