public inbox for pdm-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard
@ 2025-10-17 14:11 Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 01/11] server: fix small formatting issue via `cargo fmt` Christian Ebner
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Extends the search capability to filter resource by remote type, so
this can be used to further filter the status when clicking the remote
type specific status panel in the dashboard as well.

Extend the PVE node status panel implementation to be reusabe for the
PBS node status and add a list of failed remotes to the status api
response, which allows to further discriminate errors by remote type
and show the type specific status message accordingly.

Changes since version 1 (thanks @Dominik for feedback):
- Reworked filtering helpers so the whole remote is passed as reference
  not just the remote type. This makes the filter easier to extend in
  the future.
- Completely reworked the datastore status panel, moving it to a dedicated
  component. Pass only the status information relevant for the respective
  remote type the node status component.

datacenter-manager:

Christian Ebner (11):
  server: fix small formatting issue via `cargo fmt`
  server: api: pass remote as reference to fetching helpers
  server: api: refactor filter logic for resource post gathering
  api: resources: new transient type for remote resource gathering
  server: api: add remote-type search category for resources
  pdm-api-types: extend resource status by list of failed remotes
  server: api: collect failed remotes list while getting status
  ui: dashboard: reimplement node status panel as dedicated component
  ui: dashboard: use new node status component
  ui: dashboard: extend node panel creation by remote type
  ui: dashboard: expose PBS nodes status panel

 lib/pdm-api-types/src/remotes.rs             |   3 +-
 lib/pdm-api-types/src/resource.rs            |  28 +++-
 server/src/api/resources.rs                  | 121 ++++++++++++----
 server/src/metric_collection/top_entities.rs |   2 +-
 ui/src/dashboard/mod.rs                      | 117 ++++-----------
 ui/src/dashboard/node_status_panel.rs        | 144 +++++++++++++++++++
 ui/src/top_nav_bar.rs                        |   2 +-
 7 files changed, 297 insertions(+), 120 deletions(-)
 create mode 100644 ui/src/dashboard/node_status_panel.rs


Summary over all repositories:
  7 files changed, 297 insertions(+), 120 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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 01/11] server: fix small formatting issue via `cargo fmt`
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 02/11] server: api: pass remote as reference to fetching helpers Christian Ebner
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 server/src/metric_collection/top_entities.rs | 2 +-
 ui/src/top_nav_bar.rs                        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/server/src/metric_collection/top_entities.rs b/server/src/metric_collection/top_entities.rs
index ea121ee..73a3e63 100644
--- a/server/src/metric_collection/top_entities.rs
+++ b/server/src/metric_collection/top_entities.rs
@@ -36,7 +36,7 @@ pub fn calculate_top(
     remotes: &HashMap<String, pdm_api_types::remotes::Remote>,
     timeframe: proxmox_rrd_api_types::RrdTimeframe,
     num: usize,
-    check_remote_privs: impl Fn(&str) -> bool
+    check_remote_privs: impl Fn(&str) -> bool,
 ) -> TopEntities {
     let mut guest_cpu = Vec::new();
     let mut node_cpu = Vec::new();
diff --git a/ui/src/top_nav_bar.rs b/ui/src/top_nav_bar.rs
index 74394a8..12dbb1e 100644
--- a/ui/src/top_nav_bar.rs
+++ b/ui/src/top_nav_bar.rs
@@ -19,8 +19,8 @@ use proxmox_yew_comp::{http_get, LanguageDialog, TaskViewer, ThemeDialog};
 
 use pwt_macros::builder;
 
-use pdm_api_types::RemoteUpid;
 use pbs_api_types::TaskListItem;
+use pdm_api_types::RemoteUpid;
 
 use crate::tasks::format_optional_remote_upid;
 use crate::widget::SearchBox;
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 02/11] server: api: pass remote as reference to fetching helpers
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 01/11] server: fix small formatting issue via `cargo fmt` Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 03/11] server: api: refactor filter logic for resource post gathering Christian Ebner
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

None of the helpers requires ownership of the remote, therefore pass
it as shared reference.

This is in preparation for passing the remote also to the search term
filtering to allow matching the remote type.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 server/src/api/resources.rs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
index d629c65..21143a8 100644
--- a/server/src/api/resources.rs
+++ b/server/src/api/resources.rs
@@ -255,7 +255,7 @@ pub(crate) async fn get_resources_impl(
         }
         let filter = filters.clone();
         let handle = tokio::spawn(async move {
-            let (mut resources, error) = match get_resources_for_remote(remote, max_age).await {
+            let (mut resources, error) = match get_resources_for_remote(&remote, max_age).await {
                 Ok(resources) => (resources, None),
                 Err(error) => {
                     tracing::debug!("failed to get resources from remote - {error:?}");
@@ -700,7 +700,7 @@ static CACHE: LazyLock<RwLock<HashMap<String, CachedResources>>> =
 ///
 /// If recent enough cached data is available, it is returned
 /// instead of calling out to the remote.
-async fn get_resources_for_remote(remote: Remote, max_age: u64) -> Result<Vec<Resource>, Error> {
+async fn get_resources_for_remote(remote: &Remote, max_age: u64) -> Result<Vec<Resource>, Error> {
     let remote_name = remote.id.to_owned();
     if let Some(cached_resource) = get_cached_resources(&remote_name, max_age) {
         Ok(cached_resource.resources)
@@ -756,7 +756,7 @@ fn update_cached_resources(remote: &str, resources: &[Resource], now: i64) {
 }
 
 /// Fetch remote resources and map to pdm-native data types.
-async fn fetch_remote_resource(remote: Remote) -> Result<Vec<Resource>, Error> {
+async fn fetch_remote_resource(remote: &Remote) -> Result<Vec<Resource>, Error> {
     let mut resources = Vec::new();
     let remote_name = remote.id.to_owned();
 
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 03/11] server: api: refactor filter logic for resource post gathering
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 01/11] server: fix small formatting issue via `cargo fmt` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 02/11] server: api: pass remote as reference to fetching helpers Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 04/11] api: resources: new transient type for remote resource gathering Christian Ebner
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Avoids to loop twice over the list of remote resources if a filter is
set, at the cost of checking the presence of the filter on each element.

In preparation to also pass along the remote to the remote search term
matching.

No functional changes intended.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 server/src/api/resources.rs | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
index 21143a8..a00742b 100644
--- a/server/src/api/resources.rs
+++ b/server/src/api/resources.rs
@@ -292,18 +292,21 @@ pub(crate) async fn get_resources_impl(
 
     let mut remote_resources = Vec::new();
     for handle in join_handles {
-        remote_resources.push(handle.await?);
-    }
-
-    if !filters.is_empty() {
-        remote_resources.retain(|res| {
-            if !res.resources.is_empty() {
-                return true;
-            }
-            filters.matches(|filter| {
-                remote_matches_search_term(&res.remote, Some(res.error.is_none()), filter)
-            })
-        })
+        let remote_resource = handle.await?;
+
+        if filters.is_empty() {
+            remote_resources.push(remote_resource);
+        } else if !remote_resource.resources.is_empty() {
+            remote_resources.push(remote_resource);
+        } else if filters.matches(|filter| {
+            remote_matches_search_term(
+                &remote_resource.remote,
+                Some(remote_resource.error.is_none()),
+                filter,
+            )
+        }) {
+            remote_resources.push(remote_resource);
+        }
     }
 
     Ok(remote_resources)
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 04/11] api: resources: new transient type for remote resource gathering
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (2 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 03/11] server: api: refactor filter logic for resource post gathering Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 05/11] server: api: add remote-type search category for resources Christian Ebner
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Introduce a new transient type to be returned by the get resources
implementation helper, which also includes the full remote object.
Since the remote object can store secret information, it must be
avoided to return it in the API.

Requires now the mapping of the transient type to the final
`RemoteResources` for the API response at the cost of additional
looping over the list of remote resources.

In preparation for adding search capabilities to filter remote
resources based on remote type.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 server/src/api/resources.rs | 44 +++++++++++++++++++++++++++----------
 1 file changed, 33 insertions(+), 11 deletions(-)

diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
index a00742b..793db5e 100644
--- a/server/src/api/resources.rs
+++ b/server/src/api/resources.rs
@@ -144,6 +144,24 @@ fn remote_matches_search_term(remote_name: &str, online: Option<bool>, term: &Se
     }
 }
 
+// Transient type for remote resources gathering and filtering on remote properties
+pub(crate) struct RemoteWithResources {
+    remote_name: String,
+    remote: Remote,
+    resources: Vec<Resource>,
+    error: Option<String>,
+}
+
+impl Into<RemoteResources> for RemoteWithResources {
+    fn into(self) -> RemoteResources {
+        RemoteResources {
+            remote: self.remote_name,
+            resources: self.resources,
+            error: self.error,
+        }
+    }
+}
+
 #[api(
     // FIXME:: see list-like API calls in resource routers, we probably want more fine-grained
     // checks..
@@ -183,7 +201,10 @@ pub async fn get_resources(
     search: Option<String>,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Vec<RemoteResources>, Error> {
-    get_resources_impl(max_age, search, resource_type, Some(rpcenv)).await
+    let remotes_with_resources =
+        get_resources_impl(max_age, search, resource_type, Some(rpcenv)).await?;
+    let resources = remotes_with_resources.into_iter().map(Into::into).collect();
+    Ok(resources)
 }
 
 // helper to determine if the combination of search terms requires the results
@@ -219,7 +240,7 @@ pub(crate) async fn get_resources_impl(
     search: Option<String>,
     resource_type: Option<ResourceType>,
     rpcenv: Option<&mut dyn RpcEnvironment>,
-) -> Result<Vec<RemoteResources>, Error> {
+) -> Result<Vec<RemoteWithResources>, Error> {
     let user_info = CachedUserInfo::new()?;
     let mut opt_auth_id = None;
     if let Some(ref rpcenv) = rpcenv {
@@ -280,8 +301,9 @@ pub(crate) async fn get_resources_impl(
                 });
             }
 
-            RemoteResources {
-                remote: remote_name,
+            RemoteWithResources {
+                remote_name,
+                remote,
                 resources,
                 error,
             }
@@ -292,20 +314,20 @@ pub(crate) async fn get_resources_impl(
 
     let mut remote_resources = Vec::new();
     for handle in join_handles {
-        let remote_resource = handle.await?;
+        let remote_with_resources = handle.await?;
 
         if filters.is_empty() {
-            remote_resources.push(remote_resource);
-        } else if !remote_resource.resources.is_empty() {
-            remote_resources.push(remote_resource);
+            remote_resources.push(remote_with_resources);
+        } else if !remote_with_resources.resources.is_empty() {
+            remote_resources.push(remote_with_resources);
         } else if filters.matches(|filter| {
             remote_matches_search_term(
-                &remote_resource.remote,
-                Some(remote_resource.error.is_none()),
+                &remote_with_resources.remote_name,
+                Some(remote_with_resources.error.is_none()),
                 filter,
             )
         }) {
-            remote_resources.push(remote_resource);
+            remote_resources.push(remote_with_resources);
         }
     }
 
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 05/11] server: api: add remote-type search category for resources
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (3 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 04/11] api: resources: new transient type for remote resource gathering Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 06/11] pdm-api-types: extend resource status by list of failed remotes Christian Ebner
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Extend the current search capability for resources by adding the
`RemoteType` search category, allowing to selectively filter remotes
of type PVE and PBS.

Since the current remote filtering is only applied in case of remotes
only search, add an additional helper to pre-filter the to be fetched
resources by the remote type.

With this it is now possible to search, e.g. `remote-type:pbs` to
only get resources from PBS remotes, with the intention to provide
a search shortcut to show PBS remotes when clicking in the to be
added PBS status dashboard panel.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- Pass &Remote instead of remote type only to remote filter match logic
- Adapt to new refactored code

 server/src/api/resources.rs | 39 ++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
index 793db5e..b3f3ba2 100644
--- a/server/src/api/resources.rs
+++ b/server/src/api/resources.rs
@@ -56,6 +56,7 @@ enum MatchCategory {
     Status,
     Template,
     Remote,
+    RemoteType,
 }
 
 impl std::str::FromStr for MatchCategory {
@@ -69,6 +70,7 @@ impl std::str::FromStr for MatchCategory {
             "status" => MatchCategory::Status,
             "template" => MatchCategory::Template,
             "remote" => MatchCategory::Remote,
+            "remote-type" => MatchCategory::RemoteType,
             _ => bail!("invalid category"),
         };
         Ok(category)
@@ -88,11 +90,18 @@ impl MatchCategory {
                 (Ok(a), Ok(b)) => a == b,
                 _ => false,
             },
+            MatchCategory::RemoteType => match (
+                RemoteType::from_str(value),
+                RemoteType::from_str(search_term),
+            ) {
+                (Ok(a), Ok(b)) => a == b,
+                _ => false,
+            },
         }
     }
 }
 
-// returns None if we can't decide if it matches, currently only for the `Remote` category`
+// returns None if we can't decide if it matches, currently only for the `RemoteType` category
 fn resource_matches_search_term(
     remote_name: &str,
     resource: &Resource,
@@ -112,6 +121,7 @@ fn resource_matches_search_term(
                 _ => false,
             },
             MatchCategory::Remote => category.matches(remote_name, &term.value),
+            MatchCategory::RemoteType => return None,
         },
         Some(Err(_)) => false,
         None => {
@@ -122,7 +132,12 @@ fn resource_matches_search_term(
     Some(matches)
 }
 
-fn remote_matches_search_term(remote_name: &str, online: Option<bool>, term: &SearchTerm) -> bool {
+fn remote_matches_search_term(
+    remote_name: &str,
+    remote: &Remote,
+    online: Option<bool>,
+    term: &SearchTerm,
+) -> bool {
     match term.category.as_deref().map(|c| c.parse::<MatchCategory>()) {
         Some(Ok(category)) => match category {
             MatchCategory::Type => category.matches("remote", &term.value),
@@ -135,6 +150,7 @@ fn remote_matches_search_term(remote_name: &str, online: Option<bool>, term: &Se
                 None => true,
             },
             MatchCategory::Template => false,
+            MatchCategory::RemoteType => category.matches(&remote.ty.to_string(), &term.value),
         },
         Some(Err(_)) => false,
         None => {
@@ -144,6 +160,17 @@ fn remote_matches_search_term(remote_name: &str, online: Option<bool>, term: &Se
     }
 }
 
+fn remote_type_matches_search_term(remote_type: RemoteType, term: &SearchTerm) -> bool {
+    match term.category.as_deref().map(|c| c.parse::<MatchCategory>()) {
+        Some(Ok(category)) => match category {
+            MatchCategory::RemoteType => category.matches(&remote_type.to_string(), &term.value),
+            _ => true,
+        },
+        Some(Err(_)) => false,
+        None => true,
+    }
+}
+
 // Transient type for remote resources gathering and filtering on remote properties
 pub(crate) struct RemoteWithResources {
     remote_name: String,
@@ -269,8 +296,13 @@ pub(crate) async fn get_resources_impl(
             }
         }
 
+        if !filters.matches(|term| remote_type_matches_search_term(remote.ty, term)) {
+            continue;
+        }
+
         if remotes_only
-            && !filters.matches(|term| remote_matches_search_term(&remote_name, None, term))
+            && !filters
+                .matches(|term| remote_matches_search_term(&remote_name, &remote, None, term))
         {
             continue;
         }
@@ -323,6 +355,7 @@ pub(crate) async fn get_resources_impl(
         } else if filters.matches(|filter| {
             remote_matches_search_term(
                 &remote_with_resources.remote_name,
+                &remote_with_resources.remote,
                 Some(remote_with_resources.error.is_none()),
                 filter,
             )
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 06/11] pdm-api-types: extend resource status by list of failed remotes
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (4 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 05/11] server: api: add remote-type search category for resources Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 07/11] server: api: collect failed remotes list while getting status Christian Ebner
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Currently only the count of failed remotes is returned via the
status. Include the list of failed remotes including the name,
remote type and error message.

This will be used to extend the dashboard panel.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- no changes

 lib/pdm-api-types/src/remotes.rs  |  3 ++-
 lib/pdm-api-types/src/resource.rs | 28 ++++++++++++++++++++++++++--
 2 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/lib/pdm-api-types/src/remotes.rs b/lib/pdm-api-types/src/remotes.rs
index 6318943..dd6afa6 100644
--- a/lib/pdm-api-types/src/remotes.rs
+++ b/lib/pdm-api-types/src/remotes.rs
@@ -39,10 +39,11 @@ pub struct NodeUrl {
 
 #[api]
 /// The type of a remote entry.
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize, Ord, PartialOrd)]
+#[derive(Clone, Copy, Default, Debug, Eq, PartialEq, Deserialize, Serialize, Ord, PartialOrd)]
 #[serde(rename_all = "lowercase")]
 pub enum RemoteType {
     /// A Proxmox VE node.
+    #[default]
     Pve,
     /// A Proxmox Backup Server node.
     Pbs,
diff --git a/lib/pdm-api-types/src/resource.rs b/lib/pdm-api-types/src/resource.rs
index b219250..400f2af 100644
--- a/lib/pdm-api-types/src/resource.rs
+++ b/lib/pdm-api-types/src/resource.rs
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
 
 use proxmox_schema::{api, ApiStringFormat, ApiType, EnumEntry, OneOfSchema, Schema, StringSchema};
 
-use super::remotes::REMOTE_ID_SCHEMA;
+use super::remotes::{RemoteType, REMOTE_ID_SCHEMA};
 
 #[api(
     "id-property": "id",
@@ -550,7 +550,16 @@ pub struct SdnZoneCount {
     pub unknown: u64,
 }
 
-#[api]
+#[api(
+    properties: {
+        "failed_remotes_list": {
+            type: Array,
+            items: {
+                type: FailedRemote,
+            },
+        }
+    }
+)]
 #[derive(Default, Serialize, Deserialize, Clone, PartialEq)]
 /// Describes the status of seen resources
 pub struct ResourcesStatus {
@@ -572,6 +581,21 @@ pub struct ResourcesStatus {
     pub pbs_nodes: NodeStatusCount,
     /// Status of PBS Datastores
     pub pbs_datastores: StorageStatusCount,
+    /// List of the failed remotes including type and error
+    #[serde(default, skip_serializing_if = "Vec::is_empty")]
+    pub failed_remotes_list: Vec<FailedRemote>,
+}
+
+#[api]
+#[derive(Default, Serialize, Deserialize, Clone, PartialEq)]
+/// Error information for a failed remote
+pub struct FailedRemote {
+    /// Name of the failed remote
+    pub name: String,
+    /// Error that occurred when querying remote resources
+    pub error: String,
+    /// Type of the failed remote
+    pub remote_type: RemoteType,
 }
 
 #[api(
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 07/11] server: api: collect failed remotes list while getting status
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (5 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 06/11] pdm-api-types: extend resource status by list of failed remotes Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 08/11] ui: dashboard: reimplement node status panel as dedicated component Christian Ebner
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Include name, remote type and error message for failed remotes when
gathering status information, in order to be able to discriminate
errors by remote type for the dashboard.

Since the get_resources_impl has previously been adapted to return the
full remote object as well, utilize that over get_resources to have
the additional context.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- Use new transient type from resource gathering
- adapt to new refactored code

 server/src/api/resources.rs | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
index b3f3ba2..fb281f4 100644
--- a/server/src/api/resources.rs
+++ b/server/src/api/resources.rs
@@ -9,9 +9,9 @@ use futures::FutureExt;
 use pbs_api_types::{DataStoreStatusListItem, NodeStatus};
 use pdm_api_types::remotes::{Remote, RemoteType};
 use pdm_api_types::resource::{
-    PbsDatastoreResource, PbsNodeResource, PveLxcResource, PveNodeResource, PveQemuResource,
-    PveSdnResource, PveStorageResource, RemoteResources, Resource, ResourceType, ResourcesStatus,
-    SdnStatus, SdnZoneResource, TopEntities,
+    FailedRemote, PbsDatastoreResource, PbsNodeResource, PveLxcResource, PveNodeResource,
+    PveQemuResource, PveSdnResource, PveStorageResource, RemoteResources, Resource, ResourceType,
+    ResourcesStatus, SdnStatus, SdnZoneResource, TopEntities,
 };
 use pdm_api_types::subscription::{
     NodeSubscriptionInfo, RemoteSubscriptionState, RemoteSubscriptions, SubscriptionLevel,
@@ -395,15 +395,20 @@ pub async fn get_status(
     max_age: u64,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<ResourcesStatus, Error> {
-    let remotes = get_resources(max_age, None, None, rpcenv).await?;
+    let remotes_with_resources = get_resources_impl(max_age, None, None, Some(rpcenv)).await?;
     let mut counts = ResourcesStatus::default();
-    for remote in remotes {
-        if remote.error.is_some() {
+    for remote_with_resources in remotes_with_resources {
+        if let Some(err) = remote_with_resources.error {
             counts.failed_remotes += 1;
+            counts.failed_remotes_list.push(FailedRemote {
+                name: remote_with_resources.remote_name,
+                error: err.to_string(),
+                remote_type: remote_with_resources.remote.ty,
+            });
         } else {
             counts.remotes += 1;
         }
-        for resource in remote.resources {
+        for resource in remote_with_resources.resources {
             match resource {
                 Resource::PveStorage(r) => match r.status.as_str() {
                     "available" => counts.storages.available += 1,
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 08/11] ui: dashboard: reimplement node status panel as dedicated component
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (6 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 07/11] server: api: collect failed remotes list while getting status Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 09/11] ui: dashboard: use new node status component Christian Ebner
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Reimplement the current node status panel as a dedicated component
for better encapsulation and input data handling, analogous to how
guest status or SDN status panels are handled.

Instead of passing in the whole status, only pass the state required
for the component to be rendered.

Already take into account that this will be used to render the PBS
node status as well.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 ui/src/dashboard/node_status_panel.rs | 144 ++++++++++++++++++++++++++
 1 file changed, 144 insertions(+)
 create mode 100644 ui/src/dashboard/node_status_panel.rs

diff --git a/ui/src/dashboard/node_status_panel.rs b/ui/src/dashboard/node_status_panel.rs
new file mode 100644
index 0000000..e9e8c6b
--- /dev/null
+++ b/ui/src/dashboard/node_status_panel.rs
@@ -0,0 +1,144 @@
+use std::rc::Rc;
+
+use pdm_api_types::remotes::RemoteType;
+use pdm_api_types::resource::NodeStatusCount;
+use pdm_search::{Search, SearchTerm};
+use proxmox_yew_comp::Status;
+use pwt::{
+    css::{AlignItems, FlexFit, JustifyContent},
+    prelude::*,
+    widget::{Column, Fa},
+};
+use yew::{
+    virtual_dom::{VComp, VNode},
+    Properties,
+};
+
+use crate::search_provider::get_search_provider;
+
+use super::loading_column;
+
+#[derive(PartialEq, Clone, Properties)]
+pub struct NodeStatusPanel {
+    remote_type: RemoteType,
+    status: Option<NodeStatusCount>,
+    failed_remotes: usize,
+}
+
+impl NodeStatusPanel {
+    pub fn new(
+        remote_type: RemoteType,
+        status: Option<NodeStatusCount>,
+        failed_remotes: usize,
+    ) -> Self {
+        yew::props!(Self {
+            remote_type,
+            status,
+            failed_remotes,
+        })
+    }
+}
+
+impl From<NodeStatusPanel> for VNode {
+    fn from(value: NodeStatusPanel) -> Self {
+        let comp = VComp::new::<NodeStatusPanelComponent>(Rc::new(value), None);
+        VNode::from(comp)
+    }
+}
+
+pub struct NodeStatusPanelComponent {}
+
+impl yew::Component for NodeStatusPanelComponent {
+    type Message = Search;
+    type Properties = NodeStatusPanel;
+
+    fn create(_ctx: &yew::Context<Self>) -> Self {
+        Self {}
+    }
+
+    fn update(&mut self, ctx: &Context<Self>, msg: Self::Message) -> bool {
+        if let Some(provider) = get_search_provider(ctx) {
+            provider.search(msg);
+        }
+        false
+    }
+
+    fn view(&self, ctx: &yew::Context<Self>) -> yew::Html {
+        let props = ctx.props();
+
+        let (icon, status_msg, search_terms) = match &props.status {
+            Some(status) => map_status(status, props.remote_type, props.failed_remotes),
+            None => return loading_column().into(),
+        };
+
+        let column = Column::new()
+            .padding(4)
+            .class("pwt-pointer")
+            .class(FlexFit)
+            .class(AlignItems::Center)
+            .class(JustifyContent::Center)
+            .gap(2)
+            .onclick(ctx.link().callback({
+                let search_terms = search_terms.clone();
+                move |_| Search::with_terms(search_terms.clone())
+            }))
+            .onkeydown(ctx.link().batch_callback({
+                let search_terms = search_terms.clone();
+                move |event: KeyboardEvent| match event.key().as_str() {
+                    "Enter" | " " => Some(Search::with_terms(search_terms.clone())),
+                    _ => None,
+                }
+            }))
+            .with_child(icon.large_4x())
+            .with_child(status_msg);
+        column.into()
+    }
+}
+
+fn map_status(
+    status: &NodeStatusCount,
+    remote_type: RemoteType,
+    failed_remotes: usize,
+) -> (Fa, String, Vec<SearchTerm>) {
+    let mut search_terms = vec![
+        SearchTerm::new("node").category(Some("type")),
+        SearchTerm::new(remote_type.to_string()).category(Some("remote-type")),
+    ];
+    let (icon, status_msg) = match status {
+        NodeStatusCount {
+            online,
+            offline,
+            unknown,
+        } if *offline > 0 => {
+            search_terms.push(SearchTerm::new("offline").category(Some("status")));
+            (
+                Status::Error.into(),
+                tr!(
+                    "{0} of {1} nodes are offline",
+                    offline,
+                    online + offline + unknown,
+                ),
+            )
+        }
+        NodeStatusCount { unknown, .. } if *unknown > 0 => {
+            search_terms.push(SearchTerm::new("unknown").category(Some("status")));
+            (
+                Status::Warning.into(),
+                tr!("{0} nodes have an unknown status", unknown),
+            )
+        }
+        NodeStatusCount { online, .. } if failed_remotes > 0 => match remote_type {
+            RemoteType::Pve => (
+                Status::Unknown.into(),
+                tr!("{0} of an unknown number of nodes online", online),
+            ),
+            RemoteType::Pbs => (
+                Status::Error.into(),
+                tr!("{0} remotes failed", failed_remotes),
+            ),
+        },
+        NodeStatusCount { online, .. } => (Status::Success.into(), tr!("{0} nodes online", online)),
+    };
+
+    (icon, status_msg, search_terms)
+}
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 09/11] ui: dashboard: use new node status component
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (7 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 08/11] ui: dashboard: reimplement node status panel as dedicated component Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 10/11] ui: dashboard: extend node panel creation by remote type Christian Ebner
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Given the reusable component implementation to render status of
PVE and PBS nodes, use it to create the PVE node status panel.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- not present in previous version

 ui/src/dashboard/mod.rs | 112 +++++++++-------------------------------
 1 file changed, 25 insertions(+), 87 deletions(-)

diff --git a/ui/src/dashboard/mod.rs b/ui/src/dashboard/mod.rs
index f54c509..8a678af 100644
--- a/ui/src/dashboard/mod.rs
+++ b/ui/src/dashboard/mod.rs
@@ -10,7 +10,7 @@ use yew::{
     Component,
 };
 
-use proxmox_yew_comp::{http_get, EditWindow, Status};
+use proxmox_yew_comp::{http_get, EditWindow};
 use pwt::{
     css::{AlignItems, FlexDirection, FlexFit, FlexWrap, JustifyContent},
     prelude::*,
@@ -25,16 +25,11 @@ use pwt::{
     AsyncPool,
 };
 
-use pdm_api_types::{
-    remotes::RemoteType,
-    resource::{NodeStatusCount, ResourcesStatus},
-    TaskStatistics,
-};
+use pdm_api_types::{remotes::RemoteType, resource::ResourcesStatus, TaskStatistics};
 use pdm_client::types::TopEntity;
-use pdm_search::{Search, SearchTerm};
 use proxmox_client::ApiResponseData;
 
-use crate::{pve::GuestType, remotes::AddWizard, search_provider::get_search_provider, RemoteList};
+use crate::{pve::GuestType, remotes::AddWizard, RemoteList};
 
 mod top_entities;
 pub use top_entities::TopEntities;
@@ -48,6 +43,9 @@ use remote_panel::RemotePanel;
 mod guest_panel;
 use guest_panel::GuestPanel;
 
+mod node_status_panel;
+use node_status_panel::NodeStatusPanel;
+
 mod sdn_zone_panel;
 use sdn_zone_panel::SdnZonePanel;
 
@@ -123,7 +121,6 @@ pub enum Msg {
     ForceReload,
     UpdateConfig(DashboardConfig),
     ConfigWindow(bool),
-    Search(Search),
 }
 
 struct StatisticsOptions {
@@ -158,79 +155,28 @@ impl PdmDashboard {
             .into()
     }
 
-    fn create_node_panel(&self, ctx: &yew::Context<Self>, icon: &str, title: String) -> Panel {
-        let mut search_terms = vec![SearchTerm::new("node").category(Some("type"))];
-        let (status_icon, text): (Fa, String) = match &self.status {
-            Some(status) => {
-                match status.pve_nodes {
-                    NodeStatusCount {
-                        online,
-                        offline,
-                        unknown,
-                    } if offline > 0 => {
-                        search_terms.push(SearchTerm::new("offline").category(Some("status")));
-                        (
-                            Status::Error.into(),
-                            tr!(
-                                "{0} of {1} nodes are offline",
-                                offline,
-                                online + offline + unknown,
-                            ),
-                        )
-                    }
-                    NodeStatusCount { unknown, .. } if unknown > 0 => {
-                        search_terms.push(SearchTerm::new("unknown").category(Some("status")));
-                        (
-                            Status::Warning.into(),
-                            tr!("{0} nodes have an unknown status", unknown),
-                        )
-                    }
-                    // FIXME, get more detailed status about the failed remotes (name, type, error)?
-                    NodeStatusCount { online, .. } if status.failed_remotes > 0 => (
-                        Status::Unknown.into(),
-                        tr!("{0} of an unknown number of nodes online", online),
-                    ),
-                    NodeStatusCount { online, .. } => {
-                        (Status::Success.into(), tr!("{0} nodes online", online))
-                    }
-                }
-            }
-            None => (Status::Unknown.into(), String::new()),
+    fn create_node_panel(&self, icon: &str, title: String) -> Panel {
+        let (nodes_status, failed_remotes) = match &self.status {
+            Some(status) => (
+                Some(status.pve_nodes.clone()),
+                status
+                    .failed_remotes_list
+                    .iter()
+                    .filter(|item| item.remote_type == RemoteType::Pve)
+                    .count(),
+            ),
+            None => (None, 0),
         };
-
-        let loading = self.status.is_none();
-        let search = Search::with_terms(search_terms);
         Panel::new()
             .flex(1.0)
             .width(300)
             .title(self.create_title_with_icon(icon, title))
             .border(true)
-            .with_child(
-                Column::new()
-                    .padding(4)
-                    .class("pwt-pointer")
-                    .onclick(ctx.link().callback({
-                        let search = search.clone();
-                        move |_| Msg::Search(search.clone())
-                    }))
-                    .onkeydown(ctx.link().batch_callback({
-                        let search = search.clone();
-                        move |event: KeyboardEvent| match event.key().as_str() {
-                            "Enter" | " " => Some(Msg::Search(search.clone())),
-                            _ => None,
-                        }
-                    }))
-                    .class(FlexFit)
-                    .class(AlignItems::Center)
-                    .class(JustifyContent::Center)
-                    .gap(2)
-                    .with_child(if loading {
-                        html! {<i class={"pwt-loading-icon"} />}
-                    } else {
-                        status_icon.large_4x().into()
-                    })
-                    .with_optional_child((!loading).then_some(text)),
-            )
+            .with_child(NodeStatusPanel::new(
+                RemoteType::Pve,
+                nodes_status,
+                failed_remotes,
+            ))
     }
 
     fn create_guest_panel(&self, guest_type: GuestType) -> Panel {
@@ -501,12 +447,6 @@ impl Component for PdmDashboard {
                 self.show_config_window = false;
                 true
             }
-            Msg::Search(search_term) => {
-                if let Some(provider) = get_search_provider(ctx) {
-                    provider.search(search_term.into());
-                }
-                false
-            }
         }
     }
 
@@ -563,11 +503,9 @@ impl Component for PdmDashboard {
                             )
                             .with_child(RemotePanel::new(self.status.clone())),
                     )
-                    .with_child(self.create_node_panel(
-                        ctx,
-                        "building",
-                        tr!("Virtual Environment Nodes"),
-                    ))
+                    .with_child(
+                        self.create_node_panel("building", tr!("Virtual Environment Nodes")),
+                    )
                     .with_child(self.create_guest_panel(GuestType::Qemu))
                     .with_child(self.create_guest_panel(GuestType::Lxc))
                     // FIXME: add PBS support
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 10/11] ui: dashboard: extend node panel creation by remote type
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (8 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 09/11] ui: dashboard: use new node status component Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 11/11] ui: dashboard: expose PBS nodes status panel Christian Ebner
  2025-10-21 11:17 ` [pdm-devel] superseded: [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Make the node panel instantiation logic reusable for the PBS remotes
by passing the remote type as additional parameter, switching the
rendered node status information based on that.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- adapt to new refactored code

 ui/src/dashboard/mod.rs | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/ui/src/dashboard/mod.rs b/ui/src/dashboard/mod.rs
index 8a678af..d90d56c 100644
--- a/ui/src/dashboard/mod.rs
+++ b/ui/src/dashboard/mod.rs
@@ -155,25 +155,30 @@ impl PdmDashboard {
             .into()
     }
 
-    fn create_node_panel(&self, icon: &str, title: String) -> Panel {
+    fn create_node_panel(&self, icon: &str, title: String, remote_type: RemoteType) -> Panel {
         let (nodes_status, failed_remotes) = match &self.status {
-            Some(status) => (
-                Some(status.pve_nodes.clone()),
-                status
+            Some(status) => {
+                let nodes_status = match remote_type {
+                    RemoteType::Pve => Some(status.pve_nodes.clone()),
+                    RemoteType::Pbs => Some(status.pbs_nodes.clone()),
+                };
+                let failed_remotes = status
                     .failed_remotes_list
                     .iter()
-                    .filter(|item| item.remote_type == RemoteType::Pve)
-                    .count(),
-            ),
+                    .filter(|item| item.remote_type == remote_type)
+                    .count();
+                (nodes_status, failed_remotes)
+            }
             None => (None, 0),
         };
+
         Panel::new()
             .flex(1.0)
             .width(300)
             .title(self.create_title_with_icon(icon, title))
             .border(true)
             .with_child(NodeStatusPanel::new(
-                RemoteType::Pve,
+                remote_type,
                 nodes_status,
                 failed_remotes,
             ))
@@ -503,9 +508,11 @@ impl Component for PdmDashboard {
                             )
                             .with_child(RemotePanel::new(self.status.clone())),
                     )
-                    .with_child(
-                        self.create_node_panel("building", tr!("Virtual Environment Nodes")),
-                    )
+                    .with_child(self.create_node_panel(
+                        "building",
+                        tr!("Virtual Environment Nodes"),
+                        RemoteType::Pve,
+                    ))
                     .with_child(self.create_guest_panel(GuestType::Qemu))
                     .with_child(self.create_guest_panel(GuestType::Lxc))
                     // FIXME: add PBS support
-- 
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] 13+ messages in thread

* [pdm-devel] [PATCH datacenter-manager v2 11/11] ui: dashboard: expose PBS nodes status panel
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (9 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 10/11] ui: dashboard: extend node panel creation by remote type Christian Ebner
@ 2025-10-17 14:11 ` Christian Ebner
  2025-10-21 11:17 ` [pdm-devel] superseded: [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-17 14:11 UTC (permalink / raw)
  To: pdm-devel

Analogous to the node status information shown for PVE nodes, allows
to get a fast overview if all PBS remotes/nodes are reachable or not.

Signed-off-by: Christian Ebner <c.ebner@proxmox.com>
---
changes since version 1:
- adapt to new refactored code

 ui/src/dashboard/mod.rs | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/ui/src/dashboard/mod.rs b/ui/src/dashboard/mod.rs
index d90d56c..d3da03d 100644
--- a/ui/src/dashboard/mod.rs
+++ b/ui/src/dashboard/mod.rs
@@ -515,12 +515,12 @@ impl Component for PdmDashboard {
                     ))
                     .with_child(self.create_guest_panel(GuestType::Qemu))
                     .with_child(self.create_guest_panel(GuestType::Lxc))
-                    // FIXME: add PBS support
-                    //.with_child(self.create_node_panel(
-                    //    "building-o",
-                    //    tr!("Backup Server Nodes"),
-                    //    &self.status.pbs_nodes,
-                    //))
+                    .with_child(self.create_node_panel(
+                        "building-o",
+                        tr!("Backup Server Nodes"),
+                        RemoteType::Pbs,
+                    ))
+                    // FIXME: add further PBS support
                     //.with_child(
                     //    Panel::new()
                     //        .flex(1.0)
-- 
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] 13+ messages in thread

* [pdm-devel] superseded: [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard
  2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
                   ` (10 preceding siblings ...)
  2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 11/11] ui: dashboard: expose PBS nodes status panel Christian Ebner
@ 2025-10-21 11:17 ` Christian Ebner
  11 siblings, 0 replies; 13+ messages in thread
From: Christian Ebner @ 2025-10-21 11:17 UTC (permalink / raw)
  To: pdm-devel

superseded-by version 3:
https://lore.proxmox.com/pdm-devel/20251021111129.294349-1-c.ebner@proxmox.com/T/


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


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

end of thread, other threads:[~2025-10-21 11:17 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-17 14:11 [pdm-devel] [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 01/11] server: fix small formatting issue via `cargo fmt` Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 02/11] server: api: pass remote as reference to fetching helpers Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 03/11] server: api: refactor filter logic for resource post gathering Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 04/11] api: resources: new transient type for remote resource gathering Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 05/11] server: api: add remote-type search category for resources Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 06/11] pdm-api-types: extend resource status by list of failed remotes Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 07/11] server: api: collect failed remotes list while getting status Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 08/11] ui: dashboard: reimplement node status panel as dedicated component Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 09/11] ui: dashboard: use new node status component Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 10/11] ui: dashboard: extend node panel creation by remote type Christian Ebner
2025-10-17 14:11 ` [pdm-devel] [PATCH datacenter-manager v2 11/11] ui: dashboard: expose PBS nodes status panel Christian Ebner
2025-10-21 11:17 ` [pdm-devel] superseded: [PATCH datacenter-manager v2 00/11] add remote type based search and PBS node status panel to dashboard Christian Ebner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal