From: Dominik Csapak <d.csapak@proxmox.com>
To: pdm-devel@lists.proxmox.com
Subject: [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes
Date: Tue, 2 Dec 2025 12:13:32 +0100 [thread overview]
Message-ID: <20251202111533.2068448-4-d.csapak@proxmox.com> (raw)
In-Reply-To: <20251202111533.2068448-1-d.csapak@proxmox.com>
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
next prev parent reply other threads:[~2025-12-02 11:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
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 ` Dominik Csapak [this message]
2025-12-02 11:46 ` [pdm-devel] [PATCH datacenter-manager v2 1/3] lib/server: pve: add api call to get the cached version info from remotes 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251202111533.2068448-4-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pdm-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox