all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: Christoph Heiss <c.heiss@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: [pdm-devel] [PATCH proxmox v2 05/14] installer-types: add common types used by the installer
Date: Fri,  5 Dec 2025 12:25:07 +0100	[thread overview]
Message-ID: <20251205112528.373387-6-c.heiss@proxmox.com> (raw)
In-Reply-To: <20251205112528.373387-1-c.heiss@proxmox.com>

These moves common type definitions used throughout in the installer in
it's own crate, so they can be re-used in other places.

Some types are also renamed to improve clarity:

- `NetdevWithMac` -> `NetworkInterface`
- `SysInfo` -> `SystemInfo`

Signed-off-by: Christoph Heiss <c.heiss@proxmox.com>
---
Changes v1 -> v2:
  * no changes

 Cargo.toml                                   |   1 +
 proxmox-installer-types/Cargo.toml           |  21 +++
 proxmox-installer-types/debian/changelog     |   5 +
 proxmox-installer-types/debian/control       |  44 ++++++
 proxmox-installer-types/debian/debcargo.toml |   7 +
 proxmox-installer-types/src/lib.rs           | 143 +++++++++++++++++++
 6 files changed, 221 insertions(+)
 create mode 100644 proxmox-installer-types/Cargo.toml
 create mode 100644 proxmox-installer-types/debian/changelog
 create mode 100644 proxmox-installer-types/debian/control
 create mode 100644 proxmox-installer-types/debian/debcargo.toml
 create mode 100644 proxmox-installer-types/src/lib.rs

diff --git a/Cargo.toml b/Cargo.toml
index 27a69afa..2df50903 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -21,6 +21,7 @@ members = [
     "proxmox-http",
     "proxmox-http-error",
     "proxmox-human-byte",
+    "proxmox-installer-types",
     "proxmox-io",
     "proxmox-lang",
     "proxmox-ldap",
diff --git a/proxmox-installer-types/Cargo.toml b/proxmox-installer-types/Cargo.toml
new file mode 100644
index 00000000..62df7f4e
--- /dev/null
+++ b/proxmox-installer-types/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "proxmox-installer-types"
+description = "Type definitions used within the installer"
+version = "0.1.0"
+
+authors.workspace = true
+edition.workspace = true
+license.workspace = true
+repository.workspace = true
+homepage.workspace = true
+exclude.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+serde = { workspace = true, features = ["derive"] }
+serde_plain.workspace = true
+proxmox-network-types.workspace = true
+
+[features]
+default = []
+legacy = []
diff --git a/proxmox-installer-types/debian/changelog b/proxmox-installer-types/debian/changelog
new file mode 100644
index 00000000..d2415aa0
--- /dev/null
+++ b/proxmox-installer-types/debian/changelog
@@ -0,0 +1,5 @@
+rust-proxmox-installer-types (0.1.0-1) unstable; urgency=medium
+
+  * Initial release.
+
+ -- Proxmox Support Team <support@proxmox.com>  Tue, 25 Nov 2025 10:23:32 +0200
diff --git a/proxmox-installer-types/debian/control b/proxmox-installer-types/debian/control
new file mode 100644
index 00000000..902977af
--- /dev/null
+++ b/proxmox-installer-types/debian/control
@@ -0,0 +1,44 @@
+Source: rust-proxmox-installer-types
+Section: rust
+Priority: optional
+Build-Depends: debhelper-compat (= 13),
+ dh-sequence-cargo
+Build-Depends-Arch: cargo:native <!nocheck>,
+ rustc:native (>= 1.82) <!nocheck>,
+ libstd-rust-dev <!nocheck>,
+ librust-proxmox-network-types-0.1+api-types-dev <!nocheck>,
+ librust-proxmox-network-types-0.1+default-dev <!nocheck>,
+ librust-serde-1+default-dev <!nocheck>,
+ librust-serde-1+derive-dev <!nocheck>,
+ librust-serde-plain-1+default-dev <!nocheck>
+Maintainer: Proxmox Support Team <support@proxmox.com>
+Standards-Version: 4.7.2
+Vcs-Git: git://git.proxmox.com/git/proxmox.git
+Vcs-Browser: https://git.proxmox.com/?p=proxmox.git
+Homepage: https://proxmox.com
+X-Cargo-Crate: proxmox-installer-types
+
+Package: librust-proxmox-installer-types-dev
+Architecture: any
+Multi-Arch: same
+Depends:
+ ${misc:Depends},
+ librust-proxmox-network-types-0.1+api-types-dev,
+ librust-proxmox-network-types-0.1+default-dev,
+ librust-serde-1+default-dev,
+ librust-serde-1+derive-dev,
+ librust-serde-plain-1+default-dev
+Provides:
+ librust-proxmox-installer-types+default-dev (= ${binary:Version}),
+ librust-proxmox-installer-types+legacy-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0+default-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0+legacy-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1+default-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1+legacy-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1.0-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1.0+default-dev (= ${binary:Version}),
+ librust-proxmox-installer-types-0.1.0+legacy-dev (= ${binary:Version})
+Description: Type definitions used within the installer - Rust source code
+ Source code for Debianized Rust crate "proxmox-installer-types"
diff --git a/proxmox-installer-types/debian/debcargo.toml b/proxmox-installer-types/debian/debcargo.toml
new file mode 100644
index 00000000..b7864cdb
--- /dev/null
+++ b/proxmox-installer-types/debian/debcargo.toml
@@ -0,0 +1,7 @@
+overlay = "."
+crate_src_path = ".."
+maintainer = "Proxmox Support Team <support@proxmox.com>"
+
+[source]
+vcs_git = "git://git.proxmox.com/git/proxmox.git"
+vcs_browser = "https://git.proxmox.com/?p=proxmox.git"
diff --git a/proxmox-installer-types/src/lib.rs b/proxmox-installer-types/src/lib.rs
new file mode 100644
index 00000000..07927cb0
--- /dev/null
+++ b/proxmox-installer-types/src/lib.rs
@@ -0,0 +1,143 @@
+//! Defines API types used within the installer, primarily for interacting
+//! with proxmox-auto-installer.
+//!
+//! [`BTreeMap`]s are used to store certain properties to keep the order of
+//! them stable, compared to storing them in an ordinary [`HashMap`].
+
+#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
+#![deny(unsafe_code, missing_docs)]
+
+use serde::{Deserialize, Serialize};
+use std::{
+    collections::{BTreeMap, HashMap},
+    fmt::{self, Display},
+};
+
+use proxmox_network_types::mac_address::MacAddress;
+
+/// Default placeholder value for the administrator email address.
+pub const EMAIL_DEFAULT_PLACEHOLDER: &str = "mail@example.invalid";
+
+#[derive(Copy, Clone, Eq, Deserialize, PartialEq, Serialize)]
+#[serde(rename_all = "lowercase")]
+/// Whether the system boots using legacy BIOS or (U)EFI.
+pub enum BootType {
+    /// System boots using legacy BIOS.
+    Bios,
+    /// System boots using (U)EFI.
+    Efi,
+}
+
+/// Uses a BTreeMap to have the keys sorted
+pub type UdevProperties = BTreeMap<String, String>;
+
+#[derive(Clone, Deserialize, Debug)]
+/// Information extracted from udev about devices present in the system.
+pub struct UdevInfo {
+    /// udev information for each disk.
+    pub disks: BTreeMap<String, UdevProperties>,
+    /// udev information for each network interface card.
+    pub nics: BTreeMap<String, UdevProperties>,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// Information about the hardware and installer in use.
+pub struct SystemInfo {
+    /// Information about the product to be installed.
+    pub product: ProductConfig,
+    /// Information about the ISO.
+    pub iso: IsoInfo,
+    /// Raw DMI information of the system.
+    pub dmi: SystemDMI,
+    /// Network devices present on the system.
+    pub network_interfaces: Vec<NetworkInterface>,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// The per-product configuration of the installer.
+pub struct ProductConfig {
+    /// Full name of the product.
+    pub fullname: String,
+    /// The actual product the installer is for.
+    pub product: ProxmoxProduct,
+    /// Whether to enable installations on Btrfs.
+    pub enable_btrfs: bool,
+}
+
+impl ProductConfig {
+    /// A mocked ProductConfig simulating a Proxmox VE environment.
+    pub fn mocked() -> Self {
+        Self {
+            fullname: String::from("Proxmox VE (mocked)"),
+            product: ProxmoxProduct::PVE,
+            enable_btrfs: true,
+        }
+    }
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// Information about the ISO itself.
+pub struct IsoInfo {
+    /// Version of the product.
+    pub release: String,
+    /// Version of the ISO itself, e.g. the spin.
+    pub isorelease: String,
+}
+
+impl IsoInfo {
+    /// A mocked IsoInfo with some edge case to convey that this is not necessarily purely numeric.
+    pub fn mocked() -> Self {
+        Self {
+            release: String::from("42.1"),
+            isorelease: String::from("mocked-1"),
+        }
+    }
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// Collection of various DMI information categories.
+pub struct SystemDMI {
+    /// Information about the system baseboard.
+    pub baseboard: HashMap<String, String>,
+    /// Information about the system chassis.
+    pub chassis: HashMap<String, String>,
+    /// Information about the hardware itself, mostly identifiers.
+    pub system: HashMap<String, String>,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// A unique network interface.
+pub struct NetworkInterface {
+    /// The network link name
+    pub link: String,
+    /// The MAC address of the network device
+    pub mac: MacAddress,
+}
+
+#[allow(clippy::upper_case_acronyms)]
+#[derive(Debug, Clone, Copy, Deserialize, PartialEq, Serialize)]
+#[serde(rename_all = "lowercase")]
+/// The name of the product.
+pub enum ProxmoxProduct {
+    /// Proxmox Virtual Environment
+    PVE,
+    /// Proxmox Backup Server
+    PBS,
+    /// Proxmox Mail Gateway
+    PMG,
+    /// Proxmox Datacenter Manager
+    PDM,
+}
+
+serde_plain::derive_fromstr_from_deserialize!(ProxmoxProduct);
+
+impl Display for ProxmoxProduct {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match self {
+            Self::PVE => write!(f, "Proxmox Virtualization Environment"),
+            Self::PBS => write!(f, "Proxmox Backup Server"),
+            Self::PMG => write!(f, "Proxmox Mail Gateway"),
+            Self::PDM => write!(f, "Proxmox Datacenter Manager"),
+        }
+    }
+}
-- 
2.51.2



_______________________________________________
pdm-devel mailing list
pdm-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel


  parent reply	other threads:[~2025-12-05 11:25 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-05 11:25 [pdm-devel] [PATCH proxmox/datacenter-manager v2 00/14] initial auto-installer integration Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 01/14] api-macro: allow $ in identifier name Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 02/14] network-types: move `Fqdn` type from proxmox-installer-common Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 03/14] network-types: implement api type for Fqdn Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 04/14] network-types: add api wrapper type for std::net::IpAddr Christoph Heiss
2025-12-05 11:25 ` Christoph Heiss [this message]
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 06/14] installer-types: add types used by the auto-installer Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH proxmox v2 07/14] installer-types: implement api type for all externally-used types Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 08/14] api-types: add api types for auto-installer integration Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 09/14] config: add auto-installer configuration module Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 10/14] acl: wire up new /system/auto-installation acl path Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 11/14] server: api: add auto-installer integration module Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 12/14] ui: auto-installer: add installations overview panel Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 13/14] ui: auto-installer: add prepared answer configuration panel Christoph Heiss
2025-12-05 11:25 ` [pdm-devel] [PATCH datacenter-manager v2 14/14] docs: add documentation for auto-installer integration Christoph Heiss
2025-12-05 11:53 ` [pdm-devel] [PATCH proxmox/datacenter-manager v2 00/14] initial " Thomas Lamprecht
2025-12-05 15:50   ` Christoph Heiss
2025-12-05 15:57     ` Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251205112528.373387-6-c.heiss@proxmox.com \
    --to=c.heiss@proxmox.com \
    --cc=pdm-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal