Skip to content

Commit bc2eaa4

Browse files
authored
feat: add return fields for list backups and support ordering (#1856)
* feat: add return fields for list backups and support ordering * fix: mark fields as optional * fix: use a single boolean for ascending sorting * chore: update test versions * revert: yaml formatting * chore: don't wait in the sorting test
1 parent 5b75e5d commit bc2eaa4

File tree

5 files changed

+33
-4
lines changed

5 files changed

+33
-4
lines changed

integration/test_backup_v4.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ def test_backup_and_restore_with_collection_and_config_1_24_x(
500500
@pytest.mark.parametrize("dynamic_backup_location", [False, True])
501501
def test_cancel_backup(
502502
client: weaviate.WeaviateClient,
503-
dynamic_backup_location,
503+
dynamic_backup_location: bool,
504504
tmp_path: pathlib.Path,
505505
request: SubRequest,
506506
) -> None:
@@ -617,6 +617,21 @@ def test_list_backup(client: weaviate.WeaviateClient, request: SubRequest) -> No
617617
time.sleep(0.1)
618618

619619

620+
def test_list_backup_ascending_order(client: weaviate.WeaviateClient, request: SubRequest) -> None:
621+
"""List all backups in ascending order."""
622+
backup_id = unique_backup_id(request.node.name)
623+
if client._connection._weaviate_version.is_lower_than(1, 33, 2):
624+
pytest.skip("List backups sorting is only supported from 1.33.2")
625+
626+
resp = client.backup.create(backup_id=backup_id, backend=BACKEND)
627+
assert resp.status == BackupStatus.STARTED
628+
629+
backups = client.backup.list_backups(backend=BACKEND, sort_ascending=True)
630+
assert backup_id.lower() in [b.backup_id.lower() for b in backups]
631+
632+
assert sorted(backups, key=lambda b: b.started_at or b.backup_id) == backups
633+
634+
620635
@pytest.fixture
621636
def artist_alias(client: weaviate.WeaviateClient) -> Generator[str, None, None]:
622637
if client._connection._weaviate_version.is_lower_than(1, 32, 0):

weaviate/backup/async_.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,6 @@ class _BackupAsync(_BackupExecutor[ConnectionAsync]):
5555
backend: BackupStorage,
5656
backup_location: Optional[BackupLocationType] = None,
5757
) -> bool: ...
58-
async def list_backups(self, backend: BackupStorage) -> List[BackupListReturn]: ...
58+
async def list_backups(
59+
self, backend: BackupStorage, sort_ascending: Optional[bool] = None
60+
) -> List[BackupListReturn]: ...

weaviate/backup/backup.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime
12
from enum import Enum
23
from typing import Any, Dict, List, Optional, cast
34

@@ -88,3 +89,6 @@ class BackupListReturn(BaseModel):
8889
collections: List[str] = Field(default_factory=list, alias="classes")
8990
status: BackupStatus
9091
backup_id: str = Field(alias="id")
92+
started_at: Optional[datetime] = Field(alias="startedAt", default=None)
93+
completed_at: Optional[datetime] = Field(alias="completedAt", default=None)
94+
size: float = Field(default=0)

weaviate/backup/executor.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,9 +474,14 @@ def resp(res: Response) -> bool:
474474
status_codes=_ExpectedStatusCodes(ok_in=[204, 404], error="cancel backup"),
475475
)
476476

477-
def list_backups(self, backend: BackupStorage) -> executor.Result[List[BackupListReturn]]:
477+
def list_backups(
478+
self, backend: BackupStorage, sort_ascending: Optional[bool] = None
479+
) -> executor.Result[List[BackupListReturn]]:
478480
_, backend = _get_and_validate_get_status(backend=backend, backup_id="dummy")
479481
path = f"/backups/{backend.value}"
482+
params = {}
483+
if sort_ascending:
484+
params["order"] = "asc"
480485

481486
def resp(res: Response) -> List[BackupListReturn]:
482487
typed_response = _decode_json_response_list(res, "Backup list")
@@ -487,6 +492,7 @@ def resp(res: Response) -> List[BackupListReturn]:
487492
return executor.execute(
488493
response_callback=resp,
489494
method=self._connection.get,
495+
params=params,
490496
path=path,
491497
error_msg="Backup listing failed due to connection error.",
492498
status_codes=_ExpectedStatusCodes(ok_in=[200], error="list backup"),

weaviate/backup/sync.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,6 @@ class _Backup(_BackupExecutor[ConnectionSync]):
5555
backend: BackupStorage,
5656
backup_location: Optional[BackupLocationType] = None,
5757
) -> bool: ...
58-
def list_backups(self, backend: BackupStorage) -> List[BackupListReturn]: ...
58+
def list_backups(
59+
self, backend: BackupStorage, sort_ascending: Optional[bool] = None
60+
) -> List[BackupListReturn]: ...

0 commit comments

Comments
 (0)