[pdm-devel] [PATCH proxmox-datacenter-manager 1/4] server: add api for getting available updates/changelogs for remote nodes

Stefan Hanreich s.hanreich at proxmox.com
Wed Sep 3 11:19:15 CEST 2025


On 9/3/25 11:02 AM, Stefan Hanreich wrote:
> On 9/2/25 5:14 PM, Lukas Wagner wrote:
>> This adds new APIs for update management:
>>
>>     GET /pve/remotes/{remote}/nodes/{node}/apt/changelog
>>       -> get package changelog
>>     GET /pve/remotes/{remote}/nodes/{node}/apt/update
>>       -> get list of updatable packages
>>     POST /pve/remotes/{remote}/nodes/{node}/apt/update
>>       -> refresh APT database
>>
>> At this time these just pass the call through to PVE with no caching
>> involved on the PDM side. This should be fine for this API, but once
>> we have an API for 'give me a view of ALL available remote updates',
>> we need to introduce a cache that is periodically refreshed.
>>
>> Signed-off-by: Lukas Wagner <l.wagner at proxmox.com>
>> ---
>>  server/src/api/pve/apt.rs    | 119 +++++++++++++++++++++++++++++++++++
>>  server/src/api/pve/mod.rs    |   3 +-
>>  server/src/api/pve/node.rs   |   1 +
>>  server/src/lib.rs            |   1 +
>>  server/src/remote_updates.rs |  96 ++++++++++++++++++++++++++++
>>  5 files changed, 219 insertions(+), 1 deletion(-)
>>  create mode 100644 server/src/api/pve/apt.rs
>>  create mode 100644 server/src/remote_updates.rs
>>
>> diff --git a/server/src/api/pve/apt.rs b/server/src/api/pve/apt.rs
>> new file mode 100644
>> index 00000000..f5027fb8
>> --- /dev/null
>> +++ b/server/src/api/pve/apt.rs
>> @@ -0,0 +1,119 @@
>> +use anyhow::Error;
>> +
>> +use proxmox_apt_api_types::{APTGetChangelogOptions, APTUpdateInfo};
>> +use proxmox_router::{list_subdirs_api_method, Permission, Router, SubdirMap};
>> +use proxmox_schema::api;
>> +use proxmox_schema::api_types::NODE_SCHEMA;
>> +
>> +use pdm_api_types::{remotes::REMOTE_ID_SCHEMA, RemoteUpid, PRIV_RESOURCE_MODIFY};
>> +
>> +use crate::{api::remotes::get_remote, remote_updates};
>> +
>> +#[api(
>> +    input: {
>> +        properties: {
>> +            remote: {
>> +                schema: REMOTE_ID_SCHEMA,
>> +            },
>> +            node: {
>> +                schema: NODE_SCHEMA,
>> +            },
>> +        },
>> +    },
>> +    returns: {
>> +        description: "A list of packages with available updates.",
>> +        type: Array,
>> +        items: {
>> +            type: APTUpdateInfo
>> +        },
>> +    },
>> +    access: {
>> +        permission: &Permission::Privilege(&["resource", "{remote}", "node", "{node}", "system"], PRIV_RESOURCE_MODIFY, false),
>> +    },
>> +)]
>> +/// List available APT updates for a remote PVE node.
>> +async fn apt_update_available(remote: String, node: String) -> Result<Vec<APTUpdateInfo>, Error> {
> 
> potentially fine to take a ref here for both params as well?
> 
>> +    let (config, _digest) = pdm_config::remotes::config()?;
>> +    let remote = get_remote(&config, &remote)?;
>> +
>> +    let updates = remote_updates::list_available_updates(remote.clone(), &node).await?;
>> +
>> +    Ok(updates)
>> +}
>> +
>> +#[api(
>> +    input: {
>> +        properties: {
>> +            remote: {
>> +                schema: REMOTE_ID_SCHEMA,
>> +            },
>> +            node: {
>> +                schema: NODE_SCHEMA,
>> +            },
>> +        },
>> +    },
>> +    access: {
>> +        permission: &Permission::Privilege(&["resource", "{remote}", "node", "{node}", "system"], PRIV_RESOURCE_MODIFY, false),
>> +    },
>> +)]
>> +/// Update the APT database of a remote PVE node.
>> +pub async fn apt_update_database(remote: String, node: String) -> Result<RemoteUpid, Error> {
> 
> here too then
> 
>> +    let (config, _digest) = pdm_config::remotes::config()?;
>> +    let remote = get_remote(&config, &remote)?;
>> +
>> +    let upid = remote_updates::update_apt_database(remote, &node).await?;
>> +
>> +    Ok(upid)
>> +}
>> +
>> +#[api(
>> +    input: {
>> +        properties: {
>> +            remote: {
>> +                schema: REMOTE_ID_SCHEMA,
>> +            },
>> +            node: {
>> +                schema: NODE_SCHEMA,
>> +            },
>> +            options: {
>> +                type: APTGetChangelogOptions,
>> +                flatten: true,
>> +            },
>> +        },
>> +    },
>> +    returns: {
>> +        description: "The Package changelog.",
>> +        type: String,
>> +    },
>> +    access: {
>> +        permission: &Permission::Privilege(&["resource", "{remote}", "node", "{node}", "system"], PRIV_RESOURCE_MODIFY, false),
>> +    },
>> +)]
>> +/// Retrieve the changelog of the specified package for a remote PVE node.
>> +async fn apt_get_changelog(
>> +    remote: String,
>> +    node: String,
>> +    options: APTGetChangelogOptions,
> 
> here too then

sorry, was too liberal when scanning the functions, those three cannot
take a ref ofc

[snip]




More information about the pdm-devel mailing list