all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config
@ 2025-12-02 11:13 Dominik Csapak
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating Dominik Csapak
                   ` (4 more replies)
  0 siblings, 5 replies; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

This adds some functionality so we can easily version guard specific features
for a pve node version.

Currently this is done for:
* env/entrypoint options for lxc
* intel-tdx options for qemu

We reuse the cached update information here, but we can easily change that out
if we want/need to.

changes from v1:
* use 'proxmox_deb_version::Version' instead of just cmp_version
  (this makes the code a bit nicer)
* drop unrelated patch (was accidentally sent in v1)

proxmox-yew-comp:

Dominik Csapak (2):
  pve: qemu: options/hardware: prepare and use version feature gating
  pve: lxc panels: prepare/add version feature gating

 Cargo.toml                                    |  1 +
 src/configuration/pve/lxc_dns_panel.rs        |  6 ++++
 src/configuration/pve/lxc_network_panel.rs    |  6 ++++
 src/configuration/pve/lxc_options_panel.rs    | 32 ++++++++++++++++---
 .../pve/lxc_resources_panel/mod.rs            |  6 ++++
 .../pve/qemu_hardware_panel/mod.rs            |  6 ++++
 src/configuration/pve/qemu_options_panel.rs   | 32 ++++++++++++++++---
 src/form/pve/lxc_property/mod.rs              | 11 +++++++
 src/form/pve/mod.rs                           | 10 +++---
 9 files changed, 96 insertions(+), 14 deletions(-)


proxmxo-datacenter-manager:

Dominik Csapak (3):
  lib/server: pve: add api call to get the cached version info from
    remotes
  ui: pve: qemu: load and pass the pve-manager version to panels
  ui: pve: lxc: pass the pve-manager version to panels

 lib/pdm-client/src/lib.rs    |  6 ++++
 server/src/api/pve/mod.rs    | 21 ++++++++++++
 server/src/remote_updates.rs | 22 ++++++++++++-
 ui/src/lib.rs                | 17 ++++++++++
 ui/src/pve/lxc/mod.rs        | 16 +++++++--
 ui/src/pve/mod.rs            | 63 ++++++++++++++++++++++++------------
 ui/src/pve/qemu/mod.rs       | 13 ++++++--
 7 files changed, 133 insertions(+), 25 deletions(-)


Summary over all repositories:
  16 files changed, 229 insertions(+), 39 deletions(-)

-- 
Generated by git-murpp 0.8.1


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating
  2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
@ 2025-12-02 11:13 ` Dominik Csapak
  2025-12-02 12:16   ` [pdm-devel] applied: " Thomas Lamprecht
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add " Dominik Csapak
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

use the pve-manager version to feature gate the intel-tdx property for
now, but also prepare the hardware panel so we can already start passing
the version to it. If we need it there, we already have it then.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 Cargo.toml                                    |  1 +
 .../pve/qemu_hardware_panel/mod.rs            |  6 ++++
 src/configuration/pve/qemu_options_panel.rs   | 32 ++++++++++++++++---
 3 files changed, 34 insertions(+), 5 deletions(-)

diff --git a/Cargo.toml b/Cargo.toml
index 622bb09..600fafa 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -88,6 +88,7 @@ proxmox-node-status = { version = "1", features = [] }
 
 pve-api-types = "8.1.2"
 pbs-api-types = "1"
+proxmox-deb-version = "0.1.0"
 
 [features]
 default = []
diff --git a/src/configuration/pve/qemu_hardware_panel/mod.rs b/src/configuration/pve/qemu_hardware_panel/mod.rs
index 38bc6fd..03ec910 100644
--- a/src/configuration/pve/qemu_hardware_panel/mod.rs
+++ b/src/configuration/pve/qemu_hardware_panel/mod.rs
@@ -13,6 +13,7 @@ use pve_api_types::QemuConfig;
 use yew::html::{IntoEventCallback, IntoPropValue};
 use yew::virtual_dom::{VComp, VNode};
 
+use proxmox_deb_version::Version;
 use pwt::prelude::*;
 use pwt::props::SubmitCallback;
 use pwt_macros::builder;
@@ -38,6 +39,11 @@ pub struct QemuHardwarePanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries.
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
diff --git a/src/configuration/pve/qemu_options_panel.rs b/src/configuration/pve/qemu_options_panel.rs
index 4843ed9..be91e44 100644
--- a/src/configuration/pve/qemu_options_panel.rs
+++ b/src/configuration/pve/qemu_options_panel.rs
@@ -13,16 +13,25 @@ use crate::pending_property_view::{pending_typed_load, PendingPropertyGrid, Pend
 use crate::EditableProperty;
 use crate::{http_put, percent_encoding::percent_encode_component};
 
+use proxmox_deb_version::Version;
 use pve_api_types::QemuConfig;
 
 use pwt_macros::builder;
 
+// newest known pve-manager version we care for
+const NEWEST_KNOWN_VERSION: &str = "9.1.2";
+
 #[derive(Clone, PartialEq, Properties)]
 #[builder]
 pub struct QemuOptionsPanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
@@ -52,8 +61,13 @@ pub struct PveQemuOptionsPanel {
     properties: Rc<Vec<EditableProperty>>,
 }
 
-fn properties(node: &str, vmid: u32, mobile: bool) -> Vec<EditableProperty> {
-    vec![
+fn properties(
+    node: &str,
+    vmid: u32,
+    pve_manager_version: Option<Version>,
+    mobile: bool,
+) -> Vec<EditableProperty> {
+    let mut properties = vec![
         crate::form::pve::qemu_name_property(vmid, mobile),
         crate::form::pve::qemu_onboot_property(mobile),
         crate::form::pve::qemu_startup_property(mobile),
@@ -72,8 +86,15 @@ fn properties(node: &str, vmid: u32, mobile: bool) -> Vec<EditableProperty> {
         crate::form::pve::qemu_spice_enhancement_property(mobile),
         crate::form::pve::qemu_vmstatestorage_property(node, mobile),
         crate::form::pve::qemu_amd_sev_property(mobile),
-        crate::form::pve::qemu_intel_tdx_property(mobile),
-    ]
+    ];
+
+    let version = pve_manager_version.unwrap_or(Version::new(NEWEST_KNOWN_VERSION, None));
+
+    if version >= Version::new("9.1", None) {
+        properties.push(crate::form::pve::qemu_intel_tdx_property(mobile));
+    }
+
+    properties
 }
 
 impl Component for PveQemuOptionsPanel {
@@ -82,8 +103,9 @@ impl Component for PveQemuOptionsPanel {
 
     fn create(ctx: &Context<Self>) -> Self {
         let props = ctx.props();
+        let version = props.pve_manager_version.clone();
         Self {
-            properties: Rc::new(properties(&props.node, props.vmid, props.mobile)),
+            properties: Rc::new(properties(&props.node, props.vmid, version, props.mobile)),
         }
     }
 
-- 
2.47.3



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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add version feature gating
  2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating Dominik Csapak
@ 2025-12-02 11:13 ` Dominik Csapak
  2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes Dominik Csapak
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

add the pve-manager version as property to the various lxc panels, and
use it on the options to display the new 'env' and 'entrypoint' options,
analogous to how we do it for the qemu panel.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 src/configuration/pve/lxc_dns_panel.rs        |  6 ++++
 src/configuration/pve/lxc_network_panel.rs    |  6 ++++
 src/configuration/pve/lxc_options_panel.rs    | 32 ++++++++++++++++---
 .../pve/lxc_resources_panel/mod.rs            |  6 ++++
 src/form/pve/lxc_property/mod.rs              | 11 +++++++
 src/form/pve/mod.rs                           | 10 +++---
 6 files changed, 62 insertions(+), 9 deletions(-)

diff --git a/src/configuration/pve/lxc_dns_panel.rs b/src/configuration/pve/lxc_dns_panel.rs
index 303843a..d9bf89c 100644
--- a/src/configuration/pve/lxc_dns_panel.rs
+++ b/src/configuration/pve/lxc_dns_panel.rs
@@ -7,6 +7,7 @@ use serde_json::Value;
 use yew::html::IntoPropValue;
 use yew::virtual_dom::{VComp, VNode};
 
+use proxmox_deb_version::Version;
 use pwt::prelude::*;
 use pwt_macros::builder;
 
@@ -21,6 +22,11 @@ pub struct LxcDnsPanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
diff --git a/src/configuration/pve/lxc_network_panel.rs b/src/configuration/pve/lxc_network_panel.rs
index 613448a..953edba 100644
--- a/src/configuration/pve/lxc_network_panel.rs
+++ b/src/configuration/pve/lxc_network_panel.rs
@@ -12,6 +12,7 @@ use pwt::widget::{Button, Column, Container, Fa, List, ListTile, Toolbar};
 use yew::html::IntoPropValue;
 use yew::virtual_dom::{Key, VComp, VNode};
 
+use proxmox_deb_version::Version;
 use pwt::prelude::*;
 use pwt::props::{ExtractPrimaryKey, SubmitCallback};
 use pwt::state::{Selection, Store};
@@ -32,6 +33,11 @@ pub struct LxcNetworkPanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
diff --git a/src/configuration/pve/lxc_options_panel.rs b/src/configuration/pve/lxc_options_panel.rs
index a2d9760..8669764 100644
--- a/src/configuration/pve/lxc_options_panel.rs
+++ b/src/configuration/pve/lxc_options_panel.rs
@@ -6,6 +6,7 @@ use serde_json::Value;
 use yew::html::IntoPropValue;
 use yew::virtual_dom::{VComp, VNode};
 
+use proxmox_deb_version::Version;
 use pwt::prelude::*;
 
 use crate::configuration::{guest_config_url, guest_pending_url};
@@ -19,12 +20,20 @@ use pve_api_types::LxcConfig;
 
 use pwt_macros::builder;
 
+// newest known pve-manager version we care for
+const NEWEST_KNOWN_VERSION: &str = "9.1.2";
+
 #[derive(Clone, PartialEq, Properties)]
 #[builder]
 pub struct LxcOptionsPanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
@@ -54,8 +63,13 @@ pub struct PveLxcOptionsPanel {
     properties: Rc<Vec<EditableProperty>>,
 }
 
-fn properties(_node: &str, _vmid: u32, mobile: bool) -> Vec<EditableProperty> {
-    vec![
+fn properties(
+    _node: &str,
+    _vmid: u32,
+    pve_manager_version: Option<Version>,
+    mobile: bool,
+) -> Vec<EditableProperty> {
+    let mut properties = vec![
         //crate::form::pve::Lxc_name_property(vmid, mobile),
         crate::form::pve::qemu_onboot_property(mobile),
         crate::form::pve::qemu_startup_property(mobile),
@@ -68,7 +82,16 @@ fn properties(_node: &str, _vmid: u32, mobile: bool) -> Vec<EditableProperty> {
         crate::form::pve::lxc_unpriviledged_property(),
         crate::form::pve::lxc_features_property(mobile),
         crate::form::pve::lxc_hookscript_property(),
-    ]
+    ];
+
+    let version = pve_manager_version.unwrap_or(Version::new(NEWEST_KNOWN_VERSION, None));
+
+    if version >= Version::new("9.1", None) {
+        properties.push(crate::form::pve::lxc_entrypoint_property());
+        properties.push(crate::form::pve::lxc_env_property());
+    }
+
+    properties
 }
 
 impl Component for PveLxcOptionsPanel {
@@ -77,8 +100,9 @@ impl Component for PveLxcOptionsPanel {
 
     fn create(ctx: &Context<Self>) -> Self {
         let props = ctx.props();
+        let version = props.pve_manager_version.clone();
         Self {
-            properties: Rc::new(properties(&props.node, props.vmid, props.mobile)),
+            properties: Rc::new(properties(&props.node, props.vmid, version, props.mobile)),
         }
     }
 
diff --git a/src/configuration/pve/lxc_resources_panel/mod.rs b/src/configuration/pve/lxc_resources_panel/mod.rs
index 54e66aa..ecc9861 100644
--- a/src/configuration/pve/lxc_resources_panel/mod.rs
+++ b/src/configuration/pve/lxc_resources_panel/mod.rs
@@ -12,6 +12,7 @@ use yew::virtual_dom::{VComp, VNode};
 
 use pve_api_types::LxcConfig;
 
+use proxmox_deb_version::Version;
 use pwt::prelude::*;
 use pwt::props::SubmitCallback;
 use pwt_macros::builder;
@@ -35,6 +36,11 @@ pub struct LxcResourcesPanel {
     vmid: u32,
     node: AttrValue,
 
+    #[prop_or_default]
+    #[builder(IntoPropValue, into_prop_value)]
+    /// The nodes pve-manager version, used to feature gate some entries
+    pve_manager_version: Option<Version>,
+
     /// Use Proxmox Datacenter Manager API endpoints
     #[builder(IntoPropValue, into_prop_value)]
     #[prop_or_default]
diff --git a/src/form/pve/lxc_property/mod.rs b/src/form/pve/lxc_property/mod.rs
index 2864359..54d175d 100644
--- a/src/form/pve/lxc_property/mod.rs
+++ b/src/form/pve/lxc_property/mod.rs
@@ -119,6 +119,17 @@ pub fn lxc_hookscript_property() -> EditableProperty {
     EditableProperty::new("hookscript", tr!("Hookscript"))
 }
 
+pub fn lxc_entrypoint_property() -> EditableProperty {
+    EditableProperty::new("entrypoint", tr!("Entrypoint"))
+}
+
+pub fn lxc_env_property() -> EditableProperty {
+    EditableProperty::new("env", tr!("Environment")).renderer(|_name, value, _data| match value {
+        Value::String(env) => env.split('\0').collect::<Vec<_>>().join(" ").into(),
+        _ => value.into(),
+    })
+}
+
 pub fn lxc_tty_count_property(mobile: bool) -> EditableProperty {
     let title = tr!("TTY count");
     EditableProperty::new("tty", title.clone())
diff --git a/src/form/pve/mod.rs b/src/form/pve/mod.rs
index fc0e2c5..0be5e6f 100644
--- a/src/form/pve/mod.rs
+++ b/src/form/pve/mod.rs
@@ -54,11 +54,11 @@ pub use lxc_mount_options_selector::LxcMountOptionsSelector;
 mod lxc_property;
 pub use lxc_property::{
     extract_used_mount_points, first_unused_mount_point, lxc_architecture_property,
-    lxc_console_mode_property, lxc_console_property, lxc_cores_property, lxc_features_property,
-    lxc_hookscript_property, lxc_hostname_property, lxc_memory_property, lxc_mount_point_property,
-    lxc_nameserver_property, lxc_network_property, lxc_ostype_property, lxc_rootfs_property,
-    lxc_searchdomain_property, lxc_swap_property, lxc_tty_count_property,
-    lxc_unpriviledged_property, lxc_unused_volume_property,
+    lxc_console_mode_property, lxc_console_property, lxc_cores_property, lxc_entrypoint_property,
+    lxc_env_property, lxc_features_property, lxc_hookscript_property, lxc_hostname_property,
+    lxc_memory_property, lxc_mount_point_property, lxc_nameserver_property, lxc_network_property,
+    lxc_ostype_property, lxc_rootfs_property, lxc_searchdomain_property, lxc_swap_property,
+    lxc_tty_count_property, lxc_unpriviledged_property, lxc_unused_volume_property,
 };
 
 mod qemu_property;
-- 
2.47.3



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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes
  2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating Dominik Csapak
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add " Dominik Csapak
@ 2025-12-02 11:13 ` Dominik Csapak
  2025-12-02 11:46   ` Thomas Lamprecht
  2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels Dominik Csapak
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 3/3] ui: pve: lxc: " Dominik Csapak
  4 siblings, 2 replies; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

this is useful when we e.g. want to feature gate some things in the ui.
This way we don't have to get the whole update information for all
remotes, and we don't have to query all nodes of the remotes for their
versions.

Should we need it in the future, we can do the analagous api call for
pbs too.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 lib/pdm-client/src/lib.rs    |  6 ++++++
 server/src/api/pve/mod.rs    | 21 +++++++++++++++++++++
 server/src/remote_updates.rs | 22 +++++++++++++++++++++-
 3 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/lib/pdm-client/src/lib.rs b/lib/pdm-client/src/lib.rs
index 11bedb64..f8d6062a 100644
--- a/lib/pdm-client/src/lib.rs
+++ b/lib/pdm-client/src/lib.rs
@@ -3,6 +3,7 @@
 use std::collections::HashMap;
 use std::time::Duration;
 
+use pdm_api_types::remote_updates::RemoteUpdateSummary;
 use pdm_api_types::remotes::{RemoteType, TlsProbeOutcome};
 use pdm_api_types::resource::{PveResource, RemoteResources, ResourceType, TopEntities};
 use pdm_api_types::rrddata::{
@@ -554,6 +555,11 @@ impl<T: HttpApiClient> PdmClient<T> {
         Ok(self.0.get(&query).await?.expect_json()?.data)
     }
 
+    pub async fn pve_cluster_updates(&self, remote: &str) -> Result<RemoteUpdateSummary, Error> {
+        let url = format!("/api2/extjs/pve/remotes/{remote}/updates");
+        Ok(self.0.get(&url).await?.expect_json()?.data)
+    }
+
     pub async fn pve_cluster_status(
         &self,
         remote: &str,
diff --git a/server/src/api/pve/mod.rs b/server/src/api/pve/mod.rs
index 310c6d08..97dc3970 100644
--- a/server/src/api/pve/mod.rs
+++ b/server/src/api/pve/mod.rs
@@ -13,6 +13,7 @@ use proxmox_schema::property_string::PropertyString;
 use proxmox_section_config::typed::SectionConfigData;
 use proxmox_sortable_macro::sortable;
 
+use pdm_api_types::remote_updates::RemoteUpdateSummary;
 use pdm_api_types::remotes::{
     NodeUrl, Remote, RemoteListEntry, RemoteType, TlsProbeOutcome, REMOTE_ID_SCHEMA,
 };
@@ -32,6 +33,7 @@ use super::resources::{map_pve_lxc, map_pve_node, map_pve_qemu, map_pve_storage}
 use crate::connection::PveClient;
 use crate::connection::{self, probe_tls_connection};
 use crate::remote_tasks;
+use crate::remote_updates::get_available_updates_for_remote;
 
 mod firewall;
 mod lxc;
@@ -75,6 +77,7 @@ const REMOTE_SUBDIRS: SubdirMap = &sorted!([
     ("resources", &RESOURCES_ROUTER),
     ("cluster-status", &STATUS_ROUTER),
     ("tasks", &tasks::ROUTER),
+    ("updates", &Router::new().get(&API_METHOD_GET_UPDATES)),
 ]);
 
 const NODES_ROUTER: Router = Router::new()
@@ -530,3 +533,21 @@ pub async fn get_options(remote: String) -> Result<serde_json::Value, Error> {
 
     Ok(options)
 }
+
+#[api(
+    input: {
+        properties: {
+            remote: { schema: REMOTE_ID_SCHEMA },
+        },
+    },
+    access: {
+        // correct permission?
+        permission: &Permission::Privilege(&["resource", "{remote}"], PRIV_RESOURCE_AUDIT, false),
+    },
+)]
+/// Return the cached update information about a remote.
+pub fn get_updates(remote: String) -> Result<RemoteUpdateSummary, Error> {
+    let update_summary = get_available_updates_for_remote(&remote)?;
+
+    Ok(update_summary)
+}
diff --git a/server/src/remote_updates.rs b/server/src/remote_updates.rs
index 7e57b56e..e772eef5 100644
--- a/server/src/remote_updates.rs
+++ b/server/src/remote_updates.rs
@@ -1,7 +1,7 @@
 use std::fs::File;
 use std::io::ErrorKind;
 
-use anyhow::Error;
+use anyhow::{bail, Error};
 use serde::{Deserialize, Serialize};
 
 use proxmox_apt_api_types::{APTRepositoriesResult, APTRepositoryHandle, APTUpdateInfo};
@@ -136,6 +136,26 @@ pub fn get_available_updates_summary() -> Result<UpdateSummary, Error> {
     Ok(summary)
 }
 
+/// Return cached update information from specific remote
+pub fn get_available_updates_for_remote(remote: &str) -> Result<RemoteUpdateSummary, Error> {
+    let (config, _digest) = pdm_config::remotes::config()?;
+
+    if let Some(remote) = config.get(remote) {
+        let cache_content = get_cached_summary_or_default()?;
+        Ok(cache_content
+            .remotes
+            .get(&remote.id)
+            .cloned()
+            .unwrap_or_else(|| RemoteUpdateSummary {
+                nodes: NodeUpdateSummaryWrapper::default(),
+                remote_type: remote.ty,
+                status: RemoteUpdateStatus::Unknown,
+            }))
+    } else {
+        bail!("no such remote '{remote}'");
+    }
+}
+
 fn get_cached_summary_or_default() -> Result<UpdateSummary, Error> {
     match File::open(UPDATE_CACHE) {
         Ok(file) => {
-- 
2.47.3



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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels
  2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
                   ` (2 preceding siblings ...)
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes Dominik Csapak
@ 2025-12-02 11:13 ` Dominik Csapak
  2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 3/3] ui: pve: lxc: " Dominik Csapak
  4 siblings, 1 reply; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

this loads the cached update information when updating the resources
list and passes the pve-manager version to the qemu panels.

These can use that information to feature gate some information or
functionality.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 ui/src/lib.rs          | 17 +++++++++++++
 ui/src/pve/mod.rs      | 55 +++++++++++++++++++++++++++---------------
 ui/src/pve/qemu/mod.rs | 13 ++++++++--
 3 files changed, 64 insertions(+), 21 deletions(-)

diff --git a/ui/src/lib.rs b/ui/src/lib.rs
index cf05c04d..31068ab1 100644
--- a/ui/src/lib.rs
+++ b/ui/src/lib.rs
@@ -1,7 +1,9 @@
 use js_sys::{Array, JsString, Object};
+use pdm_api_types::remote_updates::RemoteUpdateSummary;
 use pdm_api_types::remotes::RemoteType;
 use pdm_api_types::resource::{PveLxcResource, PveQemuResource};
 use pdm_client::types::Resource;
+use proxmox_deb_version::Version;
 use serde::{Deserialize, Serialize};
 use serde_json::Value;
 
@@ -241,3 +243,18 @@ pub async fn check_subscription() -> bool {
     let data: Result<Value, _> = http_get("/nodes/localhost/subscription", None).await;
     proxmox_yew_comp::subscription_is_active(&Some(data))
 }
+
+/// Extract the version of a specific package from `RemoteUpdateSummary` for a specific node
+pub fn extract_package_version(
+    updates: &RemoteUpdateSummary,
+    node: &str,
+    package_name: &str,
+) -> Option<Version> {
+    let entry = updates.nodes.get(node)?;
+    let version = entry
+        .versions
+        .iter()
+        .find_map(|package| (package.package == package_name).then_some(package.version.clone()))?;
+
+    version.parse().ok()
+}
diff --git a/ui/src/pve/mod.rs b/ui/src/pve/mod.rs
index 73632cd5..6ec323e5 100644
--- a/ui/src/pve/mod.rs
+++ b/ui/src/pve/mod.rs
@@ -18,9 +18,12 @@ use proxmox_yew_comp::{LoadableComponent, LoadableComponentContext, LoadableComp
 
 use proxmox_client::Error;
 
-use pdm_api_types::resource::{PveResource, ResourceType};
+use pdm_api_types::{
+    remote_updates::RemoteUpdateSummary,
+    resource::{PveResource, ResourceType},
+};
 
-use crate::get_deep_url;
+use crate::{extract_package_version, get_deep_url, LoadResult};
 
 pub mod lxc;
 pub mod node;
@@ -131,13 +134,17 @@ impl GuestInfo {
 
 pub enum Msg {
     SelectedView(tree::PveTreeNode),
-    ResourcesList(Result<Vec<PveResource>, Error>),
+    LoadFinished(
+        Result<Vec<PveResource>, Error>,
+        Result<RemoteUpdateSummary, Error>,
+    ),
 }
 
 pub struct PveRemoteComp {
     view: tree::PveTreeNode,
     resources: Rc<Vec<PveResource>>,
     last_error: Option<String>,
+    updates: LoadResult<RemoteUpdateSummary, Error>,
 }
 
 impl LoadableComponent for PveRemoteComp {
@@ -151,6 +158,7 @@ impl LoadableComponent for PveRemoteComp {
             view: PveTreeNode::Root,
             resources: Rc::new(Vec::new()),
             last_error: None,
+            updates: LoadResult::new(),
         }
     }
 
@@ -159,17 +167,20 @@ impl LoadableComponent for PveRemoteComp {
             Msg::SelectedView(node) => {
                 self.view = node;
             }
-            Msg::ResourcesList(res) => match res {
-                Ok(res) => {
-                    self.last_error = None;
-                    self.resources = Rc::new(res);
-                }
-                Err(err) => {
-                    self.last_error = Some(err.to_string());
-                    _ctx.link()
-                        .show_error(tr!("Load failed"), err.to_string(), false);
-                }
-            },
+            Msg::LoadFinished(resources, updates) => {
+                match resources {
+                    Ok(res) => {
+                        self.last_error = None;
+                        self.resources = Rc::new(res);
+                    }
+                    Err(err) => {
+                        self.last_error = Some(err.to_string());
+                        _ctx.link()
+                            .show_error(tr!("Load failed"), err.to_string(), false);
+                    }
+                };
+                self.updates.update(updates);
+            }
         }
         true
     }
@@ -185,7 +196,13 @@ impl LoadableComponent for PveRemoteComp {
                 node::PveNodePanel::new(remote.clone(), node.node.clone()).into()
             }
             PveTreeNode::Qemu(qemu) => {
-                qemu::QemuPanel::new(remote.clone(), qemu.node.clone(), qemu.clone()).into()
+                let pve_manager = match &self.updates.data {
+                    Some(updates) => extract_package_version(updates, &qemu.node, "pve-manager"),
+                    None => None,
+                };
+                qemu::QemuPanel::new(remote.clone(), qemu.node.clone(), qemu.clone())
+                    .pve_manager_version(pve_manager)
+                    .into()
             }
             PveTreeNode::Lxc(lxc) => {
                 lxc::LxcPanel::new(remote.clone(), lxc.node.clone(), lxc.clone()).into()
@@ -275,10 +292,10 @@ impl LoadableComponent for PveRemoteComp {
         let link = ctx.link();
         let remote = ctx.props().remote.clone();
         Box::pin(async move {
-            let res = crate::pdm_client()
-                .pve_cluster_resources(&remote, None)
-                .await;
-            link.send_message(Msg::ResourcesList(res));
+            let client = crate::pdm_client();
+            let resources = client.pve_cluster_resources(&remote, None).await;
+            let updates = client.pve_cluster_updates(&remote).await;
+            link.send_message(Msg::LoadFinished(resources, updates));
             Ok(())
         })
     }
diff --git a/ui/src/pve/qemu/mod.rs b/ui/src/pve/qemu/mod.rs
index 562fb563..ceb8cadd 100644
--- a/ui/src/pve/qemu/mod.rs
+++ b/ui/src/pve/qemu/mod.rs
@@ -5,10 +5,11 @@ use std::rc::Rc;
 
 use yew::virtual_dom::{VComp, VNode};
 
-use pwt::prelude::*;
-
+use proxmox_deb_version::Version;
 use pwt::css::FlexFit;
+use pwt::prelude::*;
 use pwt::widget::{Button, Column, Container, Fa, Row, TabBarItem, TabPanel, Tooltip};
+use pwt_macros::builder;
 
 use proxmox_yew_comp::configuration::pve::{QemuHardwarePanel, QemuOptionsPanel};
 
@@ -18,11 +19,17 @@ use crate::pve::utils::render_qemu_name;
 use crate::renderer::render_title_row;
 
 #[derive(Clone, Debug, Properties, PartialEq)]
+#[builder]
 pub struct QemuPanel {
     remote: String,
     node: String,
     info: PveQemuResource,
 
+    #[prop_or_default]
+    #[builder]
+    /// The nodes pve-manager version, used to feature gate some entries.
+    pve_manager_version: Option<Version>,
+
     #[prop_or(60_000)]
     /// The interval for refreshing the rrd data
     pub rrd_interval: u32,
@@ -107,6 +114,7 @@ impl yew::Component for QemuPanelComp {
                     let remote = props.remote.clone();
                     let node = props.node.clone();
                     let vmid = props.info.vmid;
+                    let pve_manager_version = props.pve_manager_version.clone();
                     move |_| {
                         Container::new()
                             .class(FlexFit)
@@ -127,6 +135,7 @@ impl yew::Component for QemuPanelComp {
                                     .with_child(html! {<hr/>})
                                     .with_child(
                                         QemuOptionsPanel::new(node.clone(), vmid)
+                                            .pve_manager_version(pve_manager_version.clone())
                                             .readonly(true)
                                             .remote(remote.clone()),
                                     ),
-- 
2.47.3



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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 3/3] ui: pve: lxc: pass the pve-manager version to panels
  2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
                   ` (3 preceding siblings ...)
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels Dominik Csapak
@ 2025-12-02 11:13 ` Dominik Csapak
  2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
  4 siblings, 1 reply; 12+ messages in thread
From: Dominik Csapak @ 2025-12-02 11:13 UTC (permalink / raw)
  To: pdm-devel

this will be used by the panels to feature gate by version.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
---
 ui/src/pve/lxc/mod.rs | 16 ++++++++++++++--
 ui/src/pve/mod.rs     |  8 +++++++-
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/ui/src/pve/lxc/mod.rs b/ui/src/pve/lxc/mod.rs
index 7429e07c..949fefb9 100644
--- a/ui/src/pve/lxc/mod.rs
+++ b/ui/src/pve/lxc/mod.rs
@@ -8,10 +8,11 @@ use std::rc::Rc;
 
 use yew::virtual_dom::{VComp, VNode};
 
-use pwt::prelude::*;
-
+use proxmox_deb_version::Version;
 use pwt::css::FlexFit;
+use pwt::prelude::*;
 use pwt::widget::{Button, Column, Container, Fa, Row, TabBarItem, TabPanel, Tooltip};
+use pwt_macros::builder;
 
 use pdm_api_types::resource::PveLxcResource;
 
@@ -19,11 +20,17 @@ use crate::pve::utils::render_lxc_name;
 use crate::renderer::render_title_row;
 
 #[derive(Clone, Debug, Properties, PartialEq)]
+#[builder]
 pub struct LxcPanel {
     remote: String,
     node: String,
     info: PveLxcResource,
 
+    #[prop_or_default]
+    #[builder]
+    /// The nodes pve-manager version, used to feature gate some entries.
+    pve_manager_version: Option<Version>,
+
     #[prop_or(60_000)]
     /// The interval for refreshing the rrd data
     pub rrd_interval: u32,
@@ -108,6 +115,7 @@ impl yew::Component for LxcPanelComp {
                     let remote = props.remote.clone();
                     let node = props.node.clone();
                     let vmid = props.info.vmid;
+                    let pve_manager_version = props.pve_manager_version.clone();
                     move |_| {
                         Container::new()
                             .class(FlexFit)
@@ -119,6 +127,7 @@ impl yew::Component for LxcPanelComp {
                                     .with_child(html! {<hr/>})
                                     .with_child(
                                         LxcResourcesPanel::new(node.clone(), vmid)
+                                            .pve_manager_version(pve_manager_version.clone())
                                             .readonly(true)
                                             .remote(remote.clone()),
                                     )
@@ -128,6 +137,7 @@ impl yew::Component for LxcPanelComp {
                                     .with_child(html! {<hr/>})
                                     .with_child(
                                         LxcNetworkPanel::new(node.clone(), vmid)
+                                            .pve_manager_version(pve_manager_version.clone())
                                             .readonly(true)
                                             .remote(remote.clone()),
                                     )
@@ -135,6 +145,7 @@ impl yew::Component for LxcPanelComp {
                                     .with_child(html! {<hr/>})
                                     .with_child(
                                         LxcDnsPanel::new(node.clone(), vmid)
+                                            .pve_manager_version(pve_manager_version.clone())
                                             .readonly(true)
                                             .remote(remote.clone()),
                                     )
@@ -144,6 +155,7 @@ impl yew::Component for LxcPanelComp {
                                     .with_child(html! {<hr/>})
                                     .with_child(
                                         LxcOptionsPanel::new(node.clone(), vmid)
+                                            .pve_manager_version(pve_manager_version.clone())
                                             .readonly(true)
                                             .remote(remote.clone()),
                                     ),
diff --git a/ui/src/pve/mod.rs b/ui/src/pve/mod.rs
index 6ec323e5..d0d038dd 100644
--- a/ui/src/pve/mod.rs
+++ b/ui/src/pve/mod.rs
@@ -205,7 +205,13 @@ impl LoadableComponent for PveRemoteComp {
                     .into()
             }
             PveTreeNode::Lxc(lxc) => {
-                lxc::LxcPanel::new(remote.clone(), lxc.node.clone(), lxc.clone()).into()
+                let pve_manager = match &self.updates.data {
+                    Some(updates) => extract_package_version(updates, &lxc.node, "pve-manager"),
+                    None => None,
+                };
+                lxc::LxcPanel::new(remote.clone(), lxc.node.clone(), lxc.clone())
+                    .pve_manager_version(pve_manager)
+                    .into()
             }
             PveTreeNode::Storage(storage) => {
                 storage::StoragePanel::new(remote.clone(), storage.node.clone(), storage.clone())
-- 
2.47.3



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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes Dominik Csapak
@ 2025-12-02 11:46   ` Thomas Lamprecht
  2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
  1 sibling, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 11:46 UTC (permalink / raw)
  To: Proxmox Datacenter Manager development discussion, Dominik Csapak

Am 02.12.25 um 12:15 schrieb Dominik Csapak:
> this is useful when we e.g. want to feature gate some things in the ui.
> This way we don't have to get the whole update information for all
> remotes, and we don't have to query all nodes of the remotes for their
> versions.
> 
> Should we need it in the future, we can do the analagous api call for
> pbs too.
> 
> Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
> ---
>  lib/pdm-client/src/lib.rs    |  6 ++++++
>  server/src/api/pve/mod.rs    | 21 +++++++++++++++++++++
>  server/src/remote_updates.rs | 22 +++++++++++++++++++++-
>  3 files changed, 48 insertions(+), 1 deletion(-)
> 
> diff --git a/lib/pdm-client/src/lib.rs b/lib/pdm-client/src/lib.rs
> index 11bedb64..f8d6062a 100644
> --- a/lib/pdm-client/src/lib.rs
> +++ b/lib/pdm-client/src/lib.rs
> @@ -3,6 +3,7 @@
>  use std::collections::HashMap;
>  use std::time::Duration;
>  
> +use pdm_api_types::remote_updates::RemoteUpdateSummary;
>  use pdm_api_types::remotes::{RemoteType, TlsProbeOutcome};
>  use pdm_api_types::resource::{PveResource, RemoteResources, ResourceType, TopEntities};
>  use pdm_api_types::rrddata::{
> @@ -554,6 +555,11 @@ impl<T: HttpApiClient> PdmClient<T> {
>          Ok(self.0.get(&query).await?.expect_json()?.data)
>      }
>  
> +    pub async fn pve_cluster_updates(&self, remote: &str) -> Result<RemoteUpdateSummary, Error> {
> +        let url = format!("/api2/extjs/pve/remotes/{remote}/updates");

Hmm, wondering if we should expose the top-level /version API endpoint [0]
for such things, as that uses only "compiled"-in constants when returning,
so would be a bit cheaper.

I mean, this can be switched at any time, so it probably just doesn't really
matter for now..

OTOH, your approach actually might be superior, as one gets the node-specific
info for the whole remote, not just the version for the node one connects too.

[0]: https://pve.proxmox.com/pve-docs/api-viewer/index.html#/version




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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] applied: [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating Dominik Csapak
@ 2025-12-02 12:16   ` Thomas Lamprecht
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 12:16 UTC (permalink / raw)
  To: pdm-devel, Dominik Csapak

On Tue, 02 Dec 2025 12:13:30 +0100, Dominik Csapak wrote:
> use the pve-manager version to feature gate the intel-tdx property for
> now, but also prepare the hardware panel so we can already start passing
> the version to it. If we need it there, we already have it then.
> 
> 

Applied, thanks!

[1/2] pve: qemu: options/hardware: prepare and use version feature gating
      commit: c07006c7f4359e1623d2591512d9fc21a7af6d05


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] applied: [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add version feature gating
  2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add " Dominik Csapak
@ 2025-12-02 12:17   ` Thomas Lamprecht
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 12:17 UTC (permalink / raw)
  To: pdm-devel, Dominik Csapak

On Tue, 02 Dec 2025 12:13:31 +0100, Dominik Csapak wrote:
> add the pve-manager version as property to the various lxc panels, and
> use it on the options to display the new 'env' and 'entrypoint' options,
> analogous to how we do it for the qemu panel.
> 
> 

Applied, thanks!

[2/2] pve: lxc panels: prepare/add version feature gating
      commit: ce379ad63ec5aa38dce7c5e5268d8aec17119aed


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] applied: [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes Dominik Csapak
  2025-12-02 11:46   ` Thomas Lamprecht
@ 2025-12-02 12:17   ` Thomas Lamprecht
  1 sibling, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 12:17 UTC (permalink / raw)
  To: pdm-devel, Dominik Csapak

On Tue, 02 Dec 2025 12:13:32 +0100, Dominik Csapak wrote:
> this is useful when we e.g. want to feature gate some things in the ui.
> This way we don't have to get the whole update information for all
> remotes, and we don't have to query all nodes of the remotes for their
> versions.
> 
> Should we need it in the future, we can do the analagous api call for
> pbs too.
> 
> [...]

Applied, thanks!

[1/3] lib/server: pve: add api call to get the cached version info from remotes
      commit: 065af4f86f5f43d4def5e14f56439a573fdc8153


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] applied: [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels Dominik Csapak
@ 2025-12-02 12:17   ` Thomas Lamprecht
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 12:17 UTC (permalink / raw)
  To: pdm-devel, Dominik Csapak

On Tue, 02 Dec 2025 12:13:33 +0100, Dominik Csapak wrote:
> this loads the cached update information when updating the resources
> list and passes the pve-manager version to the qemu panels.
> 
> These can use that information to feature gate some information or
> functionality.
> 
> 
> [...]

Applied, thanks!

[2/3] ui: pve: qemu: load and pass the pve-manager version to panels
      commit: 3af4b5f086a37ddc24a542e5b36a1aed288951d0


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [pdm-devel] applied: [PATCH datacenter-manager v2 3/3] ui: pve: lxc: pass the pve-manager version to panels
  2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 3/3] ui: pve: lxc: " Dominik Csapak
@ 2025-12-02 12:17   ` Thomas Lamprecht
  0 siblings, 0 replies; 12+ messages in thread
From: Thomas Lamprecht @ 2025-12-02 12:17 UTC (permalink / raw)
  To: pdm-devel, Dominik Csapak

On Tue, 02 Dec 2025 12:13:34 +0100, Dominik Csapak wrote:
> this will be used by the panels to feature gate by version.
> 
> 

Applied, thanks!

[3/3] ui: pve: lxc: pass the pve-manager version to panels
      commit: 90108f4170c72b7b0d60dca5c7a2d0959a3598fb


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


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2025-12-02 12:17 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-02 11:13 [pdm-devel] [PATCH datacenter-manager/yew-comp v2 0/5] add basic version guarding for pve guests config Dominik Csapak
2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 1/2] pve: qemu: options/hardware: prepare and use version feature gating Dominik Csapak
2025-12-02 12:16   ` [pdm-devel] applied: " Thomas Lamprecht
2025-12-02 11:13 ` [pdm-devel] [PATCH yew-comp v2 2/2] pve: lxc panels: prepare/add " Dominik Csapak
2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes Dominik Csapak
2025-12-02 11:46   ` Thomas Lamprecht
2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels Dominik Csapak
2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht
2025-12-02 11:13 ` [pdm-devel] [PATCH datacenter-manager v2 3/3] ui: pve: lxc: " Dominik Csapak
2025-12-02 12:17   ` [pdm-devel] applied: " Thomas Lamprecht

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