Skip to content

Commit 2533684

Browse files
committed
autogenerate-rpc-examples.py: use fixed port numbers.
This makes many of our information outputs consistent. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
1 parent b08247a commit 2533684

File tree

2 files changed

+51
-18
lines changed

2 files changed

+51
-18
lines changed

contrib/pyln-testing/pyln/testing/utils.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -398,14 +398,10 @@ class BitcoinD(TailableProc):
398398
def __init__(self, bitcoin_dir="/tmp/bitcoind-test", rpcport=None):
399399
TailableProc.__init__(self, bitcoin_dir, verbose=False)
400400

401-
if rpcport is None:
402-
self.reserved_rpcport = reserve_unused_port()
403-
rpcport = self.reserved_rpcport
404-
else:
405-
self.reserved_rpcport = None
406-
407401
self.bitcoin_dir = bitcoin_dir
408402
self.rpcport = rpcport
403+
self.reserved_rpcport = None
404+
self.port_setup = False
409405
self.prefix = 'bitcoind'
410406
self.canned_blocks = None
411407

@@ -429,21 +425,29 @@ def __init__(self, bitcoin_dir="/tmp/bitcoind-test", rpcport=None):
429425
'-debug=validation',
430426
'-rpcthreads=20',
431427
]
432-
# For up to and including 0.16.1, this needs to be in main section.
433-
BITCOIND_CONFIG['rpcport'] = rpcport
434-
# For after 0.16.1 (eg. 3f398d7a17f136cd4a67998406ca41a124ae2966), this
435-
# needs its own [regtest] section.
436-
BITCOIND_REGTEST = {'rpcport': rpcport}
437428
self.conf_file = os.path.join(bitcoin_dir, 'bitcoin.conf')
429+
430+
def set_port(self, rpcport):
431+
assert self.port_setup is False
432+
433+
BITCOIND_REGTEST = {'rpcport': rpcport}
438434
write_config(self.conf_file, BITCOIND_CONFIG, BITCOIND_REGTEST)
439-
self.rpc = SimpleBitcoinProxy(btc_conf_file=self.conf_file)
440-
self.proxies = []
435+
self.port_setup = True
441436

442437
def __del__(self):
443438
if self.reserved_rpcport is not None:
444439
drop_unused_port(self.reserved_rpcport)
445440

446441
def start(self, wallet_file=None):
442+
if not self.port_setup:
443+
if self.rpcport is None:
444+
self.reserved_rpcport = reserve_unused_port()
445+
self.rpcport = self.reserved_rpcport
446+
self.set_port(self.rpcport)
447+
448+
self.rpc = SimpleBitcoinProxy(btc_conf_file=self.conf_file)
449+
self.proxies = []
450+
447451
TailableProc.start(self)
448452
self.wait_for_log("Done loading", timeout=TIMEOUT)
449453

@@ -1666,6 +1670,7 @@ def split_options(self, opts):
16661670
'start',
16671671
'gossip_store_file',
16681672
'no_entropy',
1673+
'base_port',
16691674
]
16701675
node_opts = {k: v for k, v in opts.items() if k in node_opt_keys}
16711676
cli_opts = {k: v for k, v in opts.items() if k not in node_opt_keys}
@@ -1712,10 +1717,14 @@ def get_nodes(self, num_nodes, opts=None):
17121717
def get_node(self, node_id=None, options=None, dbfile=None,
17131718
bkpr_dbfile=None, feerates=(15000, 11000, 7500, 3750),
17141719
start=True, wait_for_bitcoind_sync=True, may_fail=False,
1715-
expect_fail=False, cleandir=True, gossip_store_file=None, unused_grpc_port=True, **kwargs):
1720+
expect_fail=False, cleandir=True, gossip_store_file=None, unused_grpc_port=True, base_port=None, **kwargs):
17161721
node_id = self.get_node_id() if not node_id else node_id
1717-
port = reserve_unused_port()
1718-
grpc_port = self.get_unused_port() if unused_grpc_port else None
1722+
if base_port:
1723+
port = base_port + node_id * 2 - 1
1724+
grpc_port = base_port + node_id * 2
1725+
else:
1726+
port = reserve_unused_port()
1727+
grpc_port = self.get_unused_port() if unused_grpc_port else None
17191728

17201729
lightning_dir = os.path.join(
17211730
self.directory, "lightning-{}/".format(node_id))
@@ -1739,7 +1748,8 @@ def get_node(self, node_id=None, options=None, dbfile=None,
17391748
node.set_feerates(feerates, False)
17401749

17411750
self.nodes.append(node)
1742-
self.reserved_ports.append(port)
1751+
if not base_port:
1752+
self.reserved_ports.append(port)
17431753
if dbfile:
17441754
out = open(os.path.join(node.daemon.lightning_dir, TEST_NETWORK,
17451755
'lightningd.sqlite3'), 'xb')

tests/autogenerate-rpc-examples.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from pyln.client import RpcError, Millisatoshi # type: ignore
1111
from pyln.testing.utils import GENERATE_EXAMPLES
1212
from utils import only_one, mine_funding_to_announce, sync_blockheight, wait_for, first_scid, serialize_payload_tlv, serialize_payload_final_tlv
13+
import socket
1314
import sys
1415
import os
1516
import time
@@ -32,6 +33,7 @@
3233
EXAMPLES_JSON = {}
3334
LOG_FILE = './tests/autogenerate-examples-status.log'
3435
IGNORE_RPCS_LIST = ['dev-splice', 'reckless', 'sql-template']
36+
BASE_PORTNUM = 30000
3537

3638
if os.path.exists(LOG_FILE):
3739
open(LOG_FILE, 'w').close()
@@ -42,6 +44,16 @@ class MissingExampleError(Exception):
4244
pass
4345

4446

47+
def check_ports(portrange):
48+
for port in portrange:
49+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
50+
try:
51+
s.bind(("127.0.0.1", port))
52+
except OSError:
53+
logger.error(f'Port {port} in use!')
54+
raise
55+
56+
4557
def update_examples_in_schema_files():
4658
"""Update examples in JSON schema files"""
4759
try:
@@ -129,6 +141,7 @@ def setup_test_nodes(node_factory, bitcoind, regenerate_blockchain):
129141
'broken_log': '.*',
130142
'dev-bitcoind-poll': 3, # Default 1; increased to avoid rpc failures
131143
'no_entropy': True,
144+
'base_port': BASE_PORTNUM,
132145
}.copy()
133146
for i in range(6)
134147
]
@@ -688,6 +701,7 @@ def generate_splice_examples(node_factory, bitcoind, regenerate_blockchain):
688701
'broken_log': '.*',
689702
'dev-bitcoind-poll': 3,
690703
'no_entropy': True,
704+
'base_port': BASE_PORTNUM,
691705
}.copy()
692706
for i in range(2)
693707
]
@@ -745,6 +759,7 @@ def generate_channels_examples(node_factory, bitcoind, l1, l3, l4, l5, regenerat
745759
'broken_log': '.*',
746760
'dev-bitcoind-poll': 3,
747761
'no_entropy': True,
762+
'base_port': BASE_PORTNUM,
748763
}.copy()
749764
for i in range(2)
750765
]
@@ -796,6 +811,7 @@ def generate_channels_examples(node_factory, bitcoind, l1, l3, l4, l5, regenerat
796811
'broken_log': '.*',
797812
'dev-bitcoind-poll': 3,
798813
'no_entropy': True,
814+
'base_port': BASE_PORTNUM,
799815
}.copy()
800816
for i in range(2)
801817
]
@@ -1009,7 +1025,7 @@ def generate_backup_recovery_examples(node_factory, l4, l5, l6, regenerate_block
10091025
logger.info('Backup and Recovery Start...')
10101026

10111027
# New node l13 used for recover and exposesecret examples
1012-
l13 = node_factory.get_node(options={'exposesecret-passphrase': "test_exposesecret"}, no_entropy=True)
1028+
l13 = node_factory.get_node(options={'exposesecret-passphrase': "test_exposesecret"}, no_entropy=True, base_portnum=BASE_PORTNUM)
10131029
update_example(node=l13, method='exposesecret', params={'passphrase': 'test_exposesecret'})
10141030
update_example(node=l13, method='exposesecret', params=['test_exposesecret', 'cln2'])
10151031

@@ -1169,6 +1185,13 @@ def test_generate_examples(node_factory, bitcoind, executor):
11691185
# Change this to True to regenerate bitcoin block & wallet.
11701186
regenerate_blockchain = (os.environ.get("REGENERATE_BLOCKCHAIN") == "1")
11711187
wallet_exists = os.access("tests/data/autogenerate-bitcoind-wallet.dat", os.F_OK)
1188+
1189+
# Make sure we can get the ports we expect.
1190+
check_ports(range(BASE_PORTNUM + 1, BASE_PORTNUM + 40))
1191+
1192+
# Make sure bitcoind doesn't steal our ports!
1193+
bitcoind.set_port(BASE_PORTNUM)
1194+
11721195
try:
11731196
global ALL_RPC_EXAMPLES, REGENERATING_RPCS
11741197

0 commit comments

Comments
 (0)