From e02249f0cdd2acd0a4ae555d0ead1fd50d25cd5f Mon Sep 17 00:00:00 2001 From: Kamil Braun Date: Thu, 11 May 2023 13:35:36 +0200 Subject: [PATCH] test: pylib: ScyllaCluster: server pause/unpause API --- test/pylib/manager_client.py | 10 +++++++++ test/pylib/scylla_cluster.py | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/test/pylib/manager_client.py b/test/pylib/manager_client.py index a9ed711313..431514ce9f 100644 --- a/test/pylib/manager_client.py +++ b/test/pylib/manager_client.py @@ -161,6 +161,16 @@ class ManagerClient(): await self.server_sees_others(server_id, wait_others, interval = wait_interval) self._driver_update() + async def server_pause(self, server_id: ServerNum) -> None: + """Pause the specified server.""" + logger.debug("ManagerClient pausing %s", server_id) + await self.client.get(f"/cluster/server/{server_id}/pause") + + async def server_unpause(self, server_id: ServerNum) -> None: + """Unpause the specified server.""" + logger.debug("ManagerClient unpausing %s", server_id) + await self.client.get(f"/cluster/server/{server_id}/unpause") + async def server_add(self, replace_cfg: Optional[ReplaceConfig] = None, cmdline: Optional[List[str]] = None, config: Optional[dict[str, Any]] = None, start: bool = True) -> ServerInfo: """Add a new server""" try: diff --git a/test/pylib/scylla_cluster.py b/test/pylib/scylla_cluster.py index c867919992..c5f110b3e0 100644 --- a/test/pylib/scylla_cluster.py +++ b/test/pylib/scylla_cluster.py @@ -517,6 +517,16 @@ class ScyllaServer: self.logger.info("gracefully stopped %s", self) self.cmd = None + def pause(self) -> None: + """Pause a running server.""" + if self.cmd: + self.cmd.send_signal(signal.SIGSTOP) + + def unpause(self) -> None: + """Unpause a paused server.""" + if self.cmd: + self.cmd.send_signal(signal.SIGCONT) + async def uninstall(self) -> None: """Clear all files left from a stopped server, including the data files and log files.""" @@ -850,6 +860,21 @@ class ScyllaCluster: return ret return await self.server_start(server_id) + def server_pause(self, server_id: ServerNum) -> None: + """Pause a running server process.""" + self.logger.info("Cluster %s pausing server %s", self.name, server_id) + assert server_id in self.running + self.is_dirty = True + server = self.running[server_id] + server.pause() + + def server_unpause(self, server_id: ServerNum) -> None: + """Unpause a paused server process.""" + self.logger.info("Cluster %s unpausing server %s", self.name, server_id) + assert server_id in self.running + server = self.running[server_id] + server.unpause() + def get_config(self, server_id: ServerNum) -> ActionReturn: """Get conf/scylla.yaml of the given server as a dictionary. Fails if the server cannot be found.""" @@ -1009,6 +1034,8 @@ class ScyllaClusterManager: add_get('/cluster/server/{server_id}/stop_gracefully', self._cluster_server_stop_gracefully) add_get('/cluster/server/{server_id}/start', self._cluster_server_start) add_get('/cluster/server/{server_id}/restart', self._cluster_server_restart) + add_get('/cluster/server/{server_id}/pause', self._cluster_server_pause) + add_get('/cluster/server/{server_id}/unpause', self._cluster_server_unpause) add_put('/cluster/addserver', self._cluster_server_add) add_put('/cluster/remove-node/{initiator}', self._cluster_remove_node) add_get('/cluster/decommission-node/{server_id}', self._cluster_decommission_node) @@ -1106,6 +1133,20 @@ class ScyllaClusterManager: ret = await self.cluster.server_restart(server_id) return aiohttp.web.Response(status=200 if ret[0] else 500, text=ret[1]) + async def _cluster_server_pause(self, request) -> aiohttp.web.Response: + """Pause the specified server.""" + assert self.cluster + server_id = ServerNum(int(request.match_info["server_id"])) + self.cluster.server_pause(server_id) + return aiohttp.web.Response(status=200) + + async def _cluster_server_unpause(self, request) -> aiohttp.web.Response: + """Pause the specified server.""" + assert self.cluster + server_id = ServerNum(int(request.match_info["server_id"])) + self.cluster.server_unpause(server_id) + return aiohttp.web.Response(status=200) + async def _cluster_server_add(self, request) -> aiohttp.web.Response: """Add a new server""" assert self.cluster