mirror of
https://github.com/corda/corda.git
synced 2025-06-19 07:38:22 +00:00
CORDA-2150 Contract version no downgrade check - add test infrastructure - internalDriver can sign CorDapp JAR, disabled by default (#4289)
This commit is contained in:
@ -344,7 +344,8 @@ fun <A> driver(defaultParameters: DriverParameters = DriverParameters(), dsl: Dr
|
|||||||
networkParameters = defaultParameters.networkParameters,
|
networkParameters = defaultParameters.networkParameters,
|
||||||
notaryCustomOverrides = defaultParameters.notaryCustomOverrides,
|
notaryCustomOverrides = defaultParameters.notaryCustomOverrides,
|
||||||
inMemoryDB = defaultParameters.inMemoryDB,
|
inMemoryDB = defaultParameters.inMemoryDB,
|
||||||
cordappsForAllNodes = defaultParameters.cordappsForAllNodes()
|
cordappsForAllNodes = defaultParameters.cordappsForAllNodes(),
|
||||||
|
signCordapps = false
|
||||||
),
|
),
|
||||||
coerce = { it },
|
coerce = { it },
|
||||||
dsl = dsl,
|
dsl = dsl,
|
||||||
|
@ -94,7 +94,8 @@ class DriverDSLImpl(
|
|||||||
val networkParameters: NetworkParameters,
|
val networkParameters: NetworkParameters,
|
||||||
val notaryCustomOverrides: Map<String, Any?>,
|
val notaryCustomOverrides: Map<String, Any?>,
|
||||||
val inMemoryDB: Boolean,
|
val inMemoryDB: Boolean,
|
||||||
val cordappsForAllNodes: Collection<TestCordapp>
|
val cordappsForAllNodes: Collection<TestCordapp>,
|
||||||
|
val signCordapps: Boolean
|
||||||
) : InternalDriverDSL {
|
) : InternalDriverDSL {
|
||||||
|
|
||||||
private var _executorService: ScheduledExecutorService? = null
|
private var _executorService: ScheduledExecutorService? = null
|
||||||
@ -234,7 +235,7 @@ class DriverDSLImpl(
|
|||||||
return registrationFuture.flatMap {
|
return registrationFuture.flatMap {
|
||||||
networkMapAvailability.flatMap {
|
networkMapAvailability.flatMap {
|
||||||
// But starting the node proper does require the network map
|
// But starting the node proper does require the network map
|
||||||
startRegisteredNode(name, it, rpcUsers, verifierType, customOverrides, startInSameProcess, maximumHeapSize, p2pAddress, additionalCordapps, regenerateCordappsOnStart, flowOverrides)
|
startRegisteredNode(name, it, rpcUsers, verifierType, customOverrides, startInSameProcess, maximumHeapSize, p2pAddress, additionalCordapps, regenerateCordappsOnStart, flowOverrides, signCordapps)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,7 +250,8 @@ class DriverDSLImpl(
|
|||||||
p2pAddress: NetworkHostAndPort = portAllocation.nextHostAndPort(),
|
p2pAddress: NetworkHostAndPort = portAllocation.nextHostAndPort(),
|
||||||
additionalCordapps: Collection<TestCordapp> = emptySet(),
|
additionalCordapps: Collection<TestCordapp> = emptySet(),
|
||||||
regenerateCordappsOnStart: Boolean = false,
|
regenerateCordappsOnStart: Boolean = false,
|
||||||
flowOverrides: Map<out Class<out FlowLogic<*>>, Class<out FlowLogic<*>>> = emptyMap()): CordaFuture<NodeHandle> {
|
flowOverrides: Map<out Class<out FlowLogic<*>>, Class<out FlowLogic<*>>> = emptyMap(),
|
||||||
|
signCordapps: Boolean = false): CordaFuture<NodeHandle> {
|
||||||
val rpcAddress = portAllocation.nextHostAndPort()
|
val rpcAddress = portAllocation.nextHostAndPort()
|
||||||
val rpcAdminAddress = portAllocation.nextHostAndPort()
|
val rpcAdminAddress = portAllocation.nextHostAndPort()
|
||||||
val webAddress = portAllocation.nextHostAndPort()
|
val webAddress = portAllocation.nextHostAndPort()
|
||||||
@ -279,7 +281,7 @@ class DriverDSLImpl(
|
|||||||
allowMissingConfig = true,
|
allowMissingConfig = true,
|
||||||
configOverrides = if (overrides.hasPath("devMode")) overrides else overrides + mapOf("devMode" to true)
|
configOverrides = if (overrides.hasPath("devMode")) overrides else overrides + mapOf("devMode" to true)
|
||||||
)).checkAndOverrideForInMemoryDB()
|
)).checkAndOverrideForInMemoryDB()
|
||||||
return startNodeInternal(config, webAddress, startInSameProcess, maximumHeapSize, localNetworkMap, additionalCordapps, regenerateCordappsOnStart)
|
return startNodeInternal(config, webAddress, startInSameProcess, maximumHeapSize, localNetworkMap, additionalCordapps, regenerateCordappsOnStart, signCordapps)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startNodeRegistration(
|
private fun startNodeRegistration(
|
||||||
@ -583,7 +585,8 @@ class DriverDSLImpl(
|
|||||||
maximumHeapSize: String,
|
maximumHeapSize: String,
|
||||||
localNetworkMap: LocalNetworkMap?,
|
localNetworkMap: LocalNetworkMap?,
|
||||||
additionalCordapps: Collection<TestCordapp>,
|
additionalCordapps: Collection<TestCordapp>,
|
||||||
regenerateCordappsOnStart: Boolean = false): CordaFuture<NodeHandle> {
|
regenerateCordappsOnStart: Boolean = false,
|
||||||
|
signCordapps: Boolean = false): CordaFuture<NodeHandle> {
|
||||||
val visibilityHandle = networkVisibilityController.register(specifiedConfig.corda.myLegalName)
|
val visibilityHandle = networkVisibilityController.register(specifiedConfig.corda.myLegalName)
|
||||||
val baseDirectory = specifiedConfig.corda.baseDirectory.createDirectories()
|
val baseDirectory = specifiedConfig.corda.baseDirectory.createDirectories()
|
||||||
localNetworkMap?.networkParametersCopier?.install(baseDirectory)
|
localNetworkMap?.networkParametersCopier?.install(baseDirectory)
|
||||||
@ -609,7 +612,7 @@ class DriverDSLImpl(
|
|||||||
val appOverrides = additionalCordapps.map { it.name to it.version}.toSet()
|
val appOverrides = additionalCordapps.map { it.name to it.version}.toSet()
|
||||||
val baseCordapps = cordappsForAllNodes.filter { !appOverrides.contains(it.name to it.version) }
|
val baseCordapps = cordappsForAllNodes.filter { !appOverrides.contains(it.name to it.version) }
|
||||||
|
|
||||||
val cordappDirectories = existingCorDappDirectoriesOption + (baseCordapps + additionalCordapps).map { TestCordappDirectories.getJarDirectory(it).toString() }
|
val cordappDirectories = existingCorDappDirectoriesOption + (baseCordapps + additionalCordapps).map { TestCordappDirectories.getJarDirectory(it, signJar = signCordapps).toString() }
|
||||||
|
|
||||||
val config = NodeConfig(specifiedConfig.typesafe.withValue(NodeConfiguration.cordappDirectoriesKey, ConfigValueFactory.fromIterable(cordappDirectories.toSet())))
|
val config = NodeConfig(specifiedConfig.typesafe.withValue(NodeConfiguration.cordappDirectoriesKey, ConfigValueFactory.fromIterable(cordappDirectories.toSet())))
|
||||||
|
|
||||||
@ -1059,7 +1062,8 @@ fun <DI : DriverDSL, D : InternalDriverDSL, A> genericDriver(
|
|||||||
networkParameters = defaultParameters.networkParameters,
|
networkParameters = defaultParameters.networkParameters,
|
||||||
notaryCustomOverrides = defaultParameters.notaryCustomOverrides,
|
notaryCustomOverrides = defaultParameters.notaryCustomOverrides,
|
||||||
inMemoryDB = defaultParameters.inMemoryDB,
|
inMemoryDB = defaultParameters.inMemoryDB,
|
||||||
cordappsForAllNodes = defaultParameters.cordappsForAllNodes()
|
cordappsForAllNodes = defaultParameters.cordappsForAllNodes(),
|
||||||
|
signCordapps = false
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
val shutdownHook = addShutdownHook(driverDsl::shutdown)
|
val shutdownHook = addShutdownHook(driverDsl::shutdown)
|
||||||
@ -1153,6 +1157,7 @@ fun <A> internalDriver(
|
|||||||
notaryCustomOverrides: Map<String, Any?> = DriverParameters().notaryCustomOverrides,
|
notaryCustomOverrides: Map<String, Any?> = DriverParameters().notaryCustomOverrides,
|
||||||
inMemoryDB: Boolean = DriverParameters().inMemoryDB,
|
inMemoryDB: Boolean = DriverParameters().inMemoryDB,
|
||||||
cordappsForAllNodes: Collection<TestCordapp> = DriverParameters().cordappsForAllNodes(),
|
cordappsForAllNodes: Collection<TestCordapp> = DriverParameters().cordappsForAllNodes(),
|
||||||
|
signCordapps: Boolean = false,
|
||||||
dsl: DriverDSLImpl.() -> A
|
dsl: DriverDSLImpl.() -> A
|
||||||
): A {
|
): A {
|
||||||
return genericDriver(
|
return genericDriver(
|
||||||
@ -1171,7 +1176,8 @@ fun <A> internalDriver(
|
|||||||
networkParameters = networkParameters,
|
networkParameters = networkParameters,
|
||||||
notaryCustomOverrides = notaryCustomOverrides,
|
notaryCustomOverrides = notaryCustomOverrides,
|
||||||
inMemoryDB = inMemoryDB,
|
inMemoryDB = inMemoryDB,
|
||||||
cordappsForAllNodes = cordappsForAllNodes
|
cordappsForAllNodes = cordappsForAllNodes,
|
||||||
|
signCordapps = signCordapps
|
||||||
),
|
),
|
||||||
coerce = { it },
|
coerce = { it },
|
||||||
dsl = dsl,
|
dsl = dsl,
|
||||||
|
@ -140,7 +140,8 @@ fun <A> rpcDriver(
|
|||||||
networkParameters = networkParameters,
|
networkParameters = networkParameters,
|
||||||
notaryCustomOverrides = notaryCustomOverrides,
|
notaryCustomOverrides = notaryCustomOverrides,
|
||||||
inMemoryDB = inMemoryDB,
|
inMemoryDB = inMemoryDB,
|
||||||
cordappsForAllNodes = cordappsForAllNodes
|
cordappsForAllNodes = cordappsForAllNodes,
|
||||||
|
signCordapps = false
|
||||||
), externalTrace
|
), externalTrace
|
||||||
),
|
),
|
||||||
coerce = { it },
|
coerce = { it },
|
||||||
|
@ -2,12 +2,11 @@ package net.corda.testing.node.internal
|
|||||||
|
|
||||||
import com.typesafe.config.ConfigValueFactory
|
import com.typesafe.config.ConfigValueFactory
|
||||||
import net.corda.core.crypto.sha256
|
import net.corda.core.crypto.sha256
|
||||||
import net.corda.core.internal.createDirectories
|
import net.corda.core.internal.*
|
||||||
import net.corda.core.internal.deleteRecursively
|
|
||||||
import net.corda.core.internal.div
|
|
||||||
import net.corda.core.internal.writeText
|
|
||||||
import net.corda.core.utilities.debug
|
import net.corda.core.utilities.debug
|
||||||
import net.corda.core.utilities.loggerFor
|
import net.corda.core.utilities.loggerFor
|
||||||
|
import net.corda.testing.core.JarSignatureTestUtils.signJar
|
||||||
|
import net.corda.testing.core.JarSignatureTestUtils.generateKey
|
||||||
import net.corda.testing.node.TestCordapp
|
import net.corda.testing.node.TestCordapp
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
@ -21,7 +20,8 @@ object TestCordappDirectories {
|
|||||||
|
|
||||||
private val testCordappsCache = ConcurrentHashMap<TestCordappImpl, Path>()
|
private val testCordappsCache = ConcurrentHashMap<TestCordappImpl, Path>()
|
||||||
|
|
||||||
fun getJarDirectory(cordapp: TestCordapp, cordappsDirectory: Path = defaultCordappsDirectory): Path {
|
//TODO In future, we may wish to associate a signer attribute to TestCordapp interface itself, and trigger signing from that.
|
||||||
|
fun getJarDirectory(cordapp: TestCordapp, cordappsDirectory: Path = defaultCordappsDirectory, signJar: Boolean = false): Path {
|
||||||
cordapp as TestCordappImpl
|
cordapp as TestCordappImpl
|
||||||
return testCordappsCache.computeIfAbsent(cordapp) {
|
return testCordappsCache.computeIfAbsent(cordapp) {
|
||||||
val configString = ConfigValueFactory.fromMap(cordapp.config).toConfig().root().render()
|
val configString = ConfigValueFactory.fromMap(cordapp.config).toConfig().root().render()
|
||||||
@ -37,6 +37,17 @@ object TestCordappDirectories {
|
|||||||
val configDir = (cordappDir / "config").createDirectories()
|
val configDir = (cordappDir / "config").createDirectories()
|
||||||
val jarFile = cordappDir / "$filename.jar"
|
val jarFile = cordappDir / "$filename.jar"
|
||||||
cordapp.packageAsJar(jarFile)
|
cordapp.packageAsJar(jarFile)
|
||||||
|
//TODO in future we may extend the signing with user-defined key-stores/certs/keys.
|
||||||
|
if (signJar) {
|
||||||
|
val testKeystore = "_teststore"
|
||||||
|
val alias = "Test"
|
||||||
|
val pwd = "secret!"
|
||||||
|
if (!(cordappsDirectory / testKeystore).exists()) {
|
||||||
|
cordappsDirectory.generateKey(alias, pwd, "O=Test Company Ltd,OU=Test,L=London,C=GB")
|
||||||
|
}
|
||||||
|
(cordappsDirectory / testKeystore).copyTo(cordappDir / testKeystore)
|
||||||
|
cordappDir.signJar("$filename.jar", alias, pwd)
|
||||||
|
}
|
||||||
(configDir / "$filename.conf").writeText(configString)
|
(configDir / "$filename.conf").writeText(configString)
|
||||||
logger.debug { "$cordapp packaged into $jarFile" }
|
logger.debug { "$cordapp packaged into $jarFile" }
|
||||||
cordappDir
|
cordappDir
|
||||||
|
Reference in New Issue
Block a user