From 02884e6c816ae3d8fac510fbf8edae76cd04b1bf Mon Sep 17 00:00:00 2001 From: Michal Kit Date: Tue, 12 Jun 2018 09:31:06 +0100 Subject: [PATCH 1/9] CORDA-1593 Extracting the whitelist logic and making it public (#3317) * CORDA-1539 Extracting the whitelist logic and making it public * Addressing review comments --- .../internal/network/NetworkBootstrapper.kt | 31 ------------- .../internal/network/WhitelisGenerator.kt | 43 +++++++++++++++++++ .../network/NetworkBootstrapperTest.kt | 2 +- .../network/WhitelistGeneratorTest.kt | 41 ++++++++++++++++++ 4 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/network/WhitelisGenerator.kt create mode 100644 node-api/src/test/kotlin/net/corda/nodeapi/internal/network/WhitelistGeneratorTest.kt diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt index 6636b2374c..5438953cf5 100644 --- a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapper.kt @@ -3,7 +3,6 @@ package net.corda.nodeapi.internal.network import com.typesafe.config.Config import com.typesafe.config.ConfigFactory import net.corda.cordform.CordformNode -import net.corda.core.contracts.ContractClassName import net.corda.core.identity.CordaX500Name import net.corda.core.identity.Party import net.corda.core.internal.* @@ -55,7 +54,6 @@ class NetworkBootstrapper { ) private const val LOGS_DIR_NAME = "logs" - private const val EXCLUDE_WHITELIST_FILE_NAME = "exclude_whitelist.txt" @JvmStatic fun main(args: Array) { @@ -291,35 +289,6 @@ class NetworkBootstrapper { return networkParameters } - @VisibleForTesting - internal fun generateWhitelist(networkParameters: NetworkParameters?, - excludeContracts: List, - cordappJars: List): Map> { - val existingWhitelist = networkParameters?.whitelistedContractImplementations ?: emptyMap() - - if (excludeContracts.isNotEmpty()) { - println("Exclude contracts from whitelist: ${excludeContracts.joinToString()}") - existingWhitelist.keys.forEach { - require(it !in excludeContracts) { "$it is already part of the existing whitelist and cannot be excluded." } - } - } - - val newWhiteList = cordappJars - .flatMap { jar -> (jar.scan() - excludeContracts).map { it to jar.hash } } - .toMultiMap() - - return (newWhiteList.keys + existingWhitelist.keys).associateBy({ it }) { - val existingHashes = existingWhitelist[it] ?: emptyList() - val newHashes = newWhiteList[it] ?: emptyList() - (existingHashes + newHashes).distinct() - } - } - - private fun readExcludeWhitelist(directory: Path): List { - val file = directory / EXCLUDE_WHITELIST_FILE_NAME - return if (file.exists()) file.readAllLines().map(String::trim) else emptyList() - } - private fun NodeInfo.notaryIdentity(): Party { return when (legalIdentities.size) { // Single node notaries have just one identity like all other nodes. This identity is the notary identity diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/WhitelisGenerator.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/WhitelisGenerator.kt new file mode 100644 index 0000000000..9979337386 --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/network/WhitelisGenerator.kt @@ -0,0 +1,43 @@ +package net.corda.nodeapi.internal.network + +import net.corda.core.contracts.ContractClassName +import net.corda.core.internal.div +import net.corda.core.internal.exists +import net.corda.core.internal.readAllLines +import net.corda.core.internal.toMultiMap +import net.corda.core.node.NetworkParameters +import net.corda.core.node.services.AttachmentId +import net.corda.nodeapi.internal.ContractsJar +import org.slf4j.LoggerFactory +import java.nio.file.Path + +private const val EXCLUDE_WHITELIST_FILE_NAME = "exclude_whitelist.txt" +private val logger = LoggerFactory.getLogger("net.corda.nodeapi.internal.network.WhitelistGenerator") + +fun generateWhitelist(networkParameters: NetworkParameters?, + excludeContracts: List, + cordappJars: List): Map> { + val existingWhitelist = networkParameters?.whitelistedContractImplementations ?: emptyMap() + + if (excludeContracts.isNotEmpty()) { + logger.info("Exclude contracts from whitelist: ${excludeContracts.joinToString()}") + existingWhitelist.keys.forEach { + require(it !in excludeContracts) { "$it is already part of the existing whitelist and cannot be excluded." } + } + } + + val newWhiteList = cordappJars + .flatMap { jar -> (jar.scan() - excludeContracts).map { it to jar.hash } } + .toMultiMap() + + return (newWhiteList.keys + existingWhitelist.keys).associateBy({ it }) { + val existingHashes = existingWhitelist[it] ?: emptyList() + val newHashes = newWhiteList[it] ?: emptyList() + (existingHashes + newHashes).distinct() + } +} + +fun readExcludeWhitelist(directory: Path): List { + val file = directory / EXCLUDE_WHITELIST_FILE_NAME + return if (file.exists()) file.readAllLines().map(String::trim) else emptyList() +} \ No newline at end of file diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapperTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapperTest.kt index 59452aa0b2..b57c177d61 100644 --- a/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapperTest.kt +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/NetworkBootstrapperTest.kt @@ -127,7 +127,7 @@ class NetworkBootstrapperTest { private fun generateWhitelist(existingWhitelist: Map>, excludeContracts: List, contractJars: List): Map> { - return NetworkBootstrapper().generateWhitelist( + return generateWhitelist( testNetworkParameters(whitelistedContractImplementations = existingWhitelist), excludeContracts, contractJars diff --git a/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/WhitelistGeneratorTest.kt b/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/WhitelistGeneratorTest.kt new file mode 100644 index 0000000000..67f4bb9641 --- /dev/null +++ b/node-api/src/test/kotlin/net/corda/nodeapi/internal/network/WhitelistGeneratorTest.kt @@ -0,0 +1,41 @@ +package net.corda.nodeapi.internal.network + +import com.nhaarman.mockito_kotlin.mock +import com.nhaarman.mockito_kotlin.verify +import net.corda.core.crypto.SecureHash +import net.corda.nodeapi.internal.ContractsJar +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class WhitelistGeneratorTest { + + @Test + fun `whitelist generator builds the correct whitelist map`() { + // given + val jars = (0..9).map { + val index = it + mock { + val secureHash = SecureHash.randomSHA256() + on { scan() }.then { + listOf(index.toString()) + } + on { hash }.then { + secureHash + } + } + } + + // when + val result = generateWhitelist(null, emptyList(), jars) + + // then + jars.forEachIndexed { index, item -> + verify(item).scan() + val attachmentIds = requireNotNull(result[index.toString()]) + assertEquals(1, attachmentIds.size) + assertTrue { attachmentIds.contains(item.hash) } + } + } + +} \ No newline at end of file From dc220ef18e7e3a897d557f357eca29082db1163d Mon Sep 17 00:00:00 2001 From: Florian Friemel Date: Tue, 12 Jun 2018 09:38:14 +0100 Subject: [PATCH 2/9] [CORDA-1611] Upgrade Quasar to 0.7.10 (#3342) * [CORDA-1611] Upgrade Quasar to 0.7.10 * Add the new quasar.jar that was copied by the copyQuasarJar task. --- build.gradle | 6 +++--- lib/quasar.jar | Bin 1272883 -> 1272595 bytes 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 47eb5ee092..2e6338eef7 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,9 @@ buildscript { // // TODO: Sort this alphabetically. ext.kotlin_version = constants.getProperty("kotlinVersion") - // use our fork of quasar - ext.quasar_group = 'com.github.corda.quasar' - ext.quasar_version = '7629695563deae6cc95adcfbebcbc8322fd0241a' + + ext.quasar_group = 'co.paralleluniverse' + ext.quasar_version = '0.7.10' // gradle-capsule-plugin:1.0.2 contains capsule:1.0.1 // TODO: Upgrade gradle-capsule-plugin to a version with capsule:1.0.3 diff --git a/lib/quasar.jar b/lib/quasar.jar index 074ecc3b7ca804cf895c93cbd158db58aa280ecb..7282d8c8b8b9d0b01d9efd2a2149406dd0948eb6 100644 GIT binary patch delta 187549 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�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 From 0f3453d1c724f60126e71c5e1c4bf183c4fb3510 Mon Sep 17 00:00:00 2001 From: Stefano Franz Date: Tue, 12 Jun 2018 11:03:32 +0100 Subject: [PATCH 3/9] add configuration option to enable compatibility zone whilst running devMode * add configuration option to enable compatibility zone whilst running devMode * add documentation about allowCompatibilityZone * address review comments * remove extra doc lines * add changelog entry * Update changelog.rst --- docs/source/changelog.rst | 10 ++++---- docs/source/corda-configuration-file.rst | 8 ++++++- .../node/services/config/NodeConfiguration.kt | 11 +++++---- .../config/NodeConfigurationImplTest.kt | 23 +++++++++++-------- 4 files changed, 34 insertions(+), 18 deletions(-) diff --git a/docs/source/changelog.rst b/docs/source/changelog.rst index d298dfa51b..9c28dff7ea 100644 --- a/docs/source/changelog.rst +++ b/docs/source/changelog.rst @@ -7,6 +7,8 @@ release, see :doc:`upgrade-notes`. Unreleased ========== +* Add ``devModeOptions.allowCompatibilityZone`` to re-enable the use of a compatibility zone and ``devMode`` + * Fixed an issue where ``trackBy`` was returning ``ContractStates`` from a transaction that were not being tracked. The unrelated ``ContractStates`` will now be filtered out from the returned ``Vault.Update``. @@ -151,7 +153,7 @@ Version 3.1 * Update the fast-classpath-scanner dependent library version from 2.0.21 to 2.12.3 .. note:: Whilst this is not the latest version of this library, that being 2.18.1 at time of writing, versions - later than 2.12.3 (including 2.12.4) exhibit a different issue. +later than 2.12.3 (including 2.12.4) exhibit a different issue. * Updated the api scanner gradle plugin to work the same way as the version in master. These changes make the api scanner more accurate and fix a couple of bugs, and change the format of the api-current.txt file slightly. Backporting these changes @@ -969,15 +971,15 @@ Special thank you to `Qian Hong `_, `Marek Skocovsk to Corda in M10. .. warning:: Due to incompatibility between older version of IntelliJ and gradle 3.4, you will need to upgrade Intellij - to 2017.1 (with kotlin-plugin v1.1.1) in order to run Corda demos in IntelliJ. You can download the latest IntelliJ +to 2017.1 (with kotlin-plugin v1.1.1) in order to run Corda demos in IntelliJ. You can download the latest IntelliJ from `JetBrains `_. .. warning:: The Kapt-generated models are no longer included in our codebase. If you experience ``unresolved references`` - errors when building in IntelliJ, please rebuild the schema model by running ``gradlew kaptKotlin`` in Windows or +errors when building in IntelliJ, please rebuild the schema model by running ``gradlew kaptKotlin`` in Windows or ``./gradlew kaptKotlin`` in other systems. Alternatively, perform a full gradle build or install. .. note:: Kapt is used to generate schema model and entity code (from annotations in the codebase) using the Kotlin Annotation - processor. +processor. * Corda DemoBench: * DemoBench is a new tool to make it easy to configure and launch local Corda nodes. A very useful tool to demonstrate diff --git a/docs/source/corda-configuration-file.rst b/docs/source/corda-configuration-file.rst index 2d0e0ba42d..0c687ae50e 100644 --- a/docs/source/corda-configuration-file.rst +++ b/docs/source/corda-configuration-file.rst @@ -185,7 +185,13 @@ absolute path to the node's base directory. :doormanURL: Root address of the network registration service. :networkMapURL: Root address of the network map service. -.. note:: Only one of ``compatibilityZoneURL`` or ``networkServices`` should be used. + .. note:: Only one of ``compatibilityZoneURL`` or ``networkServices`` should be used. + +:devModeOptions: Allows modification of certain ``devMode`` features + + :allowCompatibilityZone: Allows a node configured to operate in development mode to connect to a compatibility zone. + + .. note:: This is an unsupported configuration. :jvmArgs: An optional list of JVM args, as strings, which replace those inherited from the command line when launching via ``corda.jar`` only. e.g. ``jvmArgs = [ "-Xmx220m", "-Xms220m", "-XX:+UseG1GC" ]`` diff --git a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt index ab581eac0c..7bf2b33c87 100644 --- a/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt +++ b/node/src/main/kotlin/net/corda/node/services/config/NodeConfiguration.kt @@ -78,7 +78,7 @@ interface NodeConfiguration : NodeSSLConfiguration { } } -data class DevModeOptions(val disableCheckpointChecker: Boolean = false) +data class DevModeOptions(val disableCheckpointChecker: Boolean = false, val allowCompatibilityZone: Boolean = false) fun NodeConfiguration.shouldCheckCheckpoints(): Boolean { return this.devMode && this.devModeOptions?.disableCheckpointChecker != true @@ -255,16 +255,19 @@ data class NodeConfigurationImpl( private fun validateDevModeOptions(): List { if (devMode) { compatibilityZoneURL?.let { - return listOf("'compatibilityZoneURL': present. Property cannot be set when 'devMode' is true.") + if (devModeOptions?.allowCompatibilityZone != true) { + return listOf("'compatibilityZoneURL': present. Property cannot be set when 'devMode' is true unless devModeOptions.allowCompatibilityZone is also true") + } } // if compatibiliZoneURL is set then it will be copied into the networkServices field and thus skipping // this check by returning above is fine. networkServices?.let { - return listOf("'networkServices': present. Property cannot be set when 'devMode' is true.") + if (devModeOptions?.allowCompatibilityZone != true) { + return listOf("'networkServices': present. Property cannot be set when 'devMode' is true unless devModeOptions.allowCompatibilityZone is also true") + } } } - return emptyList() } 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 7c826f9d5b..cc646a1795 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,21 +1,15 @@ package net.corda.node.services.config -import com.typesafe.config.Config -import com.typesafe.config.ConfigException -import com.typesafe.config.ConfigFactory -import com.typesafe.config.ConfigParseOptions -import com.typesafe.config.ConfigValueFactory +import com.typesafe.config.* 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 import net.corda.testing.node.MockServices.Companion.makeTestDataSourceProperties import net.corda.tools.shell.SSHDConfiguration -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatCode -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.junit.Assert.assertNotNull +import org.assertj.core.api.Assertions.* import org.junit.Assert.assertEquals +import org.junit.Assert.assertNotNull import org.junit.Test import java.net.URI import java.net.URL @@ -138,6 +132,17 @@ class NodeConfigurationImplTest { assertThat(errors).hasOnlyOneElementSatisfying { error -> error.contains("compatibilityZoneURL") && error.contains("devMode") } } + @Test + fun `validation succeeds when compatibilityZoneURL is present and devMode is true and allowCompatibilityZoneURL is set`() { + val configuration = testConfiguration.copy( + devMode = true, + compatibilityZoneURL = URL("https://r3.com"), + devModeOptions = DevModeOptions(allowCompatibilityZone = true)) + + val errors = configuration.validate() + assertThat(errors).isEmpty() + } + @Test fun `errors for nested config keys contain path`() { var rawConfig = ConfigFactory.parseResources("working-config.conf", ConfigParseOptions.defaults().setAllowMissing(false)) From dd564cfc7903afad8291d01cec17b1c81a251d8d Mon Sep 17 00:00:00 2001 From: Rick Parker Date: Tue, 12 Jun 2018 12:59:35 +0100 Subject: [PATCH 4/9] =?UTF-8?q?CORDA-1599=20Fix=20a=20small=20race=20we=20?= =?UTF-8?q?have=20with=20waiting=20for=20mock=20network=20to=20=E2=80=A6?= =?UTF-8?q?=20(#3348)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CORDA-1599 Fix a small race we have with waiting for mock network to become inactive that is affecting tests. * Missed println --- .../statemachine/FlowStateMachineImpl.kt | 5 ++- .../SingleThreadedStateMachineManager.kt | 32 ++++--------------- .../statemachine/RetryFlowMockTest.kt | 7 ++-- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt index cd8a6cdf20..8c6e23ab7f 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/FlowStateMachineImpl.kt @@ -27,6 +27,7 @@ import net.corda.nodeapi.internal.persistence.CordaPersistence import net.corda.nodeapi.internal.persistence.DatabaseTransaction import net.corda.nodeapi.internal.persistence.contextTransaction import net.corda.nodeapi.internal.persistence.contextTransactionOrNull +import org.apache.activemq.artemis.utils.ReusableLatch import org.slf4j.Logger import org.slf4j.LoggerFactory import org.slf4j.MDC @@ -68,7 +69,8 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, val actionExecutor: ActionExecutor, val stateMachine: StateMachine, val serviceHub: ServiceHubInternal, - val checkpointSerializationContext: SerializationContext + val checkpointSerializationContext: SerializationContext, + val unfinishedFibers: ReusableLatch ) internal var transientValues: TransientReference? = null @@ -239,6 +241,7 @@ class FlowStateMachineImpl(override val id: StateMachineRunId, } recordDuration(startTime) + getTransientField(TransientValues::unfinishedFibers).countDown() } @Suspendable diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt index e89bd67282..6cc0f323b1 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt @@ -13,20 +13,12 @@ import net.corda.core.flows.FlowInfo import net.corda.core.flows.FlowLogic import net.corda.core.flows.StateMachineRunId import net.corda.core.identity.Party -import net.corda.core.internal.FlowStateMachine -import net.corda.core.internal.ThreadBox -import net.corda.core.internal.TimedFlow -import net.corda.core.internal.bufferUntilSubscribed -import net.corda.core.internal.castIfPossible +import net.corda.core.internal.* import net.corda.core.internal.concurrent.OpenFuture import net.corda.core.internal.concurrent.map import net.corda.core.internal.concurrent.openFuture import net.corda.core.messaging.DataFeed -import net.corda.core.serialization.SerializationContext -import net.corda.core.serialization.SerializationDefaults -import net.corda.core.serialization.SerializedBytes -import net.corda.core.serialization.deserialize -import net.corda.core.serialization.serialize +import net.corda.core.serialization.* import net.corda.core.utilities.ProgressTracker import net.corda.core.utilities.Try import net.corda.core.utilities.contextLogger @@ -38,11 +30,7 @@ import net.corda.node.services.config.shouldCheckCheckpoints import net.corda.node.services.messaging.DeduplicationHandler import net.corda.node.services.messaging.ReceivedMessage import net.corda.node.services.statemachine.FlowStateMachineImpl.Companion.createSubFlowVersion -import net.corda.node.services.statemachine.interceptors.DumpHistoryOnErrorInterceptor -import net.corda.node.services.statemachine.interceptors.FiberDeserializationChecker -import net.corda.node.services.statemachine.interceptors.FiberDeserializationCheckingInterceptor -import net.corda.node.services.statemachine.interceptors.HospitalisingInterceptor -import net.corda.node.services.statemachine.interceptors.PrintingInterceptor +import net.corda.node.services.statemachine.interceptors.* import net.corda.node.services.statemachine.transitions.StateMachine import net.corda.node.utilities.AffinityExecutor import net.corda.nodeapi.internal.persistence.CordaPersistence @@ -54,16 +42,10 @@ import rx.Observable import rx.subjects.PublishSubject import java.security.SecureRandom import java.util.* -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.ExecutorService -import java.util.concurrent.Executors -import java.util.concurrent.ScheduledFuture -import java.util.concurrent.TimeUnit -import java.util.concurrent.locks.ReentrantLock +import java.util.concurrent.* import javax.annotation.concurrent.ThreadSafe import kotlin.collections.ArrayList import kotlin.collections.HashMap -import kotlin.concurrent.withLock import kotlin.streams.toList /** @@ -228,7 +210,6 @@ class SingleThreadedStateMachineManager( logger.debug("Killing flow known to physical node.") decrementLiveFibers() totalFinishedFlows.inc() - unfinishedFibers.countDown() try { flow.fiber.interrupt() true @@ -237,6 +218,7 @@ class SingleThreadedStateMachineManager( checkpointStorage.removeCheckpoint(id) } transitionExecutor.forceRemoveFlow(id) + unfinishedFibers.countDown() } } else { // TODO replace with a clustered delete after we'll support clustered nodes @@ -280,7 +262,6 @@ class SingleThreadedStateMachineManager( if (flow != null) { decrementLiveFibers() totalFinishedFlows.inc() - unfinishedFibers.countDown() return when (removalReason) { is FlowRemovalReason.OrderlyFinish -> removeFlowOrderly(flow, removalReason, lastState) is FlowRemovalReason.ErrorFinish -> removeFlowError(flow, removalReason, lastState) @@ -661,7 +642,8 @@ class SingleThreadedStateMachineManager( actionExecutor = actionExecutor!!, stateMachine = StateMachine(id, secureRandom), serviceHub = serviceHub, - checkpointSerializationContext = checkpointSerializationContext!! + checkpointSerializationContext = checkpointSerializationContext!!, + unfinishedFibers = unfinishedFibers ) } diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt index 56d009eeef..3049b55d58 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt @@ -105,6 +105,8 @@ class RetryFlowMockTest { @Test fun `Patient records do not leak in hospital when using killFlow`() { + // Make sure we have seen an update from the hospital, and thus the flow went there. + val records = nodeA.smm.flowHospital.track().updates.toBlocking().toIterable().iterator() val flow: FlowStateMachine = nodeA.services.startFlow(FinalityHandler(object : FlowSession() { override val counterparty: Party get() = TODO("not implemented") @@ -141,8 +143,9 @@ class RetryFlowMockTest { TODO("not implemented") } }), nodeA.services.newContext()).get() - // Make sure we have seen an update from the hospital, and thus the flow went there. - nodeA.smm.flowHospital.track().updates.toBlocking().first() + // Should be 2 records, one for admission and one for keep in. + records.next() + records.next() // Killing it should remove it. nodeA.smm.killFlow(flow.id) assertThat(nodeA.smm.flowHospital.track().snapshot).isEmpty() From 66294df34fc5edb8c34d207c1b3713ddc95f308d Mon Sep 17 00:00:00 2001 From: Stefano Franz Date: Tue, 12 Jun 2018 13:59:27 +0100 Subject: [PATCH 5/9] add experimental bootstrapper (#3009) * add experimental bootstrapper (cherry picked from commit 63665d1) refactor code to be less Azure Specific Use node classes for notaries add local docker backend move to tools directoy apply fixes for local docker RPC admin port add extraParams field to context to allow dynamic backend selection begin refactor to move all common node/notary functionality into single implementations node and notaries now share the same code path as much as possible. refactor network building logic into api class port Main.kt to use new networkbuilder api add gui fix issues with local docker ports not being exposed on localhost make push and instantiate async operations add ability to "add" a node after network has been built to gui tidy up backend selection via command line and GUI allow region selection for AZURE instantiations remove old network map based node.conf and network map dockerfile tidy up constructors of the various node stage objects tidy up artefact name add network-name selection dialog * print out help * exclude transitive dep onto log4j to suppress error print out * windows fixes for local docker * fixes to allow "devs.XXXX" resource groups in line with the new devops policy of having named resourceGroups * add extra logging around constructing azure backend --- .idea/compiler.xml | 2 + settings.gradle | 1 + tools/network-bootstrapper/build.gradle | 71 ++++ .../java/net/corda/bootstrapper/GuiUtils.java | 48 +++ .../net/corda/bootstrapper/Constants.kt | 50 +++ .../kotlin/net/corda/bootstrapper/Main.kt | 44 +++ .../net/corda/bootstrapper/NetworkBuilder.kt | 202 +++++++++++ .../bootstrapper/backends/AzureBackend.kt | 63 ++++ .../corda/bootstrapper/backends/Backend.kt | 40 +++ .../bootstrapper/backends/DockerBackend.kt | 25 ++ .../bootstrapper/cli/CommandLineInterface.kt | 69 ++++ .../corda/bootstrapper/cli/CommandParsers.kt | 68 ++++ .../containers/instance/InstanceInfo.kt | 7 + .../containers/instance/Instantiator.kt | 18 + .../instance/azure/AzureInstantiator.kt | 85 +++++ .../instance/docker/DockerInstantiator.kt | 99 ++++++ .../containers/push/ContainerPusher.kt | 9 + .../push/azure/AzureContainerPusher.kt | 62 ++++ .../push/azure/AzureRegistryLocator.kt | 55 +++ .../push/docker/DockerContainerPusher.kt | 15 + .../net/corda/bootstrapper/context/Context.kt | 69 ++++ .../corda/bootstrapper/docker/DockerUtils.kt | 35 ++ .../bootstrapper/gui/BootstrapperView.kt | 323 ++++++++++++++++++ .../kotlin/net/corda/bootstrapper/gui/Gui.kt | 11 + .../net/corda/bootstrapper/nodes/BuiltNode.kt | 22 ++ .../corda/bootstrapper/nodes/CopiedNode.kt | 40 +++ .../net/corda/bootstrapper/nodes/FoundNode.kt | 53 +++ .../net/corda/bootstrapper/nodes/NodeAdder.kt | 26 ++ .../corda/bootstrapper/nodes/NodeBuilder.kt | 48 +++ .../corda/bootstrapper/nodes/NodeCopier.kt | 101 ++++++ .../corda/bootstrapper/nodes/NodeFinder.kt | 32 ++ .../corda/bootstrapper/nodes/NodeInstance.kt | 31 ++ .../bootstrapper/nodes/NodeInstanceRequest.kt | 24 ++ .../bootstrapper/nodes/NodeInstantiator.kt | 95 ++++++ .../corda/bootstrapper/nodes/NodePusher.kt | 19 ++ .../corda/bootstrapper/nodes/PushedNode.kt | 25 ++ .../bootstrapper/notaries/CopiedNotary.kt | 14 + .../bootstrapper/notaries/NotaryCopier.kt | 69 ++++ .../bootstrapper/notaries/NotaryFinder.kt | 25 ++ .../serialization/SerializationHelper.kt | 30 ++ .../net/corda/bootstrapper/volumes/Volume.kt | 56 +++ .../volumes/azure/AzureSmbVolume.kt | 81 +++++ .../volumes/docker/LocalVolume.kt | 35 ++ .../src/main/resources/node-Dockerfile | 37 ++ .../src/main/resources/node_info_watcher.sh | 12 + .../src/main/resources/node_killer.sh | 3 + .../src/main/resources/notary-Dockerfile | 39 +++ .../src/main/resources/rpc-settings.conf | 4 + .../src/main/resources/run-corda-node.sh | 26 ++ .../src/main/resources/run-corda-notary.sh | 25 ++ .../src/main/resources/ssh.conf | 3 + 51 files changed, 2446 insertions(+) create mode 100644 tools/network-bootstrapper/build.gradle create mode 100644 tools/network-bootstrapper/src/main/java/net/corda/bootstrapper/GuiUtils.java create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Constants.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Main.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/NetworkBuilder.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/AzureBackend.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/Backend.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/DockerBackend.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandLineInterface.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandParsers.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/InstanceInfo.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/Instantiator.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/azure/AzureInstantiator.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/docker/DockerInstantiator.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/ContainerPusher.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureContainerPusher.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureRegistryLocator.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/docker/DockerContainerPusher.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/context/Context.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/docker/DockerUtils.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/BootstrapperView.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/Gui.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/BuiltNode.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/CopiedNode.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/FoundNode.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeAdder.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeBuilder.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeCopier.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeFinder.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstance.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstanceRequest.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstantiator.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodePusher.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/PushedNode.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/CopiedNotary.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryCopier.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryFinder.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/serialization/SerializationHelper.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/Volume.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/azure/AzureSmbVolume.kt create mode 100644 tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/docker/LocalVolume.kt create mode 100644 tools/network-bootstrapper/src/main/resources/node-Dockerfile create mode 100755 tools/network-bootstrapper/src/main/resources/node_info_watcher.sh create mode 100755 tools/network-bootstrapper/src/main/resources/node_killer.sh create mode 100644 tools/network-bootstrapper/src/main/resources/notary-Dockerfile create mode 100644 tools/network-bootstrapper/src/main/resources/rpc-settings.conf create mode 100755 tools/network-bootstrapper/src/main/resources/run-corda-node.sh create mode 100755 tools/network-bootstrapper/src/main/resources/run-corda-notary.sh create mode 100644 tools/network-bootstrapper/src/main/resources/ssh.conf diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 1deff9c2e3..5dbfa353df 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -115,6 +115,8 @@ + + diff --git a/settings.gradle b/settings.gradle index e2107da0bc..5409ff6576 100644 --- a/settings.gradle +++ b/settings.gradle @@ -43,6 +43,7 @@ include 'tools:graphs' include 'tools:bootstrapper' include 'tools:blobinspector' include 'tools:shell' +include 'tools:network-bootstrapper' include 'example-code' project(':example-code').projectDir = file("$settingsDir/docs/source/example-code") include 'samples:attachment-demo' diff --git a/tools/network-bootstrapper/build.gradle b/tools/network-bootstrapper/build.gradle new file mode 100644 index 0000000000..7cc76f0695 --- /dev/null +++ b/tools/network-bootstrapper/build.gradle @@ -0,0 +1,71 @@ +buildscript { + + ext.tornadofx_version = '1.7.15' + ext.controlsfx_version = '8.40.12' + + + repositories { + mavenLocal() + mavenCentral() + jcenter() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.1' + } +} + +repositories { + mavenLocal() + mavenCentral() + jcenter() +} + + +apply plugin: 'kotlin' +apply plugin: 'idea' +apply plugin: 'java' +apply plugin: 'application' +apply plugin: 'com.github.johnrengelman.shadow' + +dependencies { + + compile "com.microsoft.azure:azure:1.8.0" + compile "com.github.docker-java:docker-java:3.0.6" + + testCompile "org.jetbrains.kotlin:kotlin-test" + testCompile "org.jetbrains.kotlin:kotlin-test-junit" + + compile project(':node-api') + compile project(':node') + + compile group: "com.typesafe", name: "config", version: typesafe_config_version + compile group: "com.fasterxml.jackson.dataformat", name: "jackson-dataformat-yaml", version: "2.9.0" + compile group: "com.fasterxml.jackson.core", name: "jackson-databind", version: "2.9.0" + compile "com.fasterxml.jackson.module:jackson-module-kotlin:2.9.+" + compile group: 'info.picocli', name: 'picocli', version: '3.0.1' + + // TornadoFX: A lightweight Kotlin framework for working with JavaFX UI's. + compile "no.tornado:tornadofx:$tornadofx_version" + + compile "org.controlsfx:controlsfx:$controlsfx_version" + +} + +shadowJar { + baseName = 'network-bootstrapper' + classifier = null + version = null + zip64 true + mainClassName = 'net.corda.bootstrapper.Main' +} + +task buildNetworkBootstrapper(dependsOn: shadowJar) { +} + +configurations { + compile.exclude group: "log4j", module: "log4j" + compile.exclude group: "org.apache.logging.log4j" +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/java/net/corda/bootstrapper/GuiUtils.java b/tools/network-bootstrapper/src/main/java/net/corda/bootstrapper/GuiUtils.java new file mode 100644 index 0000000000..204a9529fa --- /dev/null +++ b/tools/network-bootstrapper/src/main/java/net/corda/bootstrapper/GuiUtils.java @@ -0,0 +1,48 @@ +package net.corda.bootstrapper; + +import javafx.scene.control.Alert; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Priority; +import javafx.stage.StageStyle; + +import java.io.PrintWriter; +import java.io.StringWriter; + +public class GuiUtils { + + public static void showException(String title, String message, Throwable exception) { + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.initStyle(StageStyle.UTILITY); + alert.setTitle("Exception"); + alert.setHeaderText(title); + alert.setContentText(message); + + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + exception.printStackTrace(pw); + String exceptionText = sw.toString(); + + Label label = new Label("Details:"); + + TextArea textArea = new TextArea(exceptionText); + textArea.setEditable(false); + textArea.setWrapText(true); + + textArea.setMaxWidth(Double.MAX_VALUE); + textArea.setMaxHeight(Double.MAX_VALUE); + GridPane.setVgrow(textArea, Priority.ALWAYS); + GridPane.setHgrow(textArea, Priority.ALWAYS); + + GridPane expContent = new GridPane(); + expContent.setMaxWidth(Double.MAX_VALUE); + expContent.add(label, 0, 0); + expContent.add(textArea, 0, 1); + + alert.getDialogPane().setExpandableContent(expContent); + + alert.showAndWait(); + } + +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Constants.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Constants.kt new file mode 100644 index 0000000000..d6e907d1b5 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Constants.kt @@ -0,0 +1,50 @@ +package net.corda.bootstrapper + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.* +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.dataformat.yaml.YAMLFactory +import com.fasterxml.jackson.module.kotlin.registerKotlinModule +import com.microsoft.azure.management.resources.ResourceGroup +import com.microsoft.azure.management.resources.fluentcore.arm.Region + +class Constants { + + companion object { + val NODE_P2P_PORT = 10020 + val NODE_SSHD_PORT = 12222 + val NODE_RPC_PORT = 10003 + val NODE_RPC_ADMIN_PORT = 10005 + + val BOOTSTRAPPER_DIR_NAME = ".bootstrapper" + + fun getContextMapper(): ObjectMapper { + val objectMapper = ObjectMapper(YAMLFactory()).registerKotlinModule() + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + objectMapper.registerModule(object : SimpleModule() {}.let { + it.addSerializer(Region::class.java, object : JsonSerializer() { + override fun serialize(value: Region, gen: JsonGenerator, serializers: SerializerProvider?) { + gen.writeString(value.name()) + } + }) + it.addDeserializer(Region::class.java, object : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Region { + return Region.findByLabelOrName(p.valueAsString) + } + }) + }) + return objectMapper + } + + val ALPHA_NUMERIC_ONLY_REGEX = "[^\\p{IsAlphabetic}\\p{IsDigit}]".toRegex() + val ALPHA_NUMERIC_DOT_AND_UNDERSCORE_ONLY_REGEX = "[^\\p{IsAlphabetic}\\p{IsDigit}._]".toRegex() + val REGION_ARG_NAME = "REGION" + + fun ResourceGroup.restFriendlyName(): String { + return this.name().replace(ALPHA_NUMERIC_ONLY_REGEX, "").toLowerCase() + } + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Main.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Main.kt new file mode 100644 index 0000000000..38a5539876 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/Main.kt @@ -0,0 +1,44 @@ +@file:JvmName("Main") + +package net.corda.bootstrapper + +import net.corda.bootstrapper.backends.Backend +import net.corda.bootstrapper.backends.Backend.BackendType.AZURE +import net.corda.bootstrapper.cli.AzureParser +import net.corda.bootstrapper.cli.CliParser +import net.corda.bootstrapper.cli.CommandLineInterface +import net.corda.bootstrapper.cli.GuiSwitch +import net.corda.bootstrapper.gui.Gui +import net.corda.bootstrapper.serialization.SerializationEngine +import picocli.CommandLine + + +fun main(args: Array) { + SerializationEngine.init() + + val entryPointArgs = GuiSwitch(); + CommandLine(entryPointArgs).parse(*args) + + if (entryPointArgs.usageHelpRequested) { + CommandLine.usage(AzureParser(), System.out) + return + } + + + if (entryPointArgs.gui) { + Gui.main(args) + } else { + val baseArgs = CliParser() + CommandLine(baseArgs).parse(*args) + val argParser: CliParser = when (baseArgs.backendType) { + AZURE -> { + val azureArgs = AzureParser() + CommandLine(azureArgs).parse(*args) + azureArgs + } + Backend.BackendType.LOCAL_DOCKER -> baseArgs + } + CommandLineInterface().run(argParser) + } + +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/NetworkBuilder.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/NetworkBuilder.kt new file mode 100644 index 0000000000..f4f36d0381 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/NetworkBuilder.kt @@ -0,0 +1,202 @@ +package net.corda.bootstrapper + +import net.corda.bootstrapper.backends.Backend +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.nodes.* +import net.corda.bootstrapper.notaries.NotaryCopier +import net.corda.bootstrapper.notaries.NotaryFinder +import java.io.File +import java.util.concurrent.CompletableFuture +import java.util.concurrent.ConcurrentHashMap + +interface NetworkBuilder { + + companion object { + fun instance(): NetworkBuilder { + return NetworkBuilderImpl() + } + } + + fun onNodeLocated(callback: (FoundNode) -> Unit): NetworkBuilder + fun onNodeCopied(callback: (CopiedNode) -> Unit): NetworkBuilder + fun onNodeBuild(callback: (BuiltNode) -> Unit): NetworkBuilder + fun onNodePushed(callback: (PushedNode) -> Unit): NetworkBuilder + fun onNodeInstance(callback: (NodeInstance) -> Unit): NetworkBuilder + + fun withNodeCounts(map: Map): NetworkBuilder + fun withNetworkName(networtName: String): NetworkBuilder + fun withBasedir(baseDir: File): NetworkBuilder + fun withBackend(backendType: Backend.BackendType): NetworkBuilder + fun withBackendOptions(options: Map): NetworkBuilder + + fun build(): CompletableFuture, Context>> +} + +private class NetworkBuilderImpl : NetworkBuilder { + + + @Volatile + private var onNodeLocatedCallback: ((FoundNode) -> Unit) = {} + @Volatile + private var onNodeCopiedCallback: ((CopiedNode) -> Unit) = {} + @Volatile + private var onNodeBuiltCallback: ((BuiltNode) -> Unit) = {} + @Volatile + private var onNodePushedCallback: ((PushedNode) -> Unit) = {} + @Volatile + private var onNodeInstanceCallback: ((NodeInstance) -> Unit) = {} + @Volatile + private var nodeCounts = mapOf() + @Volatile + private lateinit var networkName: String + @Volatile + private var workingDir: File? = null + private val cacheDirName = Constants.BOOTSTRAPPER_DIR_NAME + @Volatile + private var backendType = Backend.BackendType.LOCAL_DOCKER + @Volatile + private var backendOptions: Map = mapOf() + + override fun onNodeLocated(callback: (FoundNode) -> Unit): NetworkBuilder { + this.onNodeLocatedCallback = callback + return this + } + + override fun onNodeCopied(callback: (CopiedNode) -> Unit): NetworkBuilder { + this.onNodeCopiedCallback = callback + return this + } + + override fun onNodeBuild(callback: (BuiltNode) -> Unit): NetworkBuilder { + this.onNodeBuiltCallback = callback + return this + } + + override fun onNodePushed(callback: (PushedNode) -> Unit): NetworkBuilder { + this.onNodePushedCallback = callback + return this + } + + override fun onNodeInstance(callback: (NodeInstance) -> Unit): NetworkBuilder { + this.onNodeInstanceCallback = callback; + return this + } + + override fun withNodeCounts(map: Map): NetworkBuilder { + nodeCounts = ConcurrentHashMap(map.entries.map { it.key.toLowerCase() to it.value }.toMap()) + return this + } + + override fun withNetworkName(networtName: String): NetworkBuilder { + this.networkName = networtName + return this + } + + override fun withBasedir(baseDir: File): NetworkBuilder { + this.workingDir = baseDir + return this + } + + override fun withBackend(backendType: Backend.BackendType): NetworkBuilder { + this.backendType = backendType + return this + } + + override fun withBackendOptions(options: Map): NetworkBuilder { + this.backendOptions = HashMap(options) + return this + } + + override fun build(): CompletableFuture, Context>> { + val cacheDir = File(workingDir, cacheDirName) + val baseDir = workingDir!! + val context = Context(networkName, backendType, backendOptions) + if (cacheDir.exists()) cacheDir.deleteRecursively() + val (containerPusher, instantiator, volume) = Backend.fromContext(context, cacheDir) + val nodeFinder = NodeFinder(baseDir) + val notaryFinder = NotaryFinder(baseDir) + val notaryCopier = NotaryCopier(cacheDir) + + val nodeInstantiator = NodeInstantiator(instantiator, context) + val nodeBuilder = NodeBuilder() + val nodeCopier = NodeCopier(cacheDir) + val nodePusher = NodePusher(containerPusher, context) + + val nodeDiscoveryFuture = CompletableFuture.supplyAsync { + val foundNodes = nodeFinder.findNodes() + .map { it to nodeCounts.getOrDefault(it.name.toLowerCase(), 1) } + .toMap() + foundNodes + } + + val notaryDiscoveryFuture = CompletableFuture.supplyAsync { + val copiedNotaries = notaryFinder.findNotaries() + .map { foundNode: FoundNode -> + notaryCopier.copyNotary(foundNode) + } + volume.notariesForNetworkParams(copiedNotaries) + copiedNotaries + } + + val notariesFuture = notaryDiscoveryFuture.thenCompose { copiedNotaries -> + copiedNotaries + .map { copiedNotary -> + nodeBuilder.buildNode(copiedNotary) + }.map { builtNotary -> + nodePusher.pushNode(builtNotary) + }.map { pushedNotary -> + pushedNotary.thenApplyAsync { nodeInstantiator.createInstanceRequest(it) } + }.map { instanceRequest -> + instanceRequest.thenComposeAsync { request -> + nodeInstantiator.instantiateNotaryInstance(request) + } + }.toSingleFuture() + } + + val nodesFuture = notaryDiscoveryFuture.thenCombineAsync(nodeDiscoveryFuture) { _, nodeCount -> + nodeCount.keys + .map { foundNode -> + nodeCopier.copyNode(foundNode).let { + onNodeCopiedCallback.invoke(it) + it + } + }.map { copiedNode: CopiedNode -> + nodeBuilder.buildNode(copiedNode).let { + onNodeBuiltCallback.invoke(it) + it + } + }.map { builtNode -> + nodePusher.pushNode(builtNode).thenApplyAsync { + onNodePushedCallback.invoke(it) + it + } + }.map { pushedNode -> + pushedNode.thenApplyAsync { + nodeInstantiator.createInstanceRequests(it, nodeCount) + } + }.map { instanceRequests -> + instanceRequests.thenComposeAsync { requests -> + requests.map { request -> + nodeInstantiator.instantiateNodeInstance(request) + .thenApplyAsync { nodeInstance -> + context.registerNode(nodeInstance) + onNodeInstanceCallback.invoke(nodeInstance) + nodeInstance + } + }.toSingleFuture() + } + }.toSingleFuture() + }.thenCompose { it }.thenApplyAsync { it.flatten() } + + return notariesFuture.thenCombineAsync(nodesFuture, { _, nodeInstances -> + context.networkInitiated = true + nodeInstances to context + }) + } +} + +fun List>.toSingleFuture(): CompletableFuture> { + return CompletableFuture.allOf(*this.toTypedArray()).thenApplyAsync { + this.map { it.getNow(null) } + } +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/AzureBackend.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/AzureBackend.kt new file mode 100644 index 0000000000..93a9890d46 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/AzureBackend.kt @@ -0,0 +1,63 @@ +package net.corda.bootstrapper.backends + +import com.microsoft.azure.CloudException +import com.microsoft.azure.credentials.AzureCliCredentials +import com.microsoft.azure.management.Azure +import com.microsoft.rest.LogLevel +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.containers.instance.azure.AzureInstantiator +import net.corda.bootstrapper.containers.push.azure.AzureContainerPusher +import net.corda.bootstrapper.containers.push.azure.RegistryLocator +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.volumes.azure.AzureSmbVolume +import org.slf4j.LoggerFactory +import java.util.concurrent.CompletableFuture + +data class AzureBackend(override val containerPusher: AzureContainerPusher, + override val instantiator: AzureInstantiator, + override val volume: AzureSmbVolume) : Backend { + + companion object { + + val LOG = LoggerFactory.getLogger(AzureBackend::class.java) + + private val azure: Azure = kotlin.run { + Azure.configure() + .withLogLevel(LogLevel.NONE) + .authenticate(AzureCliCredentials.create()) + .withDefaultSubscription() + } + + fun fromContext(context: Context): AzureBackend { + val resourceGroupName = context.networkName.replace(Constants.ALPHA_NUMERIC_DOT_AND_UNDERSCORE_ONLY_REGEX, "") + val resourceGroup = try { + LOG.info("Attempting to find existing resourceGroup with name: $resourceGroupName") + val foundResourceGroup = azure.resourceGroups().getByName(resourceGroupName) + + if (foundResourceGroup == null) { + LOG.info("No existing resourceGroup found creating new resourceGroup with name: $resourceGroupName") + azure.resourceGroups().define(resourceGroupName).withRegion(context.extraParams[Constants.REGION_ARG_NAME]).create() + } else { + LOG.info("Found existing resourceGroup, reusing") + foundResourceGroup + } + } catch (e: CloudException) { + throw RuntimeException(e) + } + + val registryLocatorFuture = CompletableFuture.supplyAsync { + RegistryLocator(azure, resourceGroup) + } + val containerPusherFuture = registryLocatorFuture.thenApplyAsync { + AzureContainerPusher(azure, it.registry) + } + val azureNetworkStore = CompletableFuture.supplyAsync { AzureSmbVolume(azure, resourceGroup) } + val azureInstantiatorFuture = azureNetworkStore.thenCombine(registryLocatorFuture, + { azureVolume, registryLocator -> + AzureInstantiator(azure, registryLocator.registry, azureVolume, resourceGroup) + } + ) + return AzureBackend(containerPusherFuture.get(), azureInstantiatorFuture.get(), azureNetworkStore.get()) + } + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/Backend.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/Backend.kt new file mode 100644 index 0000000000..85209c1df5 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/Backend.kt @@ -0,0 +1,40 @@ +package net.corda.bootstrapper.backends + +import net.corda.bootstrapper.backends.Backend.BackendType.AZURE +import net.corda.bootstrapper.backends.Backend.BackendType.LOCAL_DOCKER +import net.corda.bootstrapper.containers.instance.Instantiator +import net.corda.bootstrapper.containers.push.ContainerPusher +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.volumes.Volume +import java.io.File + +interface Backend { + companion object { + fun fromContext(context: Context, baseDir: File): Backend { + return when (context.backendType) { + AZURE -> AzureBackend.fromContext(context) + LOCAL_DOCKER -> DockerBackend.fromContext(context, baseDir) + } + } + } + + val containerPusher: ContainerPusher + val instantiator: Instantiator + val volume: Volume + + enum class BackendType { + AZURE, LOCAL_DOCKER + } + + operator fun component1(): ContainerPusher { + return containerPusher + } + + operator fun component2(): Instantiator { + return instantiator + } + + operator fun component3(): Volume { + return volume + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/DockerBackend.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/DockerBackend.kt new file mode 100644 index 0000000000..fab1c3a24f --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/backends/DockerBackend.kt @@ -0,0 +1,25 @@ +package net.corda.bootstrapper.backends + +import net.corda.bootstrapper.containers.instance.docker.DockerInstantiator +import net.corda.bootstrapper.containers.push.docker.DockerContainerPusher +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.volumes.docker.LocalVolume +import java.io.File + +class DockerBackend(override val containerPusher: DockerContainerPusher, + override val instantiator: DockerInstantiator, + override val volume: LocalVolume) : Backend { + + + companion object { + fun fromContext(context: Context, baseDir: File): DockerBackend { + val dockerContainerPusher = DockerContainerPusher() + val localVolume = LocalVolume(baseDir, context) + val dockerInstantiator = DockerInstantiator(localVolume, context) + return DockerBackend(dockerContainerPusher, dockerInstantiator, localVolume) + } + } + +} + + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandLineInterface.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandLineInterface.kt new file mode 100644 index 0000000000..b7a27fe795 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandLineInterface.kt @@ -0,0 +1,69 @@ +package net.corda.bootstrapper.cli + +import com.fasterxml.jackson.databind.ObjectMapper +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.NetworkBuilder +import net.corda.bootstrapper.backends.Backend +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.nodes.NodeAdder +import net.corda.bootstrapper.nodes.NodeInstantiator +import net.corda.bootstrapper.toSingleFuture +import net.corda.core.utilities.getOrThrow +import java.io.File + +class CommandLineInterface { + + + fun run(parsedArgs: CliParser) { + val baseDir = parsedArgs.baseDirectory + val cacheDir = File(baseDir, Constants.BOOTSTRAPPER_DIR_NAME) + val networkName = parsedArgs.name + val objectMapper = Constants.getContextMapper() + val contextFile = File(cacheDir, "$networkName.yaml") + if (parsedArgs.isNew()) { + val (_, context) = NetworkBuilder.instance() + .withBasedir(baseDir) + .withNetworkName(networkName) + .withNodeCounts(parsedArgs.nodes) + .onNodeBuild { builtNode -> println("Built node: ${builtNode.name} to image: ${builtNode.localImageId}") } + .onNodePushed { pushedNode -> println("Pushed node: ${pushedNode.name} to: ${pushedNode.remoteImageName}") } + .onNodeInstance { instance -> + println("Instance of ${instance.name} with id: ${instance.nodeInstanceName} on address: " + + "${instance.reachableAddress} {ssh:${instance.portMapping[Constants.NODE_SSHD_PORT]}, " + + "p2p:${instance.portMapping[Constants.NODE_P2P_PORT]}}") + } + .withBackend(parsedArgs.backendType) + .withBackendOptions(parsedArgs.backendOptions()) + .build().getOrThrow() + persistContext(contextFile, objectMapper, context) + } else { + val context = setupContextFromExisting(contextFile, objectMapper, networkName) + val (_, instantiator, _) = Backend.fromContext(context, cacheDir) + val nodeAdder = NodeAdder(context, NodeInstantiator(instantiator, context)) + parsedArgs.nodesToAdd.map { + nodeAdder.addNode(context, Constants.ALPHA_NUMERIC_ONLY_REGEX.replace(it.toLowerCase(), "")) + }.toSingleFuture().getOrThrow() + persistContext(contextFile, objectMapper, context) + } + + } + + private fun setupContextFromExisting(contextFile: File, objectMapper: ObjectMapper, networkName: String): Context { + return contextFile.let { + if (it.exists()) { + it.inputStream().use { + objectMapper.readValue(it, Context::class.java) + } + } else { + throw IllegalStateException("No existing network context found") + } + } + } + + + private fun persistContext(contextFile: File, objectMapper: ObjectMapper, context: Context?) { + contextFile.outputStream().use { + objectMapper.writeValue(it, context) + } + } +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandParsers.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandParsers.kt new file mode 100644 index 0000000000..164f6ec092 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/cli/CommandParsers.kt @@ -0,0 +1,68 @@ +package net.corda.bootstrapper.cli + +import com.microsoft.azure.management.resources.fluentcore.arm.Region +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.backends.Backend +import picocli.CommandLine +import picocli.CommandLine.Option +import java.io.File + +open class GuiSwitch { + + @Option(names = ["-h", "--help"], usageHelp = true, description = ["display this help message"]) + var usageHelpRequested: Boolean = false + + @Option(names = ["-g", "--gui"], description = ["Run in Gui Mode"]) + var gui = false + + @CommandLine.Unmatched + var unmatched = arrayListOf() +} + +open class CliParser : GuiSwitch() { + + @Option(names = ["-n", "--network-name"], description = ["The resource grouping to use"], required = true) + lateinit var name: String + + @Option(names = ["-d", "--nodes-directory"], description = ["The directory to search for nodes in"]) + var baseDirectory = File(System.getProperty("user.dir")) + + @Option(names = ["-b", "--backend"], description = ["The backend to use when instantiating nodes"]) + var backendType: Backend.BackendType = Backend.BackendType.LOCAL_DOCKER + + @Option(names = ["-nodes"], split = ":", description = ["The number of each node to create NodeX:2 will create two instances of NodeX"]) + var nodes: MutableMap = hashMapOf() + + @Option(names = ["--add", "-a"]) + var nodesToAdd: MutableList = arrayListOf() + + fun isNew(): Boolean { + return nodesToAdd.isEmpty() + } + + open fun backendOptions(): Map { + return emptyMap() + } + +} + +class AzureParser : CliParser() { + + companion object { + val regions = Region.values().map { it.name() to it }.toMap() + } + + @Option(names = ["-r", "--region"], description = ["The azure region to use"], converter = [RegionConverter::class]) + var region: Region = Region.EUROPE_WEST + + class RegionConverter : CommandLine.ITypeConverter { + override fun convert(value: String): Region { + return regions[value] ?: throw Error("Unknown azure region: $value") + } + } + + override fun backendOptions(): Map { + return mapOf(Constants.REGION_ARG_NAME to region.name()) + } + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/InstanceInfo.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/InstanceInfo.kt new file mode 100644 index 0000000000..0a9c863e0c --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/InstanceInfo.kt @@ -0,0 +1,7 @@ +package net.corda.bootstrapper.containers.instance + +data class InstanceInfo(val groupId: String, + val instanceName: String, + val instanceAddress: String, + val reachableAddress: String, + val portMapping: Map = emptyMap()) \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/Instantiator.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/Instantiator.kt new file mode 100644 index 0000000000..1f7c963115 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/Instantiator.kt @@ -0,0 +1,18 @@ +package net.corda.bootstrapper.containers.instance + +import java.util.concurrent.CompletableFuture + + +interface Instantiator { + fun instantiateContainer(imageId: String, + portsToOpen: List, + instanceName: String, + env: Map? = null): CompletableFuture>> + + + companion object { + val ADDITIONAL_NODE_INFOS_PATH = "/opt/corda/additional-node-infos" + } + + fun getExpectedFQDN(instanceName: String): String +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/azure/AzureInstantiator.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/azure/AzureInstantiator.kt new file mode 100644 index 0000000000..f537a5420a --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/azure/AzureInstantiator.kt @@ -0,0 +1,85 @@ +package net.corda.bootstrapper.containers.instance.azure + +import com.microsoft.azure.management.Azure +import com.microsoft.azure.management.containerinstance.ContainerGroup +import com.microsoft.azure.management.containerinstance.ContainerGroupRestartPolicy +import com.microsoft.azure.management.containerregistry.Registry +import com.microsoft.azure.management.resources.ResourceGroup +import com.microsoft.rest.ServiceCallback +import net.corda.bootstrapper.Constants.Companion.restFriendlyName +import net.corda.bootstrapper.containers.instance.Instantiator +import net.corda.bootstrapper.containers.instance.Instantiator.Companion.ADDITIONAL_NODE_INFOS_PATH +import net.corda.bootstrapper.containers.push.azure.RegistryLocator.Companion.parseCredentials +import net.corda.bootstrapper.volumes.azure.AzureSmbVolume +import org.slf4j.LoggerFactory +import java.util.concurrent.CompletableFuture + +class AzureInstantiator(private val azure: Azure, + private val registry: Registry, + private val azureSmbVolume: AzureSmbVolume, + private val resourceGroup: ResourceGroup +) : Instantiator { + override fun instantiateContainer(imageId: String, + portsToOpen: List, + instanceName: String, + env: Map?): CompletableFuture>> { + + findAndKillExistingContainerGroup(resourceGroup, buildIdent(instanceName)) + + LOG.info("Starting instantiation of container: $instanceName using $imageId") + val registryAddress = registry.loginServerUrl() + val (username, password) = registry.parseCredentials(); + val mountName = "node-setup" + val future = CompletableFuture>>().also { + azure.containerGroups().define(buildIdent(instanceName)) + .withRegion(resourceGroup.region()) + .withExistingResourceGroup(resourceGroup) + .withLinux() + .withPrivateImageRegistry(registryAddress, username, password) + .defineVolume(mountName) + .withExistingReadWriteAzureFileShare(azureSmbVolume.shareName) + .withStorageAccountName(azureSmbVolume.storageAccountName) + .withStorageAccountKey(azureSmbVolume.storageAccountKey) + .attach() + .defineContainerInstance(instanceName) + .withImage(imageId) + .withExternalTcpPorts(*portsToOpen.toIntArray()) + .withVolumeMountSetting(mountName, ADDITIONAL_NODE_INFOS_PATH) + .withEnvironmentVariables(env ?: emptyMap()) + .attach().withRestartPolicy(ContainerGroupRestartPolicy.ON_FAILURE) + .withDnsPrefix(buildIdent(instanceName)) + .createAsync(object : ServiceCallback { + override fun failure(t: Throwable?) { + it.completeExceptionally(t) + } + + override fun success(result: ContainerGroup) { + val fqdn = result.fqdn() + LOG.info("Completed instantiation: $instanceName is running at $fqdn with port(s) $portsToOpen exposed") + it.complete(result.fqdn() to portsToOpen.map { it to it }.toMap()) + } + }) + } + return future + } + + private fun buildIdent(instanceName: String) = "$instanceName-${resourceGroup.restFriendlyName()}" + + override fun getExpectedFQDN(instanceName: String): String { + return "${buildIdent(instanceName)}.${resourceGroup.region().name()}.azurecontainer.io" + } + + fun findAndKillExistingContainerGroup(resourceGroup: ResourceGroup, containerName: String): ContainerGroup? { + val existingContainer = azure.containerGroups().getByResourceGroup(resourceGroup.name(), containerName) + if (existingContainer != null) { + LOG.info("Found an existing instance of: $containerName destroying ContainerGroup") + azure.containerGroups().deleteByResourceGroup(resourceGroup.name(), containerName) + } + return existingContainer; + } + + companion object { + val LOG = LoggerFactory.getLogger(AzureInstantiator::class.java) + } + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/docker/DockerInstantiator.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/docker/DockerInstantiator.kt new file mode 100644 index 0000000000..0f29838407 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/instance/docker/DockerInstantiator.kt @@ -0,0 +1,99 @@ +package net.corda.bootstrapper.containers.instance.docker + +import com.github.dockerjava.api.model.* +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.containers.instance.Instantiator +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.docker.DockerUtils +import net.corda.bootstrapper.volumes.docker.LocalVolume +import org.slf4j.LoggerFactory +import java.util.concurrent.CompletableFuture + + +class DockerInstantiator(private val volume: LocalVolume, + private val context: Context) : Instantiator { + + val networkId = setupNetwork(); + + override fun instantiateContainer(imageId: String, + portsToOpen: List, + instanceName: String, + env: Map?): CompletableFuture>> { + + val localClient = DockerUtils.createLocalDockerClient() + val convertedEnv = buildDockerEnv(env) + val nodeInfosVolume = Volume(Instantiator.ADDITIONAL_NODE_INFOS_PATH) + val existingContainers = localClient.listContainersCmd().withShowAll(true).exec() + .map { it.names.first() to it } + .filter { it.first.endsWith(instanceName) } + existingContainers.forEach { (_, container) -> + try { + localClient.killContainerCmd(container.id).exec() + LOG.info("Found running container: $instanceName killed") + } catch (e: Throwable) { + //container not running + } + try { + localClient.removeContainerCmd(container.id).exec() + LOG.info("Found existing container: $instanceName removed") + } catch (e: Throwable) { + //this *only* occurs of the container had been previously scheduled for removal + //but did not complete before this attempt was begun. + } + + } + LOG.info("starting local docker instance of: $imageId with name $instanceName and env: $env") + val ports = (portsToOpen + Constants.NODE_RPC_ADMIN_PORT).map { ExposedPort.tcp(it) }.map { PortBinding(null, it) }.let { Ports(*it.toTypedArray()) } + val createCmd = localClient.createContainerCmd(imageId) + .withName(instanceName) + .withVolumes(nodeInfosVolume) + .withBinds(Bind(volume.getPath(), nodeInfosVolume)) + .withPortBindings(ports) + .withExposedPorts(ports.bindings.map { it.key }) + .withPublishAllPorts(true) + .withNetworkMode(networkId) + .withEnv(convertedEnv).exec() + + localClient.startContainerCmd(createCmd.id).exec() + val foundContainer = localClient.listContainersCmd().exec() + .filter { it.id == (createCmd.id) } + .firstOrNull() + + val portMappings = foundContainer?.ports?.map { + (it.privatePort ?: 0) to (it.publicPort ?: 0) + }?.toMap()?.toMap() + ?: portsToOpen.map { it to it }.toMap() + + + + return CompletableFuture.completedFuture(("localhost") to portMappings) + } + + private fun buildDockerEnv(env: Map?) = + (env ?: emptyMap()).entries.map { (key, value) -> "$key=$value" }.toList() + + override fun getExpectedFQDN(instanceName: String): String { + return instanceName + } + + private fun setupNetwork(): String { + val createLocalDockerClient = DockerUtils.createLocalDockerClient() + val existingNetworks = createLocalDockerClient.listNetworksCmd().withNameFilter(context.safeNetworkName).exec() + return if (existingNetworks.isNotEmpty()) { + if (existingNetworks.size > 1) { + throw IllegalStateException("Multiple local docker networks found with name ${context.safeNetworkName}") + } else { + LOG.info("Found existing network with name: ${context.safeNetworkName} reusing") + existingNetworks.first().id + } + } else { + val result = createLocalDockerClient.createNetworkCmd().withName(context.safeNetworkName).exec() + LOG.info("Created local docker network: ${result.id} with name: ${context.safeNetworkName}") + result.id + } + } + + companion object { + val LOG = LoggerFactory.getLogger(DockerInstantiator::class.java) + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/ContainerPusher.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/ContainerPusher.kt new file mode 100644 index 0000000000..13714586ac --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/ContainerPusher.kt @@ -0,0 +1,9 @@ +package net.corda.bootstrapper.containers.push + +import java.util.concurrent.CompletableFuture + +interface ContainerPusher { + fun pushContainerToImageRepository(localImageId: String, + remoteImageName: String, + networkName: String): CompletableFuture +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureContainerPusher.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureContainerPusher.kt new file mode 100644 index 0000000000..2c57bb1a2e --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureContainerPusher.kt @@ -0,0 +1,62 @@ +package net.corda.bootstrapper.containers.push.azure + +import com.github.dockerjava.api.async.ResultCallback +import com.github.dockerjava.api.model.PushResponseItem +import com.microsoft.azure.management.Azure +import com.microsoft.azure.management.containerregistry.Registry +import net.corda.bootstrapper.containers.push.ContainerPusher +import net.corda.bootstrapper.containers.push.azure.RegistryLocator.Companion.parseCredentials +import net.corda.bootstrapper.docker.DockerUtils +import org.slf4j.LoggerFactory +import java.io.Closeable +import java.util.concurrent.CompletableFuture + + +class AzureContainerPusher(private val azure: Azure, private val azureRegistry: Registry) : ContainerPusher { + + + override fun pushContainerToImageRepository(localImageId: String, + remoteImageName: String, + networkName: String): CompletableFuture { + + + val (registryUser, registryPassword) = azureRegistry.parseCredentials() + val dockerClient = DockerUtils.createDockerClient( + azureRegistry.loginServerUrl(), + registryUser, + registryPassword) + + val privateRepoUrl = "${azureRegistry.loginServerUrl()}/$remoteImageName".toLowerCase() + dockerClient.tagImageCmd(localImageId, privateRepoUrl, networkName).exec() + val result = CompletableFuture() + dockerClient.pushImageCmd("$privateRepoUrl:$networkName") + .withAuthConfig(dockerClient.authConfig()) + .exec(object : ResultCallback { + override fun onComplete() { + LOG.info("completed PUSH image: $localImageId to registryURL: $privateRepoUrl:$networkName") + result.complete("$privateRepoUrl:$networkName") + } + + override fun close() { + } + + override fun onNext(`object`: PushResponseItem) { + } + + override fun onError(throwable: Throwable?) { + result.completeExceptionally(throwable) + } + + override fun onStart(closeable: Closeable?) { + LOG.info("starting PUSH image: $localImageId to registryURL: $privateRepoUrl:$networkName") + } + }) + return result + } + + companion object { + val LOG = LoggerFactory.getLogger(AzureContainerPusher::class.java) + } + +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureRegistryLocator.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureRegistryLocator.kt new file mode 100644 index 0000000000..f9ee36c259 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/azure/AzureRegistryLocator.kt @@ -0,0 +1,55 @@ +package net.corda.bootstrapper.containers.push.azure + +import com.microsoft.azure.management.Azure +import com.microsoft.azure.management.containerregistry.AccessKeyType +import com.microsoft.azure.management.containerregistry.Registry +import com.microsoft.azure.management.resources.ResourceGroup +import net.corda.bootstrapper.Constants.Companion.restFriendlyName +import net.corda.bootstrapper.containers.instance.azure.AzureInstantiator +import org.slf4j.LoggerFactory + +class RegistryLocator(private val azure: Azure, + private val resourceGroup: ResourceGroup) { + + + val registry: Registry = locateRegistry() + + + private fun locateRegistry(): Registry { + LOG.info("Attempting to find existing registry with name: ${resourceGroup.restFriendlyName()}") + val found = azure.containerRegistries().getByResourceGroup(resourceGroup.name(), resourceGroup.restFriendlyName()) + + if (found == null) { + LOG.info("Did not find existing container registry - creating new registry with name ${resourceGroup.restFriendlyName()}") + return azure.containerRegistries() + .define(resourceGroup.restFriendlyName()) + .withRegion(resourceGroup.region().name()) + .withExistingResourceGroup(resourceGroup) + .withBasicSku() + .withRegistryNameAsAdminUser() + .create() + + } else { + LOG.info("found existing registry with name: ${resourceGroup.restFriendlyName()} reusing") + return found + } + } + + companion object { + fun Registry.parseCredentials(): Pair { + val credentials = this.credentials + return credentials.username() to + (credentials.accessKeys()[AccessKeyType.PRIMARY] + ?: throw IllegalStateException("no registry password found")) + } + + val LOG = LoggerFactory.getLogger(AzureInstantiator::class.java) + + } + + +} + + + + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/docker/DockerContainerPusher.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/docker/DockerContainerPusher.kt new file mode 100644 index 0000000000..8c53e6edae --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/containers/push/docker/DockerContainerPusher.kt @@ -0,0 +1,15 @@ +package net.corda.bootstrapper.containers.push.docker + +import net.corda.bootstrapper.containers.push.ContainerPusher +import net.corda.bootstrapper.docker.DockerUtils +import java.util.concurrent.CompletableFuture + +class DockerContainerPusher : ContainerPusher { + + + override fun pushContainerToImageRepository(localImageId: String, remoteImageName: String, networkName: String): CompletableFuture { + val dockerClient = DockerUtils.createLocalDockerClient() + dockerClient.tagImageCmd(localImageId, remoteImageName, networkName).withForce().exec() + return CompletableFuture.completedFuture("$remoteImageName:$networkName") + } +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/context/Context.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/context/Context.kt new file mode 100644 index 0000000000..8b72714c8d --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/context/Context.kt @@ -0,0 +1,69 @@ +package net.corda.bootstrapper.context + +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.backends.Backend +import net.corda.bootstrapper.nodes.NodeInstanceRequest +import net.corda.core.identity.CordaX500Name +import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet +import java.util.concurrent.ConcurrentHashMap + +class Context(val networkName: String, val backendType: Backend.BackendType, backendOptions: Map = emptyMap()) { + + + @Volatile + var safeNetworkName: String = networkName.replace(Constants.ALPHA_NUMERIC_ONLY_REGEX, "").toLowerCase() + + @Volatile + var nodes: MutableMap> = ConcurrentHashMap() + + @Volatile + var networkInitiated: Boolean = false + + @Volatile + var extraParams = ConcurrentHashMap(backendOptions) + + private fun registerNode(name: String, nodeInstanceRequest: NodeInstanceRequest) { + nodes.computeIfAbsent(name, { _ -> ConcurrentHashSet() }).add(nodeInstanceRequest.toPersistable()) + } + + fun registerNode(request: NodeInstanceRequest) { + registerNode(request.name, request) + } + + + data class PersistableNodeInstance( + val groupName: String, + val groupX500: CordaX500Name?, + val instanceName: String, + val instanceX500: String, + val localImageId: String?, + val remoteImageName: String, + val rpcPort: Int?, + val fqdn: String, + val rpcUser: String, + val rpcPassword: String) + + + companion object { + fun fromInstanceRequest(nodeInstanceRequest: NodeInstanceRequest): PersistableNodeInstance { + return PersistableNodeInstance( + nodeInstanceRequest.name, + nodeInstanceRequest.nodeConfig.myLegalName, + nodeInstanceRequest.nodeInstanceName, + nodeInstanceRequest.actualX500, + nodeInstanceRequest.localImageId, + nodeInstanceRequest.remoteImageName, + nodeInstanceRequest.nodeConfig.rpcOptions.address!!.port, + nodeInstanceRequest.expectedFqName, + "", + "" + ) + + } + } + + fun NodeInstanceRequest.toPersistable(): PersistableNodeInstance { + return fromInstanceRequest(this) + } +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/docker/DockerUtils.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/docker/DockerUtils.kt new file mode 100644 index 0000000000..f4c5680b75 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/docker/DockerUtils.kt @@ -0,0 +1,35 @@ +package net.corda.bootstrapper.docker + +import com.github.dockerjava.api.DockerClient +import com.github.dockerjava.core.DefaultDockerClientConfig +import com.github.dockerjava.core.DockerClientBuilder +import com.github.dockerjava.core.DockerClientConfig +import org.apache.commons.lang3.SystemUtils + +object DockerUtils { + + @Throws(Exception::class) + fun createDockerClient(registryServerUrl: String, username: String, password: String): DockerClient { + return DockerClientBuilder.getInstance(createDockerClientConfig(registryServerUrl, username, password)) + .build() + } + + fun createLocalDockerClient(): DockerClient { + return if (SystemUtils.IS_OS_WINDOWS) { + DockerClientBuilder.getInstance("tcp://127.0.0.1:2375").build() + } else { + DockerClientBuilder.getInstance().build() + } + } + + private fun createDockerClientConfig(registryServerUrl: String, username: String, password: String): DockerClientConfig { + return DefaultDockerClientConfig.createDefaultConfigBuilder() + .withDockerTlsVerify(false) + .withRegistryUrl(registryServerUrl) + .withRegistryUsername(username) + .withRegistryPassword(password) + .build() + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/BootstrapperView.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/BootstrapperView.kt new file mode 100644 index 0000000000..32be5574eb --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/BootstrapperView.kt @@ -0,0 +1,323 @@ +package net.corda.bootstrapper.gui + +import com.microsoft.azure.management.resources.fluentcore.arm.Region +import javafx.beans.property.SimpleObjectProperty +import javafx.collections.transformation.SortedList +import javafx.event.EventHandler +import javafx.scene.control.ChoiceDialog +import javafx.scene.control.TableView.CONSTRAINED_RESIZE_POLICY +import javafx.scene.control.TextInputDialog +import javafx.scene.input.MouseEvent +import javafx.scene.layout.Priority +import javafx.stage.DirectoryChooser +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.GuiUtils +import net.corda.bootstrapper.NetworkBuilder +import net.corda.bootstrapper.backends.Backend +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.nodes.* +import net.corda.bootstrapper.notaries.NotaryFinder +import org.apache.commons.lang3.RandomStringUtils +import tornadofx.* +import java.io.File +import java.util.* +import java.util.concurrent.CompletableFuture +import kotlin.collections.ArrayList + +class BootstrapperView : View("Network Bootstrapper") { + + val YAML_MAPPER = Constants.getContextMapper() + + + val controller: State by inject() + + val textarea = textarea { + maxWidth = Double.MAX_VALUE + maxHeight = Double.MAX_VALUE + } + + override val root = vbox { + + menubar { + menu("File") { + item("Open") { + action { + selectNodeDirectory().thenAcceptAsync({ (notaries: List, nodes: List) -> + controller.nodes(nodes) + controller.notaries(notaries) + }) + } + } + + item("Build") { + enableWhen(controller.baseDir.isNotNull) + action { + controller.clear() + val availableBackends = getAvailableBackends() + val backend = ChoiceDialog(availableBackends.first(), availableBackends).showAndWait() + var networkName = "gui-network" + backend.ifPresent { selectedBackEnd -> + + val backendParams = when (selectedBackEnd) { + Backend.BackendType.LOCAL_DOCKER -> { + + emptyMap() + } + Backend.BackendType.AZURE -> { + val defaultName = RandomStringUtils.randomAlphabetic(4) + "-network" + val textInputDialog = TextInputDialog(defaultName) + textInputDialog.title = "Choose Network Name" + networkName = textInputDialog.showAndWait().orElseGet { defaultName } + mapOf(Constants.REGION_ARG_NAME to ChoiceDialog(Region.EUROPE_WEST, Region.values().toList().sortedBy { it.name() }).showAndWait().get().name()) + } + } + + val nodeCount = controller.foundNodes.map { it.id to it.count }.toMap() + val result = NetworkBuilder.instance() + .withBasedir(controller.baseDir.get()) + .withNetworkName(networkName) + .onNodeBuild(controller::addBuiltNode) + .onNodePushed(controller::addPushedNode) + .onNodeInstance(controller::addInstance) + .withBackend(selectedBackEnd) + .withNodeCounts(nodeCount) + .withBackendOptions(backendParams) + .build() + result.handle { v, t -> + runLater { + if (t != null) { + GuiUtils.showException("Failed to build network", "Failure due to", t) + } else { + controller.networkContext.set(v.second) + } + } + } + } + } + } + + item("Add Node") { + enableWhen(controller.networkContext.isNotNull) + action { + val foundNodes = controller.foundNodes.map { it.id } + val nodeToAdd = ChoiceDialog(foundNodes.first(), *foundNodes.toTypedArray()).showAndWait() + val context = controller.networkContext.value + nodeToAdd.ifPresent { node -> + runLater { + val (_, instantiator, _) = Backend.fromContext( + context, + File(controller.baseDir.get(), Constants.BOOTSTRAPPER_DIR_NAME)) + val nodeAdder = NodeAdder(context, NodeInstantiator(instantiator, context)) + nodeAdder.addNode(context, node).handleAsync { instanceInfo, t -> + t?.let { + GuiUtils.showException("Failed", "Failed to add node", it) + } + instanceInfo?.let { + runLater { + controller.addInstance(NodeInstanceTableEntry( + it.groupId, + it.instanceName, + it.instanceAddress, + it.reachableAddress, + it.portMapping[Constants.NODE_P2P_PORT] ?: Constants.NODE_P2P_PORT, + it.portMapping[Constants.NODE_SSHD_PORT] + ?: Constants.NODE_SSHD_PORT)) + } + } + } + } + } + } + } + } + } + + hbox { + vbox { + label("Nodes to build") + val foundNodesTable = tableview(controller.foundNodes) { + readonlyColumn("ID", FoundNodeTableEntry::id) + column("Count", FoundNodeTableEntry::count).makeEditable() + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + foundNodesTable.columnResizePolicy = CONSTRAINED_RESIZE_POLICY + label("Notaries to build") + val notaryListView = listview(controller.foundNotaries) { + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + notaryListView.cellFormat { text = it.name } + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + + vbox { + + label("Built Nodes") + tableview(controller.builtNodes) { + readonlyColumn("ID", BuiltNodeTableEntry::id) + readonlyColumn("LocalImageId", BuiltNodeTableEntry::localImageId) + columnResizePolicy = CONSTRAINED_RESIZE_POLICY + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + + + label("Pushed Nodes") + tableview(controller.pushedNodes) { + readonlyColumn("ID", PushedNode::name) + readonlyColumn("RemoteImageId", PushedNode::remoteImageName) + columnResizePolicy = CONSTRAINED_RESIZE_POLICY + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + + borderpane { + top = vbox { + label("Instances") + tableview(controller.nodeInstances) { + onMouseClicked = EventHandler { _ -> + textarea.text = YAML_MAPPER.writeValueAsString(selectionModel.selectedItem) + } + readonlyColumn("ID", NodeInstanceTableEntry::id) + readonlyColumn("InstanceId", NodeInstanceTableEntry::nodeInstanceName) + readonlyColumn("Address", NodeInstanceTableEntry::address) + columnResizePolicy = CONSTRAINED_RESIZE_POLICY + } + } + center = textarea + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + + vgrow = Priority.ALWAYS + hgrow = Priority.ALWAYS + } + + } + + private fun getAvailableBackends(): List { + return Backend.BackendType.values().toMutableList(); + } + + + fun selectNodeDirectory(): CompletableFuture, List>> { + val fileChooser = DirectoryChooser(); + fileChooser.initialDirectory = File(System.getProperty("user.home")) + val file = fileChooser.showDialog(null) + controller.baseDir.set(file) + return processSelectedDirectory(file) + } + + + fun processSelectedDirectory(dir: File): CompletableFuture, List>> { + val foundNodes = CompletableFuture.supplyAsync { + val nodeFinder = NodeFinder(dir) + nodeFinder.findNodes() + } + val foundNotaries = CompletableFuture.supplyAsync { + val notaryFinder = NotaryFinder(dir) + notaryFinder.findNotaries() + } + return foundNodes.thenCombine(foundNotaries) { nodes, notaries -> + notaries to nodes + } + } +} + +class State : Controller() { + + val foundNodes = Collections.synchronizedList(ArrayList()).observable() + val builtNodes = Collections.synchronizedList(ArrayList()).observable() + val pushedNodes = Collections.synchronizedList(ArrayList()).observable() + + private val backingUnsortedInstances = Collections.synchronizedList(ArrayList()).observable() + val nodeInstances = SortedList(backingUnsortedInstances, COMPARATOR) + + val foundNotaries = Collections.synchronizedList(ArrayList()).observable() + val networkContext = SimpleObjectProperty(null) + + fun clear() { + builtNodes.clear() + pushedNodes.clear() + backingUnsortedInstances.clear() + networkContext.set(null) + } + + fun nodes(nodes: List) { + foundNodes.clear() + nodes.forEach { addFoundNode(it) } + } + + fun notaries(notaries: List) { + foundNotaries.clear() + notaries.forEach { runLater { foundNotaries.add(it) } } + } + + var baseDir = SimpleObjectProperty(null) + + + fun addFoundNode(foundNode: FoundNode) { + runLater { + foundNodes.add(FoundNodeTableEntry(foundNode.name)) + } + } + + fun addBuiltNode(builtNode: BuiltNode) { + runLater { + builtNodes.add(BuiltNodeTableEntry(builtNode.name, builtNode.localImageId)) + } + } + + fun addPushedNode(pushedNode: PushedNode) { + runLater { + pushedNodes.add(pushedNode) + } + } + + fun addInstance(nodeInstance: NodeInstance) { + runLater { + backingUnsortedInstances.add(NodeInstanceTableEntry( + nodeInstance.name, + nodeInstance.nodeInstanceName, + nodeInstance.expectedFqName, + nodeInstance.reachableAddress, + nodeInstance.portMapping[Constants.NODE_P2P_PORT] ?: Constants.NODE_P2P_PORT, + nodeInstance.portMapping[Constants.NODE_SSHD_PORT] ?: Constants.NODE_SSHD_PORT)) + } + } + + fun addInstance(nodeInstance: NodeInstanceTableEntry) { + runLater { + backingUnsortedInstances.add(nodeInstance) + } + } + + companion object { + val COMPARATOR: (NodeInstanceTableEntry, NodeInstanceTableEntry) -> Int = { o1, o2 -> + if (o1.id == (o2.id)) { + o1.nodeInstanceName.compareTo(o2.nodeInstanceName) + } else { + o1.id.compareTo(o2.id) + } + } + } + + +} + +data class FoundNodeTableEntry(val id: String, + @Volatile var count: Int = 1) + +data class BuiltNodeTableEntry(val id: String, val localImageId: String) + +data class NodeInstanceTableEntry(val id: String, + val nodeInstanceName: String, + val address: String, + val locallyReachableAddress: String, + val rpcPort: Int, + val sshPort: Int) \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/Gui.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/Gui.kt new file mode 100644 index 0000000000..cc71845369 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/gui/Gui.kt @@ -0,0 +1,11 @@ +package net.corda.bootstrapper.gui + +import javafx.application.Application +import tornadofx.App + +class Gui : App(BootstrapperView::class) { + companion object { + @JvmStatic + fun main(args: Array) = Application.launch(Gui::class.java, *args) + } +} diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/BuiltNode.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/BuiltNode.kt new file mode 100644 index 0000000000..47515f9dce --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/BuiltNode.kt @@ -0,0 +1,22 @@ +package net.corda.bootstrapper.nodes + +import net.corda.node.services.config.NodeConfiguration +import java.io.File + +open class BuiltNode(configFile: File, baseDirectory: File, + copiedNodeConfig: File, copiedNodeDir: File, + val nodeConfig: NodeConfiguration, val localImageId: String) : CopiedNode(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir) { + + + override fun toString(): String { + return "BuiltNode(" + + "nodeConfig=$nodeConfig," + + "localImageId='$localImageId'" + + ")" + + " ${super.toString()}" + } + + fun toPushedNode(remoteImageName: String): PushedNode { + return PushedNode(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName) + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/CopiedNode.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/CopiedNode.kt new file mode 100644 index 0000000000..6e6c04c67f --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/CopiedNode.kt @@ -0,0 +1,40 @@ +package net.corda.bootstrapper.nodes + +import net.corda.node.services.config.NodeConfiguration +import java.io.File + +open class CopiedNode(configFile: File, baseDirectory: File, + open val copiedNodeConfig: File, open val copiedNodeDir: File) : + FoundNode(configFile, baseDirectory) { + + constructor(foundNode: FoundNode, copiedNodeConfig: File, copiedNodeDir: File) : this( + foundNode.configFile, foundNode.baseDirectory, copiedNodeConfig, copiedNodeDir + ) + + operator fun component4(): File { + return copiedNodeDir; + } + + operator fun component5(): File { + return copiedNodeConfig; + } + + + fun builtNode(nodeConfig: NodeConfiguration, imageId: String): BuiltNode { + return BuiltNode(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, imageId) + } + + override fun toString(): String { + return "CopiedNode(" + + "copiedNodeConfig=$copiedNodeConfig," + + "copiedNodeDir=$copiedNodeDir" + + ")" + + " ${super.toString()}" + } + + fun toBuiltNode(nodeConfig: NodeConfiguration, localImageId: String): BuiltNode { + return BuiltNode(this.configFile, this.baseDirectory, this.copiedNodeConfig, this.copiedNodeDir, nodeConfig, localImageId) + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/FoundNode.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/FoundNode.kt new file mode 100644 index 0000000000..477cbd1b75 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/FoundNode.kt @@ -0,0 +1,53 @@ +package net.corda.bootstrapper.nodes + +import java.io.File + +open class FoundNode(open val configFile: File, + open val baseDirectory: File = configFile.parentFile, + val name: String = configFile.parentFile.name.toLowerCase().replace(net.corda.bootstrapper.Constants.ALPHA_NUMERIC_ONLY_REGEX, "")) { + + + operator fun component1(): File { + return baseDirectory; + } + + operator fun component2(): File { + return configFile; + } + + operator fun component3(): String { + return name; + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as FoundNode + + if (configFile != other.configFile) return false + if (baseDirectory != other.baseDirectory) return false + if (name != other.name) return false + + return true + } + + override fun hashCode(): Int { + var result = configFile.hashCode() + result = 31 * result + baseDirectory.hashCode() + result = 31 * result + name.hashCode() + return result + } + + override fun toString(): String { + return "FoundNode(name='$name', configFile=$configFile, baseDirectory=$baseDirectory)" + } + + fun toCopiedNode(copiedNodeConfig: File, copiedNodeDir: File): CopiedNode { + return CopiedNode(this.configFile, this.baseDirectory, copiedNodeConfig, copiedNodeDir) + } + + +} + + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeAdder.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeAdder.kt new file mode 100644 index 0000000000..4de0d53ebe --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeAdder.kt @@ -0,0 +1,26 @@ +package net.corda.bootstrapper.nodes + +import net.corda.bootstrapper.containers.instance.InstanceInfo +import net.corda.bootstrapper.context.Context +import java.util.concurrent.CompletableFuture + +class NodeAdder(val context: Context, + val nodeInstantiator: NodeInstantiator) { + + fun addNode(context: Context, nodeGroupName: String): CompletableFuture { + return synchronized(context) { + val nodeGroup = context.nodes[nodeGroupName]!! + val nodeInfo = nodeGroup.iterator().next() + val currentNodeSize = nodeGroup.size + val newInstanceX500 = nodeInfo.groupX500!!.copy(commonName = nodeInfo.groupX500.commonName + (currentNodeSize)).toString() + val newInstanceName = nodeGroupName + (currentNodeSize) + val nextNodeInfo = nodeInfo.copy( + instanceX500 = newInstanceX500, + instanceName = newInstanceName, + fqdn = nodeInstantiator.expectedFqdn(newInstanceName) + ) + nodeGroup.add(nextNodeInfo) + nodeInstantiator.instantiateNodeInstance(nextNodeInfo) + } + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeBuilder.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeBuilder.kt new file mode 100644 index 0000000000..9b55321cdd --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeBuilder.kt @@ -0,0 +1,48 @@ +package net.corda.bootstrapper.nodes + +import com.github.dockerjava.core.command.BuildImageResultCallback +import com.typesafe.config.Config +import com.typesafe.config.ConfigFactory +import com.typesafe.config.ConfigValueFactory +import net.corda.bootstrapper.docker.DockerUtils +import net.corda.node.services.config.NodeConfiguration +import net.corda.node.services.config.parseAsNodeConfiguration +import org.slf4j.LoggerFactory +import java.io.File + +open class NodeBuilder { + + companion object { + val LOG = LoggerFactory.getLogger(NodeBuilder::class.java) + } + + fun buildNode(copiedNode: CopiedNode): BuiltNode { + val localDockerClient = DockerUtils.createLocalDockerClient() + val copiedNodeConfig = copiedNode.copiedNodeConfig + val nodeDir = copiedNodeConfig.parentFile + if (!copiedNodeConfig.exists()) { + throw IllegalStateException("There is no nodeConfig for dir: " + copiedNodeConfig) + } + val nodeConfig = ConfigFactory.parseFile(copiedNodeConfig) + LOG.info("starting to build docker image for: " + nodeDir) + val nodeImageId = localDockerClient.buildImageCmd() + .withDockerfile(File(nodeDir, "Dockerfile")) + .withBaseDirectory(nodeDir) + .exec(BuildImageResultCallback()).awaitImageId() + LOG.info("finished building docker image for: $nodeDir with id: $nodeImageId") + val config = nodeConfig.parseAsNodeConfigWithFallback(ConfigFactory.parseFile(copiedNode.configFile)) + return copiedNode.builtNode(config, nodeImageId) + } + +} + + +fun Config.parseAsNodeConfigWithFallback(preCopyConfig: Config): NodeConfiguration { + val nodeConfig = this + .withValue("baseDirectory", ConfigValueFactory.fromAnyRef("")) + .withFallback(ConfigFactory.parseResources("reference.conf")) + .withFallback(preCopyConfig) + .resolve() + return nodeConfig.parseAsNodeConfiguration() +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeCopier.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeCopier.kt new file mode 100644 index 0000000000..fa58d90b89 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeCopier.kt @@ -0,0 +1,101 @@ +package net.corda.bootstrapper.nodes + +import com.typesafe.config.ConfigFactory +import com.typesafe.config.ConfigRenderOptions +import com.typesafe.config.ConfigValue +import org.slf4j.LoggerFactory +import java.io.File + +open class NodeCopier(private val cacheDir: File) { + + + fun copyNode(foundNode: FoundNode): CopiedNode { + val nodeCacheDir = File(cacheDir, foundNode.baseDirectory.name) + nodeCacheDir.deleteRecursively() + LOG.info("copying: ${foundNode.baseDirectory} to $nodeCacheDir") + foundNode.baseDirectory.copyRecursively(nodeCacheDir, overwrite = true) + copyBootstrapperFiles(nodeCacheDir) + val configInCacheDir = File(nodeCacheDir, "node.conf") + LOG.info("Applying precanned config " + configInCacheDir) + val rpcSettings = getDefaultRpcSettings() + val sshSettings = getDefaultSshSettings(); + mergeConfigs(configInCacheDir, rpcSettings, sshSettings) + return CopiedNode(foundNode, configInCacheDir, nodeCacheDir) + } + + + fun copyBootstrapperFiles(nodeCacheDir: File) { + this.javaClass.classLoader.getResourceAsStream("node-Dockerfile").use { nodeDockerFileInStream -> + val nodeDockerFile = File(nodeCacheDir, "Dockerfile") + nodeDockerFile.outputStream().use { nodeDockerFileOutStream -> + nodeDockerFileInStream.copyTo(nodeDockerFileOutStream) + } + } + + this.javaClass.classLoader.getResourceAsStream("run-corda-node.sh").use { nodeRunScriptInStream -> + val nodeRunScriptFile = File(nodeCacheDir, "run-corda.sh") + nodeRunScriptFile.outputStream().use { nodeDockerFileOutStream -> + nodeRunScriptInStream.copyTo(nodeDockerFileOutStream) + } + } + + this.javaClass.classLoader.getResourceAsStream("node_info_watcher.sh").use { nodeRunScriptInStream -> + val nodeInfoWatcherFile = File(nodeCacheDir, "node_info_watcher.sh") + nodeInfoWatcherFile.outputStream().use { nodeDockerFileOutStream -> + nodeRunScriptInStream.copyTo(nodeDockerFileOutStream) + } + } + } + + internal fun getDefaultRpcSettings(): ConfigValue { + return javaClass + .classLoader + .getResourceAsStream("rpc-settings.conf") + .reader().use { + ConfigFactory.parseReader(it) + }.getValue("rpcSettings") + } + + internal fun getDefaultSshSettings(): ConfigValue { + return javaClass + .classLoader + .getResourceAsStream("ssh.conf") + .reader().use { + ConfigFactory.parseReader(it) + }.getValue("sshd") + } + + internal fun mergeConfigs(configInCacheDir: File, + rpcSettings: ConfigValue, + sshSettings: ConfigValue, + mergeMode: Mode = Mode.NODE) { + var trimmedConfig = ConfigFactory.parseFile(configInCacheDir) + .withoutPath("compatibilityZoneURL") + .withValue("rpcSettings", rpcSettings) + .withValue("sshd", sshSettings) + + if (mergeMode == Mode.NODE) { + trimmedConfig = trimmedConfig.withoutPath("p2pAddress") + } + + configInCacheDir.outputStream().use { + trimmedConfig.root().render(ConfigRenderOptions + .defaults() + .setOriginComments(false) + .setComments(false) + .setFormatted(true) + .setJson(false)).byteInputStream().copyTo(it) + } + } + + + internal enum class Mode { + NOTARY, NODE + } + + + companion object { + val LOG = LoggerFactory.getLogger(NodeCopier::class.java) + } +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeFinder.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeFinder.kt new file mode 100644 index 0000000000..9c2b75d94b --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeFinder.kt @@ -0,0 +1,32 @@ +package net.corda.bootstrapper.nodes + +import com.typesafe.config.ConfigFactory +import net.corda.bootstrapper.Constants +import org.slf4j.LoggerFactory +import java.io.File + +class NodeFinder(private val scratchDir: File) { + + + fun findNodes(): List { + return scratchDir.walkBottomUp().filter { it.name == "node.conf" && !it.absolutePath.contains(Constants.BOOTSTRAPPER_DIR_NAME) }.map { + try { + ConfigFactory.parseFile(it) to it + } catch (t: Throwable) { + null + } + }.filterNotNull() + .filter { !it.first.hasPath("notary") } + .map { (nodeConfig, nodeConfigFile) -> + LOG.info("We've found a node with name: ${nodeConfigFile.parentFile.name}") + FoundNode(nodeConfigFile, nodeConfigFile.parentFile) + }.toList() + + } + + companion object { + val LOG = LoggerFactory.getLogger(NodeFinder::class.java) + } + +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstance.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstance.kt new file mode 100644 index 0000000000..e6d6a440d3 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstance.kt @@ -0,0 +1,31 @@ +package net.corda.bootstrapper.nodes + +import net.corda.node.services.config.NodeConfiguration +import java.io.File + +class NodeInstance(configFile: File, + baseDirectory: File, + copiedNodeConfig: File, + copiedNodeDir: File, + nodeConfig: NodeConfiguration, + localImageId: String, + remoteImageName: String, + nodeInstanceName: String, + actualX500: String, + expectedFqName: String, + val reachableAddress: String, + val portMapping: Map) : + NodeInstanceRequest( + configFile, + baseDirectory, + copiedNodeConfig, + copiedNodeDir, + nodeConfig, + localImageId, + remoteImageName, + nodeInstanceName, + actualX500, + expectedFqName + ) { +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstanceRequest.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstanceRequest.kt new file mode 100644 index 0000000000..0ecb570352 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstanceRequest.kt @@ -0,0 +1,24 @@ +package net.corda.bootstrapper.nodes + +import net.corda.node.services.config.NodeConfiguration +import java.io.File + +open class NodeInstanceRequest(configFile: File, baseDirectory: File, + copiedNodeConfig: File, copiedNodeDir: File, + nodeConfig: NodeConfiguration, localImageId: String, remoteImageName: String, + internal val nodeInstanceName: String, + internal val actualX500: String, + internal val expectedFqName: String) : PushedNode( + configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName +) { + + override fun toString(): String { + return "NodeInstanceRequest(nodeInstanceName='$nodeInstanceName', actualX500='$actualX500', expectedFqName='$expectedFqName') ${super.toString()}" + } + + fun toNodeInstance(reachableAddress: String, portMapping: Map): NodeInstance { + return NodeInstance(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName, nodeInstanceName, actualX500, expectedFqName, reachableAddress, portMapping) + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstantiator.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstantiator.kt new file mode 100644 index 0000000000..1c7f0ac6f6 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodeInstantiator.kt @@ -0,0 +1,95 @@ +package net.corda.bootstrapper.nodes + +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.containers.instance.InstanceInfo +import net.corda.bootstrapper.containers.instance.Instantiator +import net.corda.bootstrapper.context.Context +import net.corda.core.identity.CordaX500Name +import java.util.concurrent.CompletableFuture + +class NodeInstantiator(val instantiator: Instantiator, + val context: Context) { + + + fun createInstanceRequests(pushedNode: PushedNode, nodeCount: Map): List { + + val namedMap = nodeCount.map { it.key.name.toLowerCase() to it.value }.toMap() + + return (0 until (namedMap[pushedNode.name.toLowerCase()] ?: 1)).map { i -> + createInstanceRequest(pushedNode, i) + } + } + + private fun createInstanceRequest(node: PushedNode, i: Int): NodeInstanceRequest { + val nodeInstanceName = node.name + i + val expectedName = instantiator.getExpectedFQDN(nodeInstanceName) + return node.toNodeInstanceRequest(nodeInstanceName, buildX500(node.nodeConfig.myLegalName, i), expectedName) + } + + fun createInstanceRequest(node: PushedNode): NodeInstanceRequest { + return createInstanceRequest(node, 0) + } + + + private fun buildX500(baseX500: CordaX500Name, i: Int): String { + if (i == 0) { + return baseX500.toString() + } + return baseX500.copy(commonName = (baseX500.commonName ?: "") + i).toString() + } + + fun instantiateNodeInstance(request: Context.PersistableNodeInstance): CompletableFuture { + return instantiateNodeInstance(request.remoteImageName, request.rpcPort!!, request.instanceName, request.fqdn, request.instanceX500).thenApplyAsync { + InstanceInfo(request.groupName, request.instanceName, request.fqdn, it.first, it.second) + } + } + + fun instantiateNodeInstance(request: NodeInstanceRequest): CompletableFuture { + return instantiateNodeInstance(request.remoteImageName, request.nodeConfig.rpcOptions.address!!.port, request.nodeInstanceName, request.expectedFqName, request.actualX500) + .thenApplyAsync { (reachableName, portMapping) -> + request.toNodeInstance(reachableName, portMapping) + } + } + + fun instantiateNotaryInstance(request: NodeInstanceRequest): CompletableFuture { + return instantiateNotaryInstance(request.remoteImageName, request.nodeConfig.rpcOptions.address!!.port, request.nodeInstanceName, request.expectedFqName) + .thenApplyAsync { (reachableName, portMapping) -> + request.toNodeInstance(reachableName, portMapping) + } + } + + private fun instantiateNotaryInstance(remoteImageName: String, + rpcPort: Int, + nodeInstanceName: String, + expectedFqName: String): CompletableFuture>> { + return instantiator.instantiateContainer( + remoteImageName, + listOf(Constants.NODE_P2P_PORT, Constants.NODE_RPC_PORT, Constants.NODE_SSHD_PORT), + nodeInstanceName, + mapOf("OUR_NAME" to expectedFqName, + "OUR_PORT" to Constants.NODE_P2P_PORT.toString()) + ) + } + + private fun instantiateNodeInstance(remoteImageName: String, + rpcPort: Int, + nodeInstanceName: String, + expectedFqName: String, + actualX500: String): CompletableFuture>> { + + return instantiator.instantiateContainer( + remoteImageName, + listOf(Constants.NODE_P2P_PORT, Constants.NODE_RPC_PORT, Constants.NODE_SSHD_PORT), + nodeInstanceName, + mapOf("OUR_NAME" to expectedFqName, + "OUR_PORT" to Constants.NODE_P2P_PORT.toString(), + "X500" to actualX500) + ) + } + + fun expectedFqdn(newInstanceName: String): String { + return instantiator.getExpectedFQDN(newInstanceName) + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodePusher.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodePusher.kt new file mode 100644 index 0000000000..ecb12b363d --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/NodePusher.kt @@ -0,0 +1,19 @@ +package net.corda.bootstrapper.nodes + +import net.corda.bootstrapper.containers.push.ContainerPusher +import net.corda.bootstrapper.context.Context +import java.util.concurrent.CompletableFuture + +class NodePusher(private val containerPusher: ContainerPusher, + private val context: Context) { + + + fun pushNode(builtNode: BuiltNode): CompletableFuture { + + val localImageId = builtNode.localImageId + val nodeImageIdentifier = "node-${builtNode.name}" + val nodeImageNameFuture = containerPusher.pushContainerToImageRepository(localImageId, + nodeImageIdentifier, context.networkName) + return nodeImageNameFuture.thenApplyAsync { imageName -> builtNode.toPushedNode(imageName) } + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/PushedNode.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/PushedNode.kt new file mode 100644 index 0000000000..d75c4390f5 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/nodes/PushedNode.kt @@ -0,0 +1,25 @@ +package net.corda.bootstrapper.nodes + +import net.corda.node.services.config.NodeConfiguration +import java.io.File + +open class PushedNode(configFile: File, baseDirectory: File, + copiedNodeConfig: File, copiedNodeDir: File, + nodeConfig: NodeConfiguration, localImageId: String, val remoteImageName: String) : BuiltNode( + configFile, + baseDirectory, + copiedNodeConfig, + copiedNodeDir, + nodeConfig, + localImageId +) { + fun toNodeInstanceRequest(nodeInstanceName: String, actualX500: String, expectedFqName: String): NodeInstanceRequest { + return NodeInstanceRequest(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir, nodeConfig, localImageId, remoteImageName, nodeInstanceName, actualX500, expectedFqName) + } + + override fun toString(): String { + return "PushedNode(remoteImageName='$remoteImageName') ${super.toString()}" + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/CopiedNotary.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/CopiedNotary.kt new file mode 100644 index 0000000000..f16ef7a70a --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/CopiedNotary.kt @@ -0,0 +1,14 @@ +package net.corda.bootstrapper.notaries + +import net.corda.bootstrapper.nodes.CopiedNode +import java.io.File + +class CopiedNotary(configFile: File, baseDirectory: File, + copiedNodeConfig: File, copiedNodeDir: File, val nodeInfoFile: File) : + CopiedNode(configFile, baseDirectory, copiedNodeConfig, copiedNodeDir) { +} + + +fun CopiedNode.toNotary(nodeInfoFile: File): CopiedNotary { + return CopiedNotary(this.configFile, this.baseDirectory, this.copiedNodeConfig, this.copiedNodeDir, nodeInfoFile) +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryCopier.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryCopier.kt new file mode 100644 index 0000000000..e3b51b8e85 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryCopier.kt @@ -0,0 +1,69 @@ +package net.corda.bootstrapper.notaries + +import net.corda.bootstrapper.nodes.CopiedNode +import net.corda.bootstrapper.nodes.FoundNode +import net.corda.bootstrapper.nodes.NodeCopier +import org.slf4j.LoggerFactory +import java.io.File + +class NotaryCopier(val cacheDir: File) : NodeCopier(cacheDir) { + + fun copyNotary(foundNotary: FoundNode): CopiedNotary { + val nodeCacheDir = File(cacheDir, foundNotary.baseDirectory.name) + nodeCacheDir.deleteRecursively() + LOG.info("copying: ${foundNotary.baseDirectory} to $nodeCacheDir") + foundNotary.baseDirectory.copyRecursively(nodeCacheDir, overwrite = true) + copyNotaryBootstrapperFiles(nodeCacheDir) + val configInCacheDir = File(nodeCacheDir, "node.conf") + LOG.info("Applying precanned config " + configInCacheDir) + val rpcSettings = getDefaultRpcSettings() + val sshSettings = getDefaultSshSettings(); + mergeConfigs(configInCacheDir, rpcSettings, sshSettings, Mode.NOTARY) + val generatedNodeInfo = generateNodeInfo(nodeCacheDir) + return CopiedNode(foundNotary, configInCacheDir, nodeCacheDir).toNotary(generatedNodeInfo) + } + + fun generateNodeInfo(dirToGenerateFrom: File): File { + val nodeInfoGeneratorProcess = ProcessBuilder() + .command(listOf("java", "-jar", "corda.jar", "--just-generate-node-info")) + .directory(dirToGenerateFrom) + .inheritIO() + .start() + + val exitCode = nodeInfoGeneratorProcess.waitFor() + if (exitCode != 0) { + throw IllegalStateException("Failed to generate nodeInfo for notary: " + dirToGenerateFrom) + } + val nodeInfoFile = dirToGenerateFrom.listFiles().filter { it.name.startsWith("nodeInfo") }.single() + return nodeInfoFile; + } + + private fun copyNotaryBootstrapperFiles(nodeCacheDir: File) { + this.javaClass.classLoader.getResourceAsStream("notary-Dockerfile").use { nodeDockerFileInStream -> + val nodeDockerFile = File(nodeCacheDir, "Dockerfile") + nodeDockerFile.outputStream().use { nodeDockerFileOutStream -> + nodeDockerFileInStream.copyTo(nodeDockerFileOutStream) + } + } + + this.javaClass.classLoader.getResourceAsStream("run-corda-notary.sh").use { nodeRunScriptInStream -> + val nodeRunScriptFile = File(nodeCacheDir, "run-corda.sh") + nodeRunScriptFile.outputStream().use { nodeDockerFileOutStream -> + nodeRunScriptInStream.copyTo(nodeDockerFileOutStream) + } + } + + this.javaClass.classLoader.getResourceAsStream("node_info_watcher.sh").use { nodeRunScriptInStream -> + val nodeInfoWatcherFile = File(nodeCacheDir, "node_info_watcher.sh") + nodeInfoWatcherFile.outputStream().use { nodeDockerFileOutStream -> + nodeRunScriptInStream.copyTo(nodeDockerFileOutStream) + } + } + } + + companion object { + val LOG = LoggerFactory.getLogger(NotaryCopier::class.java) + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryFinder.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryFinder.kt new file mode 100644 index 0000000000..d4ae23d072 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/notaries/NotaryFinder.kt @@ -0,0 +1,25 @@ +package net.corda.bootstrapper.notaries + +import com.typesafe.config.ConfigFactory +import net.corda.bootstrapper.Constants +import net.corda.bootstrapper.nodes.FoundNode +import java.io.File + +class NotaryFinder(private val dirToSearch: File) { + + fun findNotaries(): List { + return dirToSearch.walkBottomUp().filter { it.name == "node.conf" && !it.absolutePath.contains(Constants.BOOTSTRAPPER_DIR_NAME) } + .map { + try { + ConfigFactory.parseFile(it) to it + } catch (t: Throwable) { + null + } + }.filterNotNull() + .filter { it.first.hasPath("notary") } + .map { (_, nodeConfigFile) -> + FoundNode(nodeConfigFile) + }.toList() + } +} + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/serialization/SerializationHelper.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/serialization/SerializationHelper.kt new file mode 100644 index 0000000000..d3d867c461 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/serialization/SerializationHelper.kt @@ -0,0 +1,30 @@ +package net.corda.bootstrapper.serialization + +import net.corda.core.serialization.internal.SerializationEnvironmentImpl +import net.corda.core.serialization.internal.nodeSerializationEnv +import net.corda.node.serialization.amqp.AMQPServerSerializationScheme +import net.corda.serialization.internal.AMQP_P2P_CONTEXT +import net.corda.serialization.internal.AMQP_STORAGE_CONTEXT +import net.corda.serialization.internal.SerializationFactoryImpl + + +class SerializationEngine { + companion object { + fun init() { + synchronized(this) { + if (nodeSerializationEnv == null) { + val classloader = this.javaClass.classLoader + nodeSerializationEnv = SerializationEnvironmentImpl( + SerializationFactoryImpl().apply { + registerScheme(AMQPServerSerializationScheme(emptyList())) + }, + p2pContext = AMQP_P2P_CONTEXT.withClassLoader(classloader), + rpcServerContext = AMQP_P2P_CONTEXT.withClassLoader(classloader), + storageContext = AMQP_STORAGE_CONTEXT.withClassLoader(classloader), + checkpointContext = AMQP_P2P_CONTEXT.withClassLoader(classloader) + ) + } + } + } + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/Volume.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/Volume.kt new file mode 100644 index 0000000000..fa514dd168 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/Volume.kt @@ -0,0 +1,56 @@ +package net.corda.bootstrapper.volumes + +import com.microsoft.azure.storage.file.CloudFile +import com.typesafe.config.ConfigFactory +import net.corda.bootstrapper.notaries.CopiedNotary +import net.corda.bootstrapper.serialization.SerializationEngine +import net.corda.core.node.NetworkParameters +import net.corda.core.node.NotaryInfo +import net.corda.core.serialization.deserialize +import net.corda.nodeapi.internal.DEV_ROOT_CA +import net.corda.nodeapi.internal.SignedNodeInfo +import net.corda.nodeapi.internal.createDevNetworkMapCa +import java.io.File +import java.security.cert.X509Certificate +import java.time.Instant + +interface Volume { + fun notariesForNetworkParams(notaries: List) + + companion object { + init { + SerializationEngine.init() + } + + internal val networkMapCa = createDevNetworkMapCa(DEV_ROOT_CA) + internal val networkMapCert: X509Certificate = networkMapCa.certificate + internal val keyPair = networkMapCa.keyPair + + } + + + fun CloudFile.uploadFromByteArray(array: ByteArray) { + this.uploadFromByteArray(array, 0, array.size) + } + + + fun convertNodeIntoToNetworkParams(notaryFiles: List>): NetworkParameters { + val notaryInfos = notaryFiles.map { (configFile, nodeInfoFile) -> + val validating = ConfigFactory.parseFile(configFile).getConfig("notary").getBoolean("validating") + nodeInfoFile.readBytes().deserialize().verified().let { NotaryInfo(it.legalIdentities.first(), validating) } + } + + return notaryInfos.let { + NetworkParameters( + minimumPlatformVersion = 1, + notaries = it, + maxMessageSize = 10485760, + maxTransactionSize = Int.MAX_VALUE, + modifiedTime = Instant.now(), + epoch = 10, + whitelistedContractImplementations = emptyMap()) + } + } + + +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/azure/AzureSmbVolume.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/azure/AzureSmbVolume.kt new file mode 100644 index 0000000000..185868bbf1 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/azure/AzureSmbVolume.kt @@ -0,0 +1,81 @@ +package net.corda.bootstrapper.volumes.azure + +import com.microsoft.azure.management.Azure +import com.microsoft.azure.management.resources.ResourceGroup +import com.microsoft.azure.management.storage.StorageAccount +import com.microsoft.azure.storage.CloudStorageAccount +import net.corda.bootstrapper.Constants.Companion.restFriendlyName +import net.corda.bootstrapper.notaries.CopiedNotary +import net.corda.bootstrapper.volumes.Volume +import net.corda.bootstrapper.volumes.Volume.Companion.keyPair +import net.corda.bootstrapper.volumes.Volume.Companion.networkMapCert +import net.corda.core.internal.signWithCert +import net.corda.core.serialization.serialize +import net.corda.nodeapi.internal.network.NETWORK_PARAMS_FILE_NAME +import org.slf4j.LoggerFactory + + +class AzureSmbVolume(private val azure: Azure, private val resourceGroup: ResourceGroup) : Volume { + + private val storageAccount = getStorageAccount() + + private val accKeys = storageAccount.keys[0] + + + private val cloudFileShare = CloudStorageAccount.parse( + "DefaultEndpointsProtocol=https;" + + "AccountName=${storageAccount.name()};" + + "AccountKey=${accKeys.value()};" + + "EndpointSuffix=core.windows.net" + ) + .createCloudFileClient() + .getShareReference("nodeinfos") + + val networkParamsFolder = cloudFileShare.rootDirectoryReference.getDirectoryReference("network-params") + val shareName: String = cloudFileShare.name + val storageAccountName: String + get() = resourceGroup.restFriendlyName() + val storageAccountKey: String + get() = accKeys.value() + + + init { + while (true) { + try { + cloudFileShare.createIfNotExists() + networkParamsFolder.createIfNotExists() + break + } catch (e: Throwable) { + LOG.debug("storage account not ready, waiting") + Thread.sleep(5000) + } + } + } + + private fun getStorageAccount(): StorageAccount { + return azure.storageAccounts().getByResourceGroup(resourceGroup.name(), resourceGroup.restFriendlyName()) + ?: azure.storageAccounts().define(resourceGroup.restFriendlyName()) + .withRegion(resourceGroup.region()) + .withExistingResourceGroup(resourceGroup) + .withAccessFromAllNetworks() + .create() + } + + override fun notariesForNetworkParams(notaries: List) { + val networkParamsFile = networkParamsFolder.getFileReference(NETWORK_PARAMS_FILE_NAME) + networkParamsFile.deleteIfExists() + LOG.info("Storing network-params in AzureFile location: " + networkParamsFile.uri) + val networkParameters = convertNodeIntoToNetworkParams(notaries.map { it.configFile to it.nodeInfoFile }) + networkParamsFile.uploadFromByteArray(networkParameters.signWithCert(keyPair.private, networkMapCert).serialize().bytes) + } + + + companion object { + val LOG = LoggerFactory.getLogger(AzureSmbVolume::class.java) + } + +} + + + + diff --git a/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/docker/LocalVolume.kt b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/docker/LocalVolume.kt new file mode 100644 index 0000000000..e5ca96c9a0 --- /dev/null +++ b/tools/network-bootstrapper/src/main/kotlin/net/corda/bootstrapper/volumes/docker/LocalVolume.kt @@ -0,0 +1,35 @@ +package net.corda.bootstrapper.volumes.docker + +import net.corda.bootstrapper.context.Context +import net.corda.bootstrapper.notaries.CopiedNotary +import net.corda.bootstrapper.volumes.Volume +import net.corda.core.internal.signWithCert +import net.corda.core.serialization.serialize +import net.corda.nodeapi.internal.network.NETWORK_PARAMS_FILE_NAME +import org.slf4j.LoggerFactory +import java.io.File + +class LocalVolume(scratchDir: File, context: Context) : Volume { + + private val networkDir = File(scratchDir, context.safeNetworkName) + private val volumeDir = File(networkDir, "nodeinfos") + private val networkParamsDir = File(volumeDir, "network-params") + + override fun notariesForNetworkParams(notaries: List) { + volumeDir.deleteRecursively() + networkParamsDir.mkdirs() + val networkParameters = convertNodeIntoToNetworkParams(notaries.map { it.configFile to it.nodeInfoFile }) + val networkParamsFile = File(networkParamsDir, NETWORK_PARAMS_FILE_NAME) + networkParamsFile.outputStream().use { networkParameters.signWithCert(Volume.keyPair.private, Volume.networkMapCert).serialize().writeTo(it) } + LOG.info("wrote network params to local file: ${networkParamsFile.absolutePath}") + } + + + fun getPath(): String { + return volumeDir.absolutePath + } + + companion object { + val LOG = LoggerFactory.getLogger(LocalVolume::class.java) + } +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/node-Dockerfile b/tools/network-bootstrapper/src/main/resources/node-Dockerfile new file mode 100644 index 0000000000..3ef62097b2 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/node-Dockerfile @@ -0,0 +1,37 @@ +# Base image from (http://phusion.github.io/baseimage-docker) +FROM openjdk:8u151-jre-alpine + +RUN apk upgrade --update && \ + apk add --update --no-cache bash iputils && \ + rm -rf /var/cache/apk/* && \ + # Add user to run the app && \ + addgroup corda && \ + adduser -G corda -D -s /bin/bash corda && \ + # Create /opt/corda directory && \ + mkdir -p /opt/corda/plugins && \ + mkdir -p /opt/corda/logs && \ + mkdir -p /opt/corda/additional-node-infos && \ + mkdir -p /opt/node-setup + +# Copy corda files +ADD --chown=corda:corda corda.jar /opt/corda/corda.jar +ADD --chown=corda:corda node.conf /opt/corda/node.conf +ADD --chown=corda:corda cordapps/ /opt/corda/cordapps + +# Copy node info watcher script +ADD --chown=corda:corda node_info_watcher.sh /opt/corda/ + +COPY run-corda.sh /run-corda.sh + +RUN chmod +x /run-corda.sh && \ + chmod +x /opt/corda/node_info_watcher.sh && \ + sync && \ + chown -R corda:corda /opt/corda + +# Working directory for Corda +WORKDIR /opt/corda +ENV HOME=/opt/corda +USER corda + +# Start it +CMD ["/run-corda.sh"] \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/node_info_watcher.sh b/tools/network-bootstrapper/src/main/resources/node_info_watcher.sh new file mode 100755 index 0000000000..a3b6e19387 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/node_info_watcher.sh @@ -0,0 +1,12 @@ +#!/bin/bash +while [ 1 -lt 2 ]; do + NODE_INFO=$(ls | grep nodeInfo) + if [ ${#NODE_INFO} -ge 5 ]; then + echo "found nodeInfo copying to additional node node info folder" + cp ${NODE_INFO} additional-node-infos/ + exit 0 + else + echo "no node info found waiting" + fi + sleep 5 +done \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/node_killer.sh b/tools/network-bootstrapper/src/main/resources/node_killer.sh new file mode 100755 index 0000000000..e553d287c5 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/node_killer.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +sleep $1 \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/notary-Dockerfile b/tools/network-bootstrapper/src/main/resources/notary-Dockerfile new file mode 100644 index 0000000000..d8a7b8a0a7 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/notary-Dockerfile @@ -0,0 +1,39 @@ +# Base image from (http://phusion.github.io/baseimage-docker) +FROM openjdk:8u151-jre-alpine + +RUN apk upgrade --update && \ + apk add --update --no-cache bash iputils && \ + rm -rf /var/cache/apk/* && \ + # Add user to run the app && \ + addgroup corda && \ + adduser -G corda -D -s /bin/bash corda && \ + # Create /opt/corda directory && \ + mkdir -p /opt/corda/plugins && \ + mkdir -p /opt/corda/logs && \ + mkdir -p /opt/corda/additional-node-infos && \ + mkdir -p /opt/node-setup + +# Copy corda files +ADD --chown=corda:corda corda.jar /opt/corda/corda.jar +ADD --chown=corda:corda node.conf /opt/corda/node.conf +ADD --chown=corda:corda cordapps/ /opt/corda/cordapps +ADD --chown=corda:corda certificates/ /opt/corda/certificates +#ADD --chown=corda:corda nodeInfo-* /opt/corda/ + +# Copy node info watcher script +ADD --chown=corda:corda node_info_watcher.sh /opt/corda/ + +COPY run-corda.sh /run-corda.sh + +RUN chmod +x /run-corda.sh && \ + chmod +x /opt/corda/node_info_watcher.sh && \ + sync && \ + chown -R corda:corda /opt/corda + +# Working directory for Corda +WORKDIR /opt/corda +ENV HOME=/opt/corda +USER corda + +# Start it +CMD ["/run-corda.sh"] \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/rpc-settings.conf b/tools/network-bootstrapper/src/main/resources/rpc-settings.conf new file mode 100644 index 0000000000..95c820218f --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/rpc-settings.conf @@ -0,0 +1,4 @@ +rpcSettings { + address="0.0.0.0:10003" + adminAddress="127.0.0.1:10005" +} \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/run-corda-node.sh b/tools/network-bootstrapper/src/main/resources/run-corda-node.sh new file mode 100755 index 0000000000..c5d379d260 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/run-corda-node.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +: ${CORDA_HOME:=/opt/corda} +: ${JAVA_OPTIONS:=-Xmx512m} +: ${X500? Need a value for the x500 name of this node} +: ${OUR_NAME? Need a value for the expected FQDN of this node} +: ${OUR_PORT? Need a value for the port to bind to} + +export CORDA_HOME JAVA_OPTIONS + +sed -i "/myLegalName/d" node.conf +echo "myLegalName=\"${X500}\"" >> node.conf +echo "p2pAddress=\"${OUR_NAME}:${OUR_PORT}\"" >> node.conf + +cp additional-node-infos/network-params/network-parameters . + +bash node_info_watcher.sh & + +cd ${CORDA_HOME} + +if java ${JAVA_OPTIONS} -jar ${CORDA_HOME}/corda.jar 2>&1 ; then + echo "Corda exited with zero exit code" +else + echo "Corda exited with nonzero exit code, sleeping to allow log collection" + sleep 10000 +fi \ No newline at end of file diff --git a/tools/network-bootstrapper/src/main/resources/run-corda-notary.sh b/tools/network-bootstrapper/src/main/resources/run-corda-notary.sh new file mode 100755 index 0000000000..ec8e21d4e7 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/run-corda-notary.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +: ${CORDA_HOME:=/opt/corda} +: ${JAVA_OPTIONS:=-Xmx512m} +: ${OUR_NAME? Need a value for the expected FQDN of this node} +: ${OUR_PORT? Need a value for the port to bind to} + +export CORDA_HOME JAVA_OPTIONS +echo "p2pAddress=\"${OUR_NAME}:${OUR_PORT}\"" >> node.conf +cp additional-node-infos/network-params/network-parameters . + +bash node_info_watcher.sh & + +cd ${CORDA_HOME} + + +if java ${JAVA_OPTIONS} -jar ${CORDA_HOME}/corda.jar 2>&1 ; then + echo "Corda exited with zero exit code" +else + echo "Corda exited with nonzero exit code, sleeping to allow log collection" + sleep 10000 +fi + + + diff --git a/tools/network-bootstrapper/src/main/resources/ssh.conf b/tools/network-bootstrapper/src/main/resources/ssh.conf new file mode 100644 index 0000000000..32f59a0321 --- /dev/null +++ b/tools/network-bootstrapper/src/main/resources/ssh.conf @@ -0,0 +1,3 @@ +sshd { + port = 12222 +} \ No newline at end of file From 92889cef5c62e31ca0c73c7935cb82b2ed4e5e4a Mon Sep 17 00:00:00 2001 From: Joel Dudley Date: Tue, 12 Jun 2018 14:10:57 +0100 Subject: [PATCH 6/9] Update task so it can be run outside of the main Corda repo. (#3349) --- docs/source/generating-a-node.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/generating-a-node.rst b/docs/source/generating-a-node.rst index 2dc7f225cb..9c5555a720 100644 --- a/docs/source/generating-a-node.rst +++ b/docs/source/generating-a-node.rst @@ -170,25 +170,25 @@ Below you can find the example task from the `IRS Demo Date: Tue, 12 Jun 2018 18:00:44 +0100 Subject: [PATCH 7/9] =?UTF-8?q?CORDA-1622=20Correct=20broken=20de-dup=20he?= =?UTF-8?q?ader=20logic=20on=20node=20restart=20for=20res=E2=80=A6=20(#335?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CORDA-1622 Correct broken de-dup header logic on node restart for restored flows. * Missed a volatile --- .../SingleThreadedStateMachineManager.kt | 10 +-- .../statemachine/RetryFlowMockTest.kt | 90 ++++++++++++++----- 2 files changed, 73 insertions(+), 27 deletions(-) diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt index 6cc0f323b1..b0e0d05ad9 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/SingleThreadedStateMachineManager.kt @@ -345,8 +345,7 @@ class SingleThreadedStateMachineManager( checkpoint = checkpoint, initialDeduplicationHandler = null, isAnyCheckpointPersisted = true, - isStartIdempotent = false, - senderUUID = null + isStartIdempotent = false ) } else { // Just flow initiation message @@ -652,8 +651,7 @@ class SingleThreadedStateMachineManager( checkpoint: Checkpoint, isAnyCheckpointPersisted: Boolean, isStartIdempotent: Boolean, - initialDeduplicationHandler: DeduplicationHandler?, - senderUUID: String? = ourSenderUUID + initialDeduplicationHandler: DeduplicationHandler? ): Flow { val flowState = checkpoint.flowState val resultFuture = openFuture() @@ -669,7 +667,7 @@ class SingleThreadedStateMachineManager( isStartIdempotent = isStartIdempotent, isRemoved = false, flowLogic = logic, - senderUUID = senderUUID + senderUUID = null ) val fiber = FlowStateMachineImpl(id, logic, scheduler) fiber.transientValues = TransientReference(createTransientValues(id, resultFuture)) @@ -688,7 +686,7 @@ class SingleThreadedStateMachineManager( isStartIdempotent = isStartIdempotent, isRemoved = false, flowLogic = fiber.logic, - senderUUID = senderUUID + senderUUID = null ) fiber.transientValues = TransientReference(createTransientValues(id, resultFuture)) fiber.transientState = TransientReference(state) diff --git a/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt b/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt index 3049b55d58..42d79ce2a8 100644 --- a/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt +++ b/node/src/test/kotlin/net/corda/node/services/statemachine/RetryFlowMockTest.kt @@ -29,6 +29,7 @@ import org.junit.Before import org.junit.Test import java.sql.SQLException import java.time.Duration +import java.util.* import kotlin.test.assertEquals import kotlin.test.assertNotNull import kotlin.test.assertNull @@ -47,6 +48,7 @@ class RetryFlowMockTest { RetryFlow.count = 0 SendAndRetryFlow.count = 0 RetryInsertFlow.count = 0 + KeepSendingFlow.count = 0 } private fun StartedNode.startFlow(logic: FlowLogic): CordaFuture { @@ -74,7 +76,7 @@ class RetryFlowMockTest { @Test fun `Retry does not set senderUUID`() { - val messagesSent = mutableListOf() + val messagesSent = Collections.synchronizedList(mutableListOf()) val partyB = nodeB.info.legalIdentities.first() nodeA.setMessagingServiceSpy(object : MessagingServiceSpy(nodeA.network) { override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) { @@ -88,6 +90,38 @@ class RetryFlowMockTest { assertEquals(2, SendAndRetryFlow.count) } + @Test + fun `Restart does not set senderUUID`() { + val messagesSent = Collections.synchronizedList(mutableListOf()) + val partyB = nodeB.info.legalIdentities.first() + nodeA.setMessagingServiceSpy(object : MessagingServiceSpy(nodeA.network) { + override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) { + messagesSent.add(message) + messagingService.send(message, target) + } + }) + val count = 10000 // Lots of iterations so the flow keeps going long enough + nodeA.startFlow(KeepSendingFlow(count, partyB)) + while (messagesSent.size < 1) { + Thread.sleep(10) + } + assertNotNull(messagesSent.first().senderUUID) + nodeA = mockNet.restartNode(nodeA) + // This is a bit racy because restarting the node actually starts it, so we need to make sure there's enough iterations we get here with flow still going. + nodeA.setMessagingServiceSpy(object : MessagingServiceSpy(nodeA.network) { + override fun send(message: Message, target: MessageRecipients, sequenceKey: Any) { + messagesSent.add(message) + messagingService.send(message, target) + } + }) + // Now short circuit the iterations so the flow finishes soon. + KeepSendingFlow.count = count - 2 + while (nodeA.smm.allStateMachines.size > 0) { + Thread.sleep(10) + } + assertNull(messagesSent.last().senderUUID) + } + @Test fun `Retry duplicate insert`() { assertEquals(Unit, nodeA.startFlow(RetryInsertFlow(1)).get()) @@ -158,6 +192,7 @@ class RetryCausingError : SQLException("deadlock") class RetryFlow(private val i: Int) : FlowLogic() { companion object { + @Volatile var count = 0 } @@ -174,29 +209,10 @@ class RetryFlow(private val i: Int) : FlowLogic() { } } -class RetryAndSleepFlow(private val i: Int) : FlowLogic() { - companion object { - var count = 0 - } - - @Suspendable - override fun call() { - logger.info("Hello $count") - if (count++ < i) { - if (i == Int.MAX_VALUE) { - throw LimitedRetryCausingError() - } else { - throw RetryCausingError() - } - } else { - sleep(Duration.ofDays(1)) - } - } -} - @InitiatingFlow class SendAndRetryFlow(private val i: Int, private val other: Party) : FlowLogic() { companion object { + @Volatile var count = 0 } @@ -221,8 +237,40 @@ class ReceiveFlow2(private val other: FlowSession) : FlowLogic() { } } +@InitiatingFlow +class KeepSendingFlow(private val i: Int, private val other: Party) : FlowLogic() { + companion object { + @Volatile + var count = 0 + } + + @Suspendable + override fun call() { + val session = initiateFlow(other) + session.send(i.toString()) + do { + logger.info("Sending... $count") + session.send("Boo") + } while (count++ < i) + } +} + +@Suppress("unused") +@InitiatedBy(KeepSendingFlow::class) +class ReceiveFlow3(private val other: FlowSession) : FlowLogic() { + @Suspendable + override fun call() { + var count = other.receive().unwrap { it.toInt() } + while (count-- > 0) { + val received = other.receive().unwrap { it } + logger.info("Received... $received $count") + } + } +} + class RetryInsertFlow(private val i: Int) : FlowLogic() { companion object { + @Volatile var count = 0 } From 7fec9df99e2e82c7917fbf6cb2e7a62eff51bd9e Mon Sep 17 00:00:00 2001 From: Michele Sollecito Date: Tue, 12 Jun 2018 18:08:31 +0100 Subject: [PATCH 8/9] Fixed double JAR publishing problem with network bootstrapper. (#3354) --- build.gradle | 4 ++-- tools/blobinspector/build.gradle | 4 ++-- tools/bootstrapper/build.gradle | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 2e6338eef7..b1a0dd42a9 100644 --- a/build.gradle +++ b/build.gradle @@ -348,8 +348,8 @@ bintrayConfig { 'corda-shell', 'corda-serialization', 'corda-serialization-deterministic', - 'tools-blob-inspector', - 'tools-network-bootstrapper' + 'corda-tools-blob-inspector', + 'corda-tools-network-bootstrapper' ] license { name = 'Apache-2.0' diff --git a/tools/blobinspector/build.gradle b/tools/blobinspector/build.gradle index 06b4f21e52..c20270831d 100644 --- a/tools/blobinspector/build.gradle +++ b/tools/blobinspector/build.gradle @@ -20,7 +20,7 @@ jar { exclude "META-INF/*.DSA" exclude "META-INF/*.RSA" } - archiveName = "blob-inspector-${version}.jar" + archiveName = "blob-inspector-${corda_release_version}.jar" manifest { attributes( 'Automatic-Module-Name': 'net.corda.blobinspector', @@ -30,5 +30,5 @@ jar { } publish { - name 'tools-blob-inspector' + name 'corda-tools-blob-inspector' } diff --git a/tools/bootstrapper/build.gradle b/tools/bootstrapper/build.gradle index ff2c7c81de..1748fda18f 100644 --- a/tools/bootstrapper/build.gradle +++ b/tools/bootstrapper/build.gradle @@ -8,13 +8,17 @@ configurations { runtimeArtifacts } +jar { + baseName "corda-tools-network-bootstrapper" +} + dependencies { compile "org.slf4j:slf4j-nop:$slf4j_version" } task buildBootstrapperJar(type: FatCapsule, dependsOn: project(':node-api').compileJava) { applicationClass 'net.corda.nodeapi.internal.network.NetworkBootstrapper' - archiveName = "network-bootstrapper-${version}.jar" + archiveName "tools-network-bootstrapper-${corda_release_version}.jar" capsuleManifest { applicationVersion = corda_release_version systemProperties['visualvm.display.name'] = 'Network Bootstrapper' @@ -38,6 +42,6 @@ artifacts { } publish { - name 'tools-network-bootstrapper' disableDefaultJar = true + name 'corda-tools-network-bootstrapper' } From d5d46c674dda89332520b019c3fbf8ef7371fa48 Mon Sep 17 00:00:00 2001 From: Andrius Dagys Date: Wed, 13 Jun 2018 09:04:05 +0100 Subject: [PATCH 9/9] CORDA-1494: Minor - improve error message when max retries reached for notarisation (#3355) --- .../corda/node/services/statemachine/StaffedFlowHospital.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/node/src/main/kotlin/net/corda/node/services/statemachine/StaffedFlowHospital.kt b/node/src/main/kotlin/net/corda/node/services/statemachine/StaffedFlowHospital.kt index 4228a73367..0a2e70ce6f 100644 --- a/node/src/main/kotlin/net/corda/node/services/statemachine/StaffedFlowHospital.kt +++ b/node/src/main/kotlin/net/corda/node/services/statemachine/StaffedFlowHospital.kt @@ -206,7 +206,11 @@ class StaffedFlowHospital { if (history.notDischargedForTheSameThingMoreThan(newError.maxRetries, this)) { return Diagnosis.DISCHARGE } else { - log.warn("\"Maximum number of retries reached for timed flow ${flowFiber.javaClass}") + val errorMsg = "Maximum number of retries reached for flow ${flowFiber.snapshot().flowLogic.javaClass}." + + "If the flow involves notarising a transaction, this usually means that the notary is being overloaded and" + + "unable to service requests fast enough. Please try again later." + newError.setMessage(errorMsg) + log.warn(errorMsg) } } return Diagnosis.NOT_MY_SPECIALTY