test: add expected_error to rebuild_node operation

This commit is contained in:
Gleb Natapov
2024-01-25 16:47:27 +02:00
parent 51c40034f5
commit d62204e758
2 changed files with 23 additions and 5 deletions

View File

@@ -326,10 +326,12 @@ class ManagerClient():
timeout=ScyllaServer.TOPOLOGY_TIMEOUT)
self._driver_update()
async def rebuild_node(self, server_id: ServerNum) -> None:
async def rebuild_node(self, server_id: ServerNum,
expected_error: str | None = None) -> None:
"""Tell a node to rebuild with Scylla REST API"""
logger.debug("ManagerClient rebuild %s", server_id)
await self.client.put_json(f"/cluster/rebuild-node/{server_id}",
data = {"expected_error": expected_error}
await self.client.put_json(f"/cluster/rebuild-node/{server_id}", data,
timeout=ScyllaServer.TOPOLOGY_TIMEOUT)
self._driver_update()

View File

@@ -1371,16 +1371,32 @@ class ScyllaClusterManager:
async def _cluster_rebuild_node(self, request) -> None:
"""Run rebuild node on Scylla REST API for a specified server"""
assert self.cluster
data = await request.json()
server_id = ServerNum(int(request.match_info["server_id"]))
self.logger.info("_cluster_rebuild_node %s", server_id)
assert server_id in self.cluster.running, "Can't rebuild not running node"
server = self.cluster.running[server_id]
expected_error = data["expected_error"]
try:
await self.cluster.api.rebuild_node(server.ip_addr, timeout=ScyllaServer.TOPOLOGY_TIMEOUT)
except (RuntimeError, HTTPError) as exc:
raise RuntimeError(
f"rebuild failed (server: {server}), check log at {server.log_filename},"
f" error: \"{exc}\"")
if expected_error:
if expected_error not in str(exc):
raise RuntimeError(
f"rebuild failed (server: {server}) but did not contain expected error"
f"(\"{expected_error}\", check log file at {server.log_filename}, error: \"{exc}\"")
else:
return
else:
raise RuntimeError(
f"rebuild failed (server: {server}), check log at {server.log_filename},"
f" error: \"{exc}\"")
else:
if expected_error:
raise RuntimeError(
f"rebuild succeeded when it should have failed (server: {server},"
f" expected_error: \"{expected_error}\"), check log file at {server.log_filename}")
await self.cluster.server_stop(server_id, gracefully=True)
async def _server_get_config(self, request: aiohttp.web.Request) -> dict[str, object]: