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 0a3e9e4a98..2fb3fae86f 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 @@ -200,23 +200,27 @@ data class NodeConfigurationImpl( } - override val rpcOptions: NodeRpcOptions = initialiseRpcOptions(rpcAddress, rpcSettings, BrokerRpcSslOptions(baseDirectory / "certificates" / "nodekeystore.jks", keyStorePassword)) + private val actualRpcSettings: NodeRpcSettings - private fun initialiseRpcOptions(explicitAddress: NetworkHostAndPort?, settings: NodeRpcSettings, fallbackSslOptions: BrokerRpcSslOptions): NodeRpcOptions { - return when { - explicitAddress != null -> { - require(settings.address == null) { "Can't provide top-level rpcAddress and rpcSettings.address (they control the same property)." } + init { + actualRpcSettings = when { + rpcAddress != null -> { + require(rpcSettings.address == null) { "Can't provide top-level rpcAddress and rpcSettings.address (they control the same property)." } logger.warn("Top-level declaration of property 'rpcAddress' is deprecated. Please use 'rpcSettings.address' instead.") - settings.copy(address = explicitAddress) + rpcSettings.copy(address = rpcAddress) } else -> { - settings.address ?: throw ConfigException.Missing("rpcSettings.address") - settings + rpcSettings.address ?: throw ConfigException.Missing("rpcSettings.address") + rpcSettings } - }.asOptions(fallbackSslOptions) + } } + override val rpcOptions: NodeRpcOptions + get() { + return actualRpcSettings.asOptions(BrokerRpcSslOptions(baseDirectory / "certificates" / "nodekeystore.jks", keyStorePassword)) + } private fun validateTlsCertCrlConfig(): List { val errors = mutableListOf() @@ -239,7 +243,12 @@ data class NodeConfigurationImpl( override fun validate(): List { val errors = mutableListOf() errors += validateDevModeOptions() - errors += validateRpcOptions(rpcOptions) + val rpcSettingsErrors = validateRpcSettings(rpcSettings) + errors += rpcSettingsErrors + if (rpcSettingsErrors.isEmpty()) { + // Forces lazy property to initialise in order to throw exceptions + rpcOptions + } errors += validateTlsCertCrlConfig() errors += validateNetworkServices() errors += validateH2Settings() @@ -254,7 +263,7 @@ data class NodeConfigurationImpl( return errors } - private fun validateRpcOptions(options: NodeRpcOptions): List { + private fun validateRpcSettings(options: NodeRpcSettings): List { val errors = mutableListOf() if (options.address != null) { if (!options.useSsl && options.adminAddress == null) { diff --git a/node/src/test/kotlin/net/corda/node/services/config/NodeConfigurationImplTest.kt b/node/src/test/kotlin/net/corda/node/services/config/NodeConfigurationImplTest.kt index cc646a1795..9f183d0b9a 100644 --- a/node/src/test/kotlin/net/corda/node/services/config/NodeConfigurationImplTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/config/NodeConfigurationImplTest.kt @@ -191,6 +191,16 @@ class NodeConfigurationImplTest { assertThatCode { rawConfig.parseAsNodeConfiguration() }.doesNotThrowAnyException() } + @Test + fun `missing rpcSettings_adminAddress cause a graceful failure`() { + var rawConfig = ConfigFactory.parseResources("working-config.conf", ConfigParseOptions.defaults().setAllowMissing(false)) + rawConfig = rawConfig.withoutPath("rpcSettings.adminAddress") + + val config = rawConfig.parseAsNodeConfiguration() + + assertThat(config.validate().filter { it.contains("rpcSettings.adminAddress") }).isNotEmpty + } + @Test fun `compatiilityZoneURL populates NetworkServices`() { val compatibilityZoneURL = URI.create("https://r3.com").toURL()