test/pylib: Introduce Tasks History:

Topology tests might spawn asynchronous tasks in parallel in ScyllaClusterManager.
Tasks history is introduced to be able log and analyze all actions
against cluster in case of failures
This commit is contained in:
Artsiom Mishuta
2024-04-22 16:17:02 +02:00
parent 38125a0049
commit 2ee063c90c

View File

@@ -6,6 +6,7 @@
"""Scylla clusters for testing.
Provides helpers to setup and manage clusters of Scylla servers for testing.
"""
from functools import wraps
import asyncio
from asyncio.subprocess import Process
from contextlib import asynccontextmanager
@@ -1134,6 +1135,13 @@ class ScyllaClusterManager:
app = aiohttp.web.Application()
self._setup_routes(app)
self.runner = aiohttp.web.AppRunner(app)
self.tasks_history = dict()
def repr_tasks_history(self):
out = "Cluster_history"
for key, val in self.tasks_history.items():
out += f"\n{val}:\t\t{repr(key)}"
return out
async def start(self) -> None:
"""Get first cluster, setup API"""
@@ -1199,11 +1207,19 @@ class ScyllaClusterManager:
return aiohttp.web.Response(status=500, text=str(e))
return catching_handler
def route_history_wrapper(handler: Callable)-> Callable:
@wraps(handler)
async def inner_wrapper(request):
self.logger.info("[ScyllaClusterManager][%s] %s", asyncio.current_task().get_name(), request.url)
self.tasks_history[asyncio.current_task()] = request
return await handler(request)
return inner_wrapper
def add_get(route: str, handler: Callable):
app.router.add_get(route, make_catching_handler(handler))
app.router.add_get(route, make_catching_handler(route_history_wrapper(handler)))
def add_put(route: str, handler: Callable):
app.router.add_put(route, make_catching_handler(handler))
app.router.add_put(route, make_catching_handler(route_history_wrapper(handler)))
add_get('/up', self._manager_up)
add_get('/cluster/up', self._cluster_up)
@@ -1274,6 +1290,7 @@ class ScyllaClusterManager:
async def _after_test(self, _request) -> str:
assert self.cluster is not None
assert self.current_test_case_full_name
self.logger.info(self.repr_tasks_history())
success = _request.match_info["success"] == "True"
self.logger.info("Test %s %s, cluster: %s", self.current_test_case_full_name,
"SUCCEEDED" if success else "FAILED", self.cluster)