Skip to content

Commit 474359e

Browse files
aMahannaapetenchea
andauthored
new: get/put /_admin/cluster/maintenance/ (#306)
* new: `server_maintenance_mode` and `toggle_server_maintenance_mode` * fix lint * increase sleep * increase sleep (again) * revert 8e71d82 * finding a dbserver * Changing timeouts --------- Co-authored-by: Alex Petenchea <alex.petenchea@gmail.com>
1 parent ed6df53 commit 474359e

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

arango/cluster.py

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

163163
return self._execute(request, response_handler)
164164

165+
def server_maintenance_mode(self, server_id: str) -> Result[Json]:
166+
"""Return the maintenance status for the given server.
167+
168+
:param server_id: Server ID.
169+
:type server_id: str
170+
:return: Maintenance status for the given server.
171+
:rtype: dict
172+
:raise arango.exceptions.ClusterMaintenanceModeError: If retrieval fails.
173+
"""
174+
request = Request(
175+
method="get",
176+
endpoint=f"/_admin/cluster/maintenance/{server_id}",
177+
)
178+
179+
def response_handler(resp: Response) -> Json:
180+
if resp.is_success:
181+
result: Json = resp.body.get("result", {})
182+
return result
183+
184+
raise ClusterMaintenanceModeError(resp, request)
185+
186+
return self._execute(request, response_handler)
187+
188+
def toggle_server_maintenance_mode(
189+
self, server_id: str, mode: str, timeout: Optional[int] = None
190+
) -> Result[Json]:
191+
"""Enable or disable the maintenance mode for the given server.
192+
193+
:param server_id: Server ID.
194+
:type server_id: str
195+
:param mode: Maintenance mode. Allowed values are "normal" and "maintenance".
196+
:type mode: str
197+
:param timeout: Timeout in seconds.
198+
:type timeout: Optional[int]
199+
:return: Result of the operation.
200+
:rtype: dict
201+
:raise arango.exceptions.ClusterMaintenanceModeError: If toggle fails.
202+
"""
203+
request = Request(
204+
method="put",
205+
endpoint=f"/_admin/cluster/maintenance/{server_id}",
206+
data={"mode": mode, "timeout": timeout},
207+
)
208+
209+
def response_handler(resp: Response) -> Json:
210+
if resp.is_success:
211+
return format_body(resp.body)
212+
213+
raise ClusterMaintenanceModeError(resp, request)
214+
215+
return self._execute(request, response_handler)
216+
165217
def health(self) -> Result[Json]:
166218
"""Return the cluster health.
167219

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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
import warnings
23

34
import pytest
@@ -112,6 +113,37 @@ def test_cluster_server_statistics(sys_db, bad_db, cluster):
112113
assert err.value.error_code in {FORBIDDEN, DATABASE_NOT_FOUND}
113114

114115

116+
def test_cluster_server_maintenance_mode(sys_db, bad_db, cluster):
117+
if not cluster:
118+
pytest.skip("Only tested in a cluster setup")
119+
120+
# Must be a DBServer
121+
health = sys_db.cluster.health()
122+
server_id = None
123+
for server_id, info in health["Health"].items():
124+
if info["Role"] == "DBServer":
125+
server_id = server_id
126+
break
127+
if server_id is None:
128+
pytest.skip("No DBServer found in cluster")
129+
130+
result = sys_db.cluster.server_maintenance_mode(server_id)
131+
assert result == {}
132+
133+
with assert_raises(ClusterMaintenanceModeError) as err:
134+
bad_db.cluster.server_maintenance_mode(server_id)
135+
assert err.value.error_code in {FORBIDDEN, DATABASE_NOT_FOUND}
136+
137+
sys_db.cluster.toggle_server_maintenance_mode(server_id, "maintenance", timeout=2)
138+
result = sys_db.cluster.server_maintenance_mode(server_id)
139+
assert "Mode" in result
140+
assert "Until" in result
141+
142+
time.sleep(5)
143+
result = sys_db.cluster.server_maintenance_mode(server_id)
144+
assert result == {}
145+
146+
115147
def test_cluster_toggle_maintenance_mode(sys_db, bad_db, cluster):
116148
if not cluster:
117149
pytest.skip("Only tested in a cluster setup")

0 commit comments

Comments
 (0)