From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 863D11FF0EA for ; Fri, 14 Aug 2026 15:46:14 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 4E38721A30; Fri, 14 Aug 2026 15:46:14 +0200 (CEST) From: Dominik Csapak To: pdm-devel@lists.proxmox.com Subject: [PATCH datacenter-manager 2/8] lib: api types: resource: add 'node' helper to ResourceView Date: Fri, 14 Aug 2026 15:43:58 +0200 Message-ID: <20260814134548.3446943-3-d.csapak@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260814134548.3446943-1-d.csapak@proxmox.com> References: <20260814134548.3446943-1-d.csapak@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.328 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust RDNS_NONE 1.274 Delivered to internal network by a host with no rDNS SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: XMPIMHC6FNWZEUWIRZPLNEO7KPAISVL5 X-Message-ID-Hash: XMPIMHC6FNWZEUWIRZPLNEO7KPAISVL5 X-MailFrom: d.csapak@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: this is often needed independent of the underlying variant Signed-off-by: Dominik Csapak --- lib/pdm-api-types/src/resource.rs | 13 +++++++++++++ ui/src/dashboard/top_entities.rs | 5 +++-- ui/src/guests.rs | 6 +++--- ui/src/lib.rs | 13 ------------- ui/src/widget/resource_tree.rs | 8 ++++---- 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/lib/pdm-api-types/src/resource.rs b/lib/pdm-api-types/src/resource.rs index a8c4849d..92d05cbc 100644 --- a/lib/pdm-api-types/src/resource.rs +++ b/lib/pdm-api-types/src/resource.rs @@ -230,6 +230,19 @@ impl<'a> ResourceView<'a> { } } + /// Returns the cluster node the resource is located on. Returns `None` if it's a PBS resource + pub fn node(&self) -> Option<&'a str> { + let node = match self { + ResourceView::PveStorage(r) => &r.node, + ResourceView::PveQemu(r) => &r.node, + ResourceView::PveLxc(r) => &r.node, + ResourceView::PveNode(r) => &r.node, + ResourceView::PveNetwork(r) => r.node(), + ResourceView::PbsNode(_) | ResourceView::PbsDatastore(_) => return None, + }; + Some(node) + } + pub fn resource_type(&self) -> ResourceType { match self { ResourceView::PveStorage(_) => ResourceType::PveStorage, diff --git a/ui/src/dashboard/top_entities.rs b/ui/src/dashboard/top_entities.rs index 634be1d6..cdc3b465 100644 --- a/ui/src/dashboard/top_entities.rs +++ b/ui/src/dashboard/top_entities.rs @@ -18,13 +18,14 @@ use pwt::{ widget::{ActionIcon, Column, Container, Panel, Row, error_message}, }; +use pdm_api_types::resource::AsResourceView; use pdm_api_types::views::LeaderboardType; use pdm_client::types::{Resource, TopEntity}; use crate::LoadResult; use crate::{ dashboard::{create_title_with_icon, loading_column}, - get_deep_url, get_resource_node, navigate_to, + get_deep_url, navigate_to, renderer::{render_resource_icon, render_resource_name}, }; @@ -138,7 +139,7 @@ impl Component for TopEntitiesComp { let rrd = &entity.rrd_data; let remote = &entity.remote; - let node = get_resource_node(resource).map(|n| n.to_string()); + let node = resource.as_resource_view().node().map(|n| n.to_string()); let tooltip_anchor = if let Some(info) = self.tooltip_info.as_ref() { if info.id == resource.global_id() { diff --git a/ui/src/guests.rs b/ui/src/guests.rs index ef670a00..b40b1866 100644 --- a/ui/src/guests.rs +++ b/ui/src/guests.rs @@ -39,14 +39,14 @@ use pwt::widget::{ }; use pdm_api_types::RemoteUpid; -use pdm_api_types::resource::{RemoteResources, Resource}; +use pdm_api_types::resource::{AsResourceView, RemoteResources, Resource}; use pdm_search::SearchTerm; use crate::pve::utils::{guest_is_live, guest_status_label, render_guest_tags}; use crate::pve::{GuestInfo, GuestType}; use crate::renderer::{empty_state, render_resource_name, render_status_icon, render_tree_column}; use crate::{ - get_deep_url, get_resource_node, + get_deep_url, widget::{MigrateWindow, SnapshotWindow}, }; @@ -161,7 +161,7 @@ impl GuestEntry { } fn node(&self) -> &str { - get_resource_node(&self.resource).unwrap_or("") + self.resource.as_resource_view().node().unwrap_or("") } fn guest_info(&self) -> GuestInfo { diff --git a/ui/src/lib.rs b/ui/src/lib.rs index fedbfee5..6e89f044 100644 --- a/ui/src/lib.rs +++ b/ui/src/lib.rs @@ -5,7 +5,6 @@ use pdm_api_types::remote_updates::RemoteUpdateSummary; use pdm_api_types::remotes::RemoteType; use pdm_api_types::resource::{PveLxcResource, PveQemuResource}; use pdm_api_types::subscription::PdmSubscriptionInfo; -use pdm_client::types::Resource; use proxmox_deb_version::Version; use pwt::props::ContainerBuilder; use pwt::tr; @@ -221,18 +220,6 @@ pub(crate) fn navigate_to( } } -pub(crate) fn get_resource_node(resource: &Resource) -> Option<&str> { - match resource { - Resource::PveStorage(storage) => Some(&storage.node), - Resource::PveQemu(qemu) => Some(&qemu.node), - Resource::PveLxc(lxc) => Some(&lxc.node), - Resource::PveNode(node) => Some(&node.node), - Resource::PveNetwork(network) => Some(network.node()), - Resource::PbsNode(_) => None, - Resource::PbsDatastore(_) => None, - } -} - /// Wrapper to 'locale compare' to strings /// /// Note: The first parameter must be a [`String`], since it needs to be converted to a [`js_sys::JsString`]. diff --git a/ui/src/widget/resource_tree.rs b/ui/src/widget/resource_tree.rs index 3ba10a7b..337d8e23 100644 --- a/ui/src/widget/resource_tree.rs +++ b/ui/src/widget/resource_tree.rs @@ -28,12 +28,12 @@ use pwt_macros::{builder, widget}; use proxmox_yew_comp::{Status, http_get}; -use pdm_api_types::resource::{RemoteResources, Resource}; +use pdm_api_types::resource::{AsResourceView, RemoteResources, Resource}; use crate::{ RemoteList, dashboard::view::ViewContext, - get_deep_url, get_resource_node, + get_deep_url, pve::utils::render_guest_tags, renderer::{render_resource_name, render_status_icon}, }; @@ -420,7 +420,7 @@ fn columns( match item { PdmTreeEntry::Root => "", PdmTreeEntry::Resource(_, resource) => { - get_resource_node(resource).unwrap_or("") + resource.as_resource_view().node().unwrap_or("") } PdmTreeEntry::Remote(_, _) => "", } @@ -436,7 +436,7 @@ fn columns( let (remote, id, node) = match item { PdmTreeEntry::Root => return html! {}, PdmTreeEntry::Resource(remote_id, resource) => { - (remote_id, resource.id(), get_resource_node(resource)) + (remote_id, resource.id(), resource.as_resource_view().node()) } PdmTreeEntry::Remote(remote_id, _) => (remote_id, String::new(), None), }; -- 2.47.3