Hi all

This is a proposal for discussion, not a patch. The developer documentation asks that plans be discussed before starting work, so I'd like to check whether this would be acceptable before writing it.

GET /api2/json/admin/datastore/{store}/snapshots returns only the snapshots in the requested namespace, so a client wanting a datastore-wide view has to call /admin/datastore/{store}/namespace first and then issue one snapshots request per namespace. I ran into this writing a third-party monitoring client.

Tested against PBS 4.2:

/admin/datastore/pbs/snapshots -> 485 snapshots (root only) 

/admin/datastore/pbs/snapshots?ns=test -> 1 snapshot 

/admin/datastore/pbs/snapshots?max-depth=7 -> 400 parameter verification failed - 'max-depth': schema does not allow additional properties

Proposal: accept an optional max-depth using the existing NS_MAX_DEPTH_SCHEMA, defaulting to 0 so behaviour is unchanged for current callers.

This looks anticipated in the code. As of 5d95fc20e, src/api2/admin/datastore.rs lines 571, 575 and 583 each carry a "// FIXME: Recursion" on the group construction in list_snapshots_blocking, with a further one at 565 about filtering by owner before collecting. ListAccessibleBackupGroups already takes max_depth and applies the per-namespace privilege and owner checks during iteration, and get_snapshots_count uses it in roughly the shape list_snapshots would need.

I'd send it as two patches: the refactor onto ListAccessibleBackupGroups with no behavioural change, then max-depth on top. I can test on a 4.2 instance including with a token holding DatastoreAudit on the root namespace only, to confirm namespaces the token cannot see stay absent from a recursive listing.


Questions for the list

1. Is adding max-depth to the snapshots endpoint acceptable in principle?

2. Is ListAccessibleBackupGroups the right vehicle here, or is there a reason list_snapshots does not already use it?

3. Snapshot entries carry no namespace field, so a recursive listing is ambiguous unless the client tracks it per request. Adding one would mean a new field on SnapshotListItem, which is also decoded from remote instances in server/sync.rs and server/push.rs

If you'd rather this were solved another way or not at all I'm happy to hear it before writing anything.

Regards Thomas Moore