mirror of
https://github.com/corda/corda.git
synced 2025-05-29 13:44:25 +00:00
[CORDA-2055] [CORDA-2236]: Bootstrapper cordapp copying (#4309)
This commit is contained in:
parent
9d748e7b0c
commit
994afcfef7
@ -82,7 +82,7 @@ Whitelisting contracts
|
|||||||
Any CorDapps provided when bootstrapping a network will be scanned for contracts which will be used to create the
|
Any CorDapps provided when bootstrapping a network will be scanned for contracts which will be used to create the
|
||||||
*Zone whitelist* (see :doc:`api-contract-constraints`) for the network.
|
*Zone whitelist* (see :doc:`api-contract-constraints`) for the network.
|
||||||
|
|
||||||
.. note:: If you only wish to whitelist the CorDapps but not copy them to each node then run with the ``--no-copy`` flag.
|
.. note:: If you only wish to whitelist the CorDapps but not copy them to each node then run with the ``--copy-cordapps=No`` option.
|
||||||
|
|
||||||
The CorDapp JARs will be hashed and scanned for ``Contract`` classes. These contract class implementations will become part
|
The CorDapp JARs will be hashed and scanned for ``Contract`` classes. These contract class implementations will become part
|
||||||
of the whitelisted contracts in the network parameters (see ``NetworkParameters.whitelistedContractImplementations`` :doc:`network-map`).
|
of the whitelisted contracts in the network parameters (see ``NetworkParameters.whitelistedContractImplementations`` :doc:`network-map`).
|
||||||
@ -401,16 +401,17 @@ The Network Bootstrapper can be started with the following command line options:
|
|||||||
|
|
||||||
.. code-block:: shell
|
.. code-block:: shell
|
||||||
|
|
||||||
bootstrapper [-hvV] [--no-copy] [--dir=<dir>] [--event-horizon=<eventHorizon>]
|
bootstrapper [-hvV] [--copy-cordapps=<copyCordapps>] [--dir=<dir>]
|
||||||
[--logging-level=<loggingLevel>]
|
[--event-horizon=<eventHorizon>] [--logging-level=<loggingLevel>]
|
||||||
[--max-message-size=<maxMessageSize>]
|
[--max-message-size=<maxMessageSize>]
|
||||||
[--max-transaction-size=<maxTransactionSize>]
|
[--max-transaction-size=<maxTransactionSize>]
|
||||||
[--minimum-platform-version=<minimumPlatformVersion>]
|
[--minimum-platform-version=<minimumPlatformVersion>]
|
||||||
[-n=<networkParametersFile>] [COMMAND]
|
[-n=<networkParametersFile>] [COMMAND]
|
||||||
|
|
||||||
* ``--dir=<dir>``: Root directory containing the node configuration files and CorDapp JARs that will form the test network.
|
* ``--dir=<dir>``: Root directory containing the node configuration files and CorDapp JARs that will form the test network.
|
||||||
It may also contain existing node directories. Defaults to the current directory.
|
It may also contain existing node directories. Defaults to the current directory.
|
||||||
* ``--no-copy``: Don't copy the CorDapp JARs into the nodes' "cordapps" directories.
|
* ``--copy-cordapps=<copyCordapps>``: Whether or not to copy the CorDapp JARs into the nodes' 'cordapps' directory. Possible values:
|
||||||
|
FirstRunOnly, Yes, No. Default: FirstRunOnly.
|
||||||
* ``--verbose``, ``--log-to-console``, ``-v``: If set, prints logging to the console as well as to a file.
|
* ``--verbose``, ``--log-to-console``, ``-v``: If set, prints logging to the console as well as to a file.
|
||||||
* ``--logging-level=<loggingLevel>``: Enable logging at this level and higher. Possible values: ERROR, WARN, INFO, DEBUG, TRACE. Default: INFO.
|
* ``--logging-level=<loggingLevel>``: Enable logging at this level and higher. Possible values: ERROR, WARN, INFO, DEBUG, TRACE. Default: INFO.
|
||||||
* ``--help``, ``-h``: Show this help message and exit.
|
* ``--help``, ``-h``: Show this help message and exit.
|
||||||
@ -419,8 +420,8 @@ The Network Bootstrapper can be started with the following command line options:
|
|||||||
* ``--max-message-size``: The maximum message size to use in the network-parameters, in bytes.
|
* ``--max-message-size``: The maximum message size to use in the network-parameters, in bytes.
|
||||||
* ``--max-transaction-size``: The maximum transaction size to use in the network-parameters, in bytes.
|
* ``--max-transaction-size``: The maximum transaction size to use in the network-parameters, in bytes.
|
||||||
* ``--event-horizon``: The event horizon to use in the network-parameters.
|
* ``--event-horizon``: The event horizon to use in the network-parameters.
|
||||||
* ``--network-parameter-overrides=<networkParametersFile>``, ``-n=<networkParametersFile>`: Overrides the default network parameters with those
|
* ``--network-parameter-overrides=<networkParametersFile>``, ``-n=<networkParametersFile>``: Overrides the default network parameters with those
|
||||||
in the given file. See `Overriding network parameters via a file`_ for more information.
|
in the given file. See `Overriding network parameters via a file`_ for more information.
|
||||||
|
|
||||||
|
|
||||||
Sub-commands
|
Sub-commands
|
||||||
|
@ -75,6 +75,8 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
|
|
||||||
private const val LOGS_DIR_NAME = "logs"
|
private const val LOGS_DIR_NAME = "logs"
|
||||||
|
|
||||||
|
private val jarsThatArentCordapps = setOf("corda.jar", "runnodes.jar")
|
||||||
|
|
||||||
private fun extractEmbeddedCordaJar(): InputStream {
|
private fun extractEmbeddedCordaJar(): InputStream {
|
||||||
return Thread.currentThread().contextClassLoader.getResourceAsStream("corda.jar")
|
return Thread.currentThread().contextClassLoader.getResourceAsStream("corda.jar")
|
||||||
}
|
}
|
||||||
@ -182,21 +184,21 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
* TODO: Remove once the gradle plugins are updated to 4.0.30
|
* TODO: Remove once the gradle plugins are updated to 4.0.30
|
||||||
*/
|
*/
|
||||||
fun bootstrap(directory: Path, cordappJars: List<Path>) {
|
fun bootstrap(directory: Path, cordappJars: List<Path>) {
|
||||||
bootstrap(directory, cordappJars, copyCordapps = true, fromCordform = true)
|
bootstrap(directory, cordappJars, CopyCordapps.Yes, fromCordform = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Entry point for Cordform */
|
/** Entry point for Cordform */
|
||||||
fun bootstrapCordform(directory: Path, cordappJars: List<Path>) {
|
fun bootstrapCordform(directory: Path, cordappJars: List<Path>) {
|
||||||
bootstrap(directory, cordappJars, copyCordapps = false, fromCordform = true)
|
bootstrap(directory, cordappJars, CopyCordapps.No, fromCordform = true)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Entry point for the tool */
|
/** Entry point for the tool */
|
||||||
override fun bootstrap(directory: Path, copyCordapps: Boolean, networkParameterOverrides: NetworkParametersOverrides) {
|
override fun bootstrap(directory: Path, copyCordapps: CopyCordapps, networkParameterOverrides: NetworkParametersOverrides) {
|
||||||
require(networkParameterOverrides.minimumPlatformVersion == null || networkParameterOverrides.minimumPlatformVersion <= PLATFORM_VERSION) { "Minimum platform version cannot be greater than $PLATFORM_VERSION" }
|
require(networkParameterOverrides.minimumPlatformVersion == null || networkParameterOverrides.minimumPlatformVersion <= PLATFORM_VERSION) { "Minimum platform version cannot be greater than $PLATFORM_VERSION" }
|
||||||
// Don't accidentally include the bootstrapper jar as a CorDapp!
|
// Don't accidentally include the bootstrapper jar as a CorDapp!
|
||||||
val bootstrapperJar = javaClass.location.toPath()
|
val bootstrapperJar = javaClass.location.toPath()
|
||||||
val cordappJars = directory.list { paths ->
|
val cordappJars = directory.list { paths ->
|
||||||
paths.filter { it.toString().endsWith(".jar") && !it.isSameAs(bootstrapperJar) && it.fileName.toString() != "corda.jar" }
|
paths.filter { it.toString().endsWith(".jar") && !it.isSameAs(bootstrapperJar) && !jarsThatArentCordapps.contains(it.fileName.toString().toLowerCase()) }
|
||||||
.toList()
|
.toList()
|
||||||
}
|
}
|
||||||
bootstrap(directory, cordappJars, copyCordapps, fromCordform = false, networkParametersOverrides = networkParameterOverrides)
|
bootstrap(directory, cordappJars, copyCordapps, fromCordform = false, networkParametersOverrides = networkParameterOverrides)
|
||||||
@ -205,16 +207,13 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
private fun bootstrap(
|
private fun bootstrap(
|
||||||
directory: Path,
|
directory: Path,
|
||||||
cordappJars: List<Path>,
|
cordappJars: List<Path>,
|
||||||
copyCordapps: Boolean,
|
copyCordapps: CopyCordapps,
|
||||||
fromCordform: Boolean,
|
fromCordform: Boolean,
|
||||||
networkParametersOverrides: NetworkParametersOverrides = NetworkParametersOverrides()
|
networkParametersOverrides: NetworkParametersOverrides = NetworkParametersOverrides()
|
||||||
) {
|
) {
|
||||||
directory.createDirectories()
|
directory.createDirectories()
|
||||||
println("Bootstrapping local test network in $directory")
|
println("Bootstrapping local test network in $directory")
|
||||||
if (!fromCordform) {
|
val networkAlreadyExists = createNodeDirectoriesIfNeeded(directory, fromCordform)
|
||||||
println("Found the following CorDapps: ${cordappJars.map { it.fileName }}")
|
|
||||||
}
|
|
||||||
createNodeDirectoriesIfNeeded(directory, fromCordform)
|
|
||||||
val nodeDirs = gatherNodeDirectories(directory)
|
val nodeDirs = gatherNodeDirectories(directory)
|
||||||
|
|
||||||
require(nodeDirs.isNotEmpty()) { "No nodes found" }
|
require(nodeDirs.isNotEmpty()) { "No nodes found" }
|
||||||
@ -224,19 +223,9 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
|
|
||||||
val configs = nodeDirs.associateBy({ it }, { ConfigFactory.parseFile((it / "node.conf").toFile()) })
|
val configs = nodeDirs.associateBy({ it }, { ConfigFactory.parseFile((it / "node.conf").toFile()) })
|
||||||
checkForDuplicateLegalNames(configs.values)
|
checkForDuplicateLegalNames(configs.values)
|
||||||
if (copyCordapps && cordappJars.isNotEmpty()) {
|
|
||||||
println("Copying CorDapp JARs into node directories")
|
copyCordapps.copy(cordappJars, nodeDirs, networkAlreadyExists, fromCordform)
|
||||||
for (nodeDir in nodeDirs) {
|
|
||||||
val cordappsDir = (nodeDir / "cordapps").createDirectories()
|
|
||||||
cordappJars.forEach {
|
|
||||||
try {
|
|
||||||
it.copyToDirectory(cordappsDir)
|
|
||||||
} catch (e: FileAlreadyExistsException) {
|
|
||||||
println("WARNING: ${it.fileName} already exists in $cordappsDir, ignoring and leaving existing CorDapp untouched")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
generateServiceIdentitiesForNotaryClusters(configs)
|
generateServiceIdentitiesForNotaryClusters(configs)
|
||||||
if (initSerEnv) {
|
if (initSerEnv) {
|
||||||
initialiseSerialization()
|
initialiseSerialization()
|
||||||
@ -268,7 +257,8 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createNodeDirectoriesIfNeeded(directory: Path, fromCordform: Boolean) {
|
private fun createNodeDirectoriesIfNeeded(directory: Path, fromCordform: Boolean): Boolean {
|
||||||
|
var networkAlreadyExists = false
|
||||||
val cordaJar = directory / "corda.jar"
|
val cordaJar = directory / "corda.jar"
|
||||||
var usingEmbedded = false
|
var usingEmbedded = false
|
||||||
if (!cordaJar.exists()) {
|
if (!cordaJar.exists()) {
|
||||||
@ -284,6 +274,10 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
for (confFile in confFiles) {
|
for (confFile in confFiles) {
|
||||||
val nodeName = confFile.fileName.toString().removeSuffix("_node.conf")
|
val nodeName = confFile.fileName.toString().removeSuffix("_node.conf")
|
||||||
println("Generating node directory for $nodeName")
|
println("Generating node directory for $nodeName")
|
||||||
|
if ((directory / nodeName).exists()) {
|
||||||
|
//directory already exists, so assume this network has been bootstrapped before
|
||||||
|
networkAlreadyExists = true
|
||||||
|
}
|
||||||
val nodeDir = (directory / nodeName).createDirectories()
|
val nodeDir = (directory / nodeName).createDirectories()
|
||||||
confFile.copyTo(nodeDir / "node.conf", REPLACE_EXISTING)
|
confFile.copyTo(nodeDir / "node.conf", REPLACE_EXISTING)
|
||||||
webServerConfFiles.firstOrNull { directory.relativize(it).toString().removeSuffix("_web-server.conf") == nodeName }
|
webServerConfFiles.firstOrNull { directory.relativize(it).toString().removeSuffix("_web-server.conf") == nodeName }
|
||||||
@ -306,6 +300,7 @@ internal constructor(private val initSerEnv: Boolean,
|
|||||||
if (fromCordform || usingEmbedded) {
|
if (fromCordform || usingEmbedded) {
|
||||||
cordaJar.delete()
|
cordaJar.delete()
|
||||||
}
|
}
|
||||||
|
return networkAlreadyExists
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun gatherNodeDirectories(directory: Path): List<Path> {
|
private fun gatherNodeDirectories(directory: Path): List<Path> {
|
||||||
@ -467,7 +462,8 @@ fun NetworkParameters.overrideWith(override: NetworkParametersOverrides): Networ
|
|||||||
maxMessageSize = override.maxMessageSize ?: this.maxMessageSize,
|
maxMessageSize = override.maxMessageSize ?: this.maxMessageSize,
|
||||||
maxTransactionSize = override.maxTransactionSize ?: this.maxTransactionSize,
|
maxTransactionSize = override.maxTransactionSize ?: this.maxTransactionSize,
|
||||||
eventHorizon = override.eventHorizon ?: this.eventHorizon,
|
eventHorizon = override.eventHorizon ?: this.eventHorizon,
|
||||||
packageOwnership = override.packageOwnership?.map { it.javaPackageName to it.publicKey }?.toMap() ?: this.packageOwnership
|
packageOwnership = override.packageOwnership?.map { it.javaPackageName to it.publicKey }?.toMap()
|
||||||
|
?: this.packageOwnership
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,5 +478,50 @@ data class NetworkParametersOverrides(
|
|||||||
)
|
)
|
||||||
|
|
||||||
interface NetworkBootstrapperWithOverridableParameters {
|
interface NetworkBootstrapperWithOverridableParameters {
|
||||||
fun bootstrap(directory: Path, copyCordapps: Boolean, networkParameterOverrides: NetworkParametersOverrides = NetworkParametersOverrides())
|
fun bootstrap(directory: Path, copyCordapps: CopyCordapps, networkParameterOverrides: NetworkParametersOverrides = NetworkParametersOverrides())
|
||||||
|
}
|
||||||
|
|
||||||
|
enum class CopyCordapps {
|
||||||
|
FirstRunOnly {
|
||||||
|
override fun copy(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean) {
|
||||||
|
if (networkAlreadyExists) {
|
||||||
|
println("Not copying CorDapp JARs as --copy-cordapps is set to FirstRunOnly, and it looks like this network has already been bootstrapped.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
cordappJars.copy(nodeDirs)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Yes {
|
||||||
|
override fun copy(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean) = cordappJars.copy(nodeDirs)
|
||||||
|
},
|
||||||
|
|
||||||
|
No {
|
||||||
|
override fun copy(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean) = println("Not copying CorDapp JARs as --copy-cordapps is set to No.")
|
||||||
|
};
|
||||||
|
|
||||||
|
protected abstract fun copy(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean)
|
||||||
|
|
||||||
|
protected fun List<Path>.copy(nodeDirs: List<Path>) {
|
||||||
|
if (this.isNotEmpty()) {
|
||||||
|
println("Copying CorDapp JARs into node directories")
|
||||||
|
for (nodeDir in nodeDirs) {
|
||||||
|
val cordappsDir = (nodeDir / "cordapps").createDirectories()
|
||||||
|
this.forEach {
|
||||||
|
try {
|
||||||
|
it.copyToDirectory(cordappsDir)
|
||||||
|
} catch (e: FileAlreadyExistsException) {
|
||||||
|
println("WARNING: ${it.fileName} already exists in $cordappsDir, ignoring and leaving existing CorDapp untouched")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun copy(cordappJars: List<Path>, nodeDirs: List<Path>, networkAlreadyExists: Boolean, fromCordform: Boolean) {
|
||||||
|
if (!fromCordform) {
|
||||||
|
println("Found the following CorDapps: ${cordappJars.map { it.fileName }}")
|
||||||
|
}
|
||||||
|
this.copy(cordappJars, nodeDirs, networkAlreadyExists)
|
||||||
|
}
|
||||||
}
|
}
|
@ -184,7 +184,7 @@ class NetworkBootstrapperTest {
|
|||||||
fun `no copy CorDapps`() {
|
fun `no copy CorDapps`() {
|
||||||
createNodeConfFile("alice", aliceConfig)
|
createNodeConfFile("alice", aliceConfig)
|
||||||
val cordappBytes = createFakeCordappJar("sample-app", listOf("contract.class"))
|
val cordappBytes = createFakeCordappJar("sample-app", listOf("contract.class"))
|
||||||
bootstrap(copyCordapps = false)
|
bootstrap(copyCordapps = CopyCordapps.No)
|
||||||
val networkParameters = assertBootstrappedNetwork(fakeEmbeddedCordaJar, "alice" to aliceConfig)
|
val networkParameters = assertBootstrappedNetwork(fakeEmbeddedCordaJar, "alice" to aliceConfig)
|
||||||
assertThat(rootDir / "alice" / "cordapps" / "sample-app.jar").doesNotExist()
|
assertThat(rootDir / "alice" / "cordapps" / "sample-app.jar").doesNotExist()
|
||||||
assertThat(networkParameters.whitelistedContractImplementations).isEqualTo(mapOf(
|
assertThat(networkParameters.whitelistedContractImplementations).isEqualTo(mapOf(
|
||||||
@ -305,7 +305,7 @@ class NetworkBootstrapperTest {
|
|||||||
return bytes
|
return bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun bootstrap(copyCordapps: Boolean = true,
|
private fun bootstrap(copyCordapps: CopyCordapps = CopyCordapps.FirstRunOnly,
|
||||||
packageOwnership: Map<String, PublicKey>? = emptyMap(),
|
packageOwnership: Map<String, PublicKey>? = emptyMap(),
|
||||||
minimumPlatformVerison: Int? = PLATFORM_VERSION,
|
minimumPlatformVerison: Int? = PLATFORM_VERSION,
|
||||||
maxMessageSize: Int? = DEFAULT_MAX_MESSAGE_SIZE,
|
maxMessageSize: Int? = DEFAULT_MAX_MESSAGE_SIZE,
|
||||||
|
@ -2,18 +2,13 @@ package net.corda.bootstrapper
|
|||||||
|
|
||||||
import com.typesafe.config.ConfigFactory
|
import com.typesafe.config.ConfigFactory
|
||||||
import com.typesafe.config.ConfigParseOptions
|
import com.typesafe.config.ConfigParseOptions
|
||||||
import net.corda.cliutils.CordaCliWrapper
|
import net.corda.cliutils.*
|
||||||
import net.corda.cliutils.ExitCodes
|
|
||||||
import net.corda.cliutils.printError
|
|
||||||
import net.corda.cliutils.start
|
|
||||||
import net.corda.common.configuration.parsing.internal.Configuration
|
import net.corda.common.configuration.parsing.internal.Configuration
|
||||||
import net.corda.core.internal.PLATFORM_VERSION
|
import net.corda.core.internal.PLATFORM_VERSION
|
||||||
import net.corda.core.internal.exists
|
import net.corda.core.internal.exists
|
||||||
import net.corda.nodeapi.internal.network.NetworkBootstrapper
|
import net.corda.nodeapi.internal.network.*
|
||||||
import net.corda.nodeapi.internal.network.NetworkBootstrapper.Companion.DEFAULT_MAX_MESSAGE_SIZE
|
import net.corda.nodeapi.internal.network.NetworkBootstrapper.Companion.DEFAULT_MAX_MESSAGE_SIZE
|
||||||
import net.corda.nodeapi.internal.network.NetworkBootstrapper.Companion.DEFAULT_MAX_TRANSACTION_SIZE
|
import net.corda.nodeapi.internal.network.NetworkBootstrapper.Companion.DEFAULT_MAX_TRANSACTION_SIZE
|
||||||
import net.corda.nodeapi.internal.network.NetworkBootstrapperWithOverridableParameters
|
|
||||||
import net.corda.nodeapi.internal.network.NetworkParametersOverrides
|
|
||||||
import picocli.CommandLine.Option
|
import picocli.CommandLine.Option
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@ -30,8 +25,11 @@ class NetworkBootstrapperRunner(private val bootstrapper: NetworkBootstrapperWit
|
|||||||
"It may also contain existing node directories."])
|
"It may also contain existing node directories."])
|
||||||
var dir: Path = Paths.get(".")
|
var dir: Path = Paths.get(".")
|
||||||
|
|
||||||
@Option(names = ["--no-copy"], description = ["""Don't copy the CorDapp JARs into the nodes' "cordapps" directories."""])
|
@Option(names = ["--no-copy"], hidden = true, description = ["""DEPRECATED. Don't copy the CorDapp JARs into the nodes' "cordapps" directories."""])
|
||||||
var noCopy: Boolean = false
|
var noCopy: Boolean? = null
|
||||||
|
|
||||||
|
@Option(names = ["--copy-cordapps"], description = ["Whether or not to copy the CorDapp JARs into the nodes' 'cordapps' directory. \${COMPLETION-CANDIDATES}"])
|
||||||
|
var copyCordapps: CopyCordapps = CopyCordapps.FirstRunOnly
|
||||||
|
|
||||||
@Option(names = ["--minimum-platform-version"], description = ["The minimum platform version to use in the network-parameters. Current default is $PLATFORM_VERSION."])
|
@Option(names = ["--minimum-platform-version"], description = ["The minimum platform version to use in the network-parameters. Current default is $PLATFORM_VERSION."])
|
||||||
var minimumPlatformVersion: Int? = null
|
var minimumPlatformVersion: Int? = null
|
||||||
@ -85,10 +83,14 @@ class NetworkBootstrapperRunner(private val bootstrapper: NetworkBootstrapperWit
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun runProgram(): Int {
|
override fun runProgram(): Int {
|
||||||
|
if (noCopy != null) {
|
||||||
|
printWarning("The --no-copy parameter has been deprecated and been replaced with the --copy-cordapps parameter.")
|
||||||
|
copyCordapps = if (noCopy == true) CopyCordapps.No else CopyCordapps.Yes
|
||||||
|
}
|
||||||
verifyInputs()
|
verifyInputs()
|
||||||
val networkParameterOverrides = getNetworkParametersOverrides().doOnErrors(::reportErrors).optional ?: return ExitCodes.FAILURE
|
val networkParameterOverrides = getNetworkParametersOverrides().doOnErrors(::reportErrors).optional ?: return ExitCodes.FAILURE
|
||||||
bootstrapper.bootstrap(dir.toAbsolutePath().normalize(),
|
bootstrapper.bootstrap(dir.toAbsolutePath().normalize(),
|
||||||
copyCordapps = !noCopy,
|
copyCordapps = copyCordapps,
|
||||||
networkParameterOverrides = networkParameterOverrides
|
networkParameterOverrides = networkParameterOverrides
|
||||||
)
|
)
|
||||||
return ExitCodes.SUCCESS
|
return ExitCodes.SUCCESS
|
||||||
|
@ -6,12 +6,11 @@ import net.corda.core.internal.copyTo
|
|||||||
import net.corda.core.internal.deleteRecursively
|
import net.corda.core.internal.deleteRecursively
|
||||||
import net.corda.core.internal.div
|
import net.corda.core.internal.div
|
||||||
import net.corda.core.utilities.days
|
import net.corda.core.utilities.days
|
||||||
|
import net.corda.nodeapi.internal.network.CopyCordapps
|
||||||
import net.corda.nodeapi.internal.network.NetworkBootstrapperWithOverridableParameters
|
import net.corda.nodeapi.internal.network.NetworkBootstrapperWithOverridableParameters
|
||||||
import net.corda.nodeapi.internal.network.NetworkParametersOverrides
|
import net.corda.nodeapi.internal.network.NetworkParametersOverrides
|
||||||
import net.corda.nodeapi.internal.network.PackageOwner
|
import net.corda.nodeapi.internal.network.PackageOwner
|
||||||
import net.corda.testing.core.ALICE_NAME
|
import net.corda.testing.core.ALICE_NAME
|
||||||
import net.corda.testing.core.BOB_NAME
|
|
||||||
import net.corda.testing.core.CHARLIE_NAME
|
|
||||||
import net.corda.testing.core.JarSignatureTestUtils.generateKey
|
import net.corda.testing.core.JarSignatureTestUtils.generateKey
|
||||||
import net.corda.testing.core.JarSignatureTestUtils.getPublicKey
|
import net.corda.testing.core.JarSignatureTestUtils.getPublicKey
|
||||||
import org.junit.*
|
import org.junit.*
|
||||||
@ -92,7 +91,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
fun `test when defaults are run bootstrapper is called correctly`() {
|
fun `test when defaults are run bootstrapper is called correctly`() {
|
||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides())
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides())
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -102,16 +101,25 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val tempDir = createTempDir()
|
val tempDir = createTempDir()
|
||||||
runner.dir = tempDir.toPath()
|
runner.dir = tempDir.toPath()
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(tempDir.toPath().toAbsolutePath().normalize(), true, NetworkParametersOverrides())
|
verify(mockBootstrapper).bootstrap(tempDir.toPath().toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides())
|
||||||
|
assertEquals(0, exitCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test when no copy flag is specified it is passed through to the bootstrapper`() {
|
||||||
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
|
runner.noCopy = true
|
||||||
|
val exitCode = runner.runProgram()
|
||||||
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.No, NetworkParametersOverrides())
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `test when copy cordapps is specified it is passed through to the bootstrapper`() {
|
fun `test when copy cordapps is specified it is passed through to the bootstrapper`() {
|
||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
runner.noCopy = true
|
runner.copyCordapps = CopyCordapps.No
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), false, NetworkParametersOverrides())
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.No, NetworkParametersOverrides())
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -120,7 +128,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
runner.minimumPlatformVersion = 1
|
runner.minimumPlatformVersion = 1
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(minimumPlatformVersion = 1))
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(minimumPlatformVersion = 1))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +145,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
runner.maxMessageSize = 1
|
runner.maxMessageSize = 1
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(maxMessageSize = 1))
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(maxMessageSize = 1))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,7 +162,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
runner.maxTransactionSize = 1
|
runner.maxTransactionSize = 1
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(maxTransactionSize = 1))
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(maxTransactionSize = 1))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +179,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val (runner, mockBootstrapper) = getRunner()
|
val (runner, mockBootstrapper) = getRunner()
|
||||||
runner.eventHorizon = 7.days
|
runner.eventHorizon = 7.days
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(eventHorizon = 7.days))
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(eventHorizon = 7.days))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -189,7 +197,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val conf = correctNetworkFile.copyToTestDir()
|
val conf = correctNetworkFile.copyToTestDir()
|
||||||
runner.networkParametersFile = conf
|
runner.networkParametersFile = conf
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(
|
||||||
maxMessageSize = 10000,
|
maxMessageSize = 10000,
|
||||||
maxTransactionSize = 2000,
|
maxTransactionSize = 2000,
|
||||||
eventHorizon = 5.days,
|
eventHorizon = 5.days,
|
||||||
@ -204,7 +212,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val conf = aliceConfigFile.copyToTestDir()
|
val conf = aliceConfigFile.copyToTestDir()
|
||||||
runner.networkParametersFile = conf
|
runner.networkParametersFile = conf
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(
|
||||||
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKey))
|
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKey))
|
||||||
))
|
))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
@ -216,7 +224,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val conf = aliceConfigFile.copyToTestDir(dirAliceEC)
|
val conf = aliceConfigFile.copyToTestDir(dirAliceEC)
|
||||||
runner.networkParametersFile = conf
|
runner.networkParametersFile = conf
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(
|
||||||
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKeyEC))
|
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKeyEC))
|
||||||
))
|
))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
@ -228,7 +236,7 @@ class NetworkBootstrapperRunnerTests {
|
|||||||
val conf = aliceConfigFile.copyToTestDir(dirAliceDSA)
|
val conf = aliceConfigFile.copyToTestDir(dirAliceDSA)
|
||||||
runner.networkParametersFile = conf
|
runner.networkParametersFile = conf
|
||||||
val exitCode = runner.runProgram()
|
val exitCode = runner.runProgram()
|
||||||
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), true, NetworkParametersOverrides(
|
verify(mockBootstrapper).bootstrap(Paths.get(".").toAbsolutePath().normalize(), CopyCordapps.FirstRunOnly, NetworkParametersOverrides(
|
||||||
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKeyDSA))
|
packageOwnership = listOf(PackageOwner("com.example.stuff", publicKey = alicePublicKeyDSA))
|
||||||
))
|
))
|
||||||
assertEquals(0, exitCode)
|
assertEquals(0, exitCode)
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
- "DEBUG"
|
- "DEBUG"
|
||||||
- "TRACE"
|
- "TRACE"
|
||||||
- parameterName: "--no-copy"
|
- parameterName: "--no-copy"
|
||||||
parameterType: "boolean"
|
parameterType: "java.lang.Boolean"
|
||||||
required: false
|
required: false
|
||||||
multiParam: false
|
multiParam: false
|
||||||
acceptableValues: []
|
acceptableValues: []
|
||||||
|
Loading…
x
Reference in New Issue
Block a user