Skip to content

Commit c6caee3

Browse files
committed
add test
1 parent 00f6394 commit c6caee3

File tree

5 files changed

+212
-5
lines changed

5 files changed

+212
-5
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
strategy:
4444
matrix:
4545
backend: [compose, k8s]
46-
test: [scenarios_test.py, rpc_test.py, graph_test.py, ln_test.py]
46+
test: [scenarios_test.py, rpc_test.py, graph_test.py, ln_test.py, get_service_ip_test.py]
4747
steps:
4848
- uses: actions/checkout@v4
4949
- if: matrix.backend == 'compose'

src/scenarios/get_service_ip.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#!/usr/bin/env python3
2+
3+
from time import sleep
4+
5+
from scenarios.utils import ensure_miner, get_service_ip
6+
from warnet.test_framework_bridge import WarnetTestFramework
7+
8+
9+
def cli_help():
10+
return "Test getting ip addresses from services"
11+
12+
13+
class GetServiceIp(WarnetTestFramework):
14+
def set_test_params(self):
15+
# This is just a minimum
16+
self.num_nodes = 8
17+
18+
def add_options(self, parser):
19+
parser.add_argument(
20+
"--network_name",
21+
dest="network_name",
22+
default="warnet",
23+
help="",
24+
)
25+
26+
def run_test(self):
27+
while not self.warnet.network_connected():
28+
sleep(1)
29+
30+
# All permutations of directed graph with zero, one, or two inputs/outputs
31+
#
32+
# | Node | In | Out | Con In | Con Out |
33+
# |------+----+-----+--------+---------|
34+
# | A 0 | 0 | 1 | - | C |
35+
# | B 1 | 0 | 2 | - | C, D |
36+
# | C 2 | 2 | 2 | A, B | D, E |
37+
# | D 3 | 2 | 1 | B, C | F |
38+
# | E 4 | 2 | 0 | C, F | - |
39+
# | F 5 | 1 | 2 | D | E, G |
40+
# | G 6 | 1 | 1 | F | H |
41+
# | H 7 | 1 | 0 | G | - |
42+
#
43+
# ╭──────> E ╭──────> 4
44+
# │ ∧ │ ∧
45+
# A ─> C ─┤ │ 0 ─> 2 ─┤ │
46+
# ∧ ╰─> D ─> F ─> G ─> H ∧ ╰─> 3 ─> 5 ─> 6 ─> 7
47+
# │ ∧ │ ∧
48+
# B ───┴──────╯ 1 ───┴──────╯
49+
50+
zero_external, zero_internal = get_service_ip(f"{self.options.network_name}-tank-000000-service")
51+
one_external, one_internal = get_service_ip(f"{self.options.network_name}-tank-000001-service")
52+
two_external, two_internal = get_service_ip(f"{self.options.network_name}-tank-000002-service")
53+
three_external, three_internal = get_service_ip(f"{self.options.network_name}-tank-000003-service")
54+
five_external, five_internal = get_service_ip(f"{self.options.network_name}-tank-000005-service")
55+
six_external, six_internal = get_service_ip(f"{self.options.network_name}-tank-000006-service")
56+
57+
zero_peers = self.nodes[0].getpeerinfo()
58+
one_peers = self.nodes[1].getpeerinfo()
59+
two_peers = self.nodes[2].getpeerinfo()
60+
three_peers = self.nodes[3].getpeerinfo()
61+
four_peers = self.nodes[4].getpeerinfo()
62+
five_peers = self.nodes[5].getpeerinfo()
63+
six_peers = self.nodes[6].getpeerinfo()
64+
seven_peers = self.nodes[7].getpeerinfo()
65+
66+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000002-service" for d in zero_peers), f"Could not find {self.options.network_name}-tank-000002-service"
67+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000002-service" for d in one_peers), f"Could not find {self.options.network_name}-tank-000002-service"
68+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000003-service" for d in one_peers), f"Could not find {self.options.network_name}-tank-000003-service"
69+
assert any(d.get("addr").split(":")[0] == str(zero_internal) for d in two_peers), f"Could not find {zero_internal}"
70+
assert any(d.get("addr").split(":")[0] == str(one_internal) for d in two_peers), f"Could not find {one_internal}"
71+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000003-service" for d in two_peers), f"Could not find {self.options.network_name}-tank-000003-service"
72+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000004-service" for d in two_peers), f"Could not find {self.options.network_name}-tank-000004-service"
73+
assert any(d.get("addr").split(":")[0] == str(one_internal) for d in three_peers), f"Could not find {one_internal}"
74+
assert any(d.get("addr").split(":")[0] == str(two_internal) for d in three_peers), f"Could not find {two_internal}"
75+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000005-service" for d in three_peers), f"Could not find {self.options.network_name}-tank-000005-service"
76+
assert any(d.get("addr").split(":")[0] == str(two_internal) for d in four_peers), f"Could not find {two_internal}"
77+
assert any(d.get("addr").split(":")[0] == str(five_internal) for d in four_peers), f"Could not find {five_internal}"
78+
assert any(d.get("addr").split(":")[0] == str(three_internal) for d in five_peers), f"Could not find {three_internal}"
79+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000004-service" for d in five_peers), f"Could not find {self.options.network_name}-tank-000004-service"
80+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000006-service" for d in five_peers), f"Could not find {self.options.network_name}-tank-000006-service"
81+
assert any(d.get("addr").split(":")[0] == str(five_internal) for d in six_peers), f"Could not find {five_internal}"
82+
assert any(d.get("addr").split(":")[0] == f"{self.options.network_name}-tank-000007-service" for d in six_peers), f"Could not find {self.options.network_name}-tank-000007-service"
83+
assert any(d.get("addr").split(":")[0] == str(six_internal) for d in seven_peers), f"Could not find {seven_peers}"
84+
85+
self.log.info("Successfully ran the get_service_ip scenario.")
86+
87+
if __name__ == "__main__":
88+
GetServiceIp().main()

src/scenarios/utils.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,13 @@ def ensure_miner(node):
99
return node.get_wallet_rpc("miner")
1010

1111

12-
def get_service_ip(service_name: str, namespace: str = "warnet") -> (IPv4Address | IPv6Address,
13-
IPv4Address | IPv6Address):
12+
def get_service_ip(service_name: str) -> (IPv4Address | IPv6Address, IPv4Address | IPv6Address):
1413
"""Given a service name and namespace, returns the service's external ip and internal ip"""
1514
# https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1Endpoints.md
1615
config.load_incluster_config()
1716
v1 = client.CoreV1Api()
18-
service = v1.read_namespaced_service(name=service_name, namespace=namespace)
19-
endpoints = v1.read_namespaced_endpoints(name=service_name, namespace=namespace)
17+
service = v1.read_namespaced_service(name=service_name, namespace="warnet")
18+
endpoints = v1.read_namespaced_endpoints(name=service_name, namespace="warnet")
2019

2120
try:
2221
initial_subset = endpoints.subsets[0]

test/data/permutations.graphml

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd">
4+
<key id="image" for="node" attr.name="image" attr.type="string" />
5+
<key id="collect_logs" for="node" attr.name="collect_logs" attr.type="boolean" />
6+
<key id="exporter" for="node" attr.name="exporter" attr.type="boolean" />
7+
<key id="build_args" for="node" attr.name="build_args" attr.type="string" />
8+
<key id="tc_netem" for="node" attr.name="tc_netem" attr.type="string" />
9+
<key id="bitcoin_config" for="node" attr.name="bitcoin_config" attr.type="string" />
10+
<key id="version" for="node" attr.name="version" attr.type="string" />
11+
<graph edgedefault="directed">
12+
<node id="0">
13+
<data key="version">26.0</data>
14+
<data key="bitcoin_config" />
15+
<data key="tc_netem" />
16+
<data key="build_args" />
17+
<data key="exporter">False</data>
18+
<data key="collect_logs">False</data>
19+
</node>
20+
<node id="1">
21+
<data key="image">bitcoindevproject/bitcoin:26.0</data>
22+
<data key="bitcoin_config" />
23+
<data key="tc_netem" />
24+
<data key="build_args" />
25+
<data key="exporter">False</data>
26+
<data key="collect_logs">False</data>
27+
</node>
28+
<node id="2">
29+
<data key="version">26.0</data>
30+
<data key="bitcoin_config" />
31+
<data key="tc_netem" />
32+
<data key="build_args" />
33+
<data key="exporter">False</data>
34+
<data key="collect_logs">False</data>
35+
</node>
36+
<node id="3">
37+
<data key="version">26.0</data>
38+
<data key="bitcoin_config" />
39+
<data key="tc_netem" />
40+
<data key="build_args" />
41+
<data key="exporter">False</data>
42+
<data key="collect_logs">False</data>
43+
</node>
44+
<node id="4">
45+
<data key="version">26.0</data>
46+
<data key="bitcoin_config" />
47+
<data key="tc_netem" />
48+
<data key="build_args" />
49+
<data key="exporter">False</data>
50+
<data key="collect_logs">False</data>
51+
</node>
52+
<node id="5">
53+
<data key="version">26.0</data>
54+
<data key="bitcoin_config" />
55+
<data key="tc_netem" />
56+
<data key="build_args" />
57+
<data key="exporter">False</data>
58+
<data key="collect_logs">False</data>
59+
</node>
60+
<node id="6">
61+
<data key="version">26.0</data>
62+
<data key="bitcoin_config" />
63+
<data key="tc_netem" />
64+
<data key="build_args" />
65+
<data key="exporter">False</data>
66+
<data key="collect_logs">False</data>
67+
</node>
68+
<node id="7">
69+
<data key="version">26.0</data>
70+
<data key="bitcoin_config" />
71+
<data key="tc_netem" />
72+
<data key="build_args" />
73+
<data key="exporter">False</data>
74+
<data key="collect_logs">False</data>
75+
</node>
76+
<edge source="0" target="2" id="0" />
77+
<edge source="1" target="2" id="0" />
78+
<edge source="1" target="3" id="0" />
79+
<edge source="2" target="3" id="0" />
80+
<edge source="2" target="4" id="0" />
81+
<edge source="3" target="5" id="0" />
82+
<edge source="5" target="4" id="0" />
83+
<edge source="5" target="6" id="0" />
84+
<edge source="6" target="7" id="0" />
85+
</graph>
86+
</graphml>

test/get_service_ip_test.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import time
5+
from pathlib import Path
6+
7+
from test_base import TestBase
8+
9+
graph_file_path = Path(os.path.dirname(__file__)) / "data" / "permutations.graphml"
10+
11+
base = TestBase()
12+
13+
if base.backend == "k8s":
14+
base.start_server()
15+
print(base.warcli(f"network start {graph_file_path}"))
16+
base.wait_for_all_tanks_status(target="running")
17+
base.wait_for_all_edges()
18+
19+
# Start scenario
20+
base.warcli(f"scenarios run get_service_ip --network_name={base.network_name}")
21+
22+
counter = 0
23+
while (len(base.rpc("scenarios_list_running")) == 1
24+
and base.rpc("scenarios_list_running")[0]["active"]):
25+
time.sleep(1)
26+
counter += 1
27+
if counter > 30:
28+
pid = base.rpc("scenarios_list_running")[0]['pid']
29+
base.warcli(f"scenarios stop {pid}", False)
30+
assert counter < 30
31+
else:
32+
print(f"get_service_ip_test does not test {base.backend}")
33+
34+
base.stop_server()

0 commit comments

Comments
 (0)