diff --git a/node/src/integration-test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTest.kt b/node/src/integration-test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTest.kt index 5a8c5736f0..7bc03883b1 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/messaging/ArtemisMessagingTest.kt @@ -8,6 +8,7 @@ import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.seconds import net.corda.coretesting.internal.rigorousMock import net.corda.coretesting.internal.stubs.CertificateStoreStubs +import net.corda.node.services.config.CustomConfiguration import net.corda.node.services.config.FlowTimeoutConfiguration import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.configureWithDevSSLCertificate @@ -88,6 +89,7 @@ class ArtemisMessagingTest { doReturn(FlowTimeoutConfiguration(5.seconds, 3, backoffBase = 1.0)).whenever(it).flowTimeout doReturn(true).whenever(it).crlCheckSoftFail doReturn(true).whenever(it).crlCheckArtemisServer + doReturn(CustomConfiguration()).whenever(it).custom } LogHelper.setLevel(PersistentUniquenessProvider::class) database = configureDatabase(makeTestDataSourceProperties(), DatabaseConfig(), { null }, { null }) diff --git a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt index 19d237e0b0..65a587e407 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -1178,7 +1178,7 @@ abstract class AbstractNode(val configuration: NodeConfiguration, inner class ServiceHubImpl : SingletonSerializeAsToken(), ServiceHubInternal, NetworkParameterUpdateListener { override val rpcFlows = ArrayList>>() override val stateMachineRecordedTransactionMapping = DBTransactionMappingStorage(database) - override val externalVerifierHandle = ExternalVerifierHandleImpl(this, configuration.baseDirectory).also { runOnStop += it::close } + override val externalVerifierHandle = ExternalVerifierHandleImpl(this, configuration.baseDirectory, configuration.custom?.externalVerifierJvmArgs ?: emptyList()).also { runOnStop += it::close } override val identityService: IdentityService get() = this@AbstractNode.identityService override val keyManagementService: KeyManagementService get() = this@AbstractNode.keyManagementService override val schemaService: SchemaService get() = this@AbstractNode.schemaService 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 7fa506d885..fea84e2448 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 @@ -44,6 +44,7 @@ interface NodeConfiguration : ConfigurationWithOptionsContainer { val verifierType: VerifierType val flowTimeout: FlowTimeoutConfiguration val telemetry: TelemetryConfiguration + val custom: CustomConfiguration? val notary: NotaryConfig? val additionalNodeInfoPollingFrequencyMsec: Long val p2pAddress: NetworkHostAndPort @@ -229,6 +230,11 @@ data class TelemetryConfiguration( val copyBaggageToTags: Boolean ) +data class CustomConfiguration( + val jvmArgs: List = emptyList(), + val externalVerifierJvmArgs: List = emptyList() +) + /** * Represents a list of rotated CorDapp attachment signing keys. * diff --git a/node/src/main/kotlin/net/corda/node/services/config/NodeConfigurationImpl.kt b/node/src/main/kotlin/net/corda/node/services/config/NodeConfigurationImpl.kt index f02abcdb70..91b014d7c5 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/NodeConfigurationImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/NodeConfigurationImpl.kt @@ -44,6 +44,7 @@ data class NodeConfigurationImpl( override val verifierType: VerifierType, override val flowTimeout: FlowTimeoutConfiguration, override val telemetry: TelemetryConfiguration = Defaults.telemetry, + override val custom: CustomConfiguration = Defaults.custom, override val p2pAddress: NetworkHostAndPort, override val additionalP2PAddresses: List = Defaults.additionalP2PAddresses, private val rpcAddress: NetworkHostAndPort? = Defaults.rpcAddress, @@ -138,6 +139,7 @@ data class NodeConfigurationImpl( exportHibernateJMXStatistics = devMode ) val telemetry = TelemetryConfiguration(openTelemetryEnabled = true, simpleLogTelemetryEnabled = false, spanStartEndEventsEnabled = false, copyBaggageToTags = false) + val custom: CustomConfiguration = CustomConfiguration() } companion object { diff --git a/node/src/main/kotlin/net/corda/node/services/config/schema/v1/ConfigSections.kt b/node/src/main/kotlin/net/corda/node/services/config/schema/v1/ConfigSections.kt index a474ebb3d5..b208270917 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/schema/v1/ConfigSections.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/schema/v1/ConfigSections.kt @@ -17,6 +17,7 @@ import net.corda.core.internal.notary.NotaryServiceFlow import net.corda.node.services.config.AuthDataSourceType import net.corda.node.services.config.CertChainPolicyConfig import net.corda.node.services.config.CertChainPolicyType +import net.corda.node.services.config.CustomConfiguration import net.corda.node.services.config.DevModeOptions import net.corda.node.services.config.FlowOverride import net.corda.node.services.config.FlowOverrideConfig @@ -226,6 +227,15 @@ internal object TelemetryConfigurationSpec : Configuration.Specification("CustomConfiguration") { + private val jvmArgs by string().listOrEmpty() + private val externalVerifierJvmArgs by string().listOrEmpty() + override fun parseValid(configuration: Config, options: Configuration.Options): Valid { + val config = configuration.withOptions(options) + return valid(CustomConfiguration(config[jvmArgs], config[externalVerifierJvmArgs])) + } +} + internal object RotatedSignerKeySpec : Configuration.Specification("RotatedCorDappSignerKeyConfiguration") { private val rotatedKeys by string().listOrEmpty() override fun parseValid(configuration: Config, options: Configuration.Options): Valid { diff --git a/node/src/main/kotlin/net/corda/node/services/config/schema/v1/V1NodeConfigurationSpec.kt b/node/src/main/kotlin/net/corda/node/services/config/schema/v1/V1NodeConfigurationSpec.kt index 87e4153af7..b329e76fd9 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/schema/v1/V1NodeConfigurationSpec.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/schema/v1/V1NodeConfigurationSpec.kt @@ -69,8 +69,7 @@ internal object V1NodeConfigurationSpec : Configuration.Specification ) : ExternalVerifierHandle { companion object { private val log = contextLogger() @@ -207,6 +208,7 @@ class ExternalVerifierHandleImpl( val command = ArrayList() command += "${Path(System.getProperty("java.home"), "bin", "java")}" command += inheritedJvmArgs + command += jvmArgsFromConfig // Build list of 3rd party jars val legacyJarsPath = baseDirectory / "legacy-jars" diff --git a/node/src/test/kotlin/net/corda/node/internal/NodeH2SecurityTests.kt b/node/src/test/kotlin/net/corda/node/internal/NodeH2SecurityTests.kt index 1c46fa8c54..ce5494f5cb 100644 --- a/node/src/test/kotlin/net/corda/node/internal/NodeH2SecurityTests.kt +++ b/node/src/test/kotlin/net/corda/node/internal/NodeH2SecurityTests.kt @@ -4,6 +4,7 @@ import net.corda.core.identity.CordaX500Name import net.corda.core.serialization.SerializeAsToken import net.corda.core.utilities.NetworkHostAndPort import net.corda.node.VersionInfo +import net.corda.node.services.config.CustomConfiguration import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.NodeH2Settings import net.corda.node.services.events.NodeSchedulerService @@ -138,6 +139,7 @@ class NodeH2SecurityTests { whenever(config.effectiveH2Settings).thenAnswer { NodeH2Settings(address) } whenever(config.telemetry).thenReturn(mock()) whenever(config.myLegalName).thenReturn(CordaX500Name(null, "client-${address.toString()}", "Corda", "London", null, "GB")) + whenever(config.custom).thenReturn(CustomConfiguration()) } private inner class MockNode : Node(config, VersionInfo.UNKNOWN, false) { diff --git a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelperTest.kt b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelperTest.kt index 3e434cf76b..cf3f2d7b93 100644 --- a/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelperTest.kt +++ b/node/src/test/kotlin/net/corda/node/utilities/registration/NetworkRegistrationHelperTest.kt @@ -12,6 +12,7 @@ import net.corda.core.utilities.seconds import net.corda.coretesting.internal.rigorousMock import net.corda.coretesting.internal.stubs.CertificateStoreStubs import net.corda.node.NodeRegistrationOption +import net.corda.node.services.config.CustomConfiguration import net.corda.node.services.config.NodeConfiguration import net.corda.node.services.config.NotaryConfig import net.corda.nodeapi.internal.crypto.CertificateAndKeyPair @@ -85,6 +86,7 @@ class NetworkRegistrationHelperTest { doReturn(null).whenever(it).tlsCertCrlIssuer doReturn(true).whenever(it).crlCheckSoftFail doReturn(null).whenever(it).notary + doReturn(CustomConfiguration()).whenever(it).custom } } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt index 640705903a..a006341656 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/InternalMockNetwork.kt @@ -38,6 +38,7 @@ import net.corda.node.internal.NodeFlowManager import net.corda.node.services.api.FlowStarter import net.corda.node.services.api.ServiceHubInternal import net.corda.node.services.api.StartedNodeServices +import net.corda.node.services.config.CustomConfiguration import net.corda.node.services.config.FlowTimeoutConfiguration import net.corda.node.services.config.NetworkParameterAcceptanceSettings import net.corda.node.services.config.NodeConfiguration @@ -487,6 +488,7 @@ open class InternalMockNetwork(cordappPackages: List = emptyList(), doReturn(emptyList()).whenever(it).extraNetworkMapKeys doReturn(listOf(baseDirectory / "cordapps")).whenever(it).cordappDirectories doReturn(emptyList()).whenever(it).quasarExcludePackages + doReturn(CustomConfiguration()).whenever(it).custom doReturn(TelemetryConfiguration(openTelemetryEnabled = true, simpleLogTelemetryEnabled = false, spanStartEndEventsEnabled = false, copyBaggageToTags = false)).whenever(it).telemetry parameters.configOverrides(it) } @@ -674,6 +676,7 @@ private fun mockNodeConfiguration(certificatesDirectory: Path): NodeConfiguratio doReturn(2).whenever(it).flowExternalOperationThreadPoolSize doReturn(false).whenever(it).reloadCheckpointAfterSuspend doReturn(emptyList()).whenever(it).rotatedCordappSignerKeys + doReturn(CustomConfiguration()).whenever(it).custom } } diff --git a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeParams.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeParams.kt index 4eb065d787..e33cd6dbc6 100644 --- a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeParams.kt +++ b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeParams.kt @@ -42,6 +42,9 @@ class NodeParams @JvmOverloads constructor( .withValue("useTestClock", valueFor(true)) .withValue("jarDirs", valueFor(jarDirs.map(Path::absolutePathString))) .withValue("devMode", valueFor(devMode)) + .withValue("custom", empty() + .withValue("externalVerifierJvmArgs", valueFor(listOf("-Duser.name=Alice"))) + .root()) return if (isNotary) { config.withValue("notary", ConfigValueFactory.fromMap(mapOf("validating" to true))) } else {