chore: parameters and volumes for RLN relay

This commit is contained in:
Roman 2024-01-31 23:35:34 +08:00
parent de60598b6c
commit 4039480638
No known key found for this signature in database
GPG Key ID: B8FE070B54E11B75
4 changed files with 82 additions and 12 deletions

View File

@ -28,3 +28,7 @@ GATEWAY = get_env_var("GATEWAY", "172.18.0.1")
RUNNING_IN_CI = get_env_var("CI")
NODEKEY = get_env_var("NODEKEY", "30348dd51465150e04a5d9d932c72864c8967f806cce60b5d26afeca1e77eb68")
API_REQUEST_TIMEOUT = get_env_var("API_REQUEST_TIMEOUT", 10)
ETH_CLIENT_ADDRESS = get_env_var("ETH_CLIENT_ADDRESS", None)
ETH_TESTNET_KEY = get_env_var("ETH_TESTNET_KEY", None)
KEYSTORE_PASSWORD = get_env_var("KEYSTORE_PASSWORD", None)
ETH_CONTRACT_ADDRESS = get_env_var("ETH_CONTRACT_ADDRESS", None)

View File

@ -31,7 +31,7 @@ class DockerManager:
logger.debug(f"Network {network_name} created")
return network
def start_container(self, image_name, ports, args, log_path, container_ip):
def start_container(self, image_name, ports, args, log_path, container_ip, volumes):
cli_args = []
for key, value in args.items():
if isinstance(value, list): # Check if value is a list
@ -41,7 +41,9 @@ class DockerManager:
port_bindings = {f"{port}/tcp": ("", port) for port in ports}
logger.debug(f"Starting container with image {image_name}")
logger.debug(f"Using args {cli_args}")
container = self._client.containers.run(image_name, command=cli_args, ports=port_bindings, detach=True, remove=True, auto_remove=True)
container = self._client.containers.run(
image_name, command=cli_args, ports=port_bindings, detach=True, remove=True, auto_remove=True, volumes=volumes
)
network = self._client.networks.get(NETWORK_NAME)
network.connect(container, ipv4_address=container_ip)

View File

@ -32,6 +32,7 @@ class WakuNode:
self._discv5_port = self._ports[3]
self._metrics_port = self._ports[4]
self._api = REST(self._rest_port)
self._volumes = []
default_args = {
"listen-address": "0.0.0.0",
@ -49,6 +50,9 @@ class WakuNode:
"peer-exchange": "true",
"discv5-discovery": "true",
"cluster-id": "0",
"rln_enabled": False,
"rln_creds": {},
"rln_register_only": False,
}
if self.is_gowaku():
@ -74,15 +78,47 @@ class WakuNode:
key = key.replace("_", "-")
default_args[key] = value
self._container = self._docker_manager.start_container(self._docker_manager.image, self._ports, default_args, self._log_path, self._ext_ip)
logger.debug(f"Started container from image {self._image_name}. REST: {self._rest_port}")
DS.waku_nodes.append(self)
delay(1) # if we fire requests to soon after starting the node will sometimes fail to start correctly
try:
self.ensure_ready()
except Exception as ex:
logger.error(f"REST service did not become ready in time: {ex}")
raise
if default_args["rln_enabled"] and len(default_args["rln_creds"]) == 4:
self._volumes.append(["./rln_tree:/etc/rln_tree/:Z", "./keystore/keystore.json:/keystore/keystore.json/:Z"])
rln_opts = {}
if self.is_gowaku():
rln_opts = {
"eth-client-address": default_args["rln_creds"]["eth_client_address"],
"eth-account-private-key": default_args["rln_creds"]["eth_client_private_key"],
"eth-contract-address": default_args["rln_creds"]["eth_contract_address"],
"cred-password": default_args["rln_creds"]["keystore_password"],
}
elif self.is_nwaku():
rln_opts = {
"rln-relay-eth-client-address": default_args["rln_creds"]["eth_client_address"],
"rln-relay-eth-private-key": default_args["rln_creds"]["eth_client_private_key"],
"rln-relay-eth-contract-address": default_args["rln_creds"]["eth_contract_address"],
"rln-relay-cred-password": default_args["rln_creds"]["keystore_password"],
}
if default_args["rln_register_only"]:
rln_opts["execute"] = None
rln_opts["rln-relay-cred-path"] = "/keystore/keystore.json"
del default_args["rln_creds"]
default_args.update(rln_opts)
self._container = self._docker_manager.start_container(
self._docker_manager.image, self._ports, default_args, self._log_path, self._ext_ip, self._volumes
)
if default_args["rln_register_only"]:
logger.debug(f"Executed container from image {self._image_name}. REST: {self._rest_port} to register RLN")
else:
logger.debug(f"Started container from image {self._image_name}. REST: {self._rest_port} with RLN enabled")
DS.waku_nodes.append(self)
delay(1) # if we fire requests to soon after starting the node will sometimes fail to start correctly
try:
self.ensure_ready()
except Exception as ex:
logger.error(f"REST service did not become ready in time: {ex}")
raise
@retry(stop=stop_after_delay(5), wait=wait_fixed(0.1), reraise=True)
def stop(self):

View File

@ -5,7 +5,17 @@ import pytest
import allure
from src.libs.common import to_base64, delay
from src.node.waku_message import WakuMessage
from src.env_vars import NODE_1, NODE_2, ADDITIONAL_NODES, NODEKEY, RUNNING_IN_CI
from src.env_vars import (
NODE_1,
NODE_2,
ADDITIONAL_NODES,
NODEKEY,
RUNNING_IN_CI,
ETH_CLIENT_ADDRESS,
ETH_TESTNET_KEY,
KEYSTORE_PASSWORD,
ETH_CONTRACT_ADDRESS,
)
from src.node.waku_node import WakuNode
from tenacity import retry, stop_after_delay, wait_fixed
from src.test_data import VALID_PUBSUB_TOPICS
@ -34,6 +44,24 @@ class StepsRelay:
self.node2.start(relay="true", discv5_bootstrap_node=self.enr_uri)
self.main_nodes.extend([self.node1, self.node2])
@pytest.fixture(scope="function")
def setup_main_rln_relay_nodes(self, request):
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")
self.node1 = WakuNode(NODE_1, f"node1_{request.cls.test_id}")
rln_creds = {
"eth_client_address": ETH_CLIENT_ADDRESS,
"eth_testnet_key": ETH_TESTNET_KEY,
"keystore_password": KEYSTORE_PASSWORD,
"eth_contract_address": ETH_CONTRACT_ADDRESS,
}
self.node1.start(relay="true", nodekey=NODEKEY, rln=True, rln_creds=rln_creds, rln_register_only=True)
self.node1.start(relay="true", nodekey=NODEKEY, rln=True, rln_creds=rln_creds)
self.enr_uri = self.node1.get_enr_uri()
self.node2 = WakuNode(NODE_2, f"node2_{request.cls.test_id}")
self.node2.start(relay="true", discv5_bootstrap_node=self.enr_uri, rln=True, rln_creds=rln_creds, rln_register_only=True)
self.node2.start(relay="true", discv5_bootstrap_node=self.enr_uri, rln=True, rln_creds=rln_creds)
self.main_nodes.extend([self.node1, self.node2])
@pytest.fixture(scope="function")
def setup_optional_relay_nodes(self, request):
logger.debug(f"Running fixture setup: {inspect.currentframe().f_code.co_name}")