diff --git a/test/pylib/manager_client.py b/test/pylib/manager_client.py index bc36521d8a..227f91539a 100644 --- a/test/pylib/manager_client.py +++ b/test/pylib/manager_client.py @@ -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() diff --git a/test/pylib/scylla_cluster.py b/test/pylib/scylla_cluster.py index 1437d3c348..a34abfc4b7 100644 --- a/test/pylib/scylla_cluster.py +++ b/test/pylib/scylla_cluster.py @@ -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]: