python-arango-async 0.0.4__tar.gz → 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/CONTRIBUTING.md +1 -1
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/PKG-INFO +4 -3
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/README.md +2 -2
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/aql.py +4 -4
- python_arango_async-1.0.0/arangoasync/backup.py +295 -0
- python_arango_async-1.0.0/arangoasync/cluster.py +451 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/collection.py +423 -14
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/connection.py +7 -2
- python_arango_async-1.0.0/arangoasync/database.py +3536 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/exceptions.py +374 -2
- python_arango_async-1.0.0/arangoasync/foxx.py +829 -0
- python_arango_async-1.0.0/arangoasync/replication.py +270 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/request.py +10 -5
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/response.py +15 -1
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/typings.py +140 -2
- python_arango_async-1.0.0/arangoasync/version.py +1 -0
- python_arango_async-1.0.0/docs/admin.rst +50 -0
- python_arango_async-1.0.0/docs/analyzer.rst +39 -0
- python_arango_async-1.0.0/docs/backup.rst +78 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/certificates.rst +22 -0
- python_arango_async-1.0.0/docs/cluster.rst +53 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/database.rst +7 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/document.rst +83 -0
- python_arango_async-1.0.0/docs/foxx.rst +147 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/index.rst +8 -2
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/migration.rst +9 -2
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/specs.rst +6 -0
- python_arango_async-1.0.0/docs/task.rst +51 -0
- python_arango_async-1.0.0/docs/view.rst +69 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/pyproject.toml +1 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/python_arango_async.egg-info/PKG-INFO +4 -3
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/python_arango_async.egg-info/SOURCES.txt +18 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/python_arango_async.egg-info/requires.txt +1 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/starter.sh +1 -1
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/conftest.py +13 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/helpers.py +45 -0
- python_arango_async-1.0.0/tests/static/service.zip +0 -0
- python_arango_async-1.0.0/tests/test_analyzer.py +91 -0
- python_arango_async-1.0.0/tests/test_backup.py +57 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_client.py +14 -0
- python_arango_async-1.0.0/tests/test_cluster.py +101 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_collection.py +100 -1
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_connection.py +6 -0
- python_arango_async-1.0.0/tests/test_database.py +410 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_document.py +48 -0
- python_arango_async-1.0.0/tests/test_foxx.py +245 -0
- python_arango_async-1.0.0/tests/test_task.py +79 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_typings.py +60 -0
- python_arango_async-1.0.0/tests/test_view.py +137 -0
- python_arango_async-0.0.4/arangoasync/database.py +0 -1752
- python_arango_async-0.0.4/arangoasync/version.py +0 -1
- python_arango_async-0.0.4/tests/test_database.py +0 -210
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.circleci/config.yml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.github/workflows/codeql.yaml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.github/workflows/docs.yaml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.github/workflows/pypi.yaml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.gitignore +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.pre-commit-config.yaml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/.readthedocs.yaml +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/LICENSE +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/__init__.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/auth.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/client.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/compression.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/cursor.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/errno.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/executor.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/graph.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/http.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/job.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/logger.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/resolver.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/result.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/arangoasync/serialization.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/aql.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/async.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/authentication.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/collection.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/compression.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/conf.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/cursor.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/errno.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/errors.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/graph.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/helpers.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/http.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/indexes.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/logging.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/overview.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/serialization.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/static/logo.png +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/transaction.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/docs/user.rst +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/python_arango_async.egg-info/dependency_links.txt +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/python_arango_async.egg-info/top_level.txt +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/setup.cfg +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/setup.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/__init__.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/static/cluster-3.11.conf +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/static/cluster-3.12.conf +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/static/keyfile +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/static/single-3.11.conf +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/static/single-3.12.conf +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_aql.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_async.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_compression.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_cursor.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_graph.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_http.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_resolver.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_transaction.py +0 -0
- {python_arango_async-0.0.4 → python_arango_async-1.0.0}/tests/test_user.py +0 -0
|
@@ -10,7 +10,7 @@ pre-commit install # Install git pre-commit hooks
|
|
|
10
10
|
Run unit tests with coverage:
|
|
11
11
|
|
|
12
12
|
```shell
|
|
13
|
-
pytest --cov=arango --cov-report=html # Open htmlcov/index.html in your browser
|
|
13
|
+
pytest --enterprise --cluster --cov=arango --cov-report=html # Open htmlcov/index.html in your browser
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
To start and ArangoDB instance locally, run:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-arango-async
|
|
3
|
-
Version: 0.0
|
|
3
|
+
Version: 1.0.0
|
|
4
4
|
Summary: Async Python Driver for ArangoDB
|
|
5
5
|
Author-email: Alexandru Petenchea <alexandru.petenchea@arangodb.com>, Anthony Mahanna <anthony.mahanna@arangodb.com>
|
|
6
6
|
Maintainer-email: Alexandru Petenchea <alexandru.petenchea@arangodb.com>, Anthony Mahanna <anthony.mahanna@arangodb.com>
|
|
@@ -26,6 +26,7 @@ Requires-Dist: aiohttp>=3.9
|
|
|
26
26
|
Requires-Dist: multidict>=6.0
|
|
27
27
|
Requires-Dist: pyjwt>=2.8.0
|
|
28
28
|
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: aiofiles>=24.1.0; extra == "dev"
|
|
29
30
|
Requires-Dist: black>=24.2; extra == "dev"
|
|
30
31
|
Requires-Dist: flake8>=7.0; extra == "dev"
|
|
31
32
|
Requires-Dist: isort>=5.10; extra == "dev"
|
|
@@ -39,7 +40,7 @@ Requires-Dist: sphinx_rtd_theme>=2.0; extra == "dev"
|
|
|
39
40
|
Requires-Dist: types-setuptools; extra == "dev"
|
|
40
41
|
Dynamic: license-file
|
|
41
42
|
|
|
42
|
-

|
|
43
|
+

|
|
43
44
|
|
|
44
45
|
[](https://dl.circleci.com/status-badge/redirect/gh/arangodb/python-arango-async/tree/main)
|
|
45
46
|
[](https://github.com/arangodb/python-arango-async/actions/workflows/codeql.yaml)
|
|
@@ -61,7 +62,7 @@ database natively supporting documents, graphs and search.
|
|
|
61
62
|
This is the _asyncio_ alternative of the [python-arango](https://github.com/arangodb/python-arango)
|
|
62
63
|
driver.
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
Check out a demo app at [python-arango-async-demo](https://github.com/apetenchea/python-arango-async-demo).
|
|
65
66
|
|
|
66
67
|
## Requirements
|
|
67
68
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-

|
|
1
|
+

|
|
2
2
|
|
|
3
3
|
[](https://dl.circleci.com/status-badge/redirect/gh/arangodb/python-arango-async/tree/main)
|
|
4
4
|
[](https://github.com/arangodb/python-arango-async/actions/workflows/codeql.yaml)
|
|
@@ -20,7 +20,7 @@ database natively supporting documents, graphs and search.
|
|
|
20
20
|
This is the _asyncio_ alternative of the [python-arango](https://github.com/arangodb/python-arango)
|
|
21
21
|
driver.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Check out a demo app at [python-arango-async-demo](https://github.com/apetenchea/python-arango-async-demo).
|
|
24
24
|
|
|
25
25
|
## Requirements
|
|
26
26
|
|
|
@@ -597,7 +597,7 @@ class AQL:
|
|
|
597
597
|
def response_handler(resp: Response) -> Json:
|
|
598
598
|
if not resp.is_success:
|
|
599
599
|
raise AQLQueryExplainError(resp, request)
|
|
600
|
-
return self.deserializer.loads(resp.raw_body)
|
|
600
|
+
return Response.format_body(self.deserializer.loads(resp.raw_body))
|
|
601
601
|
|
|
602
602
|
return await self._executor.execute(request, response_handler)
|
|
603
603
|
|
|
@@ -625,7 +625,7 @@ class AQL:
|
|
|
625
625
|
def response_handler(resp: Response) -> Json:
|
|
626
626
|
if not resp.is_success:
|
|
627
627
|
raise AQLQueryValidateError(resp, request)
|
|
628
|
-
return self.deserializer.loads(resp.raw_body)
|
|
628
|
+
return Response.format_body(self.deserializer.loads(resp.raw_body))
|
|
629
629
|
|
|
630
630
|
return await self._executor.execute(request, response_handler)
|
|
631
631
|
|
|
@@ -719,7 +719,7 @@ class AQL:
|
|
|
719
719
|
def response_handler(resp: Response) -> Json:
|
|
720
720
|
if not resp.is_success:
|
|
721
721
|
raise AQLFunctionCreateError(resp, request)
|
|
722
|
-
return self.deserializer.loads(resp.raw_body)
|
|
722
|
+
return Response.format_body(self.deserializer.loads(resp.raw_body))
|
|
723
723
|
|
|
724
724
|
return await self._executor.execute(request, response_handler)
|
|
725
725
|
|
|
@@ -760,6 +760,6 @@ class AQL:
|
|
|
760
760
|
if not resp.is_success:
|
|
761
761
|
if not (resp.status_code == HTTP_NOT_FOUND and ignore_missing):
|
|
762
762
|
raise AQLFunctionDeleteError(resp, request)
|
|
763
|
-
return self.deserializer.loads(resp.raw_body)
|
|
763
|
+
return Response.format_body(self.deserializer.loads(resp.raw_body))
|
|
764
764
|
|
|
765
765
|
return await self._executor.execute(request, response_handler)
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
__all__ = ["Backup"]
|
|
2
|
+
|
|
3
|
+
from numbers import Number
|
|
4
|
+
from typing import Optional, cast
|
|
5
|
+
|
|
6
|
+
from arangoasync.exceptions import (
|
|
7
|
+
BackupCreateError,
|
|
8
|
+
BackupDeleteError,
|
|
9
|
+
BackupDownloadError,
|
|
10
|
+
BackupGetError,
|
|
11
|
+
BackupRestoreError,
|
|
12
|
+
BackupUploadError,
|
|
13
|
+
)
|
|
14
|
+
from arangoasync.executor import ApiExecutor
|
|
15
|
+
from arangoasync.request import Method, Request
|
|
16
|
+
from arangoasync.response import Response
|
|
17
|
+
from arangoasync.result import Result
|
|
18
|
+
from arangoasync.serialization import Deserializer, Serializer
|
|
19
|
+
from arangoasync.typings import Json, Jsons
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class Backup:
|
|
23
|
+
"""Backup API wrapper."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, executor: ApiExecutor) -> None:
|
|
26
|
+
self._executor = executor
|
|
27
|
+
|
|
28
|
+
@property
|
|
29
|
+
def serializer(self) -> Serializer[Json]:
|
|
30
|
+
"""Return the serializer."""
|
|
31
|
+
return self._executor.serializer
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def deserializer(self) -> Deserializer[Json, Jsons]:
|
|
35
|
+
"""Return the deserializer."""
|
|
36
|
+
return self._executor.deserializer
|
|
37
|
+
|
|
38
|
+
async def get(self, backup_id: Optional[str] = None) -> Result[Json]:
|
|
39
|
+
"""Return backup details.
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
backup_id (str | None): If set, the returned list is restricted to the
|
|
43
|
+
backup with the given id.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
dict: Backup details.
|
|
47
|
+
|
|
48
|
+
Raises:
|
|
49
|
+
BackupGetError: If the operation fails.
|
|
50
|
+
|
|
51
|
+
References:
|
|
52
|
+
- `list-backups <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#list-all-backups>`__
|
|
53
|
+
""" # noqa: E501
|
|
54
|
+
data: Json = {}
|
|
55
|
+
if backup_id is not None:
|
|
56
|
+
data["id"] = backup_id
|
|
57
|
+
|
|
58
|
+
request = Request(
|
|
59
|
+
method=Method.POST,
|
|
60
|
+
endpoint="/_admin/backup/list",
|
|
61
|
+
data=self.serializer.dumps(data) if data else None,
|
|
62
|
+
prefix_needed=False,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
def response_handler(resp: Response) -> Json:
|
|
66
|
+
if not resp.is_success:
|
|
67
|
+
raise BackupGetError(resp, request)
|
|
68
|
+
result: Json = self.deserializer.loads(resp.raw_body)
|
|
69
|
+
return cast(Json, result["result"])
|
|
70
|
+
|
|
71
|
+
return await self._executor.execute(request, response_handler)
|
|
72
|
+
|
|
73
|
+
async def create(
|
|
74
|
+
self,
|
|
75
|
+
label: Optional[str] = None,
|
|
76
|
+
allow_inconsistent: Optional[bool] = None,
|
|
77
|
+
force: Optional[bool] = None,
|
|
78
|
+
timeout: Optional[Number] = None,
|
|
79
|
+
) -> Result[Json]:
|
|
80
|
+
"""Create a backup when the global write lock can be obtained.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
label (str | None): Label for this backup. If not specified, a UUID is used.
|
|
84
|
+
allow_inconsistent (bool | None): Allow inconsistent backup when the global
|
|
85
|
+
transaction lock cannot be acquired before timeout.
|
|
86
|
+
force (bool | None): Forcefully abort all running transactions to ensure a
|
|
87
|
+
consistent backup when the global transaction lock cannot be
|
|
88
|
+
acquired before timeout. Default (and highly recommended) value
|
|
89
|
+
is `False`.
|
|
90
|
+
timeout (float | None): The time in seconds that the operation tries to
|
|
91
|
+
get a consistent snapshot.
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
dict: Backup information.
|
|
95
|
+
|
|
96
|
+
Raises:
|
|
97
|
+
BackupCreateError: If the backup creation fails.
|
|
98
|
+
|
|
99
|
+
References:
|
|
100
|
+
- `create-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#create-a-backup>`__
|
|
101
|
+
""" # noqa: E501
|
|
102
|
+
data: Json = {}
|
|
103
|
+
if label is not None:
|
|
104
|
+
data["label"] = label
|
|
105
|
+
if allow_inconsistent is not None:
|
|
106
|
+
data["allowInconsistent"] = allow_inconsistent
|
|
107
|
+
if force is not None:
|
|
108
|
+
data["force"] = force
|
|
109
|
+
if timeout is not None:
|
|
110
|
+
data["timeout"] = timeout
|
|
111
|
+
|
|
112
|
+
request = Request(
|
|
113
|
+
method=Method.POST,
|
|
114
|
+
endpoint="/_admin/backup/create",
|
|
115
|
+
data=self.serializer.dumps(data),
|
|
116
|
+
prefix_needed=False,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def response_handler(resp: Response) -> Json:
|
|
120
|
+
if not resp.is_success:
|
|
121
|
+
raise BackupCreateError(resp, request)
|
|
122
|
+
result: Json = self.deserializer.loads(resp.raw_body)
|
|
123
|
+
return cast(Json, result["result"])
|
|
124
|
+
|
|
125
|
+
return await self._executor.execute(request, response_handler)
|
|
126
|
+
|
|
127
|
+
async def restore(self, backup_id: str) -> Result[Json]:
|
|
128
|
+
"""Restore a local backup.
|
|
129
|
+
|
|
130
|
+
Args:
|
|
131
|
+
backup_id (str): Backup ID.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
dict: Result of the restore operation.
|
|
135
|
+
|
|
136
|
+
Raises:
|
|
137
|
+
BackupRestoreError: If the restore operation fails.
|
|
138
|
+
|
|
139
|
+
References:
|
|
140
|
+
- `restore-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#restore-a-backup>`__
|
|
141
|
+
""" # noqa: E501
|
|
142
|
+
data: Json = {"id": backup_id}
|
|
143
|
+
request = Request(
|
|
144
|
+
method=Method.POST,
|
|
145
|
+
endpoint="/_admin/backup/restore",
|
|
146
|
+
data=self.serializer.dumps(data),
|
|
147
|
+
prefix_needed=False,
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
def response_handler(resp: Response) -> Json:
|
|
151
|
+
if not resp.is_success:
|
|
152
|
+
raise BackupRestoreError(resp, request)
|
|
153
|
+
result: Json = self.deserializer.loads(resp.raw_body)
|
|
154
|
+
return cast(Json, result["result"])
|
|
155
|
+
|
|
156
|
+
return await self._executor.execute(request, response_handler)
|
|
157
|
+
|
|
158
|
+
async def delete(self, backup_id: str) -> None:
|
|
159
|
+
"""Delete a backup.
|
|
160
|
+
|
|
161
|
+
Args:
|
|
162
|
+
backup_id (str): Backup ID.
|
|
163
|
+
|
|
164
|
+
Raises:
|
|
165
|
+
BackupDeleteError: If the delete operation fails.
|
|
166
|
+
|
|
167
|
+
References:
|
|
168
|
+
- `delete-backup <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#delete-a-backup>`__
|
|
169
|
+
""" # noqa: E501
|
|
170
|
+
data: Json = {"id": backup_id}
|
|
171
|
+
request = Request(
|
|
172
|
+
method=Method.POST,
|
|
173
|
+
endpoint="/_admin/backup/delete",
|
|
174
|
+
data=self.serializer.dumps(data),
|
|
175
|
+
prefix_needed=False,
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
def response_handler(resp: Response) -> None:
|
|
179
|
+
if not resp.is_success:
|
|
180
|
+
raise BackupDeleteError(resp, request)
|
|
181
|
+
|
|
182
|
+
await self._executor.execute(request, response_handler)
|
|
183
|
+
|
|
184
|
+
async def upload(
|
|
185
|
+
self,
|
|
186
|
+
backup_id: Optional[str] = None,
|
|
187
|
+
repository: Optional[str] = None,
|
|
188
|
+
abort: Optional[bool] = None,
|
|
189
|
+
config: Optional[Json] = None,
|
|
190
|
+
upload_id: Optional[str] = None,
|
|
191
|
+
) -> Result[Json]:
|
|
192
|
+
"""Manage backup uploads.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
backup_id (str | None): Backup ID used for scheduling an upload. Mutually
|
|
196
|
+
exclusive with parameter **upload_id**.
|
|
197
|
+
repository (str | None): Remote repository URL(e.g. "local://tmp/backups").
|
|
198
|
+
abort (str | None): If set to `True`, running upload is aborted. Used with
|
|
199
|
+
parameter **upload_id**.
|
|
200
|
+
config (dict | None): Remote repository configuration. Required for scheduling
|
|
201
|
+
an upload and mutually exclusive with parameter **upload_id**.
|
|
202
|
+
upload_id (str | None): Upload ID. Mutually exclusive with parameters
|
|
203
|
+
**backup_id**, **repository**, and **config**.
|
|
204
|
+
|
|
205
|
+
Returns:
|
|
206
|
+
dict: Upload details.
|
|
207
|
+
|
|
208
|
+
Raises:
|
|
209
|
+
BackupUploadError: If upload operation fails.
|
|
210
|
+
|
|
211
|
+
References:
|
|
212
|
+
- `upload-a-backup-to-a-remote-repository <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#upload-a-backup-to-a-remote-repository>`__
|
|
213
|
+
""" # noqa: E501
|
|
214
|
+
data: Json = {}
|
|
215
|
+
if upload_id is not None:
|
|
216
|
+
data["uploadId"] = upload_id
|
|
217
|
+
if backup_id is not None:
|
|
218
|
+
data["id"] = backup_id
|
|
219
|
+
if repository is not None:
|
|
220
|
+
data["remoteRepository"] = repository
|
|
221
|
+
if abort is not None:
|
|
222
|
+
data["abort"] = abort
|
|
223
|
+
if config is not None:
|
|
224
|
+
data["config"] = config
|
|
225
|
+
|
|
226
|
+
request = Request(
|
|
227
|
+
method=Method.POST,
|
|
228
|
+
endpoint="/_admin/backup/upload",
|
|
229
|
+
data=self.serializer.dumps(data),
|
|
230
|
+
prefix_needed=False,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
def response_handler(resp: Response) -> Json:
|
|
234
|
+
if not resp.is_success:
|
|
235
|
+
raise BackupUploadError(resp, request)
|
|
236
|
+
result: Json = self.deserializer.loads(resp.raw_body)
|
|
237
|
+
return cast(Json, result["result"])
|
|
238
|
+
|
|
239
|
+
return await self._executor.execute(request, response_handler)
|
|
240
|
+
|
|
241
|
+
async def download(
|
|
242
|
+
self,
|
|
243
|
+
backup_id: Optional[str] = None,
|
|
244
|
+
repository: Optional[str] = None,
|
|
245
|
+
abort: Optional[bool] = None,
|
|
246
|
+
config: Optional[Json] = None,
|
|
247
|
+
download_id: Optional[str] = None,
|
|
248
|
+
) -> Result[Json]:
|
|
249
|
+
"""Manage backup downloads.
|
|
250
|
+
|
|
251
|
+
Args:
|
|
252
|
+
backup_id (str | None): Backup ID used for scheduling a download. Mutually
|
|
253
|
+
exclusive with parameter **download_id**.
|
|
254
|
+
repository (str | None): Remote repository URL (e.g. "local://tmp/backups").
|
|
255
|
+
abort (bool | None): If set to `True`, running download is aborted.
|
|
256
|
+
config (dict | None): Remote repository configuration. Required for scheduling
|
|
257
|
+
a download and mutually exclusive with parameter **download_id**.
|
|
258
|
+
download_id (str | None): Download ID. Mutually exclusive with parameters
|
|
259
|
+
**backup_id**, **repository**, and **config**.
|
|
260
|
+
|
|
261
|
+
Returns:
|
|
262
|
+
dict: Download details.
|
|
263
|
+
|
|
264
|
+
Raises:
|
|
265
|
+
BackupDownloadError: If the download operation fails.
|
|
266
|
+
|
|
267
|
+
References:
|
|
268
|
+
- `download-a-backup-from-a-remote-repository <https://docs.arangodb.com/stable/develop/http-api/hot-backups/#download-a-backup-from-a-remote-repository>`__
|
|
269
|
+
""" # noqa: E501
|
|
270
|
+
data: Json = {}
|
|
271
|
+
if download_id is not None:
|
|
272
|
+
data["downloadId"] = download_id
|
|
273
|
+
if backup_id is not None:
|
|
274
|
+
data["id"] = backup_id
|
|
275
|
+
if repository is not None:
|
|
276
|
+
data["remoteRepository"] = repository
|
|
277
|
+
if abort is not None:
|
|
278
|
+
data["abort"] = abort
|
|
279
|
+
if config is not None:
|
|
280
|
+
data["config"] = config
|
|
281
|
+
|
|
282
|
+
request = Request(
|
|
283
|
+
method=Method.POST,
|
|
284
|
+
endpoint="/_admin/backup/download",
|
|
285
|
+
data=self.serializer.dumps(data),
|
|
286
|
+
prefix_needed=False,
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
def response_handler(resp: Response) -> Json:
|
|
290
|
+
if not resp.is_success:
|
|
291
|
+
raise BackupDownloadError(resp, request)
|
|
292
|
+
result: Json = self.deserializer.loads(resp.raw_body)
|
|
293
|
+
return cast(Json, result["result"])
|
|
294
|
+
|
|
295
|
+
return await self._executor.execute(request, response_handler)
|