From 40394806385d00ac7bce667692a70f2f57998e17 Mon Sep 17 00:00:00 2001 From: Roman Date: Wed, 31 Jan 2024 23:35:34 +0800 Subject: [PATCH] chore: parameters and volumes for RLN relay --- src/env_vars.py | 4 +++ src/node/docker_mananger.py | 6 +++-- src/node/waku_node.py | 54 ++++++++++++++++++++++++++++++------- src/steps/relay.py | 30 ++++++++++++++++++++- 4 files changed, 82 insertions(+), 12 deletions(-) diff --git a/src/env_vars.py b/src/env_vars.py index cac65728..03e85ee0 100644 --- a/src/env_vars.py +++ b/src/env_vars.py @@ -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) diff --git a/src/node/docker_mananger.py b/src/node/docker_mananger.py index b2b9ac4f..0e00113c 100644 --- a/src/node/docker_mananger.py +++ b/src/node/docker_mananger.py @@ -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) diff --git a/src/node/waku_node.py b/src/node/waku_node.py index 45badcda..ea3f173f 100644 --- a/src/node/waku_node.py +++ b/src/node/waku_node.py @@ -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): diff --git a/src/steps/relay.py b/src/steps/relay.py index e5d238bd..15f8ae03 100644 --- a/src/steps/relay.py +++ b/src/steps/relay.py @@ -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}")