From f73d091dc2f3ba1be37c1e6658ddd8e28a1e8113 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Tue, 17 Jun 2025 16:50:54 -0400 Subject: [PATCH] Added initial cluster setup. --- ..._single_boot.py => no_test_single_boot.py} | 0 release_tests/support/cluster.py | 26 +++++++++++++++++++ release_tests/support/mttserver.py | 11 ++++++++ release_tests/support/test_cluster.py | 25 ++++++++++++++++++ release_tests/support/translate.py | 9 ++++++- 5 files changed, 70 insertions(+), 1 deletion(-) rename release_tests/{test_single_boot.py => no_test_single_boot.py} (100%) create mode 100644 release_tests/support/cluster.py create mode 100644 release_tests/support/test_cluster.py diff --git a/release_tests/test_single_boot.py b/release_tests/no_test_single_boot.py similarity index 100% rename from release_tests/test_single_boot.py rename to release_tests/no_test_single_boot.py diff --git a/release_tests/support/cluster.py b/release_tests/support/cluster.py new file mode 100644 index 0000000..cdeb4fc --- /dev/null +++ b/release_tests/support/cluster.py @@ -0,0 +1,26 @@ +"""Create a cluster.""" + +from release_tests.support.mttserver import MTTServer +from release_tests.support.translate import Translate + +class Cluster(): + """cluster of MoreThanText.""" + + def __init__(self, num=2): + """initialization""" + self.translate = Translate() + self.servers = [] + for _ in range(num): + self.servers.append(MTTServer()) + + async def start(self): + """Start the cluster.""" + await self.translate.start() + for server in self.servers: + await server.start() + + async def stop(self): + """Stops cluster.""" + await self.translate.stop() + for server in self.servers: + await server.stop() diff --git a/release_tests/support/mttserver.py b/release_tests/support/mttserver.py index 2def275..ecccc78 100644 --- a/release_tests/support/mttserver.py +++ b/release_tests/support/mttserver.py @@ -1,6 +1,7 @@ """Starts and runs releasse version of MoreThanText server.""" from asyncio import create_subprocess_exec +from socket import AF_INET, SOCK_STREAM, socket from pathlib import Path from release_tests.support import ADDR, get_port @@ -24,3 +25,13 @@ class MTTServer: async def start(self): """Starts the server.""" self.server = await create_subprocess_exec(*self.cmd) + # delays the return untul the serverr is responding. + with socket(AF_INET, SOCK_STREAM) as soc: + while soc.connect_ex((ADDR, self.port)) != 0: + continue + + async def stop(self): + """Stops the server.""" + if self.server: + self.server.terminate() + await self.server.wait() diff --git a/release_tests/support/test_cluster.py b/release_tests/support/test_cluster.py new file mode 100644 index 0000000..ea185eb --- /dev/null +++ b/release_tests/support/test_cluster.py @@ -0,0 +1,25 @@ +"""Testing the the cluster.""" + +from unittest import IsolatedAsyncioTestCase +from aiohttp import ClientSession +from release_tests.support.cluster import Cluster + +class ClusterTC(IsolatedAsyncioTestCase): + """Test for the MoreThanText cluster.""" + + async def test_create_default_cluster(self): + """create a complete two server cluster.""" + cluster = Cluster() + await cluster.start() + async with ClientSession() as session: + url = cluster.translate.baseurl + async with session.get(url) as resp: + text = await resp.text() + self.assertEqual(resp.status, 200, text) + self.assertEqual(len(cluster.servers), 2) + for server in cluster.servers: + url = server.baseurl + async with session.get(url) as resp: + text = await resp.text() + self.assertEqual(resp.status, 200, text) + await cluster.stop() diff --git a/release_tests/support/translate.py b/release_tests/support/translate.py index af19967..54a4c09 100644 --- a/release_tests/support/translate.py +++ b/release_tests/support/translate.py @@ -7,9 +7,12 @@ from release_tests.support import ADDR, get_port class Translate: """Creates a translation mock for release testing.""" - def __init__(self, url="/", replies=["Hello"]): + def __init__(self, url="/", replies=[]): """Initialize""" + if not replies: + replies = ["hello."] + async def reply(_): """response to return""" nonlocal replies @@ -33,3 +36,7 @@ class Translate: await self.runner.setup() site = web.TCPSite(self.runner, ADDR, self.port) await site.start() + + async def stop(self): + """Stops the application.""" + await self.runner.cleanup()