From c9f3e98795983330548282f58052dc3fa3d005ed Mon Sep 17 00:00:00 2001 From: Katarzyna Streich Date: Thu, 30 Nov 2017 10:39:29 +0000 Subject: [PATCH] Another approach to fixing deployNodes task and network parameters generation (#2066) * Generate networkParameteres for Cordformation. Fix deployNodes task in Cordformation to generate NetworkParameters before running the nodes. Add TestNetworkParametersGenerator utility loaded after node infos generation step. * Get rid of bouncy castle provider dependency For cordform-common. It caused problems with loading our custom X509EdDSAEngine for generation of network parameters in deployNodes task. --- constants.properties | 2 +- gradle-plugins/cordform-common/build.gradle | 3 - .../net/corda/cordform/CordformContext.java | 1 - .../cordform/NetworkParametersGenerator.java | 16 +++ .../main/kotlin/net/corda/plugins/Cordform.kt | 42 +++++-- .../src/main/kotlin/net/corda/plugins/Node.kt | 52 ++------ .../internal/NetworkParametersCopier.kt | 2 +- .../TestNetworkParametersGenerator.kt | 115 ++++++++++++++++++ .../node/services/BFTNotaryServiceTests.kt | 2 +- .../net/corda/node/internal/AbstractNode.kt | 1 + .../services/messaging/RPCMessagingClient.kt | 1 + samples/irs-demo/cordapp/build.gradle | 2 +- .../net/corda/test/spring/SpringDriver.kt | 2 +- .../kotlin/net/corda/testing/driver/Driver.kt | 2 +- .../corda/testing/internal/NodeBasedTest.kt | 2 +- .../kotlin/net/corda/testing/node/MockNode.kt | 2 +- .../net/corda/smoketesting/NodeProcess.kt | 2 +- 17 files changed, 185 insertions(+), 64 deletions(-) create mode 100644 gradle-plugins/cordform-common/src/main/java/net/corda/cordform/NetworkParametersGenerator.java rename {testing/test-common/src/main/kotlin/net/corda/testing/common => node-api/src/main/kotlin/net/corda/nodeapi}/internal/NetworkParametersCopier.kt (96%) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/TestNetworkParametersGenerator.kt diff --git a/constants.properties b/constants.properties index f278032d63..6e842b67ca 100644 --- a/constants.properties +++ b/constants.properties @@ -1,4 +1,4 @@ -gradlePluginsVersion=2.0.9 +gradlePluginsVersion=3.0.0-NETWORKMAP kotlinVersion=1.1.60 guavaVersion=21.0 bouncycastleVersion=1.57 diff --git a/gradle-plugins/cordform-common/build.gradle b/gradle-plugins/cordform-common/build.gradle index 82274e0d09..2c848cbbdb 100644 --- a/gradle-plugins/cordform-common/build.gradle +++ b/gradle-plugins/cordform-common/build.gradle @@ -13,9 +13,6 @@ group 'net.corda.plugins' dependencies { // TypeSafe Config: for simple and human friendly config files. compile "com.typesafe:config:$typesafe_config_version" - - // Bouncy Castle: for X.500 distinguished name manipulation - compile "org.bouncycastle:bcprov-jdk15on:$bouncycastle_version" } publish { diff --git a/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/CordformContext.java b/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/CordformContext.java index 06d4375659..7687f68a11 100644 --- a/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/CordformContext.java +++ b/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/CordformContext.java @@ -1,6 +1,5 @@ package net.corda.cordform; -import org.bouncycastle.asn1.x500.X500Name; import java.nio.file.Path; public interface CordformContext { diff --git a/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/NetworkParametersGenerator.java b/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/NetworkParametersGenerator.java new file mode 100644 index 0000000000..7a8869288f --- /dev/null +++ b/gradle-plugins/cordform-common/src/main/java/net/corda/cordform/NetworkParametersGenerator.java @@ -0,0 +1,16 @@ +package net.corda.cordform; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +public interface NetworkParametersGenerator { + /** + * Run generation of network parameters for [Cordformation]. Nodes need to have already their own [NodeInfo] files in their + * base directories, these files will be used to extract notary identities. + * + * @param nodesDirs - nodes directories that will be used for network parameters generation. Network parameters + * file will be dropped into each directory on this list. + */ + void run(List nodesDirs); +} \ No newline at end of file diff --git a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt index 057b1861b5..604caa315b 100644 --- a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt +++ b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Cordform.kt @@ -3,15 +3,14 @@ package net.corda.plugins import groovy.lang.Closure import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformNode +import net.corda.cordform.NetworkParametersGenerator import org.apache.tools.ant.filters.FixCrLfFilter import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME import org.gradle.api.tasks.TaskAction -import java.io.File import java.net.URLClassLoader -import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths import java.util.concurrent.TimeUnit @@ -28,6 +27,7 @@ open class Cordform : DefaultTask() { */ @Suppress("MemberVisibilityCanPrivate") var definitionClass: String? = null + private val networkParametersGenClass: String = "net.corda.nodeapi.internal.TestNetworkParametersGenerator" private var directory = Paths.get("build", "nodes") private val nodes = mutableListOf() @@ -113,6 +113,19 @@ open class Cordform : DefaultTask() { .newInstance() } + /** + * The parametersGenerator needn't be compiled until just before our build method, so we load it manually via sourceSets.main.runtimeClasspath. + */ + private fun loadParametersGenerator(): NetworkParametersGenerator { + val plugin = project.convention.getPlugin(JavaPluginConvention::class.java) + val classpath = plugin.sourceSets.getByName(MAIN_SOURCE_SET_NAME).runtimeClasspath + val urls = classpath.files.map { it.toURI().toURL() }.toTypedArray() + return URLClassLoader(urls, NetworkParametersGenerator::class.java.classLoader) + .loadClass(networkParametersGenClass) + .asSubclass(NetworkParametersGenerator::class.java) + .newInstance() + } + /** * This task action will create and install the nodes based on the node configurations added. */ @@ -124,6 +137,7 @@ open class Cordform : DefaultTask() { installRunScript() nodes.forEach(Node::build) generateAndInstallNodeInfos() + generateAndInstallNetworkParameters() } private fun initializeConfiguration() { @@ -142,6 +156,12 @@ open class Cordform : DefaultTask() { } } + private fun generateAndInstallNetworkParameters() { + project.logger.info("Generating and installing network parameters") + val networkParamsGenerator = loadParametersGenerator() + networkParamsGenerator.run(nodes.map { it.fullPath() }) + } + private fun generateAndInstallNodeInfos() { generateNodeInfos() installNodeInfos() @@ -149,7 +169,7 @@ open class Cordform : DefaultTask() { private fun generateNodeInfos() { project.logger.info("Generating node infos") - var nodeProcesses = buildNodeProcesses() + val nodeProcesses = buildNodeProcesses() try { validateNodeProcessess(nodeProcesses) } finally { @@ -158,9 +178,10 @@ open class Cordform : DefaultTask() { } private fun buildNodeProcesses(): Map { - return nodes - .map { buildNodeProcess(it) } - .toMap() + val command = generateNodeInfoCommand() + return nodes.map { + it.makeLogDirectory() + buildProcess(it, command, "generate-info.log") }.toMap() } private fun validateNodeProcessess(nodeProcesses: Map) { @@ -175,14 +196,13 @@ open class Cordform : DefaultTask() { } } - private fun buildNodeProcess(node: Node): Pair { - node.makeLogDirectory() - var process = ProcessBuilder(generateNodeInfoCommand()) + private fun buildProcess(node: Node, command: List, logFile: String): Pair { + val process = ProcessBuilder(command) .directory(node.fullPath().toFile()) .redirectErrorStream(true) // InheritIO causes hangs on windows due the gradle buffer also not being flushed. // Must redirect to output or logger (node log is still written, this is just startup banner) - .redirectOutput(node.logFile().toFile()) + .redirectOutput(node.logFile(logFile).toFile()) .addEnvironment("CAPSULE_CACHE_DIR", Node.capsuleCacheDir) .start() return Pair(node, process) @@ -224,6 +244,6 @@ open class Cordform : DefaultTask() { } } } - private fun Node.logFile(): Path = this.logDirectory().resolve("generate-info.log") + private fun Node.logFile(name: String): Path = this.logDirectory().resolve(name) private fun ProcessBuilder.addEnvironment(key: String, value: String) = this.apply { environment().put(key, value) } } diff --git a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Node.kt b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Node.kt index 9358a293b5..bf0a08be14 100644 --- a/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Node.kt +++ b/gradle-plugins/cordformation/src/main/kotlin/net/corda/plugins/Node.kt @@ -2,9 +2,6 @@ package net.corda.plugins import com.typesafe.config.* import net.corda.cordform.CordformNode -import org.bouncycastle.asn1.x500.X500Name -import org.bouncycastle.asn1.x500.RDN -import org.bouncycastle.asn1.x500.style.BCStyle import org.gradle.api.Project import java.io.File import java.nio.charset.StandardCharsets @@ -122,18 +119,10 @@ class Node(private val project: Project) : CordformNode() { project.logger.error("Node has a null name - cannot create node") throw IllegalStateException("Node has a null name - cannot create node") } - - val dirName = try { - val o = X500Name(name).getRDNs(BCStyle.O) - if (o.size > 0) { - o.first().first.value.toString() - } else { - name - } - } catch(_ : IllegalArgumentException) { - // Can't parse as an X500 name, use the full string - name - } + // Parsing O= part directly because importing BouncyCastle provider in Cordformation causes problems + // with loading our custom X509EdDSAEngine. + val organizationName = name.trim().split(",").firstOrNull { it.startsWith("O=") }?.substringAfter("=") + val dirName = organizationName ?: name nodeDir = File(rootDir.toFile(), dirName) } @@ -151,7 +140,7 @@ class Node(private val project: Project) : CordformNode() { * Installs the corda fat JAR to the node directory. */ private fun installCordaJar() { - val cordaJar = verifyAndGetCordaJar() + val cordaJar = verifyAndGetRuntimeJar("corda") project.copy { it.apply { from(cordaJar) @@ -166,7 +155,7 @@ class Node(private val project: Project) : CordformNode() { * Installs the corda webserver JAR to the node directory */ private fun installWebserverJar() { - val webJar = verifyAndGetWebserverJar() + val webJar = verifyAndGetRuntimeJar("corda-webserver") project.copy { it.apply { from(webJar) @@ -250,34 +239,17 @@ class Node(private val project: Project) : CordformNode() { } /** - * Find the corda JAR amongst the dependencies. + * Find the given JAR amongst the dependencies + * @param jarName JAR name without the version part, for example for corda-2.0-SNAPSHOT.jar provide only "corda" as jarName * - * @return A file representing the Corda JAR. + * @return A file representing found JAR */ - private fun verifyAndGetCordaJar(): File { - val maybeCordaJAR = project.configuration("runtime").filter { - it.toString().contains("corda-$releaseVersion.jar") || it.toString().contains("corda-enterprise-$releaseVersion.jar") - } - if (maybeCordaJAR.isEmpty) { - throw RuntimeException("No Corda Capsule JAR found. Have you deployed the Corda project to Maven? Looked for \"corda-$releaseVersion.jar\"") - } else { - val cordaJar = maybeCordaJAR.singleFile - assert(cordaJar.isFile) - return cordaJar - } - } - - /** - * Find the corda JAR amongst the dependencies - * - * @return A file representing the Corda webserver JAR - */ - private fun verifyAndGetWebserverJar(): File { + private fun verifyAndGetRuntimeJar(jarName: String): File { val maybeJar = project.configuration("runtime").filter { - it.toString().contains("corda-webserver-$releaseVersion.jar") + "$jarName-$releaseVersion.jar" in it.toString() || "$jarName-enterprise-$releaseVersion.jar" in it.toString() } if (maybeJar.isEmpty) { - throw RuntimeException("No Corda Webserver JAR found. Have you deployed the Corda project to Maven? Looked for \"corda-webserver-$releaseVersion.jar\"") + throw IllegalStateException("No $jarName JAR found. Have you deployed the Corda project to Maven? Looked for \"$jarName-$releaseVersion.jar\"") } else { val jar = maybeJar.singleFile assert(jar.isFile) diff --git a/testing/test-common/src/main/kotlin/net/corda/testing/common/internal/NetworkParametersCopier.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/NetworkParametersCopier.kt similarity index 96% rename from testing/test-common/src/main/kotlin/net/corda/testing/common/internal/NetworkParametersCopier.kt rename to node-api/src/main/kotlin/net/corda/nodeapi/internal/NetworkParametersCopier.kt index f8a8d26952..d464575a4f 100644 --- a/testing/test-common/src/main/kotlin/net/corda/testing/common/internal/NetworkParametersCopier.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/NetworkParametersCopier.kt @@ -1,4 +1,4 @@ -package net.corda.testing.common.internal +package net.corda.nodeapi.internal import net.corda.core.crypto.SignedData import net.corda.core.crypto.entropyToKeyPair diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/TestNetworkParametersGenerator.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/TestNetworkParametersGenerator.kt new file mode 100644 index 0000000000..cfdf9b83a3 --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/TestNetworkParametersGenerator.kt @@ -0,0 +1,115 @@ +package net.corda.nodeapi.internal + +import com.typesafe.config.ConfigFactory +import net.corda.cordform.CordformNode +import net.corda.cordform.NetworkParametersGenerator +import net.corda.core.crypto.SignedData +import net.corda.core.identity.CordaX500Name +import net.corda.core.internal.div +import net.corda.core.internal.list +import net.corda.core.internal.readAll +import net.corda.core.node.NodeInfo +import net.corda.core.serialization.SerializationContext +import net.corda.core.serialization.deserialize +import net.corda.core.serialization.internal.SerializationEnvironmentImpl +import net.corda.core.serialization.internal._contextSerializationEnv +import net.corda.core.utilities.ByteSequence +import net.corda.core.utilities.contextLogger +import net.corda.core.utilities.days +import net.corda.nodeapi.internal.serialization.* +import net.corda.nodeapi.internal.serialization.amqp.AMQPServerSerializationScheme +import net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme +import net.corda.nodeapi.internal.serialization.kryo.KryoHeaderV0_1 +import java.nio.file.Path +import java.time.Instant +import kotlin.streams.toList + +// This class is used by deployNodes task to generate NetworkParameters in [Cordformation]. +@Suppress("UNUSED") +class TestNetworkParametersGenerator : NetworkParametersGenerator { + companion object { + private val logger = contextLogger() + } + + override fun run(nodesDirs: List) { + logger.info("NetworkParameters generation using node directories: $nodesDirs") + try { + initialiseSerialization() + val notaryInfos = loadAndGatherNotaryIdentities(nodesDirs) + val copier = NetworkParametersCopier(NetworkParameters( + minimumPlatformVersion = 1, + notaries = notaryInfos, + modifiedTime = Instant.now(), + eventHorizon = 10000.days, + maxMessageSize = 40000, + maxTransactionSize = 40000, + epoch = 1 + )) + nodesDirs.forEach { copier.install(it) } + } finally { + _contextSerializationEnv.set(null) + } + } + + private fun loadAndGatherNotaryIdentities(nodesDirs: List): List { + val infos = getAllNodeInfos(nodesDirs) + val configs = nodesDirs.map { ConfigFactory.parseFile((it / "node.conf").toFile()) } + val notaryConfigs = configs.filter { it.hasPath("notary") } + val notaries = notaryConfigs.associateBy( + { CordaX500Name.parse(it.getString("myLegalName")) }, + { it.getConfig("notary").getBoolean("validating") } + ) + // Now get the notary identities based on names passed from configs. There is one problem, for distributed notaries + // in config we specify only node's main name, the notary identity isn't passed there. It's read from keystore on + // node startup, so we have to look it up from node info as a second identity, which is ugly. + return infos.mapNotNull { + info -> notaries[info.legalIdentities[0].name]?.let { NotaryInfo(info.notaryIdentity(), it) } + }.distinct() + } + + /** + * Loads latest NodeInfo files stored in node's base directory. + * Scans main directory and [CordformNode.NODE_INFO_DIRECTORY]. + * Signatures are checked before returning a value. The latest value stored for a given name is returned. + * + * @return list of latest [NodeInfo]s + */ + private fun getAllNodeInfos(nodesDirs: List): List { + val nodeInfoFiles = nodesDirs.map { dir -> dir.list { it.filter { "nodeInfo-" in it.toString() }.toList()[0] } } // We take the first one only + return nodeInfoFiles.mapNotNull { processFile(it) } + } + + private fun processFile(file: Path): NodeInfo? { + return try { + logger.info("Reading NodeInfo from file: $file") + val signedData = file.readAll().deserialize>() + signedData.verified() + } catch (e: Exception) { + logger.warn("Exception parsing NodeInfo from file. $file", e) + null + } + } + + private fun NodeInfo.notaryIdentity() = if (legalIdentities.size == 2) legalIdentities[1] else legalIdentities[0] + + // We need to to set serialization env, because generation of parameters is run from Cordform. + // KryoServerSerializationScheme is not accessible from nodeapi. + private fun initialiseSerialization() { + val context = if (java.lang.Boolean.getBoolean("net.corda.testing.amqp.enable")) AMQP_P2P_CONTEXT else KRYO_P2P_CONTEXT + _contextSerializationEnv.set(SerializationEnvironmentImpl( + SerializationFactoryImpl().apply { + registerScheme(KryoParametersSerializationScheme) + registerScheme(AMQPServerSerializationScheme()) + }, + context)) + } + + private object KryoParametersSerializationScheme : AbstractKryoSerializationScheme() { + override fun canDeserializeVersion(byteSequence: ByteSequence, target: SerializationContext.UseCase): Boolean { + return byteSequence == KryoHeaderV0_1 && target == SerializationContext.UseCase.P2P + } + + override fun rpcClientKryoPool(context: SerializationContext) = throw UnsupportedOperationException() + override fun rpcServerKryoPool(context: SerializationContext) = throw UnsupportedOperationException() + } +} diff --git a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt index 441cb780e5..a09fb0048e 100644 --- a/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt +++ b/node/src/integration-test/kotlin/net/corda/node/services/BFTNotaryServiceTests.kt @@ -27,7 +27,7 @@ import net.corda.node.services.transactions.minCorrectReplicas import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.nodeapi.internal.NotaryInfo import net.corda.testing.chooseIdentity -import net.corda.testing.common.internal.NetworkParametersCopier +import net.corda.nodeapi.internal.NetworkParametersCopier import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.contracts.DummyContract import net.corda.testing.dummyCommand 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 2066b43a94..0cdfaaa4bd 100644 --- a/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt +++ b/node/src/main/kotlin/net/corda/node/internal/AbstractNode.kt @@ -63,6 +63,7 @@ import org.apache.activemq.artemis.utils.ReusableLatch import org.slf4j.Logger import rx.Observable import java.io.IOException +import java.io.NotSerializableException import java.lang.reflect.InvocationTargetException import java.security.KeyPair import java.security.KeyStoreException diff --git a/node/src/main/kotlin/net/corda/node/services/messaging/RPCMessagingClient.kt b/node/src/main/kotlin/net/corda/node/services/messaging/RPCMessagingClient.kt index c7033b6baf..aa9fea626c 100644 --- a/node/src/main/kotlin/net/corda/node/services/messaging/RPCMessagingClient.kt +++ b/node/src/main/kotlin/net/corda/node/services/messaging/RPCMessagingClient.kt @@ -27,6 +27,7 @@ class RPCMessagingClient(private val config: SSLConfiguration, serverAddress: Ne } fun stop() = synchronized(this) { + rpcServer?.close() artemis.stop() } } diff --git a/samples/irs-demo/cordapp/build.gradle b/samples/irs-demo/cordapp/build.gradle index 66e7aa6953..26f7839d04 100644 --- a/samples/irs-demo/cordapp/build.gradle +++ b/samples/irs-demo/cordapp/build.gradle @@ -38,7 +38,7 @@ dependencies { // Specify your cordapp's dependencies below, including dependent cordapps compile group: 'commons-io', name: 'commons-io', version: '2.5' - testCompile project(':node-driver') + cordaCompile project(':node-driver') testCompile "junit:junit:$junit_version" testCompile "org.assertj:assertj-core:${assertj_version}" } diff --git a/samples/irs-demo/src/integration-test/kotlin/net/corda/test/spring/SpringDriver.kt b/samples/irs-demo/src/integration-test/kotlin/net/corda/test/spring/SpringDriver.kt index 4de01a0d78..3a09c8200a 100644 --- a/samples/irs-demo/src/integration-test/kotlin/net/corda/test/spring/SpringDriver.kt +++ b/samples/irs-demo/src/integration-test/kotlin/net/corda/test/spring/SpringDriver.kt @@ -40,7 +40,7 @@ fun springDriver( useTestClock: Boolean = defaultParameters.useTestClock, initialiseSerialization: Boolean = defaultParameters.initialiseSerialization, startNodesInProcess: Boolean = defaultParameters.startNodesInProcess, - notarySpecs: List, + notarySpecs: List = defaultParameters.notarySpecs, extraCordappPackagesToScan: List = defaultParameters.extraCordappPackagesToScan, dsl: SpringDriverExposedDSLInterface.() -> A ) = genericDriver( 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 3a61e18f2b..a8ea08015a 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 @@ -36,7 +36,7 @@ import net.corda.nodeapi.config.toConfig import net.corda.nodeapi.internal.NotaryInfo import net.corda.nodeapi.internal.addShutdownHook import net.corda.testing.* -import net.corda.testing.common.internal.NetworkParametersCopier +import net.corda.nodeapi.internal.NetworkParametersCopier import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.internal.ProcessUtilities import net.corda.testing.node.ClusterSpec diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/internal/NodeBasedTest.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/internal/NodeBasedTest.kt index 8a107a0fe6..027232f1f5 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/internal/NodeBasedTest.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/internal/NodeBasedTest.kt @@ -16,7 +16,7 @@ import net.corda.node.services.config.parseAsNodeConfiguration import net.corda.node.services.config.plus import net.corda.nodeapi.User import net.corda.testing.SerializationEnvironmentRule -import net.corda.testing.common.internal.NetworkParametersCopier +import net.corda.nodeapi.internal.NetworkParametersCopier import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.driver.addressMustNotBeBoundFuture import net.corda.testing.getFreeLocalPorts diff --git a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt index ed5806098f..766dd80269 100644 --- a/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt +++ b/testing/node-driver/src/main/kotlin/net/corda/testing/node/MockNode.kt @@ -40,7 +40,7 @@ import net.corda.node.utilities.CordaPersistence import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.nodeapi.internal.NotaryInfo import net.corda.testing.DUMMY_NOTARY -import net.corda.testing.common.internal.NetworkParametersCopier +import net.corda.nodeapi.internal.NetworkParametersCopier import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.node.MockServices.Companion.MOCK_VERSION_INFO import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties diff --git a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt index 250161faaf..a35d80c2c6 100644 --- a/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt +++ b/testing/smoke-test-utils/src/main/kotlin/net/corda/smoketesting/NodeProcess.kt @@ -8,7 +8,7 @@ import net.corda.core.internal.createDirectories import net.corda.core.internal.div import net.corda.core.utilities.NetworkHostAndPort import net.corda.core.utilities.contextLogger -import net.corda.testing.common.internal.NetworkParametersCopier +import net.corda.nodeapi.internal.NetworkParametersCopier import net.corda.testing.common.internal.testNetworkParameters import net.corda.testing.common.internal.asContextEnv import java.nio.file.Path