Add config validation

This commit is contained in:
Arnaud 2026-06-05 18:25:19 +04:00
parent 7ac6819b4e
commit a46d7b18b3
No known key found for this signature in database
GPG Key ID: A6C7C781817146FA
3 changed files with 112 additions and 9 deletions

View File

@ -394,6 +394,27 @@ func defaultAddress*(conf: StorageConf): IpAddress =
func defaultNatConfig*(): NatConfig =
result = NatConfig(hasExtIp: false, nat: NatStrategy.NatAuto)
func validateAutonatConfig*(config: StorageConf): ?!void =
# An autonat or relay server must be Reachable, assumed with extIp.
# In other words, a node cannot be autonat server AND autonat client.
# Currently, only bootstrap nodes should be autonat servers.
if config.autonatServer and not config.nat.hasExtIp:
return failure "--autonat-server requires --nat=extip:<IP>"
if config.isRelayServer and not config.nat.hasExtIp:
return failure "--relay-server requires --nat=extip:<IP>"
if config.natMaxQueueSize < 1:
return failure "--nat-max-queue-size must be at least 1"
if config.natNumPeersToAsk < 1:
return failure "--nat-num-peers-to-ask must be at least 1"
if config.natMinConfidence < 0.0 or config.natMinConfidence > 1.0:
return failure "--nat-min-confidence must be between 0 and 1"
success()
proc getStorageVersion(): string =
let tag = strip(staticExec("git describe --tags --abbrev=0"))
if tag.isEmptyOrWhitespace:

View File

@ -241,15 +241,8 @@ proc new*(
): StorageServer =
## create StorageServer including setting up datastore, repostore, etc
# Ensure that you can run an autonat server if the node is Reachable, assumed
# with extIp.
# In other words, a node cannot have autonat server AND autonat client.
# Currently, only bootstrap node should be autonat server.
if config.autonatServer and not config.nat.hasExtIp:
raise newException(StorageError, "--autonat-server requires --nat=extip:<IP>")
if config.isRelayServer and not config.nat.hasExtIp:
raise newException(StorageError, "--relay-server requires --nat=extip:<IP>")
if err =? config.validateAutonatConfig().errorOption:
raise newException(StorageError, err.msg)
# Switch
let listenMultiAddr = getMultiAddrWithIpAndTcpPort(config.listenIp, config.listenPort)

View File

@ -0,0 +1,89 @@
import std/net
import pkg/questionable/results
import ../asynctest
import ./helpers
import ../../storage/conf
proc validConfig(): StorageConf =
StorageConf(
nat: defaultNatConfig(),
natMaxQueueSize: 3,
natNumPeersToAsk: 5,
natMinConfidence: 0.7,
)
suite "Conf - validateAutonatConfig":
test "accepts a valid config":
check validConfig().validateAutonatConfig().isOk
test "rejects autonat server without extip":
var config = validConfig()
config.autonatServer = true
check config.validateAutonatConfig().isErr
test "accepts autonat server with extip":
var config = validConfig()
config.autonatServer = true
config.nat = NatConfig(hasExtIp: true, extIp: parseIpAddress("1.2.3.4"))
check config.validateAutonatConfig().isOk
test "rejects relay server without extip":
var config = validConfig()
config.isRelayServer = true
check config.validateAutonatConfig().isErr
test "accepts relay server with extip":
var config = validConfig()
config.isRelayServer = true
config.nat = NatConfig(hasExtIp: true, extIp: parseIpAddress("1.2.3.4"))
check config.validateAutonatConfig().isOk
test "rejects nat-max-queue-size below 1":
var config = validConfig()
config.natMaxQueueSize = 0
check config.validateAutonatConfig().isErr
test "accepts nat-max-queue-size of 1":
var config = validConfig()
config.natMaxQueueSize = 1
check config.validateAutonatConfig().isOk
test "rejects nat-num-peers-to-ask below 1":
var config = validConfig()
config.natNumPeersToAsk = 0
check config.validateAutonatConfig().isErr
test "accepts nat-num-peers-to-ask of 1":
var config = validConfig()
config.natNumPeersToAsk = 1
check config.validateAutonatConfig().isOk
test "rejects negative nat-min-confidence":
var config = validConfig()
config.natMinConfidence = -0.1
check config.validateAutonatConfig().isErr
test "rejects nat-min-confidence above 1":
var config = validConfig()
config.natMinConfidence = 1.1
check config.validateAutonatConfig().isErr
test "accepts nat-min-confidence bounds":
var config = validConfig()
config.natMinConfidence = 0.0
check config.validateAutonatConfig().isOk
config.natMinConfidence = 1.0
check config.validateAutonatConfig().isOk