Restore CLI wakunode2 non-zero defaults for ports

* apply auto-port/port-0 default to library users only
* revert REST API additions
* relax rest/ws conf builders to accept an unset port for consistency
* apply fixes to tests and testing infra
This commit is contained in:
Fabiana Cecin 2026-04-28 12:27:50 -03:00
parent c842eaa9ee
commit 0bdf6538ef
No known key found for this signature in database
GPG Key ID: BCAB8A55CB51B6C7
12 changed files with 42 additions and 104 deletions

View File

@ -94,6 +94,8 @@ suite "LM API health checking":
raiseAssert error
conf.mode = Core
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)
conf.discv5UdpPort = Port(0)
conf.clusterId = 3'u16
conf.numShardsInNetwork = 1
conf.rest = false
@ -269,6 +271,8 @@ suite "LM API health checking":
raiseAssert error
edgeConf.mode = Edge
edgeConf.listenAddress = parseIpAddress("0.0.0.0")
edgeConf.tcpPort = Port(0)
edgeConf.discv5UdpPort = Port(0)
edgeConf.clusterId = 3'u16
edgeConf.maxMessageSize = "150 KiB"
edgeConf.rest = false

View File

@ -65,6 +65,8 @@ proc createApiNodeConf(numShards: uint16 = 1): WakuNodeConf =
raiseAssert error
conf.mode = cli_args.WakuMode.Core
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)
conf.discv5UdpPort = Port(0)
conf.clusterId = 3'u16
conf.numShardsInNetwork = numShards
conf.reliabilityEnabled = true

View File

@ -122,6 +122,8 @@ proc createApiNodeConf(mode: cli_args.WakuMode = cli_args.WakuMode.Core): WakuNo
raiseAssert error
conf.mode = mode
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)
conf.discv5UdpPort = Port(0)
conf.clusterId = 3'u16
conf.numShardsInNetwork = 1
conf.reliabilityEnabled = true

View File

@ -73,6 +73,8 @@ proc createApiNodeConf(
raiseAssert error
conf.mode = mode
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)
conf.discv5UdpPort = Port(0)
conf.clusterId = 3'u16
conf.numShardsInNetwork = numShards
conf.reliabilityEnabled = true

View File

@ -27,7 +27,6 @@ import
# TODO: migrate to usage of a test cluster conf
proc defaultTestWakuConfBuilder*(): WakuConfBuilder =
var builder = WakuConfBuilder.init()
builder.withP2pTcpPort(Port(0))
builder.withP2pListenAddress(parseIpAddress("0.0.0.0"))
builder.restServerConf.withListenAddress(parseIpAddress("127.0.0.1"))
builder.withDnsAddrsNameServers(

View File

@ -99,19 +99,31 @@ suite "Wakunode2 - Waku initialization":
(waitFor waku.stop()).isOkOr:
raiseAssert error
test "MyBoundPorts should report a bound port for each enabled service":
test "unspecified service ports default to 0 then bind non-zero":
var builder = defaultTestWakuConfBuilder()
builder.discv5Conf.withEnabled(true)
builder.restServerConf.withEnabled(true)
builder.restServerConf.withPort(Port(0))
builder.restServerConf.withRelayCacheCapacity(50'u32)
builder.metricsServerConf.withEnabled(true)
builder.webSocketConf.withEnabled(true)
builder.webSocketConf.withWebSocketPort(Port(0))
# the p2pTcp option is private
check:
builder.discv5Conf.udpPort.isNone()
builder.restServerConf.port.isNone()
builder.metricsServerConf.httpPort.isNone()
builder.webSocketConf.webSocketPort.isNone()
let conf = builder.build().valueOr:
raiseAssert error
check:
conf.endpointConf.p2pTcpPort == Port(0)
conf.discv5Conf.get().udpPort == Port(0)
conf.restServerConf.get().port == Port(0)
conf.metricsServerConf.get().httpPort == Port(0)
conf.webSocketConf.get().port == Port(0)
var waku = (waitFor Waku.new(conf)).valueOr:
raiseAssert error
defer:

View File

@ -63,37 +63,6 @@ suite "Waku v2 REST API - Debug":
await restServer.closeWait()
await node.stop()
asyncTest "GET /info exposes node.ports":
let node = testWakuNode()
node.ports = BoundPorts(
tcp: some(1001'u16),
webSocket: some(1002'u16),
rest: some(1003'u16),
discv5Udp: some(1004'u16),
metrics: some(1005'u16),
)
let restAddress = parseIpAddress("0.0.0.0")
let restServer = WakuRestServerRef.init(restAddress, Port(0)).tryGet()
defer:
await restServer.stop()
await restServer.closeWait()
installDebugApiHandlers(restServer.router, node)
restServer.start()
let client =
newRestHttpClient(initTAddress(restAddress, restServer.httpServer.address.port))
let response = await client.debugInfoV1()
check:
response.status == 200
response.data.ports.tcp == some(1001'u16)
response.data.ports.webSocket == some(1002'u16)
response.data.ports.rest == some(1003'u16)
response.data.ports.discv5Udp == some(1004'u16)
response.data.ports.metrics == some(1005'u16)
asyncTest "Get node version - GET /version":
# Given
let node = testWakuNode()

View File

@ -192,9 +192,8 @@ type WakuNodeConf* = object
name: "listen-address"
.}: IpAddress
tcpPort* {.
desc: "TCP listening port. 0 = auto-assign.", defaultValue: 0, name: "tcp-port"
.}: uint16
tcpPort* {.desc: "TCP listening port.", defaultValue: 60000, name: "tcp-port".}:
Port
portsShift* {.
desc: "Add a shift to all port numbers.", defaultValue: 0, name: "ports-shift"
@ -490,8 +489,8 @@ with the drawback of consuming some more bandwidth.""",
.}: IpAddress
restPort* {.
desc: "Listening port of the REST HTTP server. 0 = auto-assign.",
defaultValue: 0,
desc: "Listening port of the REST HTTP server.",
defaultValue: 8645,
name: "rest-port"
.}: uint16
@ -531,8 +530,8 @@ with the drawback of consuming some more bandwidth.""",
.}: IpAddress
metricsServerPort* {.
desc: "Listening HTTP port of the metrics server. 0 = auto-assign.",
defaultValue: 0,
desc: "Listening HTTP port of the metrics server.",
defaultValue: 8008,
name: "metrics-server-port"
.}: uint16
@ -565,10 +564,10 @@ with the drawback of consuming some more bandwidth.""",
.}: Option[bool]
discv5UdpPort* {.
desc: "Listening UDP port for Node Discovery v5. 0 = auto-assign.",
defaultValue: 0,
desc: "Listening UDP port for Node Discovery v5.",
defaultValue: 9000,
name: "discv5-udp-port"
.}: uint16
.}: Port
discv5BootstrapNodes* {.
desc:
@ -665,10 +664,8 @@ with the drawback of consuming some more bandwidth.""",
.}: bool
websocketPort* {.
desc: "WebSocket listening port. 0 = auto-assign.",
defaultValue: 0,
name: "websocket-port"
.}: uint16
desc: "WebSocket listening port.", defaultValue: 8000, name: "websocket-port"
.}: Port
websocketSecureSupport* {.
desc: "Enable secure websocket: true|false",

View File

@ -46,8 +46,6 @@ proc build*(b: RestServerConfBuilder): Result[Option[RestServerConf], string] =
if b.listenAddress.isNone():
return err("restServer.listenAddress is not specified")
if b.port.isNone():
return err("restServer.port is not specified")
if b.relayCacheCapacity.isNone():
return err("restServer.relayCacheCapacity is not specified")
@ -56,7 +54,7 @@ proc build*(b: RestServerConfBuilder): Result[Option[RestServerConf], string] =
RestServerConf(
allowOrigin: b.allowOrigin,
listenAddress: b.listenAddress.get(),
port: b.port.get(),
port: b.port.get(Port(0)),
admin: b.admin.get(false),
relayCacheCapacity: b.relayCacheCapacity.get(),
)

View File

@ -41,14 +41,11 @@ proc build*(b: WebSocketConfBuilder): Result[Option[WebSocketConf], string] =
if not b.enabled.get(false):
return ok(none(WebSocketConf))
if b.webSocketPort.isNone():
return err("websocket.port is not specified")
if not b.secureEnabled.get(false):
return ok(
some(
WebSocketConf(
port: b.websocketPort.get(), secureConf: none(WebSocketSecureConf)
port: b.webSocketPort.get(Port(0)), secureConf: none(WebSocketSecureConf)
)
)
)
@ -61,7 +58,7 @@ proc build*(b: WebSocketConfBuilder): Result[Option[WebSocketConf], string] =
return ok(
some(
WebSocketConf(
port: b.webSocketPort.get(),
port: b.webSocketPort.get(Port(0)),
secureConf: some(
WebSocketSecureConf(keyPath: b.keyPath.get(), certPath: b.certPath.get())
),

View File

@ -101,7 +101,6 @@ type
listenAddresses*: seq[string]
enrUri*: string #multiaddrStrings*: seq[string]
mixPubKey*: Option[string]
ports*: BoundPorts
# NOTE based on Eth2Node in NBC eth2_network.nim
WakuNode* = ref object
@ -251,7 +250,7 @@ proc info*(node: WakuNode): WakuInfo =
var fulladdr = $address & "/p2p/" & $peerInfo.peerId
listenStr &= fulladdr
let enrUri = node.enr.toUri()
var wakuInfo = WakuInfo(listenAddresses: listenStr, enrUri: enrUri, ports: node.ports)
var wakuInfo = WakuInfo(listenAddresses: listenStr, enrUri: enrUri)
if not node.wakuMix.isNil():
let keyStr = node.wakuMix.pubKey.to0xHex()
wakuInfo.mixPubKey = some(keyStr)

View File

@ -1,7 +1,7 @@
{.push raises: [].}
import chronicles, json_serialization, json_serialization/std/options
import waku/[waku_node, net/bound_ports, rest_api/endpoint/serdes]
import ../../../waku_node, ../serdes
import std/typetraits
#### Types
@ -10,7 +10,6 @@ type DebugWakuInfo* = object
listenAddresses*: seq[string]
enrUri*: Option[string]
mixPubKey*: Option[string]
ports*: BoundPorts
#### Type conversion
@ -19,45 +18,10 @@ proc toDebugWakuInfo*(nodeInfo: WakuInfo): DebugWakuInfo =
listenAddresses: nodeInfo.listenAddresses,
enrUri: some(nodeInfo.enrUri),
mixPubKey: nodeInfo.mixPubKey,
ports: nodeInfo.ports,
)
#### Serialization and deserialization
proc writeValue*(
writer: var JsonWriter[RestJson], value: BoundPorts
) {.raises: [IOError].} =
writer.beginRecord()
if value.tcp.isSome():
writer.writeField("tcp", value.tcp.get())
if value.webSocket.isSome():
writer.writeField("webSocket", value.webSocket.get())
if value.rest.isSome():
writer.writeField("rest", value.rest.get())
if value.discv5Udp.isSome():
writer.writeField("discv5Udp", value.discv5Udp.get())
if value.metrics.isSome():
writer.writeField("metrics", value.metrics.get())
writer.endRecord()
proc readValue*(
reader: var JsonReader[RestJson], value: var BoundPorts
) {.raises: [SerializationError, IOError].} =
for fieldName in readObjectFields(reader):
case fieldName
of "tcp":
value.tcp = some(reader.readValue(uint16))
of "webSocket":
value.webSocket = some(reader.readValue(uint16))
of "rest":
value.rest = some(reader.readValue(uint16))
of "discv5Udp":
value.discv5Udp = some(reader.readValue(uint16))
of "metrics":
value.metrics = some(reader.readValue(uint16))
else:
unrecognizedFieldWarning(value)
proc writeValue*(
writer: var JsonWriter[RestJson], value: DebugWakuInfo
) {.raises: [IOError].} =
@ -67,7 +31,6 @@ proc writeValue*(
writer.writeField("enrUri", value.enrUri.get())
if value.mixPubKey.isSome():
writer.writeField("mixPubKey", value.mixPubKey.get())
writer.writeField("ports", value.ports)
writer.endRecord()
proc readValue*(
@ -76,7 +39,6 @@ proc readValue*(
var
listenAddresses: Option[seq[string]]
enrUri: Option[string]
ports = BoundPorts.init()
for fieldName in readObjectFields(reader):
case fieldName
@ -96,8 +58,6 @@ proc readValue*(
"Multiple `mixPubKey` fields found", "DebugWakuInfo"
)
value.mixPubKey = some(reader.readValue(string))
of "ports":
reader.readValue(ports)
else:
unrecognizedFieldWarning(value)
@ -105,8 +65,5 @@ proc readValue*(
reader.raiseUnexpectedValue("Field `listenAddresses` is missing")
value = DebugWakuInfo(
listenAddresses: listenAddresses.get,
enrUri: enrUri,
mixPubKey: value.mixPubKey,
ports: ports,
listenAddresses: listenAddresses.get, enrUri: enrUri, mixPubKey: value.mixPubKey
)