Skip to content

Commit 0f46b50

Browse files
authored
Integrate latest 3.12.2 changes (#348)
* Adding 3.12.2 features * Updated driver version * Fixed failing test in 3.12.2 * Fixing failing doctest
1 parent d8ea7cc commit 0f46b50

8 files changed

+111
-6
lines changed

arango/cluster.py

+55
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
ClusterServerRoleError,
1616
ClusterServerStatisticsError,
1717
ClusterServerVersionError,
18+
ClusterVpackSortMigrationError,
1819
)
1920
from arango.formatter import format_body
2021
from arango.request import Request
@@ -444,3 +445,57 @@ def response_handler(resp: Response) -> bool:
444445
return result
445446

446447
return self._execute(request, response_handler)
448+
449+
def vpack_sort_migration_status(self) -> Result[Json]:
450+
"""Query the status of the vpack sorting migration.
451+
452+
:return: Status of the VPack sort migration.
453+
:rtype: dict
454+
"""
455+
request = Request(
456+
method="get", endpoint="/_admin/cluster/vpackSortMigration/status"
457+
)
458+
459+
def response_handler(resp: Response) -> Json:
460+
if not resp.is_success:
461+
raise ClusterVpackSortMigrationError(resp, request)
462+
result: Json = resp.body["result"]
463+
return result
464+
465+
return self._execute(request, response_handler)
466+
467+
def vpack_sort_migration_index_check(self) -> Result[Json]:
468+
"""Check for indexes impacted by the sorting behavior before 3.12.2.
469+
470+
:return: Status of indexes.
471+
:rtype: dict
472+
"""
473+
request = Request(
474+
method="get", endpoint="/_admin/cluster/vpackSortMigration/check"
475+
)
476+
477+
def response_handler(resp: Response) -> Json:
478+
if not resp.is_success:
479+
raise ClusterVpackSortMigrationError(resp, request)
480+
result: Json = resp.body["result"]
481+
return result
482+
483+
return self._execute(request, response_handler)
484+
485+
def migrate_vpack_sorting(self) -> Result[Json]:
486+
"""Migrate instances to the new VPack sorting behavior.
487+
488+
:return: Status of the VPack sort migration.
489+
:rtype: dict
490+
"""
491+
request = Request(
492+
method="put", endpoint="/_admin/cluster/vpackSortMigration/migrate"
493+
)
494+
495+
def response_handler(resp: Response) -> Json:
496+
if not resp.is_success:
497+
raise ClusterVpackSortMigrationError(resp, request)
498+
result: Json = resp.body["result"]
499+
return result
500+
501+
return self._execute(request, response_handler)

arango/database.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -935,20 +935,26 @@ def response_handler(resp: Response) -> Json:
935935

936936
return self._execute(request, response_handler)
937937

938-
def log_levels(self, server_id: Optional[str] = None) -> Result[Json]:
938+
def log_levels(
939+
self, server_id: Optional[str] = None, with_appenders: Optional[bool] = None
940+
) -> Result[Json]:
939941
"""Return current logging levels.
940942
941943
:param server_id: Forward log level to a specific server. This makes it
942944
easier to adjust the log levels in clusters because DB-Servers require
943945
JWT authentication whereas Coordinators also support authentication
944946
using usernames and passwords.
945947
:type server_id: str
948+
:param with_appenders: Include appenders in the response.
949+
:type with_appenders: bool
946950
:return: Current logging levels.
947951
:rtype: dict
948952
"""
949953
params: Params = {}
950954
if server_id is not None:
951955
params["serverId"] = server_id
956+
if with_appenders is not None:
957+
params["withAppenders"] = with_appenders
952958

953959
request = Request(method="get", endpoint="/_admin/log/level", params=params)
954960

@@ -961,7 +967,10 @@ def response_handler(resp: Response) -> Json:
961967
return self._execute(request, response_handler)
962968

963969
def set_log_levels(
964-
self, server_id: Optional[str] = None, **kwargs: Dict[str, Any]
970+
self,
971+
server_id: Optional[str] = None,
972+
with_appenders: Optional[bool] = None,
973+
**kwargs: Dict[str, Any],
965974
) -> Result[Json]:
966975
"""Set the logging levels.
967976
@@ -983,6 +992,8 @@ def set_log_levels(
983992
JWT authentication whereas Coordinators also support authentication
984993
using usernames and passwords.
985994
:type server_id: str | None
995+
:param with_appenders: Include appenders in the request.
996+
:type with_appenders: bool | None
986997
:param kwargs: Logging levels.
987998
:type kwargs: Dict[str, Any]
988999
:return: New logging levels.
@@ -991,6 +1002,8 @@ def set_log_levels(
9911002
params: Params = {}
9921003
if server_id is not None:
9931004
params["serverId"] = server_id
1005+
if with_appenders is not None:
1006+
params["withAppenders"] = with_appenders
9941007

9951008
request = Request(
9961009
method="put", endpoint="/_admin/log/level", params=params, data=kwargs

arango/exceptions.py

+4
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,10 @@ class ClusterRebalanceError(ArangoServerError):
10471047
"""Failed to execute cluster re-balancing operation (load/set)."""
10481048

10491049

1050+
class ClusterVpackSortMigrationError(ArangoServerError):
1051+
"""Failed to execute vpack sort migration request."""
1052+
1053+
10501054
##################
10511055
# JWT Exceptions #
10521056
##################

arango/formatter.py

+6
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,12 @@ def format_aql_query(body: Json) -> Json:
365365
# New in 3.11
366366
if "peakMemoryUsage" in body:
367367
result["peak_memory_usage"] = body["peakMemoryUsage"]
368+
369+
# New in 3.12.2
370+
if "modificationQuery" in body:
371+
result["modification_query"] = body["modificationQuery"]
372+
if "warnings" in body:
373+
result["warnings"] = body["warnings"]
368374
return verify_format(body, result)
369375

370376

arango/request.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def normalize_headers(
1212
if driver_flags is not None:
1313
for flag in driver_flags:
1414
flags = flags + flag + ";"
15-
driver_version = "8.1.0"
15+
driver_version = "8.1.1"
1616
driver_header = "python-arango/" + driver_version + " (" + flags + ")"
1717
normalized_headers: Headers = {
1818
"charset": "utf-8",

docs/admin.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ database.
6060
# Set the log .
6161
sys_db.set_log_levels(
6262
agency='DEBUG',
63-
collector='INFO',
63+
deprecation='INFO',
6464
threads='WARNING'
6565
)
6666

tests/test_cluster.py

+24
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import warnings
33

44
import pytest
5+
from packaging import version
56

67
from arango.errno import DATABASE_NOT_FOUND, FORBIDDEN
78
from arango.exceptions import (
@@ -16,6 +17,7 @@
1617
ClusterServerRoleError,
1718
ClusterServerStatisticsError,
1819
ClusterServerVersionError,
20+
ClusterVpackSortMigrationError,
1921
)
2022
from tests.helpers import assert_raises
2123

@@ -235,3 +237,25 @@ def test_cluster_rebalance(sys_db, bad_db, cluster):
235237
with assert_raises(ClusterRebalanceError) as err:
236238
bad_db.cluster.rebalance()
237239
assert err.value.error_code == FORBIDDEN
240+
241+
242+
def test_vpack_sort_migration(sys_db, bad_db, db_version, cluster):
243+
if not cluster:
244+
pytest.skip("Only tested in a cluster setup")
245+
if db_version < version.parse("3.12.2"):
246+
pytest.skip("vpackSortMigration is only tested in 3.12.2+")
247+
248+
sys_db.cluster.vpack_sort_migration_status()
249+
with assert_raises(ClusterVpackSortMigrationError) as err:
250+
bad_db.cluster.vpack_sort_migration_status()
251+
assert err.value.error_code == FORBIDDEN
252+
253+
sys_db.cluster.vpack_sort_migration_index_check()
254+
with assert_raises(ClusterVpackSortMigrationError) as err:
255+
bad_db.cluster.vpack_sort_migration_index_check()
256+
assert err.value.error_code == FORBIDDEN
257+
258+
sys_db.cluster.migrate_vpack_sorting()
259+
with assert_raises(ClusterVpackSortMigrationError) as err:
260+
bad_db.cluster.migrate_vpack_sorting()
261+
assert err.value.error_code == FORBIDDEN

tests/test_database.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,8 @@ def test_database_misc_methods(client, sys_db, db, bad_db, cluster, secret, db_v
9999
assert err.value.error_code in {11, 1228}
100100

101101
# Test get server required database version
102-
version = db.required_db_version()
103-
assert isinstance(version, str)
102+
required_version = db.required_db_version()
103+
assert isinstance(required_version, str)
104104

105105
# Test get server target version with bad database
106106
with assert_raises(ServerRequiredDBVersionError):
@@ -252,6 +252,9 @@ def test_database_misc_methods(client, sys_db, db, bad_db, cluster, secret, db_v
252252
# Test get log levels
253253
default_log_levels = sys_db.log_levels()
254254
assert isinstance(default_log_levels, dict)
255+
if db_version >= version.parse("3.12.2"):
256+
log_levels_with_appenders = sys_db.log_levels(with_appenders=True)
257+
assert isinstance(log_levels_with_appenders, dict)
255258

256259
# Test get log levels with bad database
257260
with assert_raises(ServerLogLevelError) as err:

0 commit comments

Comments
 (0)