Context
Operator::restore and the first S3 implementation landed in #8143. This issue turns the API discussion in #4321 into a service implementation tracker.
The checklist includes services whose providers expose versioning, delete markers, soft deletion, revisions, or a recycle bin. Other services should keep returning Unsupported until a provider-native recoverable state is identified.
Contract
Each implementation must preserve the public restore contract:
restore(path) succeeds for a live object, restores the latest service-native deleted state, and returns NotFound when no live or recoverable state exists.
restore_with(path).version(version) makes the selected historical version current.
if_not_exists is advertised only when the provider offers an atomic destination condition.
- One restore call reverses one provider-native deletion state. For services that stack delete markers, repeated calls may expose progressively older states.
- Capabilities must reflect the configured provider and must not be inferred only from a compatible API shape.
Status
Completed
Version and delete-marker services
Native soft-delete, revision, and recycle-bin services
Investigation or blocked
Pull request acceptance checklist
Every service PR should cover the applicable items:
Provider documentation and request-construction analysis establish feasibility, but they do not replace actual-service behavior tests.
Non-goals
- Changing a service's existing delete semantics inside a restore PR.
- Downloading and re-uploading object data when the provider offers native server-side recovery or copy.
- Claiming recovery for unversioned, expired, or permanently deleted data.
Context
Operator::restoreand the first S3 implementation landed in #8143. This issue turns the API discussion in #4321 into a service implementation tracker.The checklist includes services whose providers expose versioning, delete markers, soft deletion, revisions, or a recycle bin. Other services should keep returning
Unsupporteduntil a provider-native recoverable state is identified.Contract
Each implementation must preserve the public restore contract:
restore(path)succeeds for a live object, restores the latest service-native deleted state, and returnsNotFoundwhen no live or recoverable state exists.restore_with(path).version(version)makes the selected historical version current.if_not_existsis advertised only when the provider offers an atomic destination condition.Status
Completed
Version and delete-marker services
CopyObject's sourceversionId(COS API). Do not advertise conditional restore until an atomic versioned-destination condition is proven against COS.CopyObjectprotocol against the actual service before advertisingrestore_with_version.Native soft-delete, revision, and recycle-bin services
Undelete Blobfor soft-delete-only accounts (REST API). With blob versioning, discover a previous version and copy it to the base blob (versioning behavior). OpenDAL's copy request already accepts a sourceversionid(source). feat(services/azblob): implement "undelete" operation in azblob #7178 predates the currentrestoreAPI and must be adapted before it can land.objects.restore, includingrestoreTokenwhen hierarchical namespace requires it (JSON API). OpenDAL rewrite already supportssourceGenerationandifGenerationMatch=0(source), but it still needs generation/deleted-state discovery.hideentries withb2_list_file_versions(API), remove the current hide marker withb2_delete_file_version, and promote a selected file ID withb2_copy_file(API). OpenDAL currently lacks the required version-listing capability.files/restore(path, rev)(official SDK/API reference). OpenDAL currently does not expose Dropbox revisions, so define how revision IDs reachrestore_with(...).version(...)and verify behavior against the service.trashed=false(Drive API guide). The implementation needs deleted-path-to-file-ID resolution and explicit destination-conflict semantics.Investigation or blocked
permanently=true(source). Restore is blocked until a separate decision changes or parameterizes delete semantics; restore work must not silently change existing delete behavior.Pull request acceptance checklist
Every service PR should cover the applicable items:
NotFoundfor an unknown or permanently deleted path.restore_with_versionis advertised.restore_with_if_not_existsis advertised.Provider documentation and request-construction analysis establish feasibility, but they do not replace actual-service behavior tests.
Non-goals