Skip to content

Commit b19aea7

Browse files
committed
new: server_maintenance_mode and toggle_server_maintenance_mode
1 parent 5e93203 commit b19aea7

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

arango/cluster.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,58 @@ def response_handler(resp: Response) -> Json:
140140

141141
return self._execute(request, response_handler)
142142

143+
def server_maintenance_mode(self, server_id: str) -> Result[Json]:
144+
"""Return the maintenance status for the given server.
145+
146+
:param server_id: Server ID.
147+
:type server_id: str
148+
:return: Maintenance status for the given server.
149+
:rtype: dict
150+
:raise arango.exceptions.ClusterMaintenanceModeError: If retrieval fails.
151+
"""
152+
request = Request(
153+
method="get",
154+
endpoint=f"/_admin/cluster/maintenance/{server_id}",
155+
)
156+
157+
def response_handler(resp: Response) -> Json:
158+
if resp.is_success:
159+
result: Json = resp.body.get("result", {})
160+
return result
161+
162+
raise ClusterMaintenanceModeError(resp, request)
163+
164+
return self._execute(request, response_handler)
165+
166+
def toggle_server_maintenance_mode(
167+
self, server_id: str, mode: str, timeout: Optional[int] = None
168+
) -> Result[Json]:
169+
"""Enable or disable the maintenance mode for the given server.
170+
171+
:param server_id: Server ID.
172+
:type server_id: str
173+
:param mode: Maintenance mode. Allowed values are "normal" and "maintenance".
174+
:type mode: str
175+
:param timeout: Timeout in seconds.
176+
:type timeout: Optional[int]
177+
:return: Result of the operation.
178+
:rtype: dict
179+
:raise arango.exceptions.ClusterMaintenanceModeError: If toggle fails.
180+
"""
181+
request = Request(
182+
method="put",
183+
endpoint=f"/_admin/cluster/maintenance/{server_id}",
184+
data={"mode": mode, "timeout": timeout},
185+
)
186+
187+
def response_handler(resp: Response) -> Json:
188+
if resp.is_success:
189+
return format_body(resp.body)
190+
191+
raise ClusterMaintenanceModeError(resp, request)
192+
193+
return self._execute(request, response_handler)
194+
143195
def health(self) -> Result[Json]:
144196
"""Return the cluster health.
145197

docs/cluster.rst

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@ Below is an example on how to manage clusters using python-arango.
8686
cluster.server_engine(server_id)
8787
cluster.server_version(server_id)
8888
cluster.server_statistics(server_id)
89+
cluster.server_maintenance_mode(server_id)
8990
90-
# Toggle maintenance mode (allowed values are "on" and "off").
91+
# Toggle Server maintenance mode (allowed values are "normal" and "maintenance").
92+
cluster.toggle_server_maintenance_mode(server_id, 'normal')
93+
cluster.toggle_server_maintenance_mode(server_id, 'maintenance', timeout=30)
94+
95+
# Toggle Cluster maintenance mode (allowed values are "on" and "off").
9196
cluster.toggle_maintenance_mode('on')
9297
cluster.toggle_maintenance_mode('off')
9398

tests/test_cluster.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import warnings
22

3+
import time
34
import pytest
45
from packaging import version
56

@@ -99,6 +100,28 @@ def test_cluster_server_statistics(sys_db, bad_db, cluster):
99100
assert err.value.error_code in {FORBIDDEN, DATABASE_NOT_FOUND}
100101

101102

103+
def test_cluster_server_maintenance_mode(sys_db, bad_db, cluster):
104+
if not cluster:
105+
pytest.skip("Only tested in a cluster setup")
106+
107+
server_id = sys_db.cluster.server_id()
108+
result = sys_db.cluster.server_maintenance_mode(server_id)
109+
assert result == {}
110+
111+
with assert_raises(ClusterMaintenanceModeError) as err:
112+
bad_db.cluster.server_maintenance_mode(server_id)
113+
assert err.value.error_code in {FORBIDDEN, DATABASE_NOT_FOUND}
114+
115+
sys_db.cluster.toggle_server_maintenance_mode(server_id, "maintenance", timeout=1)
116+
result = sys_db.cluster.server_maintenance_mode(server_id)
117+
assert "Mode" in result
118+
assert "Until" in result
119+
120+
time.sleep(1)
121+
result = sys_db.cluster.server_maintenance_mode(server_id)
122+
assert result == {}
123+
124+
102125
def test_cluster_toggle_maintenance_mode(sys_db, bad_db, cluster):
103126
if not cluster:
104127
pytest.skip("Only tested in a cluster setup")

0 commit comments

Comments
 (0)