121 lines
4.4 KiB
Python
Raw Normal View History

2024-12-13 15:58:25 +08:00
import inspect
import os
2024-12-13 15:58:25 +08:00
import pytest
2025-03-10 05:57:22 +00:00
from src.client.proxy_client import ProxyClient
from src.env_vars import CFGSYNC, NOMOS, NOMOS_EXECUTOR, CONSENSUS_SLOT_TIME
from src.libs.common import delay
2024-12-13 15:58:25 +08:00
from src.libs.custom_logger import get_custom_logger
from src.node.nomos_node import NomosNode
2025-02-21 10:10:34 +11:00
from jinja2 import Template
2024-12-13 15:58:25 +08:00
logger = get_custom_logger(__name__)
def prepare_cluster_config(node_count, subnetwork_size=2, dispersal_factor=2, min_dispersal_peers=1):
cwd = os.getcwd()
config_dir = "cluster_config"
2025-02-21 10:10:34 +11:00
with open(f"{cwd}/{config_dir}/cfgsync-template.yaml", "r") as file:
template_content = file.read()
template = Template(template_content)
rendered = template.render(
num_hosts=node_count, subnet_size=subnetwork_size, dispersal_factor=dispersal_factor, min_dispersal_peers=min_dispersal_peers
)
2025-02-21 10:10:34 +11:00
with open(f"{cwd}/{config_dir}/cfgsync.yaml", "w") as outfile:
outfile.write(rendered)
2025-01-22 15:40:38 +08:00
def start_nodes(nodes):
for node in nodes:
node.start()
def ensure_nodes_ready(nodes):
for node in nodes:
node.ensure_ready()
def get_param_or_default(request, param_name, default_value):
return request.param.get(param_name, default_value) if hasattr(request, "param") else default_value
2024-12-13 15:58:25 +08:00
class StepsCommon:
2025-01-17 14:50:10 +08:00
@pytest.fixture(scope="function", autouse=True)
def cluster_setup(self):
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
self.main_nodes = []
2025-03-05 04:03:27 +00:00
self.client_nodes = []
2025-01-17 14:50:10 +08:00
2024-12-13 15:58:25 +08:00
@pytest.fixture(scope="function")
def setup_2_node_cluster(self, request):
2024-12-13 15:58:25 +08:00
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
subnet_size = get_param_or_default(request, "subnet_size", 2)
dispersal_factor = get_param_or_default(request, "dispersal_factor", 2)
min_dispersal_peers = get_param_or_default(request, "min_dispersal_peers", 1)
prepare_cluster_config(2, subnet_size, dispersal_factor, min_dispersal_peers)
2025-01-16 19:52:36 +08:00
self.node1 = NomosNode(CFGSYNC, "cfgsync")
self.node2 = NomosNode(NOMOS, "nomos_node_0")
self.node3 = NomosNode(NOMOS_EXECUTOR, "nomos_node_1")
self.main_nodes.extend([self.node1, self.node2, self.node3])
2025-01-22 15:40:38 +08:00
start_nodes(self.main_nodes)
2025-01-16 19:52:36 +08:00
try:
2025-02-12 22:09:55 +08:00
ensure_nodes_ready(self.main_nodes[1:])
2025-01-16 19:52:36 +08:00
except Exception as ex:
logger.error(f"REST service did not become ready in time: {ex}")
raise
delay(CONSENSUS_SLOT_TIME)
@pytest.fixture(scope="function")
def setup_4_node_cluster(self, request):
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
subnet_size = get_param_or_default(request, "subnet_size", 4)
dispersal_factor = get_param_or_default(request, "dispersal_factor", 2)
min_dispersal_peers = get_param_or_default(request, "min_dispersal_peers", 4)
prepare_cluster_config(4, subnet_size, dispersal_factor, min_dispersal_peers)
self.node1 = NomosNode(CFGSYNC, "cfgsync")
self.node2 = NomosNode(NOMOS, "nomos_node_0")
self.node3 = NomosNode(NOMOS, "nomos_node_1")
self.node4 = NomosNode(NOMOS, "nomos_node_2")
self.node5 = NomosNode(NOMOS_EXECUTOR, "nomos_node_3")
self.main_nodes.extend([self.node1, self.node2, self.node3, self.node4, self.node5])
2025-01-22 15:40:38 +08:00
start_nodes(self.main_nodes)
try:
2025-02-12 22:09:55 +08:00
ensure_nodes_ready(self.main_nodes[1:])
except Exception as ex:
logger.error(f"REST service did not become ready in time: {ex}")
raise
delay(CONSENSUS_SLOT_TIME)
2025-03-05 03:37:11 +00:00
@pytest.fixture(scope="function")
2025-03-10 05:57:22 +00:00
def setup_proxy_clients(self, request):
2025-03-05 05:20:51 +00:00
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
2025-03-05 03:37:11 +00:00
2025-03-10 05:57:22 +00:00
assert len(self.main_nodes) == 3, "There should be two Nomos nodes running already"
2025-03-05 03:37:11 +00:00
if hasattr(request, "param"):
num_clients = request.param
else:
2025-03-10 05:57:22 +00:00
num_clients = 10
assert num_clients % 2 == 0, "num_clients must be an even number"
2025-03-05 03:37:11 +00:00
2025-03-10 05:57:22 +00:00
# Every even proxy client for get-range, every odd for dispersal
2025-03-05 03:37:11 +00:00
for i in range(num_clients):
2025-03-10 05:57:22 +00:00
proxy_client = ProxyClient()
default_target = [f"http://{self.main_nodes[1 + i % 2].name()}:18080"]
proxy_client.run(input_values=default_target)
self.client_nodes.append(proxy_client)