From 3b5d89883dcf3eb0b29ec612d131f66307f00251 Mon Sep 17 00:00:00 2001 From: Michele Sollecito Date: Mon, 5 Feb 2018 18:17:54 +0000 Subject: [PATCH] Added basic node configuration validation. (#2433) --- .../net/corda/node/internal/NodeStartup.kt | 5 +++++ .../node/services/config/NodeConfiguration.kt | 18 ++++++++++++++++++ .../testing/node/internal/DriverDSLImpl.kt | 7 ++++++- .../testing/node/internal/NodeBasedTest.kt | 7 ++++++- 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt index c19516aafb..99fe31d1fc 100644 --- a/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt +++ b/node/src/main/kotlin/net/corda/node/internal/NodeStartup.kt @@ -90,6 +90,11 @@ open class NodeStartup(val args: Array) { logger.error("Exception during node configuration", e) return false } + val errors = conf.validate() + if (errors.isNotEmpty()) { + logger.error("Invalid node configuration. Errors where:${System.lineSeparator()}${errors.joinToString(System.lineSeparator())}") + return false + } try { banJavaSerialisation(conf) diff --git a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt index b26e18cffb..d881b1c968 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt @@ -50,6 +50,8 @@ interface NodeConfiguration : NodeSSLConfiguration { val attachmentContentCacheSizeBytes: Long get() = defaultAttachmentContentCacheSize val attachmentCacheBound: Long get() = defaultAttachmentCacheBound + fun validate(): List + companion object { // default to at least 8MB and a bit extra for larger heap sizes val defaultTransactionCacheSize: Long = 8.MB + getAdditionalCacheMemory() @@ -163,6 +165,22 @@ data class NodeConfigurationImpl( }.asOptions(fallbackSslOptions) } + override fun validate(): List { + val errors = mutableListOf() + errors + validateRpcOptions(rpcOptions) + return errors + } + + private fun validateRpcOptions(options: NodeRpcOptions): List { + val errors = mutableListOf() + if (!options.useSsl) { + if (options.adminAddress == null) { + errors + "'rpcSettings.adminAddress': missing. Property is mandatory when 'rpcSettings.useSsl' is false (default)." + } + } + return errors + } + override val exportJMXto: String get() = "http" override val transactionCacheSizeBytes: Long get() = transactionCacheSizeMegaBytes?.MB ?: super.transactionCacheSizeBytes diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt index 3a41a4627a..0b1ac2d4b5 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/DriverDSLImpl.kt @@ -711,7 +711,12 @@ class DriverDSLImpl( * Keeping [Config] around is needed as the user may specify extra config options not specified in [NodeConfiguration]. */ private class NodeConfig(val typesafe: Config) { - val corda: NodeConfiguration = typesafe.parseAsNodeConfiguration() + val corda: NodeConfiguration = typesafe.parseAsNodeConfiguration().also { nodeConfiguration -> + val errors = nodeConfiguration.validate() + if (errors.isNotEmpty()) { + throw IllegalStateException("Invalid node configuration. Errors where:${System.lineSeparator()}${errors.joinToString(System.lineSeparator())}") + } + } } companion object { diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/NodeBasedTest.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/NodeBasedTest.kt index 70cfb2c7ea..560a52a865 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/NodeBasedTest.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/NodeBasedTest.kt @@ -99,7 +99,12 @@ abstract class NodeBasedTest(private val cordappPackages: List = emptyLi ) + configOverrides ) - val parsedConfig = config.parseAsNodeConfiguration() + val parsedConfig = config.parseAsNodeConfiguration().also { nodeConfiguration -> + val errors = nodeConfiguration.validate() + if (errors.isNotEmpty()) { + throw IllegalStateException("Invalid node configuration. Errors where:${System.lineSeparator()}${errors.joinToString(System.lineSeparator())}") + } + } defaultNetworkParameters.install(baseDirectory) val node = InProcessNode(parsedConfig, MOCK_VERSION_INFO.copy(platformVersion = platformVersion), cordappPackages).start() nodes += node