mirror of
https://github.com/logos-messaging/logos-messaging-interop-tests.git
synced 2026-01-04 06:53:07 +00:00
Add rest APIs and wrappers (#133)
* Add rest APIs and wrappers * Add debug / admin tests * Add more admin tests * Add fix for review comments
This commit is contained in:
parent
58fa92e096
commit
9769730bac
@ -145,3 +145,42 @@ class REST(BaseClient):
|
|||||||
|
|
||||||
get_messages_response = self.rest_call("get", base_url)
|
get_messages_response = self.rest_call("get", base_url)
|
||||||
return get_messages_response.json()
|
return get_messages_response.json()
|
||||||
|
|
||||||
|
def set_log_level(self, log_level):
|
||||||
|
return self.rest_call("post", f"admin/v1/log-level/{quote(log_level)}")
|
||||||
|
|
||||||
|
def get_service_peers(self):
|
||||||
|
return self.rest_call("get", "admin/v1/peers/service").json()
|
||||||
|
|
||||||
|
def get_connected_peers(self):
|
||||||
|
return self.rest_call("get", "admin/v1/peers/connected").json()
|
||||||
|
|
||||||
|
def get_connected_peers_on_shard(self, shard_id):
|
||||||
|
return self.rest_call("get", f"admin/v1/peers/connected/on/{quote(str(shard_id))}").json()
|
||||||
|
|
||||||
|
def get_relay_peers(self):
|
||||||
|
return self.rest_call("get", "admin/v1/peers/relay").json()
|
||||||
|
|
||||||
|
def get_relay_peers_on_shard(self, shard_id):
|
||||||
|
return self.rest_call("get", f"admin/v1/peers/relay/on/{quote(str(shard_id))}").json()
|
||||||
|
|
||||||
|
def get_mesh_peers(self):
|
||||||
|
return self.rest_call("get", "admin/v1/peers/mesh").json()
|
||||||
|
|
||||||
|
def get_mesh_peers_on_shard(self, shard_id):
|
||||||
|
return self.rest_call("get", f"admin/v1/peers/mesh/on/{quote(str(shard_id))}").json()
|
||||||
|
|
||||||
|
def get_peer_stats(self):
|
||||||
|
return self.rest_call("get", "admin/v1/peers/stats").json()
|
||||||
|
|
||||||
|
def get_filter_subscriptions(self):
|
||||||
|
return self.rest_call("get", "admin/v1/filter/subscriptions").json()
|
||||||
|
|
||||||
|
def get_info(self):
|
||||||
|
return self.rest_call("get", "info").json()
|
||||||
|
|
||||||
|
def get_version(self):
|
||||||
|
return self.rest_call("get", "version").text.strip()
|
||||||
|
|
||||||
|
def get_debug_version(self):
|
||||||
|
return self.rest_call("get", "debug/v1/version").text.strip()
|
||||||
|
|||||||
@ -82,6 +82,7 @@ class WakuNode:
|
|||||||
self._log_path = os.path.join(DOCKER_LOG_DIR, f"{docker_log_prefix}__{self._image_name.replace('/', '_')}.log")
|
self._log_path = os.path.join(DOCKER_LOG_DIR, f"{docker_log_prefix}__{self._image_name.replace('/', '_')}.log")
|
||||||
self._docker_manager = DockerManager(self._image_name)
|
self._docker_manager = DockerManager(self._image_name)
|
||||||
self._container = None
|
self._container = None
|
||||||
|
self.start_args = {}
|
||||||
logger.debug(f"WakuNode instance initialized with log path {self._log_path}")
|
logger.debug(f"WakuNode instance initialized with log path {self._log_path}")
|
||||||
|
|
||||||
@retry(stop=stop_after_delay(60), wait=wait_fixed(0.1), reraise=True)
|
@retry(stop=stop_after_delay(60), wait=wait_fixed(0.1), reraise=True)
|
||||||
@ -175,7 +176,7 @@ class WakuNode:
|
|||||||
logger.info(f"RLN credentials not set or credential store not available, starting without RLN")
|
logger.info(f"RLN credentials not set or credential store not available, starting without RLN")
|
||||||
|
|
||||||
logger.debug(f"Using volumes {self._volumes}")
|
logger.debug(f"Using volumes {self._volumes}")
|
||||||
|
self.start_args = dict(default_args)
|
||||||
self._container = self._docker_manager.start_container(
|
self._container = self._docker_manager.start_container(
|
||||||
self._docker_manager.image,
|
self._docker_manager.image,
|
||||||
ports=self._ports,
|
ports=self._ports,
|
||||||
@ -534,3 +535,42 @@ class WakuNode:
|
|||||||
|
|
||||||
matches = self._docker_manager.search_log_for_keywords(self._log_path, keywords, False)
|
matches = self._docker_manager.search_log_for_keywords(self._log_path, keywords, False)
|
||||||
assert not matches, f"Found errors {matches}"
|
assert not matches, f"Found errors {matches}"
|
||||||
|
|
||||||
|
def set_log_level(self, log_level):
|
||||||
|
return self._api.set_log_level(log_level)
|
||||||
|
|
||||||
|
def get_service_peers(self):
|
||||||
|
return self._api.get_service_peers()
|
||||||
|
|
||||||
|
def get_connected_peers(self):
|
||||||
|
return self._api.get_connected_peers()
|
||||||
|
|
||||||
|
def get_connected_peers_on_shard(self, shard_id):
|
||||||
|
return self._api.get_connected_peers_on_shard(shard_id)
|
||||||
|
|
||||||
|
def get_relay_peers(self):
|
||||||
|
return self._api.get_relay_peers()
|
||||||
|
|
||||||
|
def get_relay_peers_on_shard(self, shard_id):
|
||||||
|
return self._api.get_relay_peers_on_shard(shard_id)
|
||||||
|
|
||||||
|
def get_mesh_peers(self):
|
||||||
|
return self._api.get_mesh_peers()
|
||||||
|
|
||||||
|
def get_mesh_peers_on_shard(self, shard_id):
|
||||||
|
return self._api.get_mesh_peers_on_shard(shard_id)
|
||||||
|
|
||||||
|
def get_peer_stats(self):
|
||||||
|
return self._api.get_peer_stats()
|
||||||
|
|
||||||
|
def get_filter_subscriptions(self):
|
||||||
|
return self._api.get_filter_subscriptions()
|
||||||
|
|
||||||
|
def get_info(self):
|
||||||
|
return self._api.get_info()
|
||||||
|
|
||||||
|
def get_version(self):
|
||||||
|
return self._api.get_version()
|
||||||
|
|
||||||
|
def get_debug_version(self):
|
||||||
|
return self._api.get_debug_version()
|
||||||
|
|||||||
0
tests/rest_flags/__init__.py
Normal file
0
tests/rest_flags/__init__.py
Normal file
78
tests/rest_flags/admin_flags.py
Normal file
78
tests/rest_flags/admin_flags.py
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import pytest
|
||||||
|
from src.env_vars import NODE_1, NODE_2, STRESS_ENABLED
|
||||||
|
from src.libs.common import delay
|
||||||
|
from src.libs.custom_logger import get_custom_logger
|
||||||
|
from src.node.waku_node import WakuNode
|
||||||
|
from src.steps.filter import StepsFilter
|
||||||
|
from src.steps.light_push import StepsLightPush
|
||||||
|
from src.steps.relay import StepsRelay
|
||||||
|
from src.steps.store import StepsStore
|
||||||
|
import re
|
||||||
|
|
||||||
|
logger = get_custom_logger(__name__)
|
||||||
|
|
||||||
|
"""
|
||||||
|
These tests make sure thst REST flags related to admin flags acting as expected
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestAdminFlags(StepsFilter, StepsStore, StepsRelay, StepsLightPush):
|
||||||
|
@pytest.fixture(scope="function", autouse=True)
|
||||||
|
def nodes(self):
|
||||||
|
self.node1 = WakuNode(NODE_2, f"node1_{self.test_id}")
|
||||||
|
self.node2 = WakuNode(NODE_2, f"node2_{self.test_id}")
|
||||||
|
self.node3 = WakuNode(NODE_2, f"node3_{self.test_id}")
|
||||||
|
self.node4 = WakuNode(NODE_2, f"node3_{self.test_id}")
|
||||||
|
|
||||||
|
def test_admin_filter_subscriptions_shape(self):
|
||||||
|
self.node1.start(filter="true", relay="true")
|
||||||
|
self.node2.start(relay="false", filternode=self.node1.get_multiaddr_with_id(), discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
resp = self.node2.set_filter_subscriptions(
|
||||||
|
{"requestId": "1", "contentFilters": [self.test_content_topic], "pubsubTopic": self.test_pubsub_topic}
|
||||||
|
)
|
||||||
|
subs = self.node1.get_filter_subscriptions()
|
||||||
|
logger.debug(f"Node admin subscriptions info{subs}")
|
||||||
|
assert resp["statusDesc"] == "OK" and resp["requestId"] == "1"
|
||||||
|
logger.debug(f"node 1 peers {self.node1.get_peers()}")
|
||||||
|
assert self.node2.get_multiaddr_with_id().rpartition("/p2p/")[2] == subs[0]["peerId"], "peer id doesn't match"
|
||||||
|
assert subs[0]["filterCriteria"][0]["pubsubTopic"] == self.test_pubsub_topic, "pubsub topic doesn't match"
|
||||||
|
assert subs[0]["filterCriteria"][0]["contentTopic"] == self.test_content_topic, "content topic doesn't match"
|
||||||
|
|
||||||
|
def test_admin_peers_stats_shape(self):
|
||||||
|
self.node1.start(relay="true")
|
||||||
|
self.node2.start(relay="true", discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
|
||||||
|
stats = self.node1.get_peer_stats()
|
||||||
|
logger.debug(f"Node admin peers stats {stats}")
|
||||||
|
|
||||||
|
def test_admin_peers_stats_counts(self):
|
||||||
|
self.node1.start(filter="true", relay="true")
|
||||||
|
self.node2.start(relay="true", discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
self.node3.start(relay="true", discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
self.node1.add_peers([self.node3.get_multiaddr_with_id()])
|
||||||
|
self.node4.start(relay="false", filternode=self.node1.get_multiaddr_with_id(), discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
self.node4.set_filter_subscriptions({"requestId": "1", "contentFilters": [self.test_content_topic], "pubsubTopic": self.test_pubsub_topic})
|
||||||
|
|
||||||
|
stats = self.node1.get_peer_stats()
|
||||||
|
logger.debug(f"Node-1 admin peers stats {stats}")
|
||||||
|
|
||||||
|
assert stats["Sum"]["Total peers"] == 3, "expected 3 peers connected to node1"
|
||||||
|
assert stats["Relay peers"]["Total relay peers"] == 2, "expected exactly 2 relay peer"
|
||||||
|
|
||||||
|
def test_admin_peers_mesh_on_shard_contains_node2(self):
|
||||||
|
self.node1.start(relay="true")
|
||||||
|
self.node2.start(relay="true", discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
self.node3.start(relay="true", discv5_bootstrap_node=self.node1.get_enr_uri())
|
||||||
|
mesh = self.node1.get_mesh_peers_on_shard(self.node1.start_args["shard"])
|
||||||
|
logger.debug(f"Node-1 mesh on the shard {mesh}")
|
||||||
|
|
||||||
|
logger.debug("Validate the schema variables")
|
||||||
|
assert isinstance(mesh["shard"], int) and mesh["shard"] == int(self.node1.start_args["shard"]), "shard mismatch"
|
||||||
|
peer_maddrs = [p["multiaddr"] for p in mesh["peers"]]
|
||||||
|
assert self.node2.get_multiaddr_with_id() in peer_maddrs and self.node3.get_multiaddr_with_id() in peer_maddrs, "node2 or node3 not in mesh"
|
||||||
|
for p in mesh["peers"]:
|
||||||
|
assert isinstance(p["protocols"], list) and all(isinstance(x, str) for x in p["protocols"]), "protocols must be [str]"
|
||||||
|
assert isinstance(p["shards"], list) and all(isinstance(x, int) for x in p["shards"]), "shards must be [int]"
|
||||||
|
assert isinstance(p["agent"], str), "agent not str"
|
||||||
|
assert isinstance(p["origin"], str), "origin not str"
|
||||||
|
assert isinstance(p.get("score", 0.0), (int, float)), "score not number"
|
||||||
35
tests/rest_flags/debug_flags.py
Normal file
35
tests/rest_flags/debug_flags.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import pytest
|
||||||
|
from src.env_vars import NODE_1, NODE_2, STRESS_ENABLED
|
||||||
|
from src.libs.common import delay
|
||||||
|
from src.libs.custom_logger import get_custom_logger
|
||||||
|
from src.node.waku_node import WakuNode
|
||||||
|
from src.steps.filter import StepsFilter
|
||||||
|
from src.steps.light_push import StepsLightPush
|
||||||
|
from src.steps.relay import StepsRelay
|
||||||
|
from src.steps.store import StepsStore
|
||||||
|
import re
|
||||||
|
|
||||||
|
logger = get_custom_logger(__name__)
|
||||||
|
|
||||||
|
"""
|
||||||
|
These tests make sure thst REST flags related to debug acting as expected
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class TestDebugFlags(StepsFilter, StepsStore, StepsRelay, StepsLightPush):
|
||||||
|
@pytest.fixture(scope="function", autouse=True)
|
||||||
|
def nodes(self):
|
||||||
|
self.node1 = WakuNode(NODE_2, f"node1_{self.test_id}")
|
||||||
|
|
||||||
|
def test_verify_node_version2(self):
|
||||||
|
self.node1.start(relay="true")
|
||||||
|
node1_version = self.node1.get_version()
|
||||||
|
logger.debug(f"version of created node is {node1_version}")
|
||||||
|
assert re.match(r"^v0\.(3[5-9])(?:[.\-]|$)", node1_version), f"expected v0.35–v0.39, got {node1_version}"
|
||||||
|
|
||||||
|
def test_verify_node_info(self):
|
||||||
|
self.node1.start(relay="true")
|
||||||
|
info = self.node1.get_info()
|
||||||
|
logger.debug(f"node info: {info}")
|
||||||
|
assert info["enrUri"] == self.node1.get_enr_uri(), "node enruri doesn't match"
|
||||||
|
assert self.node1.get_multiaddr_with_id() in info["listenAddresses"], "node address doesn't match"
|
||||||
Loading…
x
Reference in New Issue
Block a user