Skip to content

Commit 1dcc802

Browse files
authored
[DE-542] Adding support for shards retrieval (#274)
* Updating tested versions * Adding shards method to Collection * Updating driver version * Added changelog entry * Fixing test_database_misc_methods
1 parent 23de7d3 commit 1dcc802

File tree

7 files changed

+61
-15
lines changed

7 files changed

+61
-15
lines changed

CHANGELOG.md

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
main
2+
-----
3+
4+
* [DE-542] Added `shards()` method to `Collection`
5+
16
7.6.0
2-
----
7+
-----
38

49
* [DE-562] Index Cache Refilling by @apetenchea in https://github.com/ArangoDB-Community/python-arango/pull/259
510

arango/collection.py

+29
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
CollectionRenameError,
1717
CollectionResponsibleShardError,
1818
CollectionRevisionError,
19+
CollectionShardsError,
1920
CollectionStatisticsError,
2021
CollectionTruncateError,
2122
CollectionUnloadError,
@@ -300,6 +301,31 @@ def response_handler(resp: Response) -> Json:
300301

301302
return self._execute(request, response_handler)
302303

304+
def shards(self, details: bool = False) -> Result[Json]:
305+
"""Return collection shards and properties.
306+
307+
Available only in a cluster setup.
308+
309+
:param details: Include responsible servers for each shard.
310+
:type details: bool
311+
:return: Collection shards and properties.
312+
:rtype: dict
313+
:raise arango.exceptions.CollectionShardsError: If retrieval fails.
314+
"""
315+
request = Request(
316+
method="get",
317+
endpoint=f"/_api/collection/{self.name}/shards",
318+
params={"details": details},
319+
read=self.name,
320+
)
321+
322+
def response_handler(resp: Response) -> Json:
323+
if resp.is_success:
324+
return format_collection(resp.body)
325+
raise CollectionShardsError(resp, request)
326+
327+
return self._execute(request, response_handler)
328+
303329
def configure(
304330
self,
305331
sync: Optional[bool] = None,
@@ -330,6 +356,9 @@ def configure(
330356
Default value is 1. Used for clusters only.
331357
:type write_concern: int
332358
:return: New collection properties.
359+
:param computed_values: Define expressions on the collection level that
360+
run on inserts, modifications, or both.
361+
:type computed_values: dict | None
333362
:rtype: dict
334363
:raise arango.exceptions.CollectionConfigureError: If operation fails.
335364
"""

arango/exceptions.py

+4
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ class CollectionConfigureError(ArangoServerError):
258258
"""Failed to configure collection properties."""
259259

260260

261+
class CollectionShardsError(ArangoServerError):
262+
"""Failed to retrieve collection shards."""
263+
264+
261265
class CollectionStatisticsError(ArangoServerError):
262266
"""Failed to retrieve collection statistics."""
263267

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 = "7.5.8"
15+
driver_version = "7.6.0"
1616
driver_header = "python-arango/" + driver_version + " (" + flags + ")"
1717
normalized_headers: Headers = {
1818
"charset": "utf-8",

tester.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ if [[ "$tests" != "all" && "$tests" != "community" && "$tests" != "enterprise" ]
2121
exit 1
2222
fi
2323

24-
# 3.11.1
24+
# 3.11.2
2525
# 3.10.9
26-
# 3.9.9
26+
# 3.9.11
2727
version="${3:-3.11.1}"
2828

2929
if [[ -n "$4" && "$4" != "notest" ]]; then

tests/test_collection.py

+7
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,13 @@ def test_collection_management(db, bad_db, cluster):
204204
)
205205
assert db.has_collection(col_name) is True
206206

207+
if cluster:
208+
for details in (False, True):
209+
shards = col.shards(details=details)
210+
assert shards["name"] == col_name
211+
assert shards["system"] is False
212+
assert len(shards["shards"]) == 2
213+
207214
properties = col.properties()
208215
assert "key_options" in properties
209216
assert properties["schema"] == schema

tests/test_database.py

+12-11
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def test_database_attributes(db, username):
5656
assert isinstance(db.wal, WAL)
5757

5858

59-
def test_database_misc_methods(sys_db, db, bad_db):
59+
def test_database_misc_methods(sys_db, db, bad_db, cluster):
6060
# Test get properties
6161
properties = db.properties()
6262
assert "id" in properties
@@ -202,10 +202,6 @@ def test_database_misc_methods(sys_db, db, bad_db):
202202
# Test get log levels
203203
assert isinstance(sys_db.log_levels(), dict)
204204

205-
# Test get log levels (with server_id)
206-
server_id = sys_db.replication.server_id()
207-
assert isinstance(sys_db.log_levels(server_id), dict)
208-
209205
# Test get log levels with bad database
210206
with assert_raises(ServerLogLevelError) as err:
211207
bad_db.log_levels()
@@ -219,12 +215,17 @@ def test_database_misc_methods(sys_db, db, bad_db):
219215
for key, value in sys_db.log_levels().items():
220216
assert result[key] == value
221217

222-
# Test set log levels (with server_id)
223-
result = sys_db.set_log_levels(server_id, **new_levels)
224-
for key, value in new_levels.items():
225-
assert result[key] == value
226-
for key, value in sys_db.log_levels(server_id).items():
227-
assert result[key] == value
218+
if cluster:
219+
# Test get log levels (with server_id)
220+
server_id = sys_db.cluster.server_id()
221+
assert isinstance(sys_db.log_levels(server_id), dict)
222+
223+
# Test set log levels (with server_id)
224+
result = sys_db.set_log_levels(server_id, **new_levels)
225+
for key, value in new_levels.items():
226+
assert result[key] == value
227+
for key, value in sys_db.log_levels(server_id).items():
228+
assert result[key] == value
228229

229230
# Test set log levels with bad database
230231
with assert_raises(ServerLogLevelSetError):

0 commit comments

Comments
 (0)