zerto_recover_file passed the guest absolute path straight to
POST /v1/flrs/{session}/download, which the ZVM rejects:
HTTP 400 {"Message":"Invalid path: check location exists or
correct path syntax."}
FLR browse/download is rooted at partitions, not the guest's /.
/home/justin/app-config.yaml is Volume2-Ext4/home/justin/app-config.yaml.
server.py already called browse_flr() but discarded the result, so
nothing ever resolved the path.
Add resolve_flr_path() and browsable_partitions() to recover.py:
- browse path "" returns {MainPathItem, PathItems}, not a bare list
- skip partitions with IsBrowsable false. A Linux guest reports
Volume1-Unknown as "Cannot restore. Partition type Unknown is not
supported." Do not assume the first partition is the right one.
- browse returns child paths percent-encoded
(Volume2-Ext4%2fhome%2fjustin%2fapp-config.yaml); download wants
them decoded with plain slashes
- raise a ZertoError naming what was searched when the file is
absent, since "not replicated into that checkpoint yet" is the
likely cause and is actionable
zerto_recover_file now returns the resolved flr_path.
Verified end to end against ZVM 10.x: guard tagged cp 1075 on VPG
jp-ubuntu, FLR mounted in ~3s, 158 bytes recovered from the
pre-mutation checkpoint with matching content.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_016yVfC5nvZowoLFnEGWhLGn