From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id E07991FF187 for ; Tue, 2 Dec 2025 12:15:45 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id C8849CC51; Tue, 2 Dec 2025 12:16:08 +0100 (CET) From: Dominik Csapak To: pdm-devel@lists.proxmox.com Date: Tue, 2 Dec 2025 12:13:33 +0100 Message-ID: <20251202111533.2068448-5-d.csapak@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20251202111533.2068448-1-d.csapak@proxmox.com> References: <20251202111533.2068448-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.030 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 SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pdm-devel] [PATCH datacenter-manager v2 2/3] ui: pve: qemu: load and pass the pve-manager version to panels X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "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 --- 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 = 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 { + 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, Error>), + LoadFinished( + Result, Error>, + Result, + ), } pub struct PveRemoteComp { view: tree::PveTreeNode, resources: Rc>, last_error: Option, + updates: LoadResult, } 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, + #[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! {
}) .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