[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