It describes the data structure expected by the low-level-installer. We do this so we can use it in more than the TUI installer, for example the planned auto installer.
Make the members public so we can easily implement a custom From method for each dependent crate. Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> --- proxmox-installer-common/src/setup.rs | 86 +++++++++++++++- proxmox-tui-installer/src/setup.rs | 98 +------------------ .../src/views/install_progress.rs | 4 +- 3 files changed, 90 insertions(+), 98 deletions(-) diff --git a/proxmox-installer-common/src/setup.rs b/proxmox-installer-common/src/setup.rs index 472e1f2..03beb77 100644 --- a/proxmox-installer-common/src/setup.rs +++ b/proxmox-installer-common/src/setup.rs @@ -12,7 +12,10 @@ use std::{ use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use crate::{ - options::{Disk, ZfsBootdiskOptions, ZfsChecksumOption, ZfsCompressOption}, + options::{ + BtrfsRaidLevel, Disk, FsType, ZfsBootdiskOptions, ZfsChecksumOption, ZfsCompressOption, + ZfsRaidLevel, + }, utils::CidrAddress, }; @@ -387,3 +390,84 @@ pub fn spawn_low_level_installer(test_mode: bool) -> io::Result<process::Child> .stdout(Stdio::piped()) .spawn() } + +/// See Proxmox::Install::Config +#[derive(Serialize)] +pub struct InstallConfig { + pub autoreboot: usize, + + #[serde(serialize_with = "serialize_fstype")] + pub filesys: FsType, + pub hdsize: f64, + #[serde(skip_serializing_if = "Option::is_none")] + pub swapsize: Option<f64>, + #[serde(skip_serializing_if = "Option::is_none")] + pub maxroot: Option<f64>, + #[serde(skip_serializing_if = "Option::is_none")] + pub minfree: Option<f64>, + #[serde(skip_serializing_if = "Option::is_none")] + pub maxvz: Option<f64>, + + #[serde(skip_serializing_if = "Option::is_none")] + pub zfs_opts: Option<InstallZfsOption>, + + #[serde( + serialize_with = "serialize_disk_opt", + skip_serializing_if = "Option::is_none" + )] + pub target_hd: Option<Disk>, + #[serde(skip_serializing_if = "HashMap::is_empty")] + pub disk_selection: HashMap<String, String>, + + pub country: String, + pub timezone: String, + pub keymap: String, + + pub password: String, + pub mailto: String, + + pub mngmt_nic: String, + + pub hostname: String, + pub domain: String, + #[serde(serialize_with = "serialize_as_display")] + pub cidr: CidrAddress, + pub gateway: IpAddr, + pub dns: IpAddr, +} + +fn serialize_disk_opt<S>(value: &Option<Disk>, serializer: S) -> Result<S::Ok, S::Error> +where + S: Serializer, +{ + if let Some(disk) = value { + serializer.serialize_str(&disk.path) + } else { + serializer.serialize_none() + } +} + +fn serialize_fstype<S>(value: &FsType, serializer: S) -> Result<S::Ok, S::Error> +where + S: Serializer, +{ + use FsType::*; + let value = match value { + // proxinstall::$fssetup + Ext4 => "ext4", + Xfs => "xfs", + // proxinstall::get_zfs_raid_setup() + Zfs(ZfsRaidLevel::Raid0) => "zfs (RAID0)", + Zfs(ZfsRaidLevel::Raid1) => "zfs (RAID1)", + Zfs(ZfsRaidLevel::Raid10) => "zfs (RAID10)", + Zfs(ZfsRaidLevel::RaidZ) => "zfs (RAIDZ-1)", + Zfs(ZfsRaidLevel::RaidZ2) => "zfs (RAIDZ-2)", + Zfs(ZfsRaidLevel::RaidZ3) => "zfs (RAIDZ-3)", + // proxinstall::get_btrfs_raid_setup() + Btrfs(BtrfsRaidLevel::Raid0) => "btrfs (RAID0)", + Btrfs(BtrfsRaidLevel::Raid1) => "btrfs (RAID1)", + Btrfs(BtrfsRaidLevel::Raid10) => "btrfs (RAID10)", + }; + + serializer.collect_str(value) +} diff --git a/proxmox-tui-installer/src/setup.rs b/proxmox-tui-installer/src/setup.rs index 79421d7..e816c12 100644 --- a/proxmox-tui-installer/src/setup.rs +++ b/proxmox-tui-installer/src/setup.rs @@ -1,59 +1,11 @@ -use std::{collections::HashMap, fmt, net::IpAddr}; - -use serde::{Serialize, Serializer}; +use std::collections::HashMap; use crate::options::InstallerOptions; use proxmox_installer_common::{ - options::{AdvancedBootdiskOptions, BtrfsRaidLevel, Disk, FsType, ZfsRaidLevel}, - setup::InstallZfsOption, - utils::CidrAddress, + options::AdvancedBootdiskOptions, + setup::InstallConfig, }; -/// See Proxmox::Install::Config -#[derive(Serialize)] -pub struct InstallConfig { - autoreboot: usize, - - #[serde(serialize_with = "serialize_fstype")] - filesys: FsType, - hdsize: f64, - #[serde(skip_serializing_if = "Option::is_none")] - swapsize: Option<f64>, - #[serde(skip_serializing_if = "Option::is_none")] - maxroot: Option<f64>, - #[serde(skip_serializing_if = "Option::is_none")] - minfree: Option<f64>, - #[serde(skip_serializing_if = "Option::is_none")] - maxvz: Option<f64>, - - #[serde(skip_serializing_if = "Option::is_none")] - zfs_opts: Option<InstallZfsOption>, - - #[serde( - serialize_with = "serialize_disk_opt", - skip_serializing_if = "Option::is_none" - )] - target_hd: Option<Disk>, - #[serde(skip_serializing_if = "HashMap::is_empty")] - disk_selection: HashMap<String, String>, - - country: String, - timezone: String, - keymap: String, - - password: String, - mailto: String, - - mngmt_nic: String, - - hostname: String, - domain: String, - #[serde(serialize_with = "serialize_as_display")] - cidr: CidrAddress, - gateway: IpAddr, - dns: IpAddr, -} - impl From<InstallerOptions> for InstallConfig { fn from(options: InstallerOptions) -> Self { let mut config = Self { @@ -121,47 +73,3 @@ impl From<InstallerOptions> for InstallConfig { config } } - -fn serialize_disk_opt<S>(value: &Option<Disk>, serializer: S) -> Result<S::Ok, S::Error> -where - S: Serializer, -{ - if let Some(disk) = value { - serializer.serialize_str(&disk.path) - } else { - serializer.serialize_none() - } -} - -fn serialize_fstype<S>(value: &FsType, serializer: S) -> Result<S::Ok, S::Error> -where - S: Serializer, -{ - use FsType::*; - let value = match value { - // proxinstall::$fssetup - Ext4 => "ext4", - Xfs => "xfs", - // proxinstall::get_zfs_raid_setup() - Zfs(ZfsRaidLevel::Raid0) => "zfs (RAID0)", - Zfs(ZfsRaidLevel::Raid1) => "zfs (RAID1)", - Zfs(ZfsRaidLevel::Raid10) => "zfs (RAID10)", - Zfs(ZfsRaidLevel::RaidZ) => "zfs (RAIDZ-1)", - Zfs(ZfsRaidLevel::RaidZ2) => "zfs (RAIDZ-2)", - Zfs(ZfsRaidLevel::RaidZ3) => "zfs (RAIDZ-3)", - // proxinstall::get_btrfs_raid_setup() - Btrfs(BtrfsRaidLevel::Raid0) => "btrfs (RAID0)", - Btrfs(BtrfsRaidLevel::Raid1) => "btrfs (RAID1)", - Btrfs(BtrfsRaidLevel::Raid10) => "btrfs (RAID10)", - }; - - serializer.collect_str(value) -} - -fn serialize_as_display<S, T>(value: &T, serializer: S) -> Result<S::Ok, S::Error> -where - S: Serializer, - T: fmt::Display, -{ - serializer.collect_str(value) -} diff --git a/proxmox-tui-installer/src/views/install_progress.rs b/proxmox-tui-installer/src/views/install_progress.rs index 4626fe4..409c31a 100644 --- a/proxmox-tui-installer/src/views/install_progress.rs +++ b/proxmox-tui-installer/src/views/install_progress.rs @@ -12,8 +12,8 @@ use std::{ time::Duration, }; -use crate::{abort_install_button, prompt_dialog, setup::InstallConfig, InstallerState}; -use proxmox_installer_common::setup::spawn_low_level_installer; +use crate::{abort_install_button, prompt_dialog, InstallerState}; +use proxmox_installer_common::setup::{InstallConfig, spawn_low_level_installer}; pub struct InstallProgressView { view: PaddedView<LinearLayout>, -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel