ENT-12568: Add ability to pass system properties to external verifier. (#7897)

* ENT-12568: Add ability to pess system properties to external verifier.
This commit is contained in:
Adel El-Beik 2025-01-15 16:56:32 +00:00 committed by GitHub
parent 1c40e969f7
commit 7b6df5cc14
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 36 additions and 4 deletions

View File

@ -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 })

View File

@ -1178,7 +1178,7 @@ abstract class AbstractNode<S>(val configuration: NodeConfiguration,
inner class ServiceHubImpl : SingletonSerializeAsToken(), ServiceHubInternal, NetworkParameterUpdateListener {
override val rpcFlows = ArrayList<Class<out FlowLogic<*>>>()
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

View File

@ -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<String> = emptyList(),
val externalVerifierJvmArgs: List<String> = emptyList()
)
/**
* Represents a list of rotated CorDapp attachment signing keys.
*

View File

@ -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<NetworkHostAndPort> = 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 {

View File

@ -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<Telemet
}
}
internal object CustomConfigurationSpec : Configuration.Specification<CustomConfiguration>("CustomConfiguration") {
private val jvmArgs by string().listOrEmpty()
private val externalVerifierJvmArgs by string().listOrEmpty()
override fun parseValid(configuration: Config, options: Configuration.Options): Valid<CustomConfiguration> {
val config = configuration.withOptions(options)
return valid(CustomConfiguration(config[jvmArgs], config[externalVerifierJvmArgs]))
}
}
internal object RotatedSignerKeySpec : Configuration.Specification<RotatedCorDappSignerKeyConfiguration>("RotatedCorDappSignerKeyConfiguration") {
private val rotatedKeys by string().listOrEmpty()
override fun parseValid(configuration: Config, options: Configuration.Options): Valid<RotatedCorDappSignerKeyConfiguration> {

View File

@ -69,8 +69,7 @@ internal object V1NodeConfigurationSpec : Configuration.Specification<NodeConfig
private val quasarExcludePackages by string().list().optional().withDefaultValue(Defaults.quasarExcludePackages)
private val reloadCheckpointAfterSuspend by boolean().optional().withDefaultValue(Defaults.reloadCheckpointAfterSuspend)
private val networkParametersPath by string().mapValid(::toPath).optional()
@Suppress("unused")
private val custom by nestedObject().optional()
private val custom by nested(CustomConfigurationSpec).optional().withDefaultValue(Defaults.custom)
@Suppress("unused")
private val systemProperties by nestedObject().optional()
@ -97,6 +96,7 @@ internal object V1NodeConfigurationSpec : Configuration.Specification<NodeConfig
verifierType = config[verifierType],
flowTimeout = config[flowTimeout],
telemetry = config[telemetry],
custom = config[custom],
rpcSettings = config[rpcSettings],
messagingServerAddress = config[messagingServerAddress],
notary = config[notary],

View File

@ -64,7 +64,8 @@ import kotlin.io.path.isWritable
*/
class ExternalVerifierHandleImpl(
private val verificationSupport: NodeVerificationSupport,
private val baseDirectory: Path
private val baseDirectory: Path,
private val jvmArgsFromConfig: List<String>
) : ExternalVerifierHandle {
companion object {
private val log = contextLogger()
@ -207,6 +208,7 @@ class ExternalVerifierHandleImpl(
val command = ArrayList<String>()
command += "${Path(System.getProperty("java.home"), "bin", "java")}"
command += inheritedJvmArgs
command += jvmArgsFromConfig
// Build list of 3rd party jars
val legacyJarsPath = baseDirectory / "legacy-jars"

View File

@ -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) {

View File

@ -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
}
}

View File

@ -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<String> = emptyList(),
doReturn(emptyList<SecureHash>()).whenever(it).extraNetworkMapKeys
doReturn(listOf(baseDirectory / "cordapps")).whenever(it).cordappDirectories
doReturn(emptyList<String>()).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<RotatedCorDappSignerKeyConfiguration>()).whenever(it).rotatedCordappSignerKeys
doReturn(CustomConfiguration()).whenever(it).custom
}
}

View File

@ -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 {