[pdm-devel] [PATCH datacenter-manager 1/7] server: api: add remote-type search category for resources

Dominik Csapak d.csapak at proxmox.com
Tue Oct 14 10:35:28 CEST 2025


one comment inline

On 10/13/25 10:56 AM, Christian Ebner wrote:
> Extend the current search capability for resources by adding the
> `RemoteType` search category, allowing to selectively filter remotes
> of type PVE and PBS. While extending the search capabilities, this
> will also be used to filter the resources to be gathered on status
> api calls, to refine statistics based on remote type.
> 
> 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.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>   server/src/api/resources.rs | 44 +++++++++++++++++++++++++++++++++----
>   1 file changed, 40 insertions(+), 4 deletions(-)
> 
> diff --git a/server/src/api/resources.rs b/server/src/api/resources.rs
> index f4f56bc..029106f 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,
> +    online: Option<bool>,
> +    remote_type: Option<RemoteType>,
> +    term: &SearchTerm,

maybe we could just pass '&Remote' here?
then we don't have to add a new parameter in case we want extra info
from the remote in the future?

this would mean that we add a more complete remote struct in the 
`RemoteResources` one, but that could help later (see my comment on patch 3)

> +) -> 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,10 @@ fn remote_matches_search_term(remote_name: &str, online: Option<bool>, term: &Se
>                   None => true,
>               },
>               MatchCategory::Template => false,
> +            MatchCategory::RemoteType => match remote_type {
> +                Some(remote_type) => category.matches(&remote_type.to_string(), &term.value),
> +                None => true,
> +            },
>           },
>           Some(Err(_)) => false,
>           None => {
> @@ -144,6 +163,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,
> +    }
> +}
> +
>   #[api(
>       // FIXME:: see list-like API calls in resource routers, we probably want more fine-grained
>       // checks..
> @@ -248,8 +278,14 @@ 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, None, Some(remote.ty), term)
> +            })
>           {
>               continue;
>           }
> @@ -301,7 +337,7 @@ pub(crate) async fn get_resources_impl(
>                   return true;
>               }
>               filters.matches(|filter| {
> -                remote_matches_search_term(&res.remote, Some(res.error.is_none()), filter)
> +                remote_matches_search_term(&res.remote, Some(res.error.is_none()), None, filter)
>               })
>           })
>       }





More information about the pdm-devel mailing list