From 708bb7214de773601ceac8299c6383a0b07f1cb1 Mon Sep 17 00:00:00 2001 From: fryorcraken Date: Fri, 11 Apr 2025 21:34:31 +1000 Subject: [PATCH] waku conf tests pass # Conflicts: # waku/node/waku_node.nim --- tests/factory/test_waku_conf.nim | 206 +++++++++++-------------- waku/factory/node_factory.nim | 1 - waku/factory/waku_conf.nim | 5 +- waku/factory/waku_conf_builder.nim | 240 ++++++++++++----------------- 4 files changed, 195 insertions(+), 257 deletions(-) diff --git a/tests/factory/test_waku_conf.nim b/tests/factory/test_waku_conf.nim index 1b9ca98eb..6b7040dd5 100644 --- a/tests/factory/test_waku_conf.nim +++ b/tests/factory/test_waku_conf.nim @@ -27,35 +27,33 @@ suite "Waku Conf - build with cluster conf": builder.rlnRelayConf.withEthClientAddress("https://my_eth_rpc_url/") builder.withClusterConf(clusterConf) builder.withRelay(true) + builder.rlnRelayConf.withTreePath("/tmp/test-tree-path") ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - let conf = res.get() - assert conf.validate().isOk() - assert conf.clusterId == clusterConf.clusterId - assert conf.numShardsInNetwork == clusterConf.numShardsInNetwork - assert conf.shards == expectedShards - assert conf.maxMessageSizeBytes == - int(parseCorrectMsgSize(clusterConf.maxMessageSize)) - - assert conf.discv5Conf.get().bootstrapNodes.map( - proc(e: TextEnr): string = - e.string - ) == clusterConf.discv5BootstrapNodes + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check conf.clusterId == clusterConf.clusterId + check conf.numShardsInNetwork == clusterConf.numShardsInNetwork + check conf.shards == expectedShards + check conf.maxMessageSizeBytes == + uint64(parseCorrectMsgSize(clusterConf.maxMessageSize)) + check conf.discv5Conf.get().bootstrapNodes == clusterConf.discv5BootstrapNodes if clusterConf.rlnRelay: - assert conf.rlnRelayConf.isSome + assert conf.rlnRelayConf.isSome(), "RLN Relay conf is disabled" let rlnRelayConf = conf.rlnRelayConf.get() - assert rlnRelayConf.ethContractAddress.string == + check rlnRelayConf.ethContractAddress.string == clusterConf.rlnRelayEthContractAddress - assert rlnRelayConf.dynamic == clusterConf.rlnRelayDynamic - assert rlnRelayConf.chainId == clusterConf.rlnRelayChainId - assert rlnRelayConf.epochSizeSec == clusterConf.rlnEpochSizeSec - assert rlnRelayConf.userMessageLimit == clusterConf.rlnRelayUserMessageLimit + check rlnRelayConf.dynamic == clusterConf.rlnRelayDynamic + check rlnRelayConf.chainId == clusterConf.rlnRelayChainId + check rlnRelayConf.epochSizeSec == clusterConf.rlnEpochSizeSec + check rlnRelayConf.userMessageLimit == clusterConf.rlnRelayUserMessageLimit test "Cluster Conf is passed, but relay is disabled": ## Setup @@ -72,21 +70,19 @@ suite "Waku Conf - build with cluster conf": builder.withRelay(false) ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - let conf = res.get() - assert conf.validate().isOk() - assert conf.clusterId == clusterConf.clusterId - assert conf.numShardsInNetwork == clusterConf.numShardsInNetwork - assert conf.shards == expectedShards - assert conf.maxMessageSizeBytes == - int(parseCorrectMsgSize(clusterConf.maxMessageSize)) - assert conf.discv5Conf.get().bootstrapNodes.map( - proc(e: TextEnr): string = - e.string - ) == clusterConf.discv5BootstrapNodes + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check conf.clusterId == clusterConf.clusterId + check conf.numShardsInNetwork == clusterConf.numShardsInNetwork + check conf.shards == expectedShards + check conf.maxMessageSizeBytes == + uint64(parseCorrectMsgSize(clusterConf.maxMessageSize)) + check conf.discv5Conf.get().bootstrapNodes == clusterConf.discv5BootstrapNodes assert conf.rlnRelayConf.isNone @@ -94,8 +90,6 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withRelayServiceRatio("50:50") - builder.discv5Conf.withUdpPort(9000) let # Mount all shards in network expectedShards = toSeq[0.uint16 .. 7.uint16] @@ -103,33 +97,28 @@ suite "Waku Conf - build with cluster conf": ## Given builder.rlnRelayConf.withEthClientAddress("https://my_eth_rpc_url/") builder.withClusterConf(clusterConf) - builder.rlnRelayConf.withRlnRelay(false) + builder.rlnRelayConf.withEnabled(false) ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - let conf = res.get() - assert conf.validate().isOk() - assert conf.clusterId == clusterConf.clusterId - assert conf.numShardsInNetwork == clusterConf.numShardsInNetwork - assert conf.shards == expectedShards - assert conf.maxMessageSizeBytes == - int(parseCorrectMsgSize(clusterConf.maxMessageSize)) - assert conf.discv5Conf.get().bootstrapNodes.map( - proc(e: TextEnr): string = - e.string - ) == clusterConf.discv5BootstrapNodes - + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check conf.clusterId == clusterConf.clusterId + check conf.numShardsInNetwork == clusterConf.numShardsInNetwork + check conf.shards == expectedShards + check conf.maxMessageSizeBytes == + uint64(parseCorrectMsgSize(clusterConf.maxMessageSize)) + check conf.discv5Conf.get().bootstrapNodes == clusterConf.discv5BootstrapNodes assert conf.rlnRelayConf.isNone test "Cluster Conf is passed and valid shards are specified": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.discv5Conf.withUdpPort(9000) - builder.withRelayServiceRatio("50:50") let shards = @[2.uint16, 3.uint16] ## Given @@ -138,28 +127,24 @@ suite "Waku Conf - build with cluster conf": builder.withShards(shards) ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - let conf = res.get() - assert conf.validate().isOk() - assert conf.clusterId == clusterConf.clusterId - assert conf.numShardsInNetwork == clusterConf.numShardsInNetwork - assert conf.shards == shards - assert conf.maxMessageSizeBytes == - int(parseCorrectMsgSize(clusterConf.maxMessageSize)) - assert conf.discv5Conf.get().bootstrapNodes.map( - proc(e: TextEnr): string = - e.string - ) == clusterConf.discv5BootstrapNodes + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check conf.clusterId == clusterConf.clusterId + check conf.numShardsInNetwork == clusterConf.numShardsInNetwork + check conf.shards == shards + check conf.maxMessageSizeBytes == + uint64(parseCorrectMsgSize(clusterConf.maxMessageSize)) + check conf.discv5Conf.get().bootstrapNodes == clusterConf.discv5BootstrapNodes test "Cluster Conf is passed and invalid shards are specified": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.discv5Conf.withUdpPort(9000) - builder.withRelayServiceRatio("50:50") let shards = @[2.uint16, 10.uint16] ## Given @@ -168,20 +153,16 @@ suite "Waku Conf - build with cluster conf": builder.withShards(shards) ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() ## Then - let conf = res.get() - assert conf.validate().isErr(), "Invalid shard was accepted" + assert resConf.isErr(), "Invalid shard was accepted" test "Cluster Conf is passed and RLN contract is overridden": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.discv5Conf.withUdpPort(9000) builder.rlnRelayConf.withEthClientAddress("https://my_eth_rpc_url/") - builder.withRelayServiceRatio("50:50") # Mount all shards in network let expectedShards = toSeq[0.uint16 .. 7.uint16] @@ -191,52 +172,50 @@ suite "Waku Conf - build with cluster conf": builder.rlnRelayConf.withEthContractAddress(contractAddress) builder.withClusterConf(clusterConf) builder.withRelay(true) + builder.rlnRelayConf.withTreePath("/tmp/test") ## When - let res = builder.build() - assert res.isOk(), $res.error + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - let conf = res.get() - assert conf.validate().isOk() - assert conf.clusterId == clusterConf.clusterId - assert conf.numShardsInNetwork == clusterConf.numShardsInNetwork - assert conf.shards == expectedShards - assert conf.maxMessageSizeBytes == - int(parseCorrectMsgSize(clusterConf.maxMessageSize)) - - assert conf.discv5Conf.get().bootstrapNodes.map( - proc(e: TextEnr): string = - e.string - ) == clusterConf.discv5BootstrapNodes + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check conf.clusterId == clusterConf.clusterId + check conf.numShardsInNetwork == clusterConf.numShardsInNetwork + check conf.shards == expectedShards + check conf.maxMessageSizeBytes == + uint64(parseCorrectMsgSize(clusterConf.maxMessageSize)) + check conf.discv5Conf.isSome == clusterConf.discv5Discovery + check conf.discv5Conf.get().bootstrapNodes == clusterConf.discv5BootstrapNodes if clusterConf.rlnRelay: assert conf.rlnRelayConf.isSome let rlnRelayConf = conf.rlnRelayConf.get() - assert rlnRelayConf.ethContractAddress.string == contractAddress - assert rlnRelayConf.dynamic == clusterConf.rlnRelayDynamic - assert rlnRelayConf.chainId == clusterConf.rlnRelayChainId - assert rlnRelayConf.epochSizeSec == clusterConf.rlnEpochSizeSec - assert rlnRelayConf.userMessageLimit == clusterConf.rlnRelayUserMessageLimit + check rlnRelayConf.ethContractAddress.string == contractAddress + check rlnRelayConf.dynamic == clusterConf.rlnRelayDynamic + check rlnRelayConf.chainId == clusterConf.rlnRelayChainId + check rlnRelayConf.epochSizeSec == clusterConf.rlnEpochSizeSec + check rlnRelayConf.userMessageLimit == clusterConf.rlnRelayUserMessageLimit suite "Waku Conf - node key": test "Node key is generated": ## Setup var builder = WakuConfBuilder.init() builder.withClusterId(1) - builder.discv5Conf.withUdpPort(9000) - builder.withRelayServiceRatio("50:50") ## Given ## When - let res = builder.build() - assert res.isOk(), $res.error - let conf = res.get() + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - assert conf.validate().isOk() + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error let pubkey = getPublicKey(conf.nodeKey) assert pubkey.isOk() @@ -249,19 +228,18 @@ suite "Waku Conf - node key": crypto.PrivateKey(scheme: Secp256k1, skkey: key) var builder = WakuConfBuilder.init() builder.withClusterId(1) - builder.discv5Conf.withUdpPort(9000) - builder.withRelayServiceRatio("50:50") ## Given builder.withNodeKey(nodeKey) ## When - let res = builder.build() - assert res.isOk(), $res.error - let conf = res.get() + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - assert conf.validate().isOk() + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error assert utils.toHex(conf.nodeKey.getRawBytes().get()) == utils.toHex(nodeKey.getRawBytes().get()), "Passed node key isn't in config:" & $nodeKey & $conf.nodeKey @@ -271,26 +249,24 @@ suite "Waku Conf - extMultiaddrs": ## Setup var builder = WakuConfBuilder.init() builder.withClusterId(1) - builder.discv5Conf.withUdpPort(9000) - builder.withRelayServiceRatio("50:50") ## Given let multiaddrs = @["/ip4/127.0.0.1/udp/9090/quic", "/ip6/::1/tcp/3217", "/dns4/foo.com/tcp/80"] - for m in multiaddrs: - builder.withExtMultiAddr(m) + builder.withExtMultiAddrs(multiaddrs) ## When - let res = builder.build() - assert res.isOk(), $res.error - let conf = res.get() + let resConf = builder.build() + assert resConf.isOk(), $resConf.error + let conf = resConf.get() ## Then - assert conf.validate().isOk() - assert multiaddrs.len == conf.extMultiaddrs.len - let resMultiaddrs = conf.extMultiaddrs.map( + let resValidate = conf.validate() + assert resValidate.isOk(), $resValidate.error + check multiaddrs.len == conf.networkConf.extMultiAddrs.len + let resMultiaddrs = conf.networkConf.extMultiAddrs.map( proc(m: MultiAddress): string = $m ) for m in multiaddrs: - assert m in resMultiaddrs + check m in resMultiaddrs diff --git a/waku/factory/node_factory.nim b/waku/factory/node_factory.nim index c0e77927e..2e0bdf92f 100644 --- a/waku/factory/node_factory.nim +++ b/waku/factory/node_factory.nim @@ -36,7 +36,6 @@ import ../node/peer_manager/peer_store/waku_peer_storage, ../node/peer_manager/peer_store/migrations as peer_store_sqlite_migrations, ../waku_lightpush_legacy/common, - ../common/utils/parse_size_units, ../common/rate_limit/setting, ../common/databases/dburl diff --git a/waku/factory/waku_conf.nim b/waku/factory/waku_conf.nim index b9634afbf..9120c0022 100644 --- a/waku/factory/waku_conf.nim +++ b/waku/factory/waku_conf.nim @@ -12,7 +12,6 @@ import ../discovery/waku_discv5, ../node/waku_metrics, ../common/logging, - ./networks_config, ../waku_enr/capabilities export RlnRelayConf, RlnRelayCreds, RestServerConf, Discv5Conf, MetricsServerConf @@ -171,7 +170,8 @@ proc log*(conf: WakuConf) = rlnRelayEthClientAddress = string(rlnRelayConf.ethClientAddress) proc validateNodeKey(wakuConf: WakuConf): Result[void, string] = - # TODO + wakuConf.nodeKey.getPublicKey().isOkOr: + return err("Node key is invalid") return ok() proc validateShards(wakuConf: WakuConf): Result[void, string] = @@ -249,3 +249,4 @@ proc validate*(wakuConf: WakuConf): Result[void, string] = ?wakuConf.validateNodeKey() ?wakuConf.validateShards() ?wakuConf.validateNoEmptyStrings() + return ok() diff --git a/waku/factory/waku_conf_builder.nim b/waku/factory/waku_conf_builder.nim index 0ab8f1846..f78d9ac56 100644 --- a/waku/factory/waku_conf_builder.nim +++ b/waku/factory/waku_conf_builder.nim @@ -64,7 +64,7 @@ macro with(builderType: untyped, argName: untyped, argType: untyped) = ## Generates ## ## ``` -## proc withp2pPort*(builder: var WakuConfBuilder, p2pPort: uint16) = +## proc withp2pPort*(builder: var WakuConfBuilStoreServder, p2pPort: uint16) = ## builder.p2pPort = some(p2pPort.Port) ## ``` macro with( @@ -169,22 +169,15 @@ with(FilterServiceConfBuilder, subscriptionTimeout, uint16) with(FilterServiceConfBuilder, maxCriteria, uint32) proc build(b: FilterServiceConfBuilder): Result[Option[FilterServiceConf], string] = - if b.enabled.get(false): + if not b.enabled.get(false): return ok(none(FilterServiceConf)) - if b.maxPeersToServe.isNone(): - return err("filter.maxPeersToServe is not specified") - if b.subscriptionTimeout.isNone(): - return err("filter.subscriptionTimeout is not specified") - if b.maxCriteria.isNone(): - return err("filter.maxCriteria is not specified") - return ok( some( FilterServiceConf( - maxPeersToServe: b.maxPeersToServe.get(), - subscriptionTimeout: b.subscriptionTimeout.get(), - maxCriteria: b.maxCriteria.get(), + maxPeersToServe: b.maxPeersToServe.get(500), + subscriptionTimeout: b.subscriptionTimeout.get(300), + maxCriteria: b.maxCriteria.get(1000), ) ) ) @@ -208,7 +201,7 @@ with(StoreSyncConfBuilder, intervalSec, uint32) with(StoreSyncConfBuilder, relayJitterSec, uint32) proc build(b: StoreSyncConfBuilder): Result[Option[StoreSyncConf], string] = - if b.enabled.get(false): + if not b.enabled.get(false): return ok(none(StoreSyncConf)) if b.rangeSec.isNone(): @@ -256,7 +249,7 @@ with(StoreServiceConfBuilder, retentionPolicy, string) with(StoreServiceConfBuilder, resume, bool) proc build(b: StoreServiceConfBuilder): Result[Option[StoreServiceConf], string] = - if b.enabled.get(false): + if not b.enabled.get(false): return ok(none(StoreServiceConf)) if b.dbMigration.isNone(): @@ -317,7 +310,7 @@ with(RestServerConfBuilder, admin, bool) with(RestServerConfBuilder, relayCacheCapacity, uint32) proc build(b: RestServerConfBuilder): Result[Option[RestServerConf], string] = - if b.enabled.get(false): + if not b.enabled.get(false): return ok(none(RestServerConf)) if b.listenAddress.isNone(): @@ -406,27 +399,17 @@ proc build(b: Discv5ConfBuilder): Result[Option[Discv5Conf], string] = # Discv5 is useless without bootstrap nodes if b.bootstrapNodes.len == 0: return err("dicv5.bootstrapNodes is not specified") - if b.bitsPerHop.isNone(): - return err("discv5.bitsPerHop is not specified") - if b.bucketIpLimit.isNone(): - return err("discv5.bucketIpLimit is not specified") - if b.enrAutoUpdate.isNone(): - return err("discv5.enrAutoUpdate is not specified") - if b.tableIpLimit.isNone(): - return err("discv5.tableIpLimit is not specified") - if b.udpPort.isNone(): - return err("discv5.udpPort is not specified") return ok( some( Discv5Conf( bootstrapNodes: b.bootstrapNodes, - bitsPerHop: b.bitsPerHop.get(), - bucketIpLimit: b.bucketIpLimit.get(), + bitsPerHop: b.bitsPerHop.get(1), + bucketIpLimit: b.bucketIpLimit.get(2), discv5Only: b.discv5Only.get(false), - enrAutoUpdate: b.enrAutoUpdate.get(), - tableIpLimit: b.tableIpLimit.get(), - udpPort: b.udpPort.get(), + enrAutoUpdate: b.enrAutoUpdate.get(true), + tableIpLimit: b.tableIpLimit.get(10), + udpPort: b.udpPort.get(9000.Port), ) ) ) @@ -502,22 +485,15 @@ with(MetricsServerConfBuilder, httpPort, Port, uint16) with(MetricsServerConfBuilder, logging, bool) proc build(b: MetricsServerConfBuilder): Result[Option[MetricsServerConf], string] = - if b.enabled.get(false): + if not b.enabled.get(false): return ok(none(MetricsServerConf)) - if b.httpAddress.isNone(): - return err("metricsServer.httpAddress is not specified") - if b.httpPort.isNone(): - return err("metricsServer.httpPort is not specified") - if b.logging.isNone(): - return err("metricsServer.logging is not specified") - return ok( some( MetricsServerConf( - httpAddress: b.httpAddress.get(), - httpPort: b.httpPort.get(), - logging: b.logging.get(), + httpAddress: b.httpAddress.get(parseIpAddress("127.0.0.1")), + httpPort: b.httpPort.get(8008.Port), + logging: b.logging.get(false), ) ) ) @@ -711,44 +687,45 @@ proc applyClusterConf(builder: var WakuConfBuilder) = # Apply relay parameters if builder.relay.get(false) and clusterConf.rlnRelay: - var rlnRelayConf = builder.rlnRelayConf - - if rlnRelayConf.enabled.isNone: - rlnRelayConf.withEnabled(true) + if builder.rlnRelayConf.enabled.isNone: + builder.rlnRelayConf.withEnabled(true) else: warn "RLN Relay was manually provided alongside a cluster conf", - used = rlnRelayConf.enabled, discarded = clusterConf.rlnRelay + used = builder.rlnRelayConf.enabled, discarded = clusterConf.rlnRelay - if rlnRelayConf.ethContractAddress.isNone: - rlnRelayConf.withEthContractAddress(clusterConf.rlnRelayEthContractAddress) + if builder.rlnRelayConf.ethContractAddress.isNone: + builder.rlnRelayConf.withEthContractAddress( + clusterConf.rlnRelayEthContractAddress + ) else: warn "RLN Relay ETH Contract Address was manually provided alongside a cluster conf", - used = rlnRelayConf.ethContractAddress.get().string, + used = builder.rlnRelayConf.ethContractAddress.get().string, discarded = clusterConf.rlnRelayEthContractAddress.string - if rlnRelayConf.chainId.isNone: - rlnRelayConf.withChainId(clusterConf.rlnRelayChainId) + if builder.rlnRelayConf.chainId.isNone: + builder.rlnRelayConf.withChainId(clusterConf.rlnRelayChainId) else: warn "RLN Relay Chain Id was manually provided alongside a cluster conf", - used = rlnRelayConf.chainId, discarded = clusterConf.rlnRelayChainId + used = builder.rlnRelayConf.chainId, discarded = clusterConf.rlnRelayChainId - if rlnRelayConf.dynamic.isNone: - rlnRelayConf.withDynamic(clusterConf.rlnRelayDynamic) + if builder.rlnRelayConf.dynamic.isNone: + builder.rlnRelayConf.withDynamic(clusterConf.rlnRelayDynamic) else: warn "RLN Relay Dynamic was manually provided alongside a cluster conf", - used = rlnRelayConf.dynamic, discarded = clusterConf.rlnRelayDynamic + used = builder.rlnRelayConf.dynamic, discarded = clusterConf.rlnRelayDynamic - if rlnRelayConf.epochSizeSec.isNone: - rlnRelayConf.withEpochSizeSec(clusterConf.rlnEpochSizeSec) + if builder.rlnRelayConf.epochSizeSec.isNone: + builder.rlnRelayConf.withEpochSizeSec(clusterConf.rlnEpochSizeSec) else: warn "RLN Epoch Size in Seconds was manually provided alongside a cluster conf", - used = rlnRelayConf.epochSizeSec, discarded = clusterConf.rlnEpochSizeSec + used = builder.rlnRelayConf.epochSizeSec, + discarded = clusterConf.rlnEpochSizeSec - if rlnRelayConf.userMessageLimit.isNone: - rlnRelayConf.withUserMessageLimit(clusterConf.rlnRelayUserMessageLimit) + if builder.rlnRelayConf.userMessageLimit.isNone: + builder.rlnRelayConf.withUserMessageLimit(clusterConf.rlnRelayUserMessageLimit) else: warn "RLN Relay Dynamic was manually provided alongside a cluster conf", - used = rlnRelayConf.userMessageLimit, + used = builder.rlnRelayConf.userMessageLimit, discarded = clusterConf.rlnRelayUserMessageLimit # End Apply relay parameters @@ -766,14 +743,12 @@ proc applyClusterConf(builder: var WakuConfBuilder) = used = builder.numShardsInNetwork, discarded = clusterConf.numShardsInNetwork if clusterConf.discv5Discovery: - var discv5ConfBuilder = builder.discv5Conf + if builder.discv5Conf.enabled.isNone: + builder.discv5Conf.withEnabled(clusterConf.discv5Discovery) - if discv5ConfBuilder.enabled.isNone: - discv5ConfBuilder.withEnabled(clusterConf.discv5Discovery) - - if discv5ConfBuilder.bootstrapNodes.len == 0 and + if builder.discv5Conf.bootstrapNodes.len == 0 and clusterConf.discv5BootstrapNodes.len > 0: - discv5ConfBuilder.withBootstrapNodes(clusterConf.discv5BootstrapNodes) + builder.discv5Conf.withBootstrapNodes(clusterConf.discv5BootstrapNodes) proc build*( builder: var WakuConfBuilder, rng: ref HmacDrbgContext = crypto.newRng() @@ -976,12 +951,6 @@ proc build*( warn "Max Connections was not specified, defaulting to 300" 300 - let relayServiceRatio = - if builder.relayServiceRatio.isSome(): - builder.relayServiceRatio.get() - else: - return err "Relay Service Ratio was not specified" - # TODO: Do the git version thing here let agentString = builder.agentString.get("nwaku") @@ -993,15 +962,6 @@ proc build*( # TODO: is there a strategy for experimental features? delete vs promote let relayShardedPeerManagement = builder.relayShardedPeerManagement.get(false) - if builder.circuitRelayClient.isNone(): - return err("circuitRelayClient is not specified") - - if builder.keepAlive.isNone(): - return err("keepAlive is not specified") - - if builder.p2pReliability.isNone(): - return err("p2pReliability is not specified") - let wakuFlags = CapabilitiesBitfield.init( lightpush = lightPush, filter = filterServiceConf.isSome, @@ -1010,61 +970,63 @@ proc build*( sync = storeServiceConf.isSome() and storeServiceConf.get().storeSyncConf.isSome, ) - return ok( - WakuConf( - # confs - storeServiceConf: storeServiceConf, - filterServiceConf: filterServiceConf, - discv5Conf: discv5Conf, - rlnRelayConf: rlnRelayConf, - metricsServerConf: metricsServerConf, - restServerConf: restServerConf, - dnsDiscoveryConf: dnsDiscoveryConf, - # end confs - nodeKey: nodeKey, - clusterId: builder.clusterId.get(), - numShardsInNetwork: numShardsInNetwork, - contentTopics: contentTopics, - shards: shards, - protectedShards: protectedShards, - relay: relay, - lightPush: lightPush, - peerExchange: peerExchange, - rendezvous: rendezvous, - remoteStoreNode: builder.remoteStoreNode, - remoteLightPushNode: builder.remoteLightPushNode, - remoteFilterNode: builder.remoteFilterNode, - remotePeerExchangeNode: builder.remotePeerExchangeNode, - relayPeerExchange: relayPeerExchange, - maxMessageSizeBytes: maxMessageSizeBytes, - logLevel: logLevel, - logFormat: logFormat, - # TODO: Separate builders - networkConf: NetworkConfig( - natStrategy: natStrategy, - p2pTcpPort: p2pTcpPort, - dns4DomainName: dns4DomainName, - p2pListenAddress: p2pListenAddress, - extMultiAddrs: extMultiAddrs, - extMultiAddrsOnly: extMultiAddrsOnly, - ), - portsShift: portsShift, - webSocketConf: webSocketConf, - dnsAddrs: dnsAddrs, - dnsAddrsNameServers: dnsAddrsNameServers, - peerPersistence: peerPersistence, - peerStoreCapacity: builder.peerStoreCapacity, - maxConnections: maxConnections, - agentString: agentString, - colocationLimit: colocationLimit, - maxRelayPeers: builder.maxRelayPeers, - relayServiceRatio: relayServiceRatio, - rateLimits: rateLimits, - circuitRelayClient: builder.circuitRelayClient.get(), - keepAlive: builder.keepAlive.get(), - staticNodes: builder.staticNodes, - relayShardedPeerManagement: relayShardedPeerManagement, - p2pReliability: builder.p2pReliability.get(), - wakuFlags: wakuFlags, - ) + let wakuConf = WakuConf( + # confs + storeServiceConf: storeServiceConf, + filterServiceConf: filterServiceConf, + discv5Conf: discv5Conf, + rlnRelayConf: rlnRelayConf, + metricsServerConf: metricsServerConf, + restServerConf: restServerConf, + dnsDiscoveryConf: dnsDiscoveryConf, + # end confs + nodeKey: nodeKey, + clusterId: builder.clusterId.get(), + numShardsInNetwork: numShardsInNetwork, + contentTopics: contentTopics, + shards: shards, + protectedShards: protectedShards, + relay: relay, + lightPush: lightPush, + peerExchange: peerExchange, + rendezvous: rendezvous, + remoteStoreNode: builder.remoteStoreNode, + remoteLightPushNode: builder.remoteLightPushNode, + remoteFilterNode: builder.remoteFilterNode, + remotePeerExchangeNode: builder.remotePeerExchangeNode, + relayPeerExchange: relayPeerExchange, + maxMessageSizeBytes: maxMessageSizeBytes, + logLevel: logLevel, + logFormat: logFormat, + # TODO: Separate builders + networkConf: NetworkConfig( + natStrategy: natStrategy, + p2pTcpPort: p2pTcpPort, + dns4DomainName: dns4DomainName, + p2pListenAddress: p2pListenAddress, + extMultiAddrs: extMultiAddrs, + extMultiAddrsOnly: extMultiAddrsOnly, + ), + portsShift: portsShift, + webSocketConf: webSocketConf, + dnsAddrs: dnsAddrs, + dnsAddrsNameServers: dnsAddrsNameServers, + peerPersistence: peerPersistence, + peerStoreCapacity: builder.peerStoreCapacity, + maxConnections: maxConnections, + agentString: agentString, + colocationLimit: colocationLimit, + maxRelayPeers: builder.maxRelayPeers, + relayServiceRatio: builder.relayServiceRatio.get("60:40"), + rateLimits: rateLimits, + circuitRelayClient: builder.circuitRelayClient.get(false), + keepAlive: builder.keepAlive.get(true), + staticNodes: builder.staticNodes, + relayShardedPeerManagement: relayShardedPeerManagement, + p2pReliability: builder.p2pReliability.get(false), + wakuFlags: wakuFlags, ) + + ?wakuConf.validate() + + return ok(wakuConf)