From b4e8693e1a15a7edef46be35db1f1be458a06203 Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Sun, 25 Aug 2024 18:24:33 -0400 Subject: [PATCH 1/2] clean up tests --- .github/workflows/test.yml | 7 ++- test/build_branch_test.py | 57 -------------------- test/data/build_v24_test.graphml | 28 ---------- test/data/permutations.graphml | 93 -------------------------------- test/data/services.graphml | 0 test/graph_test.py | 0 test/onion_test.py | 71 ------------------------ 7 files changed, 5 insertions(+), 251 deletions(-) delete mode 100755 test/build_branch_test.py delete mode 100644 test/data/build_v24_test.graphml delete mode 100644 test/data/permutations.graphml delete mode 100644 test/data/services.graphml delete mode 100644 test/graph_test.py delete mode 100755 test/onion_test.py diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9bfc35fe1..f47d94b49 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -29,8 +29,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - # test: [scenarios_test.py, rpc_test.py, graph_test.py, ln_test.py, dag_connection_test.py, logging_test.py] - test: [scenarios_test.py, rpc_test.py, dag_connection_test.py, logging_test.py] + test: + - dag_connection_test.py + - logging_test.py + - rpc_test.py + - scenarios_test.py steps: - uses: actions/checkout@v4 - uses: azure/setup-helm@v4.2.0 diff --git a/test/build_branch_test.py b/test/build_branch_test.py deleted file mode 100755 index bbce564ce..000000000 --- a/test/build_branch_test.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python3 - -import json -import os -from pathlib import Path - -from test_base import TestBase - - -class BuildBranchTest(TestBase): - def __init__(self): - super().__init__() - self.graph_file_path = Path(os.path.dirname(__file__)) / "data" / "build_v24_test.graphml" - - def run_test(self): - self.start_server() - try: - self.setup_network() - self.wait_for_p2p_connections() - self.check_build_flags() - finally: - self.stop_server() - - def setup_network(self): - self.log.info("Setting up network") - self.log.info(self.warcli(f"network start {self.graph_file_path}")) - self.wait_for_all_tanks_status(target="running", timeout=10 * 60) - self.wait_for_all_edges() - - def wait_for_p2p_connections(self): - self.log.info("Waiting for P2P connections") - self.wait_for_predicate(self.check_peers, timeout=5 * 60) - - def check_peers(self): - info0 = json.loads(self.warcli("bitcoin rpc 0 getpeerinfo")) - info1 = json.loads(self.warcli("bitcoin rpc 1 getpeerinfo")) - self.log.debug( - f"Waiting for both nodes to get one peer: node0: {len(info0)}, node1: {len(info1)}" - ) - return len(info0) == 1 and len(info1) == 1 - - def check_build_flags(self): - self.log.info("Checking build flags") - release_help = self.get_tank(0).exec("bitcoind -h") - build_help = self.get_tank(1).exec("bitcoind -h") - - assert "zmqpubhashblock" in release_help, "zmqpubhashblock not found in release help" - assert ( - "zmqpubhashblock" not in build_help - ), "zmqpubhashblock found in build help, but it shouldn't be" - - self.log.info("Build flags check passed") - - -if __name__ == "__main__": - test = BuildBranchTest() - test.run_test() diff --git a/test/data/build_v24_test.graphml b/test/data/build_v24_test.graphml deleted file mode 100644 index d55c3611c..000000000 --- a/test/data/build_v24_test.graphml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - 27.0 - - - bitcoin/bitcoin#24.x - --disable-zmq - - - - diff --git a/test/data/permutations.graphml b/test/data/permutations.graphml deleted file mode 100644 index 0c4686f61..000000000 --- a/test/data/permutations.graphml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - 27.0 - - - - False - False - - - bitcoindevproject/bitcoin:26.0 - - - - False - False - - - 27.0 - - - - False - False - - - 27.0 - - - - False - False - - - 27.0 - - - - False - False - - - 27.0 - - - - False - False - - - 27.0 - - - - False - False - - - 27.0 - - - - False - False - - - - - - - - - - - - \ No newline at end of file diff --git a/test/data/services.graphml b/test/data/services.graphml deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/graph_test.py b/test/graph_test.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/onion_test.py b/test/onion_test.py deleted file mode 100755 index 7f7454b60..000000000 --- a/test/onion_test.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env python3 - -import json -import os -from pathlib import Path - -from test_base import TestBase - - -class OnionTest(TestBase): - def __init__(self): - super().__init__() - self.graph_file_path = Path(os.path.dirname(__file__)) / "data" / "12_node_ring.graphml" - self.onion_addr = None - - def run_test(self): - self.start_server() - try: - self.setup_network() - self.test_reachability() - self.test_onion_peer_connection() - finally: - self.stop_server() - - def setup_network(self): - self.log.info("Setting up network") - self.log.info(self.warcli(f"network start {self.graph_file_path}")) - self.wait_for_all_tanks_status(target="running") - self.wait_for_all_edges() - - def test_reachability(self): - self.log.info("Checking IPv4 and onion reachability") - self.wait_for_predicate(self.check_reachability, timeout=10 * 60) - - def check_reachability(self): - try: - info = json.loads(self.warcli("bitcoin rpc 0 getnetworkinfo")) - for net in info["networks"]: - if net["name"] == "ipv4" and not net["reachable"]: - return False - if net["name"] == "onion" and not net["reachable"]: - return False - if len(info["localaddresses"]) != 2: - return False - for addr in info["localaddresses"]: - assert "100." in addr["address"] or ".onion" in addr["address"] - if ".onion" in addr["address"]: - self.onion_addr = addr["address"] - return True - except Exception as e: - self.log.error(f"Error checking reachability: {e}") - return False - - def test_onion_peer_connection(self): - self.log.info("Attempting addnode to onion peer") - self.warcli(f"bitcoin rpc 1 addnode {self.onion_addr} add") - # Might take up to 10 minutes - self.wait_for_predicate(self.check_onion_peer, timeout=10 * 60) - - def check_onion_peer(self): - peers = json.loads(self.warcli("bitcoin rpc 0 getpeerinfo")) - for peer in peers: - self.log.debug(f"Checking peer: {peer['network']} {peer['addr']}") - if peer["network"] == "onion": - return True - return False - - -if __name__ == "__main__": - test = OnionTest() - test.run_test() From c0224db10b967cc51432bae81177267fb294a95b Mon Sep 17 00:00:00 2001 From: Matthew Zipkin Date: Sun, 25 Aug 2024 19:55:50 -0400 Subject: [PATCH 2/2] charts: only use conf file sections prior to v0.17 --- .github/workflows/test.yml | 1 + .../charts/bitcoincore/templates/_helpers.tpl | 12 ++++ .../bitcoincore/templates/configmap.yaml | 3 + resources/charts/bitcoincore/values.yaml | 3 - test/conf_test.py | 58 +++++++++++++++++ test/data/bitcoin_conf/network.yaml | 64 +++++++++++++++++++ test/data/bitcoin_conf/node-defaults.yaml | 4 ++ 7 files changed, 142 insertions(+), 3 deletions(-) create mode 100755 test/conf_test.py create mode 100644 test/data/bitcoin_conf/network.yaml create mode 100644 test/data/bitcoin_conf/node-defaults.yaml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f47d94b49..a84bfbab2 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -30,6 +30,7 @@ jobs: strategy: matrix: test: + - conf_test.py - dag_connection_test.py - logging_test.py - rpc_test.py diff --git a/resources/charts/bitcoincore/templates/_helpers.tpl b/resources/charts/bitcoincore/templates/_helpers.tpl index 25622c4e8..f22ca65e4 100644 --- a/resources/charts/bitcoincore/templates/_helpers.tpl +++ b/resources/charts/bitcoincore/templates/_helpers.tpl @@ -55,3 +55,15 @@ Create the name of the service account to use {{- default "default" .Values.serviceAccount.name }} {{- end }} {{- end }} + + +{{/* +Add network section heading in bitcoin.conf after v0.17.0 +*/}} +{{- define "bitcoincore.check_semver.regtest" -}} +{{- $tag := .Values.image.tag | trimPrefix "v" -}} +{{- $version := semverCompare ">=0.17.0" $tag -}} +{{- if $version -}} +[regtest] +{{- end -}} +{{- end -}} diff --git a/resources/charts/bitcoincore/templates/configmap.yaml b/resources/charts/bitcoincore/templates/configmap.yaml index ea21616f0..37952ff48 100644 --- a/resources/charts/bitcoincore/templates/configmap.yaml +++ b/resources/charts/bitcoincore/templates/configmap.yaml @@ -7,6 +7,9 @@ metadata: data: bitcoin.conf: | {{- if eq .Values.chain "regtest" }} + regtest=1 + + {{ template "bitcoincore.check_semver.regtest" . }} {{- tpl .Values.regtestConfig . | nindent 4 }} {{- end }} {{- .Values.baseConfig | nindent 4 }} diff --git a/resources/charts/bitcoincore/values.yaml b/resources/charts/bitcoincore/values.yaml index aac305ec6..275e11cd3 100644 --- a/resources/charts/bitcoincore/values.yaml +++ b/resources/charts/bitcoincore/values.yaml @@ -111,9 +111,6 @@ metricsExport: false prometheusMetricsPort: 9332 regtestConfig: | - regtest=1 - - [regtest] rpcuser=user rpcpassword=password rpcport=18443 diff --git a/test/conf_test.py b/test/conf_test.py new file mode 100755 index 000000000..97b9b0fcc --- /dev/null +++ b/test/conf_test.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 + +import json +import os +import re +from pathlib import Path + +from test_base import TestBase + +from warnet.k8s import get_mission + + +class ConfTest(TestBase): + def __init__(self): + super().__init__() + self.network_dir = Path(os.path.dirname(__file__)) / "data" / "bitcoin_conf" + + def run_test(self): + try: + self.setup_network() + self.check_uacomment() + finally: + self.stop_server() + + def setup_network(self): + self.log.info("Setting up network") + self.log.info(self.warcli(f"deploy {self.network_dir}")) + self.wait_for_all_tanks_status(target="running") + + def check_uacomment(self): + tanks = get_mission("tank") + + def get_uacomment(): + for tank in tanks[::-1]: + try: + name = tank.metadata.name + info = json.loads(self.warcli(f"bitcoin rpc {name} getnetworkinfo")) + subver = info["subversion"] + + # Regex pattern to match the uacomment inside parentheses + # e.g. /Satoshi:27.0.0(tank-0027)/ + pattern = r"\(([^)]+)\)" + match = re.search(pattern, subver) + if match: + uacomment = match.group(1) + assert uacomment == name + else: + return False + except Exception: + return False + return True + + self.wait_for_predicate(get_uacomment) + + +if __name__ == "__main__": + test = ConfTest() + test.run_test() diff --git a/test/data/bitcoin_conf/network.yaml b/test/data/bitcoin_conf/network.yaml new file mode 100644 index 000000000..0ceb8b059 --- /dev/null +++ b/test/data/bitcoin_conf/network.yaml @@ -0,0 +1,64 @@ +nodes: + - name: tank-0016 + image: + tag: "v0.16.1" + connect: + - tank-0017 + config: + uacomment=tank-0016 + - name: tank-0017 + image: + tag: "v0.17.0" + connect: + - tank-0019 + config: + uacomment=tank-0017 + - name: tank-0019 + image: + tag: "v0.19.2" + connect: + - tank-0020 + config: + uacomment=tank-0019 + - name: tank-0020 + image: + tag: "v0.20.0" + connect: + - tank-0021 + config: + uacomment=tank-0020 + - name: tank-0021 + image: + tag: "v0.21.1" + connect: + - tank-0024 + config: + uacomment=tank-0021 + - name: tank-0024 + image: + tag: "24.2" + connect: + - tank-0025 + config: + uacomment=tank-0024 + - name: tank-0025 + image: + tag: "25.1" + connect: + - tank-0026 + config: + uacomment=tank-0025 + - name: tank-0026 + image: + tag: "26.0" + connect: + - tank-0027 + config: + uacomment=tank-0026 + - name: tank-0027 + image: + tag: "27.0" + connect: + - tank-0016 + config: + uacomment=tank-0027 \ No newline at end of file diff --git a/test/data/bitcoin_conf/node-defaults.yaml b/test/data/bitcoin_conf/node-defaults.yaml new file mode 100644 index 000000000..7e021cad1 --- /dev/null +++ b/test/data/bitcoin_conf/node-defaults.yaml @@ -0,0 +1,4 @@ +image: + repository: bitcoindevproject/bitcoin + pullPolicy: IfNotPresent + tag: "27.0"