From 543491c7dfaee601c56df8f58baf8084826df4d2 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Fri, 11 May 2018 17:48:02 +0100 Subject: [PATCH 1/4] CORDA-1461 improve devMode (#3100) * CORDA-1461 improve devMode * CORDA-1461 set devMode=true for driver * CORDA-1461 fix tests and improve UI * CORDA-1461 Address code review changes * CORDA-1461 Missing developer emoji * CORDA-1461 use latest cordform that sets devMode=true * CORDA-1461 fix test and add driver overrides for notary * CORDA-1461 fix tests, fix api-scanner version * CORDA-1461 fix api * CORDA-1461 formatting * CORDA-1461 comment style --- build.gradle | 4 +- constants.properties | 2 +- .../kotlin/net/corda/core/internal/Emoji.kt | 6 ++ docs/source/changelog.rst | 6 ++ docs/source/corda-configuration-file.rst | 9 ++- .../registration/NodeRegistrationTest.kt | 7 +- .../kotlin/net/corda/node/NodeArgsParser.kt | 11 +++- .../net/corda/node/internal/AbstractNode.kt | 8 ++- .../kotlin/net/corda/node/internal/Node.kt | 8 +++ .../node/services/config/ConfigUtilities.kt | 18 +++++ node/src/main/resources/reference.conf | 1 - .../net/corda/node/NodeArgsParserTest.kt | 3 +- .../config/NodeConfigurationImplTest.kt | 56 ++++++++++++++++ .../test/resources/test-config-DevMode.conf | 1 + .../src/test/resources/test-config-empty.conf | 0 .../test/resources/test-config-noDevMode.conf | 1 + .../net/corda/bank/BankOfCordaCordform.kt | 3 + .../net/corda/notarydemo/BFTNotaryCordform.kt | 6 ++ .../corda/notarydemo/CustomNotaryCordform.kt | 3 + .../corda/notarydemo/RaftNotaryCordform.kt | 6 ++ .../corda/notarydemo/SingleNotaryCordform.kt | 3 + .../kotlin/net/corda/testing/driver/Driver.kt | 66 ++++++++++++++++++- .../testing/node/internal/DriverDSLImpl.kt | 39 ++++++----- .../testing/node/internal/NodeBasedTest.kt | 1 + .../corda/testing/node/internal/RPCDriver.kt | 4 +- .../corda/demobench/model/NodeConfigTest.kt | 1 + 26 files changed, 238 insertions(+), 35 deletions(-) create mode 100644 node/src/test/resources/test-config-DevMode.conf create mode 100644 node/src/test/resources/test-config-empty.conf create mode 100644 node/src/test/resources/test-config-noDevMode.conf diff --git a/build.gradle b/build.gradle index 4c998cce77..d8f71ddd81 100644 --- a/build.gradle +++ b/build.gradle @@ -103,7 +103,9 @@ buildscript { classpath "net.corda.plugins:quasar-utils:$gradle_plugins_version" classpath "net.corda.plugins:cordformation:$gradle_plugins_version" classpath "net.corda.plugins:cordapp:$gradle_plugins_version" - classpath "net.corda.plugins:api-scanner:$gradle_plugins_version" + //TODO Anthony- this should be changed back to $gradle_plugins_version when the api-scaner is fixed +// classpath "net.corda.plugins:api-scanner:$gradle_plugins_version" + classpath "net.corda.plugins:api-scanner:4.0.15" classpath 'com.github.ben-manes:gradle-versions-plugin:0.15.0' classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version" classpath "org.jetbrains.dokka:dokka-gradle-plugin:${dokka_version}" diff --git a/constants.properties b/constants.properties index 6e5d6a60eb..830d1cfdca 100644 --- a/constants.properties +++ b/constants.properties @@ -1,4 +1,4 @@ -gradlePluginsVersion=4.0.15 +gradlePluginsVersion=4.0.19 kotlinVersion=1.2.41 platformVersion=4 guavaVersion=21.0 diff --git a/core/src/main/kotlin/net/corda/core/internal/Emoji.kt b/core/src/main/kotlin/net/corda/core/internal/Emoji.kt index eb057cfe30..b90994e72d 100644 --- a/core/src/main/kotlin/net/corda/core/internal/Emoji.kt +++ b/core/src/main/kotlin/net/corda/core/internal/Emoji.kt @@ -45,6 +45,10 @@ object Emoji { val CODE_FREE: String = codePointsString(0x1F193) @JvmStatic val CODE_SOON: String = codePointsString(0x1F51C) + @JvmStatic + val CODE_DEVELOPER: String = codePointsString(0x1F469, 0x200D, 0x1F4BB) + @JvmStatic + val CODE_WARNING_SIGN: String = codePointsString(0x26A0, 0xFE0F) /** @@ -65,6 +69,8 @@ object Emoji { val lightBulb: String get() = if (emojiMode.get() != null) "$CODE_LIGHTBULB " else "" val free: String get() = if (emojiMode.get() != null) "$CODE_FREE " else "" val soon: String get() = if (emojiMode.get() != null) "$CODE_SOON " else "" + val developer: String get() = if (emojiMode.get() != null) "$CODE_DEVELOPER " else "" + val warningSign: String get() = if (emojiMode.get() != null) "$CODE_WARNING_SIGN " else "!" // These have old/non-emoji symbols with better platform support. val greenTick: String get() = if (emojiMode.get() != null) "$CODE_GREEN_TICK " else "✓" diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index 9f55ac5efd..988cbcb6a4 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -10,6 +10,12 @@ Unreleased * Node will now gracefully fail to start if ``devMode`` is true and ``compatibilityZoneURL`` is specified. +* Added smart detection logic for the development mode setting and an option to override it from the command line. + +* Fixed an error thrown by NodeVaultService upon recording a transaction with a number of inputs greater than the default page size. + +* Fixed incorrect computation of ``totalStates`` from ``otherResults`` in ``NodeVaultService``. + * Changes to the JSON/YAML serialisation format from ``JacksonSupport``, which also applies to the node shell: * ``Instant`` and ``Date`` objects are serialised as ISO-8601 formatted strings rather than timestamps diff --git a/docs/source/corda-configuration-file.rst b/docs/source/corda-configuration-file.rst index 25c6b891af..7743bd1740 100644 --- a/docs/source/corda-configuration-file.rst +++ b/docs/source/corda-configuration-file.rst @@ -159,9 +159,12 @@ absolute path to the node's base directory. :devMode: This flag sets the node to run in development mode. On startup, if the keystore ``/certificates/sslkeystore.jks`` does not exist, a developer keystore will be used if ``devMode`` is true. The node will exit if ``devMode`` is false and the keystore does not exist. ``devMode`` also turns on background checking of flow checkpoints to shake out any - bugs in the checkpointing process. Also, if ``devMode`` is true, Hibernate will try to automatically create the schema required by Corda - or update an existing schema in the SQL database; if ``devMode`` is false, Hibernate will simply validate an existing schema - failing on node start if this schema is either not present or not compatible. + bugs in the checkpointing process. + Also, if ``devMode`` is true, Hibernate will try to automatically create the schema required by Corda + or update an existing schema in the SQL database; if ``devMode`` is false, Hibernate will simply validate the existing schema, + failing on node start if the schema is either not present or not compatible. + If no value is specified in the node config file, the node will attempt to detect if it's running on a developer machine and set ``devMode=true`` in that case. + This value can be overridden from the command line using the ``--dev-mode`` option. :detectPublicIp: This flag toggles the auto IP detection behaviour, it is enabled by default. On startup the node will attempt to discover its externally visible IP address first by looking for any public addresses on its network diff --git a/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt b/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt index 0bfaa223a1..ed2bbf50cf 100644 --- a/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt +++ b/node/src/integration-test/kotlin/net/corda/node/utilities/registration/NodeRegistrationTest.kt @@ -88,11 +88,12 @@ class NodeRegistrationTest { compatibilityZone = compatibilityZone, initialiseSerialization = false, notarySpecs = listOf(NotarySpec(notaryName)), - extraCordappPackagesToScan = listOf("net.corda.finance") + extraCordappPackagesToScan = listOf("net.corda.finance"), + notaryCustomOverrides = mapOf("devMode" to false) ) { val (alice, genevieve) = listOf( - startNode(providedName = aliceName), - startNode(providedName = genevieveName) + startNode(providedName = aliceName, customOverrides = mapOf("devMode" to false)), + startNode(providedName = genevieveName, customOverrides = mapOf("devMode" to false)) ).transpose().getOrThrow() assertThat(registrationHandler.idsPolled).containsOnly( diff --git a/node/src/main/kotlin/net/corda/node/NodeArgsParser.kt b/node/src/main/kotlin/net/corda/node/NodeArgsParser.kt index eae62e5ff8..587ba55ac9 100644 --- a/node/src/main/kotlin/net/corda/node/NodeArgsParser.kt +++ b/node/src/main/kotlin/net/corda/node/NodeArgsParser.kt @@ -47,6 +47,7 @@ class NodeArgsParser : AbstractArgsParser() { .withRequiredArg() .withValuesConvertedBy(object : EnumConverter(UnknownConfigKeysPolicy::class.java) {}) .defaultsTo(UnknownConfigKeysPolicy.FAIL) + private val devModeArg = optionParser.accepts("dev-mode", "Run the node in developer mode. Unsafe for production.") private val isVersionArg = optionParser.accepts("version", "Print the version and exit") private val justGenerateNodeInfoArg = optionParser.accepts("just-generate-node-info", @@ -70,6 +71,7 @@ class NodeArgsParser : AbstractArgsParser() { val networkRootTrustStorePath = optionSet.valueOf(networkRootTrustStorePathArg) val networkRootTrustStorePassword = optionSet.valueOf(networkRootTrustStorePasswordArg) val unknownConfigKeysPolicy = optionSet.valueOf(unknownConfigKeysPolicy) + val devMode = optionSet.has(devModeArg) val registrationConfig = if (isRegistration) { requireNotNull(networkRootTrustStorePassword) { "Network root trust store password must be provided in registration mode using --network-root-truststore-password." } @@ -89,7 +91,8 @@ class NodeArgsParser : AbstractArgsParser() { sshdServer, justGenerateNodeInfo, bootstrapRaftCluster, - unknownConfigKeysPolicy) + unknownConfigKeysPolicy, + devMode) } } @@ -105,12 +108,14 @@ data class CmdLineOptions(val baseDirectory: Path, val sshdServer: Boolean, val justGenerateNodeInfo: Boolean, val bootstrapRaftCluster: Boolean, - val unknownConfigKeysPolicy: UnknownConfigKeysPolicy) { + val unknownConfigKeysPolicy: UnknownConfigKeysPolicy, + val devMode: Boolean) { fun loadConfig(): NodeConfiguration { val config = ConfigHelper.loadConfig( baseDirectory, configFile, - configOverrides = ConfigFactory.parseMap(mapOf("noLocalShell" to this.noLocalShell)) + configOverrides = ConfigFactory.parseMap(mapOf("noLocalShell" to this.noLocalShell) + + if (devMode) mapOf("devMode" to this.devMode) else emptyMap()) ).parseAsNodeConfiguration(unknownConfigKeysPolicy::handle) if (nodeRegistrationOption != null) { require(!config.devMode) { "registration cannot occur in devMode" } 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 45126d306e..491654812f 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -14,6 +14,7 @@ import net.corda.core.flows.* import net.corda.core.identity.CordaX500Name import net.corda.core.identity.Party import net.corda.core.identity.PartyAndCertificate +import net.corda.core.internal.Emoji import net.corda.core.internal.FlowStateMachine import net.corda.core.internal.VisibleForTesting import net.corda.core.internal.concurrent.map @@ -173,8 +174,10 @@ abstract class AbstractNode(val configuration: NodeConfiguration, private fun initCertificate() { if (configuration.devMode) { - log.warn("Corda node is running in dev mode.") + log.warn("The Corda node is running in developer mode. This is not suitable for production usage.") configuration.configureWithDevSSLCertificate() + } else { + log.info("The Corda node is running in production mode. If this is a developer environment you can set 'devMode=true' in the node.conf file.") } validateKeystore() } @@ -199,6 +202,9 @@ abstract class AbstractNode(val configuration: NodeConfiguration, open fun start(): StartedNode { check(started == null) { "Node has already been started" } + if (configuration.devMode) { + Emoji.renderIfSupported { Node.printWarning("This node is running in developer mode! ${Emoji.developer} This is not safe for production deployment.") } + } log.info("Node starting up ...") initCertificate() initialiseJVMAgents() diff --git a/node/src/main/kotlin/net/corda/node/internal/Node.kt b/node/src/main/kotlin/net/corda/node/internal/Node.kt index f8f57e16fc..c06f241c65 100644 --- a/node/src/main/kotlin/net/corda/node/internal/Node.kt +++ b/node/src/main/kotlin/net/corda/node/internal/Node.kt @@ -3,6 +3,7 @@ package net.corda.node.internal import com.codahale.metrics.JmxReporter import net.corda.client.rpc.internal.serialization.kryo.KryoClientSerializationScheme import net.corda.core.concurrent.CordaFuture +import net.corda.core.internal.Emoji import net.corda.core.internal.concurrent.openFuture import net.corda.core.internal.concurrent.thenMatch import net.corda.core.internal.div @@ -75,6 +76,13 @@ open class Node(configuration: NodeConfiguration, LoggerFactory.getLogger(loggerName).info(msg) } + fun printWarning(message: String) { + Emoji.renderIfSupported { + println("${Emoji.warningSign} ATTENTION: ${message}") + } + staticLog.warn(message) + } + internal fun failStartUp(message: String): Nothing { println(message) println("Corda will now exit...") diff --git a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt index f7dc7f73f2..245f4a3042 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt @@ -28,11 +28,17 @@ object ConfigHelper { val parseOptions = ConfigParseOptions.defaults() val defaultConfig = ConfigFactory.parseResources("reference.conf", parseOptions.setAllowMissing(false)) val appConfig = ConfigFactory.parseFile(configFile.toFile(), parseOptions.setAllowMissing(allowMissingConfig)) + + // Detect the underlying OS. If mac or windows non-server then we assume we're running in devMode. Unless specified otherwise. + val smartDevMode = CordaSystemUtils.isOsMac() || (CordaSystemUtils.isOsWindows() && !CordaSystemUtils.getOsName().toLowerCase().contains("server")) + val devModeConfig = ConfigFactory.parseMap(mapOf("devMode" to smartDevMode)) + val finalConfig = configOf( // Add substitution values here "baseDirectory" to baseDirectory.toString()) .withFallback(configOverrides) .withFallback(appConfig) + .withFallback(devModeConfig) // this needs to be after the appConfig, so it doesn't override the configured devMode .withFallback(defaultConfig) .resolve() @@ -81,3 +87,15 @@ fun SSLConfiguration.configureDevKeyAndTrustStores(myLegalName: CordaX500Name) { } } } + +/** This is generally covered by commons-lang. */ +object CordaSystemUtils { + const val OS_NAME = "os.name" + + const val MAC_PREFIX = "Mac" + const val WIN_PREFIX = "Windows" + + fun isOsMac() = getOsName().startsWith(MAC_PREFIX) + fun isOsWindows() = getOsName().startsWith(WIN_PREFIX) + fun getOsName() = System.getProperty(OS_NAME) +} \ No newline at end of file diff --git a/node/src/main/resources/reference.conf b/node/src/main/resources/reference.conf index 9608bb1dc5..808b1e1cee 100644 --- a/node/src/main/resources/reference.conf +++ b/node/src/main/resources/reference.conf @@ -13,7 +13,6 @@ database = { transactionIsolationLevel = "REPEATABLE_READ" exportHibernateJMXStatistics = "false" } -devMode = true h2port = 0 useTestClock = false verifierType = InMemory diff --git a/node/src/test/kotlin/net/corda/node/NodeArgsParserTest.kt b/node/src/test/kotlin/net/corda/node/NodeArgsParserTest.kt index 66fdee718f..9a088d6353 100644 --- a/node/src/test/kotlin/net/corda/node/NodeArgsParserTest.kt +++ b/node/src/test/kotlin/net/corda/node/NodeArgsParserTest.kt @@ -43,7 +43,8 @@ class NodeArgsParserTest { sshdServer = false, justGenerateNodeInfo = false, bootstrapRaftCluster = false, - unknownConfigKeysPolicy = UnknownConfigKeysPolicy.FAIL)) + unknownConfigKeysPolicy = UnknownConfigKeysPolicy.FAIL, + devMode = false)) } @Test 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 456c511321..891f0fff2a 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 @@ -1,6 +1,9 @@ package net.corda.node.services.config +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory import net.corda.core.internal.div +import net.corda.core.internal.toPath import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.seconds import net.corda.testing.core.ALICE_NAME @@ -45,6 +48,59 @@ class NodeConfigurationImplTest { assertFalse { testConfiguration.copy(noLocalShell = true, sshd = null).shouldInitCrashShell() } } + @Test + fun `Dev mode is autodetected correctly`() { + val os = System.getProperty("os.name") + + setSystemOs("Windows 98") + assertTrue(getConfig("test-config-empty.conf").getBoolean("devMode")) + + setSystemOs("Mac Sierra") + assertTrue(getConfig("test-config-empty.conf").getBoolean("devMode")) + + setSystemOs("Windows server 2008") + assertFalse(getConfig("test-config-empty.conf").getBoolean("devMode")) + + setSystemOs("Linux") + assertFalse(getConfig("test-config-empty.conf").getBoolean("devMode")) + + setSystemOs(os) + } + + private fun setSystemOs(os: String) { + System.setProperty("os.name", os) + } + + @Test + fun `Dev mode is read from the config over the autodetect logic`() { + assertTrue(getConfig("test-config-DevMode.conf").getBoolean("devMode")) + assertFalse(getConfig("test-config-noDevMode.conf").getBoolean("devMode")) + } + + @Test + fun `Dev mode is true if overriden`() { + assertTrue(getConfig("test-config-DevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBoolean("devMode")) + assertTrue(getConfig("test-config-noDevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBoolean("devMode")) + assertTrue(getConfig("test-config-empty.conf", ConfigFactory.parseMap(mapOf("devMode" to true))).getBoolean("devMode")) + } + + @Test + fun `Dev mode is false if overriden`() { + assertFalse(getConfig("test-config-DevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBoolean("devMode")) + assertFalse(getConfig("test-config-noDevMode.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBoolean("devMode")) + assertFalse(getConfig("test-config-empty.conf", ConfigFactory.parseMap(mapOf("devMode" to false))).getBoolean("devMode")) + } + + private fun getConfig(cfgName: String, overrides: Config = ConfigFactory.empty()): Config { + val path = this::class.java.classLoader.getResource(cfgName).toPath() + val cfg = ConfigHelper.loadConfig( + baseDirectory = path.parent, + configFile = path, + configOverrides = overrides + ) + return cfg + } + @Test fun `validation has error when compatibilityZoneURL is present and devMode is true`() { val configuration = testConfiguration.copy(devMode = true, compatibilityZoneURL = URI.create("https://r3.com").toURL()) diff --git a/node/src/test/resources/test-config-DevMode.conf b/node/src/test/resources/test-config-DevMode.conf new file mode 100644 index 0000000000..f0c599c1d8 --- /dev/null +++ b/node/src/test/resources/test-config-DevMode.conf @@ -0,0 +1 @@ +devMode=true \ No newline at end of file diff --git a/node/src/test/resources/test-config-empty.conf b/node/src/test/resources/test-config-empty.conf new file mode 100644 index 0000000000..e69de29bb2 diff --git a/node/src/test/resources/test-config-noDevMode.conf b/node/src/test/resources/test-config-noDevMode.conf new file mode 100644 index 0000000000..ddf59af5b0 --- /dev/null +++ b/node/src/test/resources/test-config-noDevMode.conf @@ -0,0 +1 @@ +devMode=false \ No newline at end of file diff --git a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt index 371b70e043..1e2d724dbc 100644 --- a/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt +++ b/samples/bank-of-corda-demo/src/main/kotlin/net/corda/bank/BankOfCordaCordform.kt @@ -36,6 +36,7 @@ class BankOfCordaCordform : CordformDefinition() { address("localhost:10003") adminAddress("localhost:10004") } + devMode(true) } node { name(BOC_NAME) @@ -47,6 +48,7 @@ class BankOfCordaCordform : CordformDefinition() { } webPort(BOC_WEB_PORT) rpcUsers(User("bankUser", "test", setOf(all()))) + devMode(true) } node { name(BIGCORP_NAME) @@ -57,6 +59,7 @@ class BankOfCordaCordform : CordformDefinition() { } webPort(10010) rpcUsers(User("bigCorpUser", "test", setOf(all()))) + devMode(true) } } diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt index 9f5c8802e4..c696730bb5 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/BFTNotaryCordform.kt @@ -34,6 +34,7 @@ class BFTNotaryCordform : CordformDefinition() { adminAddress("localhost:10103") } rpcUsers(notaryDemoUser) + devMode(true) } node { name(BOB_NAME) @@ -42,6 +43,7 @@ class BFTNotaryCordform : CordformDefinition() { address("localhost:10006") adminAddress("localhost:10106") } + devMode(true) } val clusterAddresses = (0 until clusterSize).map { NetworkHostAndPort("localhost", 11000 + it * 10) } fun notaryNode(replicaId: Int, configure: CordformNode.() -> Unit) = node { @@ -55,6 +57,7 @@ class BFTNotaryCordform : CordformDefinition() { address("localhost:10010") adminAddress("localhost:10110") } + devMode(true) } notaryNode(1) { p2pPort(10013) @@ -62,6 +65,7 @@ class BFTNotaryCordform : CordformDefinition() { address("localhost:10014") adminAddress("localhost:10114") } + devMode(true) } notaryNode(2) { p2pPort(10017) @@ -69,6 +73,7 @@ class BFTNotaryCordform : CordformDefinition() { address("localhost:10018") adminAddress("localhost:10118") } + devMode(true) } notaryNode(3) { p2pPort(10021) @@ -76,6 +81,7 @@ class BFTNotaryCordform : CordformDefinition() { address("localhost:10022") adminAddress("localhost:10122") } + devMode(true) } } diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/CustomNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/CustomNotaryCordform.kt index 3aa6b38654..05fded3f50 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/CustomNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/CustomNotaryCordform.kt @@ -22,6 +22,7 @@ class CustomNotaryCordform : CordformDefinition() { adminAddress("localhost:10103") } rpcUsers(notaryDemoUser) + devMode(true) } node { name(BOB_NAME) @@ -30,6 +31,7 @@ class CustomNotaryCordform : CordformDefinition() { address("localhost:10006") adminAddress("localhost:10106") } + devMode(true) } node { name(DUMMY_NOTARY_NAME) @@ -39,6 +41,7 @@ class CustomNotaryCordform : CordformDefinition() { adminAddress("localhost:10110") } notary(NotaryConfig(validating = true, custom = true)) + devMode(true) } } diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt index 2a2aec2582..746be5db2f 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/RaftNotaryCordform.kt @@ -34,6 +34,7 @@ class RaftNotaryCordform : CordformDefinition() { adminAddress("localhost:10103") } rpcUsers(notaryDemoUser) + devMode(true) } node { name(BOB_NAME) @@ -42,12 +43,14 @@ class RaftNotaryCordform : CordformDefinition() { address("localhost:10006") adminAddress("localhost:10106") } + devMode(true) } fun notaryNode(index: Int, nodePort: Int, clusterPort: Int? = null, configure: CordformNode.() -> Unit) = node { name(notaryNames[index]) val clusterAddresses = if (clusterPort != null ) listOf(NetworkHostAndPort("localhost", clusterPort)) else emptyList() notary(NotaryConfig(validating = true, raft = RaftConfig(NetworkHostAndPort("localhost", nodePort), clusterAddresses))) configure() + devMode(true) } notaryNode(0, 10008) { p2pPort(10009) @@ -55,6 +58,7 @@ class RaftNotaryCordform : CordformDefinition() { address("localhost:10010") adminAddress("localhost:10110") } + devMode(true) } notaryNode(1, 10012, 10008) { p2pPort(10013) @@ -62,6 +66,7 @@ class RaftNotaryCordform : CordformDefinition() { address("localhost:10014") adminAddress("localhost:10114") } + devMode(true) } notaryNode(2, 10016, 10008) { p2pPort(10017) @@ -69,6 +74,7 @@ class RaftNotaryCordform : CordformDefinition() { address("localhost:10018") adminAddress("localhost:10118") } + devMode(true) } } diff --git a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/SingleNotaryCordform.kt b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/SingleNotaryCordform.kt index d5acdb135c..8358ed7e8c 100644 --- a/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/SingleNotaryCordform.kt +++ b/samples/notary-demo/src/main/kotlin/net/corda/notarydemo/SingleNotaryCordform.kt @@ -28,6 +28,7 @@ class SingleNotaryCordform : CordformDefinition() { adminAddress("localhost:10103") } rpcUsers(notaryDemoUser) + devMode(true) } node { name(BOB_NAME) @@ -36,6 +37,7 @@ class SingleNotaryCordform : CordformDefinition() { address("localhost:10006") adminAddress("localhost:10106") } + devMode(true) } node { name(DUMMY_NOTARY_NAME) @@ -45,6 +47,7 @@ class SingleNotaryCordform : CordformDefinition() { adminAddress("localhost:10110") } notary(NotaryConfig(validating = true)) + devMode(true) } } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt index 104ed2d332..3330930fda 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -164,7 +164,7 @@ data class NodeParameters( */ data class JmxPolicy(val startJmxHttpServer: Boolean = false, val jmxHttpServerPortAllocation: PortAllocation? = - if (startJmxHttpServer) PortAllocation.Incremental(7005) else null) + if (startJmxHttpServer) PortAllocation.Incremental(7005) else null) /** * [driver] allows one to start up nodes like this: @@ -199,7 +199,8 @@ fun driver(defaultParameters: DriverParameters = DriverParameters(), dsl: Dr extraCordappPackagesToScan = defaultParameters.extraCordappPackagesToScan, jmxPolicy = defaultParameters.jmxPolicy, compatibilityZone = null, - networkParameters = defaultParameters.networkParameters + networkParameters = defaultParameters.networkParameters, + notaryCustomOverrides = defaultParameters.notaryCustomOverrides ), coerce = { it }, dsl = dsl, @@ -231,6 +232,7 @@ fun driver(defaultParameters: DriverParameters = DriverParameters(), dsl: Dr * @property jmxPolicy Used to specify whether to expose JMX metrics via Jolokia HHTP/JSON. * @property networkParameters The network parameters to be used by all the nodes. [NetworkParameters.notaries] must be * empty as notaries are defined by [notarySpecs]. + * @property notaryCustomOverrides Extra settings that need to be passed to the notary. */ @Suppress("unused") data class DriverParameters( @@ -245,8 +247,37 @@ data class DriverParameters( val notarySpecs: List = listOf(NotarySpec(DUMMY_NOTARY_NAME)), val extraCordappPackagesToScan: List = emptyList(), val jmxPolicy: JmxPolicy = JmxPolicy(), - val networkParameters: NetworkParameters = testNetworkParameters() + val networkParameters: NetworkParameters = testNetworkParameters(), + val notaryCustomOverrides: Map = emptyMap() ) { + constructor( + isDebug: Boolean, + driverDirectory: Path, + portAllocation: PortAllocation, + debugPortAllocation: PortAllocation, + systemProperties: Map, + useTestClock: Boolean, + startNodesInProcess: Boolean, + waitForAllNodesToFinish: Boolean, + notarySpecs: List, + extraCordappPackagesToScan: List, + jmxPolicy: JmxPolicy, + networkParameters: NetworkParameters + ) : this( + isDebug, + driverDirectory, + portAllocation, + debugPortAllocation, + systemProperties, + useTestClock, + startNodesInProcess, + waitForAllNodesToFinish, + notarySpecs, + extraCordappPackagesToScan, + jmxPolicy, + networkParameters, emptyMap() + ) + fun withIsDebug(isDebug: Boolean): DriverParameters = copy(isDebug = isDebug) fun withDriverDirectory(driverDirectory: Path): DriverParameters = copy(driverDirectory = driverDirectory) fun withPortAllocation(portAllocation: PortAllocation): DriverParameters = copy(portAllocation = portAllocation) @@ -259,4 +290,33 @@ data class DriverParameters( fun withExtraCordappPackagesToScan(extraCordappPackagesToScan: List): DriverParameters = copy(extraCordappPackagesToScan = extraCordappPackagesToScan) fun withJmxPolicy(jmxPolicy: JmxPolicy): DriverParameters = copy(jmxPolicy = jmxPolicy) fun withNetworkParameters(networkParameters: NetworkParameters): DriverParameters = copy(networkParameters = networkParameters) + fun withNotaryCustomOverrides(notaryCustomOverrides: Map): DriverParameters = copy(notaryCustomOverrides = notaryCustomOverrides) + + fun copy( + isDebug: Boolean, + driverDirectory: Path, + portAllocation: PortAllocation, + debugPortAllocation: PortAllocation, + systemProperties: Map, + useTestClock: Boolean, + startNodesInProcess: Boolean, + waitForAllNodesToFinish: Boolean, + notarySpecs: List, + extraCordappPackagesToScan: List, + jmxPolicy: JmxPolicy, + networkParameters: NetworkParameters + ) = this.copy( + isDebug, + driverDirectory, + portAllocation, + debugPortAllocation, + systemProperties, + useTestClock, + startNodesInProcess, + waitForAllNodesToFinish, + notarySpecs, + extraCordappPackagesToScan, + jmxPolicy, + networkParameters, emptyMap() + ) } 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 c561805c88..228d62ca63 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 @@ -90,7 +90,8 @@ class DriverDSLImpl( val jmxPolicy: JmxPolicy, val notarySpecs: List, val compatibilityZone: CompatibilityZoneParams?, - val networkParameters: NetworkParameters + val networkParameters: NetworkParameters, + val notaryCustomOverrides: Map ) : InternalDriverDSL { private var _executorService: ScheduledExecutorService? = null val executorService get() = _executorService!! @@ -214,18 +215,19 @@ class DriverDSLImpl( val webAddress = portAllocation.nextHostAndPort() val users = rpcUsers.map { it.copy(permissions = it.permissions + DRIVER_REQUIRED_PERMISSIONS) } val czUrlConfig = if (compatibilityZone != null) mapOf("compatibilityZoneURL" to compatibilityZone.url.toString()) else emptyMap() + val overrides = configOf( + "myLegalName" to name.toString(), + "p2pAddress" to p2pAddress.toString(), + "rpcSettings.address" to rpcAddress.toString(), + "rpcSettings.adminAddress" to rpcAdminAddress.toString(), + "useTestClock" to useTestClock, + "rpcUsers" to if (users.isEmpty()) defaultRpcUserList else users.map { it.toConfig().root().unwrapped() }, + "verifierType" to verifierType.name + ) + czUrlConfig + customOverrides val config = NodeConfig(ConfigHelper.loadConfig( baseDirectory = baseDirectory(name), allowMissingConfig = true, - configOverrides = configOf( - "myLegalName" to name.toString(), - "p2pAddress" to p2pAddress.toString(), - "rpcSettings.address" to rpcAddress.toString(), - "rpcSettings.adminAddress" to rpcAdminAddress.toString(), - "useTestClock" to useTestClock, - "rpcUsers" to if (users.isEmpty()) defaultRpcUserList else users.map { it.toConfig().root().unwrapped() }, - "verifierType" to verifierType.name - ) + czUrlConfig + customOverrides + configOverrides = if (overrides.hasPath("devMode")) overrides else overrides + mapOf("devMode" to true) )) return startNodeInternal(config, webAddress, startInSameProcess, maximumHeapSize, localNetworkMap) } @@ -422,7 +424,7 @@ class DriverDSLImpl( networkMapAvailability = notaryInfosFuture.map { it.second } _notaries = notaryInfosFuture.map { (notaryInfos, localNetworkMap) -> - val listOfFutureNodeHandles = startNotaries(localNetworkMap) + val listOfFutureNodeHandles = startNotaries(localNetworkMap, notaryCustomOverrides) notaryInfos.zip(listOfFutureNodeHandles) { (identity, validating), nodeHandlesFuture -> NotaryHandle(identity, validating, nodeHandlesFuture) } @@ -498,10 +500,10 @@ class DriverDSLImpl( return (0 until spec.cluster!!.clusterSize).map { spec.name.copy(organisation = "${spec.name.organisation}-$it") } } - private fun startNotaries(localNetworkMap: LocalNetworkMap?): List>> { + private fun startNotaries(localNetworkMap: LocalNetworkMap?, customOverrides: Map): List>> { return notarySpecs.map { when (it.cluster) { - null -> startSingleNotary(it, localNetworkMap) + null -> startSingleNotary(it, localNetworkMap, customOverrides ) is ClusterSpec.Raft, // DummyCluster is used for testing the notary communication path, and it does not matter // which underlying consensus algorithm is used, so we just stick to Raft @@ -515,13 +517,13 @@ class DriverDSLImpl( // generating the configs for the nodes, probably making use of Any.toConfig() private fun NotaryConfig.toConfigMap(): Map = mapOf("notary" to toConfig().root().unwrapped()) - private fun startSingleNotary(spec: NotarySpec, localNetworkMap: LocalNetworkMap?): CordaFuture> { + private fun startSingleNotary(spec: NotarySpec, localNetworkMap: LocalNetworkMap?, customOverrides: Map): CordaFuture> { return startRegisteredNode( spec.name, localNetworkMap, spec.rpcUsers, spec.verifierType, - customOverrides = NotaryConfig(spec.validating).toConfigMap() + customOverrides = NotaryConfig(spec.validating).toConfigMap() + customOverrides ).map { listOf(it) } } @@ -1031,7 +1033,8 @@ fun genericDriver( jmxPolicy = defaultParameters.jmxPolicy, notarySpecs = defaultParameters.notarySpecs, compatibilityZone = null, - networkParameters = defaultParameters.networkParameters + networkParameters = defaultParameters.networkParameters, + notaryCustomOverrides = defaultParameters.notaryCustomOverrides ) ) val shutdownHook = addShutdownHook(driverDsl::shutdown) @@ -1075,6 +1078,7 @@ fun internalDriver( jmxPolicy: JmxPolicy = DriverParameters().jmxPolicy, networkParameters: NetworkParameters = DriverParameters().networkParameters, compatibilityZone: CompatibilityZoneParams? = null, + notaryCustomOverrides: Map = DriverParameters().notaryCustomOverrides, dsl: DriverDSLImpl.() -> A ): A { return genericDriver( @@ -1091,7 +1095,8 @@ fun internalDriver( extraCordappPackagesToScan = extraCordappPackagesToScan, jmxPolicy = jmxPolicy, compatibilityZone = compatibilityZone, - networkParameters = networkParameters + networkParameters = networkParameters, + notaryCustomOverrides = notaryCustomOverrides ), coerce = { it }, dsl = dsl, 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 8c8f0962fe..7fbd49e067 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 @@ -92,6 +92,7 @@ abstract class NodeBasedTest(private val cordappPackages: List = emptyLi configOverrides = configOf( "myLegalName" to legalName.toString(), "p2pAddress" to p2pAddress, + "devMode" to true, "rpcSettings.address" to localPort[1].toString(), "rpcSettings.adminAddress" to localPort[2].toString(), "rpcUsers" to rpcUsers.map { it.toConfig().root().unwrapped() } diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt index 289bc07139..a2789b03c1 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/internal/RPCDriver.kt @@ -116,6 +116,7 @@ fun rpcDriver( externalTrace: Trace? = null, jmxPolicy: JmxPolicy = JmxPolicy(), networkParameters: NetworkParameters = testNetworkParameters(), + notaryCustomOverrides: Map = emptyMap(), dsl: RPCDriverDSL.() -> A ): A { return genericDriver( @@ -133,7 +134,8 @@ fun rpcDriver( notarySpecs = notarySpecs, jmxPolicy = jmxPolicy, compatibilityZone = null, - networkParameters = networkParameters + networkParameters = networkParameters, + notaryCustomOverrides = notaryCustomOverrides ), externalTrace ), coerce = { it }, diff --git a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt index 1e9a874119..c5660ab4f9 100644 --- a/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt +++ b/tools/demobench/src/test/kotlin/net/corda/demobench/model/NodeConfigTest.kt @@ -37,6 +37,7 @@ class NodeConfigTest { val nodeConfig = config.nodeConf() .withValue("baseDirectory", ConfigValueFactory.fromAnyRef(baseDir.toString())) .withFallback(ConfigFactory.parseResources("reference.conf")) + .withFallback(ConfigFactory.parseMap(mapOf("devMode" to true))) .resolve() val fullConfig = nodeConfig.parseAsNodeConfiguration() From 95054f71d5b10b1d4befd1bc96dccd315d0bb6a0 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Mon, 14 May 2018 15:23:27 +0100 Subject: [PATCH 2/4] Fix merge --- .../kotlin/net/corda/node/services/config/ConfigUtilities.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt index 4eb8cfc72e..3c47746835 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/ConfigUtilities.kt @@ -52,7 +52,7 @@ object ConfigHelper { val systemOverrides = systemProperties().cordaEntriesOnly() val environmentOverrides = systemEnvironment().cordaEntriesOnly() - val finalConfig = configOf( + val finalConfig = configOverrides // Add substitution values here .withFallback(configOf("custom.nodeOrganizationName" to parseToDbSchemaFriendlyName(baseDirectory.fileName.toString()))) //for database integration tests .withFallback(systemOverrides) //for database integration tests From ec2035951822db7044ef5557f9ae16b4809e001a Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Mon, 14 May 2018 16:05:30 +0100 Subject: [PATCH 3/4] Fix merge --- .../src/main/kotlin/net/corda/testing/driver/Driver.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt index eb2901655e..1af3231dbd 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -283,6 +283,7 @@ data class DriverParameters( debugPortAllocation, systemProperties, useTestClock, + true, startNodesInProcess, waitForAllNodesToFinish, notarySpecs, @@ -326,6 +327,7 @@ data class DriverParameters( debugPortAllocation, systemProperties, useTestClock, + true, startNodesInProcess, waitForAllNodesToFinish, notarySpecs, From a1616767b8868995f3d7a3c4ccb7e0a6de797054 Mon Sep 17 00:00:00 2001 From: Tudor Malene Date: Mon, 14 May 2018 17:17:48 +0100 Subject: [PATCH 4/4] Fix merge --- .../doorman/NetworkParametersUpdateTest.kt | 9 +-- .../doorman/NodeRegistrationTest.kt | 7 +- .../kotlin/net/corda/testing/driver/Driver.kt | 68 ++++++++++++++++++- 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NetworkParametersUpdateTest.kt b/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NetworkParametersUpdateTest.kt index 76c936cad8..993985a985 100644 --- a/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NetworkParametersUpdateTest.kt +++ b/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NetworkParametersUpdateTest.kt @@ -95,11 +95,12 @@ class NetworkParametersUpdateTest : IntegrationTest() { compatibilityZone = compatibilityZone, notarySpecs = emptyList(), initialiseSerialization = false, - extraCordappPackagesToScan = listOf("net.corda.finance") + extraCordappPackagesToScan = listOf("net.corda.finance"), + notaryCustomOverrides = mapOf("devMode" to false) ) { var (alice, bob) = listOf( - startNode(providedName = ALICE_NAME), - startNode(providedName = BOB_NAME) + startNode(providedName = ALICE_NAME, customOverrides = mapOf("devMode" to false)), + startNode(providedName = BOB_NAME, customOverrides = mapOf("devMode" to false)) ).map { it.getOrThrow() as NodeHandleInternal } // Make sure that stopping Bob doesn't remove him from the network map @@ -139,7 +140,7 @@ class NetworkParametersUpdateTest : IntegrationTest() { applyNetworkParametersAndStart(NetworkParametersCmd.FlagDay) alice.stop() - alice = startNode(providedName = ALICE_NAME).getOrThrow() as NodeHandleInternal + alice = startNode(providedName = ALICE_NAME, customOverrides = mapOf("devMode" to false)).getOrThrow() as NodeHandleInternal // TODO It is also possible to check what version of parameters node runs by writing flow that reads that value from ServiceHub val networkParameters = (alice.configuration.baseDirectory / NETWORK_PARAMS_FILE_NAME) diff --git a/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NodeRegistrationTest.kt b/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NodeRegistrationTest.kt index 61d280eaf1..fa1be7a347 100644 --- a/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NodeRegistrationTest.kt +++ b/network-management/src/integration-test/kotlin/com/r3/corda/networkmanage/doorman/NodeRegistrationTest.kt @@ -130,17 +130,18 @@ class NodeRegistrationTest : IntegrationTest() { compatibilityZone = compatibilityZone, initialiseSerialization = false, notarySpecs = listOf(NotarySpec(notaryName)), - extraCordappPackagesToScan = listOf("net.corda.finance") + extraCordappPackagesToScan = listOf("net.corda.finance"), + notaryCustomOverrides = mapOf("devMode" to false) ) { val (alice, notary) = listOf( - startNode(providedName = aliceName), + startNode(providedName = aliceName, customOverrides = mapOf("devMode" to false)), defaultNotaryNode ).map { it.getOrThrow() as NodeHandleInternal } alice.onlySeesFromNetworkMap(alice, notary) notary.onlySeesFromNetworkMap(alice, notary) - val genevieve = startNode(providedName = genevieveName).getOrThrow() as NodeHandleInternal + val genevieve = startNode(providedName = genevieveName, customOverrides = mapOf("devMode" to false)).getOrThrow() as NodeHandleInternal // Wait for the nodes to poll again Thread.sleep(timeoutMillis * 2) diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt index 1af3231dbd..3cd9b47c6d 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/driver/Driver.kt @@ -289,7 +289,39 @@ data class DriverParameters( notarySpecs, extraCordappPackagesToScan, jmxPolicy, - networkParameters, emptyMap() + networkParameters, + emptyMap() + ) + + constructor( + isDebug: Boolean, + driverDirectory: Path, + portAllocation: PortAllocation, + debugPortAllocation: PortAllocation, + systemProperties: Map, + useTestClock: Boolean, + initialiseSerialization: Boolean, + startNodesInProcess: Boolean, + waitForAllNodesToFinish: Boolean, + notarySpecs: List, + extraCordappPackagesToScan: List, + jmxPolicy: JmxPolicy, + networkParameters: NetworkParameters + ) : this( + isDebug, + driverDirectory, + portAllocation, + debugPortAllocation, + systemProperties, + useTestClock, + initialiseSerialization, + startNodesInProcess, + waitForAllNodesToFinish, + notarySpecs, + extraCordappPackagesToScan, + jmxPolicy, + networkParameters, + emptyMap() ) fun withIsDebug(isDebug: Boolean): DriverParameters = copy(isDebug = isDebug) @@ -333,6 +365,38 @@ data class DriverParameters( notarySpecs, extraCordappPackagesToScan, jmxPolicy, - networkParameters, emptyMap() + networkParameters, + emptyMap() + ) + + fun copy( + isDebug: Boolean, + driverDirectory: Path, + portAllocation: PortAllocation, + debugPortAllocation: PortAllocation, + systemProperties: Map, + useTestClock: Boolean, + initialiseSerialization: Boolean, + startNodesInProcess: Boolean, + waitForAllNodesToFinish: Boolean, + notarySpecs: List, + extraCordappPackagesToScan: List, + jmxPolicy: JmxPolicy, + networkParameters: NetworkParameters + ) = this.copy( + isDebug, + driverDirectory, + portAllocation, + debugPortAllocation, + systemProperties, + useTestClock, + initialiseSerialization, + startNodesInProcess, + waitForAllNodesToFinish, + notarySpecs, + extraCordappPackagesToScan, + jmxPolicy, + networkParameters, + emptyMap() ) }