Skip to content

Commit be7f8a3

Browse files
committed
feat: external mode of lnd
1 parent 9e099db commit be7f8a3

File tree

11 files changed

+313
-34
lines changed

11 files changed

+313
-34
lines changed

images/utils/launcher/check_wallets.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import os
44
import docker
55
import time
6-
from concurrent.futures import ThreadPoolExecutor
6+
from concurrent.futures import ThreadPoolExecutor, wait
77
from docker.models.containers import Container
88
from datetime import datetime
99
import re
@@ -276,7 +276,10 @@ def ensure_layer2_ready(self) -> None:
276276
nodes = self.config.nodes
277277
if self.node_manager.newly_installed:
278278
if self.network == "simnet":
279-
self.lnd_cfheaders["bitcoin"] = CFHeaderState()
279+
if self.config.nodes["lndbtc"]["mode"] == "native":
280+
self.lnd_cfheaders["bitcoin"] = CFHeaderState()
281+
if self.config.nodes["lndltc"]["mode"] == "native":
282+
self.lnd_cfheaders["litecoin"] = CFHeaderState()
280283
self.lnd_cfheaders["litecoin"] = CFHeaderState()
281284
if "bitcoind" in nodes and nodes["bitcoind"]["mode"] in ["neutrino", "light"]:
282285
self.lnd_cfheaders["bitcoin"] = CFHeaderState()
@@ -287,19 +290,18 @@ def ensure_layer2_ready(self) -> None:
287290
print("Syncing light clients:")
288291
self._print_lnd_cfheaders(erase_last_line=False)
289292

290-
with ThreadPoolExecutor(max_workers=2, thread_name_prefix="LndReady") as executor:
291-
f1 = executor.submit(self.ensure_lnd_ready, "bitcoin")
292-
f2 = executor.submit(self.ensure_lnd_ready, "litecoin")
293+
with ThreadPoolExecutor(max_workers=len(self.lnd_cfheaders), thread_name_prefix="LndReady") as executor:
294+
futs = {}
295+
for chain in self.lnd_cfheaders:
296+
futs[executor.submit(self.ensure_lnd_ready, chain)] = chain
293297

294-
try:
295-
f1.result()
296-
except Exception as e:
297-
raise FatalError("Failed to wait for lndbtc to be ready") from e
298+
done, not_done = wait(futs)
298299

299-
try:
300-
f2.result()
301-
except Exception as e:
302-
raise FatalError("Failed to wait for lndltc to be ready") from e
300+
if len(not_done) > 0:
301+
for f in not_done:
302+
f.cancel()
303+
lnds = ", ".join([futs[f] for f in not_done])
304+
raise FatalError("Failed to wait for {} to be ready".format(lnds))
303305

304306
if self.node_manager.newly_installed:
305307
print()

images/utils/launcher/config/config.py

Lines changed: 118 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,33 @@ def parse_command_line_arguments(self):
265265
action="store_true",
266266
help="Preserve lndbtc lnd.conf file during updates"
267267
)
268+
group.add_argument(
269+
"--lndbtc.mode",
270+
metavar="<mode>",
271+
choices=["native", "external"],
272+
help="Lndbtc service mode"
273+
)
274+
group.add_argument(
275+
"--lndbtc.rpc-host",
276+
metavar="<hostname>",
277+
help="External lndbtc RPC hostname"
278+
)
279+
group.add_argument(
280+
"--lndbtc.rpc-port",
281+
type=int,
282+
metavar="<port>",
283+
help="External lndbtc RPC port"
284+
)
285+
group.add_argument(
286+
"--lndbtc.certpath",
287+
metavar="<hostname>",
288+
help="External lndbtc TLS certificate file"
289+
)
290+
group.add_argument(
291+
"--lndbtc.macaroonpath",
292+
metavar="<hostname>",
293+
help="External lndbtc admin.macaroon path"
294+
)
268295

269296
group = parser.add_argument_group("lndltc")
270297
group.add_argument(
@@ -277,6 +304,33 @@ def parse_command_line_arguments(self):
277304
action="store_true",
278305
help="Preserve lndltc lnd.conf file during updates"
279306
)
307+
group.add_argument(
308+
"--lndltc.mode",
309+
metavar="<mode>",
310+
choices=["native", "external"],
311+
help="Lndltc service mode"
312+
)
313+
group.add_argument(
314+
"--lndltc.rpc-host",
315+
metavar="<hostname>",
316+
help="External lndltc RPC hostname"
317+
)
318+
group.add_argument(
319+
"--lndltc.rpc-port",
320+
type=int,
321+
metavar="<port>",
322+
help="External lndltc RPC port"
323+
)
324+
group.add_argument(
325+
"--lndltc.certpath",
326+
metavar="<hostname>",
327+
help="External lndltc TLS certificate file"
328+
)
329+
group.add_argument(
330+
"--lndltc.macaroonpath",
331+
metavar="<hostname>",
332+
help="External lndltc admin.macaroon path"
333+
)
280334

281335
group = parser.add_argument_group("connext")
282336
group.add_argument(
@@ -665,20 +719,72 @@ def update_geth(self, parsed):
665719
value = getattr(self.args, opt)
666720
node["cache"] = value
667721

722+
def _get_value(self, key, node, parsed, validator=None, converter=None, default=None):
723+
result = None
724+
725+
node_name = node["name"]
726+
727+
def process(value, hint):
728+
if converter:
729+
try:
730+
value = converter(value)
731+
except Exception as e:
732+
raise ValueError("({}) Invalid value: {}".format(hint, value)) from e
733+
734+
if validator and not validator(value):
735+
raise ValueError(value)
736+
737+
return value
738+
739+
if key in parsed:
740+
value = parsed[key]
741+
value = process(value, "{}.conf > {} > {}".format(self.network, node_name, key))
742+
result = value
743+
744+
opt = "{}.{}".format(node_name, key.replace("-", "_"))
745+
746+
if hasattr(self.args, opt):
747+
value = getattr(self.args, opt)
748+
value = process(value, "--{}".format(opt.replace("_", "-")))
749+
result = value
750+
751+
if not result:
752+
if default:
753+
return default
754+
msg = "configuration \"{}.{}\" missing (please specify command-line option \"--{}\" or add \"{}\" in your {}.conf \"{}\" section)".format(
755+
node_name, key, opt.replace("_", "-"), key, self.network, node_name)
756+
raise ValueError(msg)
757+
758+
return result
759+
668760
def update_lndbtc(self, parsed):
669761
"""Update lndbtc related configurations from parsed TOML lndbtc section
670762
:param parsed: Parsed lndbtc TOML section
671763
"""
672764
node = self.nodes["lndbtc"]
673765
self.update_ports(node, parsed)
674766

767+
node["mode"] = self._get_value("mode", node, parsed, validator=lambda v: v in ["native", "external"], default="native")
768+
if node["mode"] == "external":
769+
node["rpc_host"] = self._get_value("rpc_host", node, parsed)
770+
node["rpc_port"] = self._get_value("rpc_port", node, parsed, converter=lambda v: int(v))
771+
node["certpath"] = self._get_value("certpath", node, parsed)
772+
node["macaroonpath"] = self._get_value("macaroonpath", node, parsed)
773+
675774
def update_lndltc(self, parsed):
676775
"""Update lndltc related configurations from parsed TOML lndltc section
677776
:param parsed: Parsed lndltc TOML section
678777
"""
679778
node = self.nodes["lndltc"]
680779
self.update_ports(node, parsed)
681780

781+
node["mode"] = self._get_value("mode", node, parsed, validator=lambda v: v in ["native", "external"], default="native")
782+
if node["mode"] == "external":
783+
node["rpc_host"] = self._get_value("rpc_host", node, parsed)
784+
node["rpc_port"] = self._get_value("rpc_port", node, parsed, converter=lambda v: int(v))
785+
node["certpath"] = self._get_value("certpath", node, parsed)
786+
node["macaroonpath"] = self._get_value("macaroonpath", node, parsed)
787+
682788
def update_connext(self, parsed):
683789
"""Update Connext related configurations from parsed TOML connext section
684790
:param parsed: Parsed connext TOML section
@@ -975,6 +1081,7 @@ def dump_attr(attr: str) -> None:
9751081
if isinstance(value, bool):
9761082
value = str(value).lower()
9771083
print("{}=\"{}\"".format(key, value), file=f)
1084+
9781085
dump_attr("branch")
9791086
dump_attr("disable_update")
9801087
dump_attr("external_ip")
@@ -1024,16 +1131,21 @@ def dump_node_attr(node: str, attr: str) -> None:
10241131
if node in ["bitcoind", "litecoind"]:
10251132
dump_node_attr(node, "external_rpc_host")
10261133
dump_node_attr(node, "external_rpc_port")
1027-
#dump_node_attr(node, "external_rpc_user")
1028-
#dump_node_attr(node, "external_rpc_password")
1134+
# dump_node_attr(node, "external_rpc_user")
1135+
# dump_node_attr(node, "external_rpc_password")
10291136
dump_node_attr(node, "external_zmqpubrawblock")
10301137
dump_node_attr(node, "external_zmqpubrawtx")
10311138
elif node == "geth":
10321139
dump_node_attr(node, "external_rpc_host")
10331140
dump_node_attr(node, "external_rpc_port")
1034-
#dump_node_attr(node, "infura_project_id")
1035-
#dump_node_attr(node, "infura_project_secret")
1141+
# dump_node_attr(node, "infura_project_id")
1142+
# dump_node_attr(node, "infura_project_secret")
10361143
dump_node_attr(node, "cache")
1144+
elif node in ["lndbtc", "lndltc"]:
1145+
dump_node_attr(node, "rpc_host")
1146+
dump_node_attr(node, "rpc_port")
1147+
dump_node_attr(node, "certpath")
1148+
dump_node_attr(node, "macaroonpath")
10371149
elif node == "arby":
10381150
dump_node_attr(node, "test_centralized_baseasset_balance")
10391151
dump_node_attr(node, "test_centralized_quoteasset_balance")
@@ -1044,6 +1156,6 @@ def dump_node_attr(node: str, attr: str) -> None:
10441156
dump_node_attr(node, "live_cex")
10451157
dump_node_attr(node, "test_mode")
10461158
dump_node_attr(node, "cex")
1047-
#dump_node_attr(node, "cex_api_key")
1048-
#dump_node_attr(node, "cex_api_secret")
1159+
# dump_node_attr(node, "cex_api_key")
1160+
# dump_node_attr(node, "cex_api_secret")
10491161
dump_node_attr(node, "margin")

images/utils/launcher/config/mainnet.conf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,24 @@
104104
# 10010 - REST port
105105
#expose-ports = ["9735", "10009", "10010"]
106106

107+
#mode = "external"
108+
#rpc-host = "127.0.0.1"
109+
#rpc-port = 10009
110+
#certpath = "$HOME/.lnd/tls.cert"
111+
#macaroonpath = "$HOME/.lnd/data/chain/bitcoin/mainnet/admin.macaroon"
112+
107113
[lndltc]
108114
# 10735 - P2P port
109115
# 11009 - gRPC port
110116
# 11010 - REST port
111117
#expose-ports = ["10735", "11009:10009", "11010:10010"]
112118

119+
#mode = "external"
120+
#rpc-host = "127.0.0.1"
121+
#rpc-port = 10009
122+
#certpath = "$HOME/.lnd/tls.cert"
123+
#macaroonpath = "$HOME/.lnd/data/chain/litecoin/mainnet/admin.macaroon"
124+
113125
[connext]
114126
# 5040 - connext API port
115127
#expose-ports = ["5040"]

images/utils/launcher/config/simnet.conf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,24 @@
1717
# 30010 - REST port
1818
#expose-ports = ["29735", "30009:10009", "30010:10010"]
1919

20+
#mode = "external"
21+
#rpc-host = "127.0.0.1"
22+
#rpc-port = 10009
23+
#certpath = "$HOME/.lnd/tls.cert"
24+
#macaroonpath = "$HOME/.lnd/data/chain/bitcoin/simnet/admin.macaroon"
25+
2026
[lndltc]
2127
# 30735 - P2P port
2228
# 31009 - gRPC port
2329
# 31010 - REST port
2430
#expose-ports = ["30735", "31009:10009", "31010:10010"]
2531

32+
#mode = "external"
33+
#rpc-host = "127.0.0.1"
34+
#rpc-port = 10009
35+
#certpath = "$HOME/.lnd/tls.cert"
36+
#macaroonpath = "$HOME/.lnd/data/chain/litecoin/simnet/admin.macaroon"
37+
2638
[connext]
2739
# 25040 - connext API port
2840
#expose-ports = ["25040:5040"]

images/utils/launcher/config/template.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,10 @@ def __str__(self):
8787
"mode": "native",
8888
"preserve_config": False,
8989
"use_local_image": False,
90+
"rpc_host": None,
91+
"rpc_port": None,
92+
"certpath": None,
93+
"macaroonpath": None,
9094
},
9195
"lndltc": {
9296
"name": "lndltc",
@@ -101,6 +105,10 @@ def __str__(self):
101105
"mode": "native",
102106
"preserve_config": False,
103107
"use_local_image": False,
108+
"rpc_host": None,
109+
"rpc_port": None,
110+
"certpath": None,
111+
"macaroonpath": None,
104112
},
105113
"connext": {
106114
"name": "connext",
@@ -282,6 +290,10 @@ def __str__(self):
282290
"mode": "native",
283291
"preserve_config": False,
284292
"use_local_image": False,
293+
"rpc_host": None,
294+
"rpc_port": None,
295+
"certpath": None,
296+
"macaroonpath": None,
285297
},
286298
"lndltc": {
287299
"name": "lndltc",
@@ -296,6 +308,10 @@ def __str__(self):
296308
"mode": "native",
297309
"preserve_config": False,
298310
"use_local_image": False,
311+
"rpc_host": None,
312+
"rpc_port": None,
313+
"certpath": None,
314+
"macaroonpath": None,
299315
},
300316
"connext": {
301317
"name": "connext",
@@ -500,6 +516,10 @@ def __str__(self):
500516
"mode": "native",
501517
"preserve_config": False,
502518
"use_local_image": False,
519+
"rpc_host": None,
520+
"rpc_port": None,
521+
"certpath": None,
522+
"macaroonpath": None,
503523
},
504524
"lndltc": {
505525
"name": "lndltc",
@@ -514,6 +534,10 @@ def __str__(self):
514534
"mode": "native",
515535
"preserve_config": False,
516536
"use_local_image": False,
537+
"rpc_host": None,
538+
"rpc_port": None,
539+
"certpath": None,
540+
"macaroonpath": None,
517541
},
518542
"connext": {
519543
"name": "connext",

images/utils/launcher/config/testnet.conf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,24 @@
104104
# 20010 - REST port
105105
#expose-ports = ["19735", "20009:10009", "20010:10010"]
106106

107+
#mode = "external"
108+
#rpc-host = "127.0.0.1"
109+
#rpc-port = 10009
110+
#certpath = "$HOME/.lnd/tls.cert"
111+
#macaroonpath = "$HOME/.lnd/data/chain/bitcoin/testnet/admin.macaroon"
112+
107113
[lndltc]
108114
# 20735 - P2P port
109115
# 21009 - gRPC port
110116
# 21010 - REST port
111117
#expose-ports = ["20735", "21009:10009", "21010:10010"]
112118

119+
#mode = "external"
120+
#rpc-host = "127.0.0.1"
121+
#rpc-port = 10009
122+
#certpath = "$HOME/.lnd/tls.cert"
123+
#macaroonpath = "$HOME/.lnd/data/chain/litecoin/testnet/admin.macaroon"
124+
113125
[connext]
114126
# 15040 - connext API port
115127
#expose-ports = ["15040:5040"]

images/utils/launcher/node/base.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -367,10 +367,7 @@ def ignored(item):
367367
if old_set != new_set:
368368
old.diff = old_set - new_set
369369
new.diff = new_set - old_set
370-
if len(new.diff) == 0:
371-
return CompareResult(True, "", old, new)
372-
else:
373-
return CompareResult(False, "Environments are different", old, new)
370+
return CompareResult(False, "Environments are different", old, new)
374371

375372
return CompareResult(True, "", old, new)
376373

0 commit comments

Comments
 (0)