Browse Source

pyln: Move RPC and daemon instantiation into the LightningNode

We were relying heavily on NodeFactory to do some magic before instantiating
the Node with rpc and daemon initialized, that meant that we'd have to replace
all 3 classes when customizing the node to our needs. Moving that
initialization into the node itself means that the LightningNode class now can
be swapped out and customized, without having to wire everything else through.
travis-debug
Christian Decker 5 years ago
parent
commit
bc9b1c405e
  1. 118
      contrib/pyln-testing/pyln/testing/utils.py

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

@ -540,12 +540,10 @@ class LightningD(TailableProc):
class LightningNode(object): class LightningNode(object):
def __init__(self, daemon, rpc, btc, executor, may_fail=False, def __init__(self, node_id, lightning_dir, bitcoind, executor, may_fail=False,
may_reconnect=False, allow_broken_log=False, may_reconnect=False, allow_broken_log=False,
allow_bad_gossip=False, db=None): allow_bad_gossip=False, db=None, port=None, disconnect=None, random_hsm=None, log_all_io=None, options=None, **kwargs):
self.rpc = rpc self.bitcoin = bitcoind
self.daemon = daemon
self.bitcoin = btc
self.executor = executor self.executor = executor
self.may_fail = may_fail self.may_fail = may_fail
self.may_reconnect = may_reconnect self.may_reconnect = may_reconnect
@ -553,6 +551,48 @@ class LightningNode(object):
self.allow_bad_gossip = allow_bad_gossip self.allow_bad_gossip = allow_bad_gossip
self.db = db self.db = db
socket_path = os.path.join(lightning_dir, "lightning-rpc").format(node_id)
self.rpc = LightningRpc(socket_path, self.executor)
self.daemon = LightningD(
lightning_dir, bitcoindproxy=bitcoind.get_proxy(),
port=port, random_hsm=random_hsm, node_id=node_id
)
# If we have a disconnect string, dump it to a file for daemon.
if disconnect:
self.daemon.disconnect_file = os.path.join(lightning_dir, "dev_disconnect")
with open(self.daemon.disconnect_file, "w") as f:
f.write("\n".join(disconnect))
self.daemon.opts["dev-disconnect"] = "dev_disconnect"
if log_all_io:
assert DEVELOPER
self.daemon.env["LIGHTNINGD_DEV_LOG_IO"] = "1"
self.daemon.opts["log-level"] = "io"
if DEVELOPER:
self.daemon.opts["dev-fail-on-subdaemon-fail"] = None
self.daemon.env["LIGHTNINGD_DEV_MEMLEAK"] = "1"
if os.getenv("DEBUG_SUBD"):
self.daemon.opts["dev-debugger"] = os.getenv("DEBUG_SUBD")
if VALGRIND:
self.daemon.env["LIGHTNINGD_DEV_NO_BACKTRACE"] = "1"
if not may_reconnect:
self.daemon.opts["dev-no-reconnect"] = None
if options is not None:
self.daemon.opts.update(options)
dsn = db.get_dsn()
if dsn is not None:
self.daemon.opts['wallet'] = dsn
if VALGRIND:
self.daemon.cmd_prefix = [
'valgrind',
'-q',
'--trace-children=yes',
'--trace-children-skip=*python*,*bitcoin-cli*,*elements-cli*',
'--error-exitcode=7',
'--log-file={}/valgrind-errors.%p'.format(self.daemon.lightning_dir)
]
def connect(self, remote_node): def connect(self, remote_node):
self.rpc.connect(remote_node.info['id'], '127.0.0.1', remote_node.daemon.port) self.rpc.connect(remote_node.info['id'], '127.0.0.1', remote_node.daemon.port)
@ -929,14 +969,11 @@ class NodeFactory(object):
return [j.result() for j in jobs] return [j.result() for j in jobs]
def get_node(self, disconnect=None, options=None, may_fail=False, def get_node(self, node_id=None, options=None, dbfile=None,
may_reconnect=False, random_hsm=False, feerates=(15000, 7500, 3750), start=True,
feerates=(15000, 7500, 3750), start=True, log_all_io=False, wait_for_bitcoind_sync=True, **kwargs):
dbfile=None, node_id=None, allow_broken_log=False,
wait_for_bitcoind_sync=True, allow_bad_gossip=False):
if not node_id:
node_id = self.get_node_id()
node_id = self.get_node_id() if not node_id else node_id
port = self.get_next_port() port = self.get_next_port()
lightning_dir = os.path.join( lightning_dir = os.path.join(
@ -945,62 +982,21 @@ class NodeFactory(object):
if os.path.exists(lightning_dir): if os.path.exists(lightning_dir):
shutil.rmtree(lightning_dir) shutil.rmtree(lightning_dir)
socket_path = os.path.join(lightning_dir, "lightning-rpc").format(node_id) # Get the DB backend DSN we should be using for this test and this
daemon = LightningD( # node.
lightning_dir, bitcoindproxy=self.bitcoind.get_proxy(),
port=port, random_hsm=random_hsm, node_id=node_id
)
# If we have a disconnect string, dump it to a file for daemon.
if disconnect:
daemon.disconnect_file = os.path.join(lightning_dir, "dev_disconnect")
with open(daemon.disconnect_file, "w") as f:
f.write("\n".join(disconnect))
daemon.opts["dev-disconnect"] = "dev_disconnect"
if log_all_io:
assert DEVELOPER
daemon.env["LIGHTNINGD_DEV_LOG_IO"] = "1"
daemon.opts["log-level"] = "io"
if DEVELOPER:
daemon.opts["dev-fail-on-subdaemon-fail"] = None
daemon.env["LIGHTNINGD_DEV_MEMLEAK"] = "1"
if os.getenv("DEBUG_SUBD"):
daemon.opts["dev-debugger"] = os.getenv("DEBUG_SUBD")
if VALGRIND:
daemon.env["LIGHTNINGD_DEV_NO_BACKTRACE"] = "1"
if not may_reconnect:
daemon.opts["dev-no-reconnect"] = None
if options is not None:
daemon.opts.update(options)
# Get the DB backend DSN we should be using for this test and this node.
db = self.db_provider.get_db(lightning_dir, self.testname, node_id) db = self.db_provider.get_db(lightning_dir, self.testname, node_id)
dsn = db.get_dsn() node = LightningNode(
if dsn is not None: node_id, lightning_dir, self.bitcoind, self.executor, db=db,
daemon.opts['wallet'] = dsn port=port, options=options, **kwargs
)
rpc = LightningRpc(socket_path, self.executor)
node = LightningNode(daemon, rpc, self.bitcoind, self.executor, may_fail=may_fail,
may_reconnect=may_reconnect, allow_broken_log=allow_broken_log,
allow_bad_gossip=allow_bad_gossip, db=db)
# Regtest estimatefee are unusable, so override. # Regtest estimatefee are unusable, so override.
node.set_feerates(feerates, False) node.set_feerates(feerates, False)
self.nodes.append(node) self.nodes.append(node)
if VALGRIND:
node.daemon.cmd_prefix = [
'valgrind',
'-q',
'--trace-children=yes',
'--trace-children-skip=*python*,*bitcoin-cli*,*elements-cli*',
'--error-exitcode=7',
'--log-file={}/valgrind-errors.%p'.format(node.daemon.lightning_dir)
]
if dbfile: if dbfile:
out = open(os.path.join(node.daemon.lightning_dir, 'lightningd.sqlite3'), 'xb') out = open(os.path.join(node.daemon.lightning_dir,
'lightningd.sqlite3'), 'xb')
with lzma.open(os.path.join('tests/data', dbfile), 'rb') as f: with lzma.open(os.path.join('tests/data', dbfile), 'rb') as f:
out.write(f.read()) out.write(f.read())

Loading…
Cancel
Save