[CORDA-442] Removed the NetworkMap option from Cordform, changed all the examples… (#1827)

[CORDA-442]
Removed the option for Cordformation to specify a networkMap.

All the samples have been migrated to not specify a networkMap.
This commit is contained in:
Alberto Arri 2017-10-10 15:45:42 +01:00 committed by GitHub
parent 8c9045bd73
commit 3bee830604
17 changed files with 35 additions and 72 deletions

View File

@ -231,7 +231,6 @@ tasks.withType(Test) {
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Controller,OU=corda,L=London,C=GB"
node { node {
name "O=Controller,OU=corda,L=London,C=GB" name "O=Controller,OU=corda,L=London,C=GB"
notary = [validating : true] notary = [validating : true]

View File

@ -12,8 +12,8 @@ UNRELEASED
deploys nodes for development and testing, the latter turns a project into a cordapp project that generates JARs in deploys nodes for development and testing, the latter turns a project into a cordapp project that generates JARs in
the standard CorDapp format. the standard CorDapp format.
* ``Cordform`` and node identity generation * ``Cordform`` and node identity generation:
* Cordform may not specify a value for ``NetworkMap``, when that happens, during the task execution the following happens: * Removed the parameter ``NetworkMap`` from Cordform. Now at the end of the deployment the following happens:
1. Each node is started and its signed serialized NodeInfo is written to disk in the node base directory. 1. Each node is started and its signed serialized NodeInfo is written to disk in the node base directory.
2. Every serialized ``NodeInfo`` above is copied in every other node "additional-node-info" folder under the NodeInfo folder. 2. Every serialized ``NodeInfo`` above is copied in every other node "additional-node-info" folder under the NodeInfo folder.

View File

@ -11,13 +11,12 @@ Cordform is the local node deployment system for CorDapps. The nodes generated a
debugging, and testing node configurations, but not for production or testnet deployment. debugging, and testing node configurations, but not for production or testnet deployment.
Here is an example Gradle task called ``deployNodes`` that uses the Cordform plugin to deploy three nodes, plus a Here is an example Gradle task called ``deployNodes`` that uses the Cordform plugin to deploy three nodes, plus a
notary/network map node: notary node:
.. sourcecode:: groovy .. sourcecode:: groovy
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Controller,OU=corda,L=London,C=UK"
node { node {
name "O=Controller,OU=corda,L=London,C=UK" name "O=Controller,OU=corda,L=London,C=UK"
notary = [validating : true] notary = [validating : true]
@ -52,9 +51,7 @@ notary/network map node:
} }
} }
You can extend ``deployNodes`` to generate any number of nodes you like. The only requirement is that you must specify You can extend ``deployNodes`` to generate any number of nodes you like.
one node as running the network map service, by putting their name in the ``networkMap`` field. In our example, the
``Controller`` is set as the network map service.
.. warning:: When adding nodes, make sure that there are no port clashes! .. warning:: When adding nodes, make sure that there are no port clashes!
@ -87,7 +84,12 @@ run all the nodes at once. Each node in the ``nodes`` folder has the following s
. nodeName . nodeName
├── corda.jar // The Corda runtime ├── corda.jar // The Corda runtime
├── node.conf // The node's configuration ├── node.conf // The node's configuration
└── plugins // Any installed CorDapps ├── plugins // Any installed CorDapps
└── additional-node-infos // Directory containing all the addresses and certificates of the other nodes.
.. note:: During the build process each node generates a NodeInfo file which is written in its own root directory,
the plug-in proceeds and copies each node NodeInfo to every other node ``additional-node-infos`` directory.
The NodeInfo file contains a node hostname and port, legal name and security certificate.
.. note:: Outside of development environments, do not store your node directories in the build folder. .. note:: Outside of development environments, do not store your node directories in the build folder.

View File

@ -73,7 +73,6 @@ task integrationTest(type: Test) {
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Notary Service,OU=corda,L=London,C=GB"
node { node {
name "O=Notary Service,OU=corda,L=London,C=GB" name "O=Notary Service,OU=corda,L=London,C=GB"
notary = [validating : true] notary = [validating : true]

View File

@ -25,7 +25,6 @@ Let's take a look at the nodes we're going to deploy. Open the project's ``build
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Controller,L=London,C=GB"
node { node {
name "O=Controller,L=London,C=GB" name "O=Controller,L=London,C=GB"
notary = [validating : true] notary = [validating : true]
@ -82,6 +81,7 @@ the three node folders. Each node folder has the following structure:
|____corda-webserver.jar // The node's webserver |____corda-webserver.jar // The node's webserver
|____dependencies |____dependencies
|____node.conf // The node's configuration file |____node.conf // The node's configuration file
|____additional-node-infos/ // Directory containing all the other nodes' addresses and identities
|____plugins |____plugins
|____java/kotlin-source-0.1.jar // Our IOU CorDapp |____java/kotlin-source-0.1.jar // Our IOU CorDapp

View File

@ -17,7 +17,7 @@ if:
We will deploy the CorDapp on 4 test nodes: We will deploy the CorDapp on 4 test nodes:
* **Controller**, which hosts the network map service and a validating notary service * **Controller**, which hosts a validating notary service
* **PartyA** * **PartyA**
* **PartyB** * **PartyB**
* **PartyC** * **PartyC**
@ -276,7 +276,7 @@ IntelliJ
The node driver defined in ``/src/test/kotlin/com/example/Main.kt`` allows you to specify how many nodes you would like The node driver defined in ``/src/test/kotlin/com/example/Main.kt`` allows you to specify how many nodes you would like
to run and the configuration settings for each node. For the example CorDapp, the driver starts up four nodes to run and the configuration settings for each node. For the example CorDapp, the driver starts up four nodes
and adds an RPC user for all but the "Controller" node (which serves as the notary and network map service): and adds an RPC user for all but the "Controller" node (which serves as the notary):
.. sourcecode:: kotlin .. sourcecode:: kotlin
@ -489,9 +489,6 @@ You must now edit the configuration file for each node, including the controller
and make the following changes: and make the following changes:
* Change the Artemis messaging address to the machine's IP address (e.g. ``p2pAddress="10.18.0.166:10006"``) * Change the Artemis messaging address to the machine's IP address (e.g. ``p2pAddress="10.18.0.166:10006"``)
* Change the network map service's address to the IP address of the machine where the controller node is running
(e.g. ``networkMapService { address="10.18.0.166:10002" legalName="O=Controller,L=London,C=GB" ``). The controller
will not have the ``networkMapService`` configuration entry
After starting each node, the nodes will be able to see one another and agree IOUs among themselves. After starting each node, the nodes will be able to see one another and agree IOUs among themselves.

View File

@ -7,11 +7,9 @@ import java.util.function.Consumer;
public abstract class CordformDefinition { public abstract class CordformDefinition {
public final Path driverDirectory; public final Path driverDirectory;
public final ArrayList<Consumer<? super CordformNode>> nodeConfigurers = new ArrayList<>(); public final ArrayList<Consumer<? super CordformNode>> nodeConfigurers = new ArrayList<>();
public final String networkMapNodeName;
public CordformDefinition(Path driverDirectory, String networkMapNodeName) { public CordformDefinition(Path driverDirectory) {
this.driverDirectory = driverDirectory; this.driverDirectory = driverDirectory;
this.networkMapNodeName = networkMapNodeName;
} }
public void addNode(Consumer<? super CordformNode> configurer) { public void addNode(Consumer<? super CordformNode> configurer) {

View File

@ -3,9 +3,7 @@ package net.corda.plugins
import static org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME import static org.gradle.api.tasks.SourceSet.MAIN_SOURCE_SET_NAME
import net.corda.cordform.CordformContext import net.corda.cordform.CordformContext
import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformDefinition
import net.corda.cordform.CordformNode
import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.filters.FixCrLfFilter
import org.bouncycastle.asn1.x500.X500Name
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.plugins.JavaPluginConvention import org.gradle.api.plugins.JavaPluginConvention
import org.gradle.api.tasks.TaskAction import org.gradle.api.tasks.TaskAction
@ -24,7 +22,6 @@ class Cordform extends DefaultTask {
String definitionClass String definitionClass
protected def directory = Paths.get("build", "nodes") protected def directory = Paths.get("build", "nodes")
private def nodes = new ArrayList<Node>() private def nodes = new ArrayList<Node>()
protected String networkMapNodeName
/** /**
* Set the directory to install nodes into. * Set the directory to install nodes into.
@ -36,16 +33,6 @@ class Cordform extends DefaultTask {
this.directory = Paths.get(directory) this.directory = Paths.get(directory)
} }
/**
* Set the network map node.
*
* @warning Ensure the node name is one of the configured nodes.
* @param nodeName The name of the node that will host the network map.
*/
void networkMap(String nodeName) {
networkMapNodeName = nodeName
}
/** /**
* Add a node configuration. * Add a node configuration.
* *
@ -110,12 +97,15 @@ class Cordform extends DefaultTask {
*/ */
@TaskAction @TaskAction
void build() { void build() {
String networkMapNodeName = initializeConfigurationAndGetNetworkMapNodeName() initializeConfiguration()
installRunScript() installRunScript()
finalizeConfiguration(networkMapNodeName) nodes.each {
it.build()
}
generateNodeInfos()
} }
private initializeConfigurationAndGetNetworkMapNodeName() { private initializeConfiguration() {
if (null != definitionClass) { if (null != definitionClass) {
def cd = loadCordformDefinition() def cd = loadCordformDefinition()
cd.nodeConfigurers.each { nc -> cd.nodeConfigurers.each { nc ->
@ -129,30 +119,10 @@ class Cordform extends DefaultTask {
project.projectDir.toPath().resolve(getNodeByName(nodeName).nodeDir.toPath()) project.projectDir.toPath().resolve(getNodeByName(nodeName).nodeDir.toPath())
} }
} }
return cd.networkMapNodeName.toString()
} else { } else {
nodes.each { nodes.each {
it.rootDir directory it.rootDir directory
} }
return this.networkMapNodeName
}
}
private finalizeConfiguration(String networkMapNodeName) {
Node networkMapNode = getNodeByName(networkMapNodeName)
if (networkMapNode == null) {
nodes.each {
it.build()
}
generateNodeInfos()
logger.info("Starting without networkMapNode, this an experimental feature")
} else {
nodes.each {
if (it != networkMapNode) {
it.networkMapAddress(networkMapNode.getP2PAddress(), networkMapNodeName)
}
it.build()
}
} }
} }

View File

@ -38,7 +38,6 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["StartFlow.net.corda.attachmentdemo.AttachmentDemoFlow"]]] ext.rpcUsers = [['username': "demo", 'password': "demo", 'permissions': ["StartFlow.net.corda.attachmentdemo.AttachmentDemoFlow"]]]
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Notary Service,L=Zurich,C=CH"
node { node {
name "O=Notary Service,L=Zurich,C=CH" name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true] notary = [validating : true]

View File

@ -50,8 +50,6 @@ dependencies {
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
// This name "Notary" is hard-coded into BankOfCordaClientApi so if you change it here, change it there too. // This name "Notary" is hard-coded into BankOfCordaClientApi so if you change it here, change it there too.
// In this demo the node that runs a standalone notary also acts as the network map server.
networkMap "O=Notary Service,L=Zurich,C=CH"
node { node {
name "O=Notary Service,L=Zurich,C=CH" name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true] notary = [validating : true]

View File

@ -51,7 +51,6 @@ dependencies {
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Notary Service,L=Zurich,C=CH"
node { node {
name "O=Notary Service,L=Zurich,C=CH" name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true] notary = [validating : true]

View File

@ -13,7 +13,11 @@ import net.corda.node.services.transactions.minCorrectReplicas
import net.corda.node.utilities.ServiceIdentityGenerator import net.corda.node.utilities.ServiceIdentityGenerator
import net.corda.testing.ALICE import net.corda.testing.ALICE
import net.corda.testing.BOB import net.corda.testing.BOB
import net.corda.testing.internal.demorun.* import net.corda.testing.internal.demorun.name
import net.corda.testing.internal.demorun.node
import net.corda.testing.internal.demorun.notary
import net.corda.testing.internal.demorun.rpcUsers
import net.corda.testing.internal.demorun.runNodes
fun main(args: Array<String>) = BFTNotaryCordform.runNodes() fun main(args: Array<String>) = BFTNotaryCordform.runNodes()
@ -22,7 +26,7 @@ private val notaryNames = createNotaryNames(clusterSize)
// This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO // This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO
// NOT use this as a design to copy. // NOT use this as a design to copy.
object BFTNotaryCordform : CordformDefinition("build" / "notary-demo-nodes", notaryNames[0].toString()) { object BFTNotaryCordform : CordformDefinition("build" / "notary-demo-nodes") {
private val clusterName = CordaX500Name(BFTNonValidatingNotaryService.id, "BFT", "Zurich", "CH") private val clusterName = CordaX500Name(BFTNonValidatingNotaryService.id, "BFT", "Zurich", "CH")
init { init {

View File

@ -22,7 +22,7 @@ private val notaryNames = createNotaryNames(3)
// This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO // This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO
// NOT use this as a design to copy. // NOT use this as a design to copy.
object RaftNotaryCordform : CordformDefinition("build" / "notary-demo-nodes", notaryNames[0].toString()) { object RaftNotaryCordform : CordformDefinition("build" / "notary-demo-nodes") {
private val clusterName = CordaX500Name(RaftValidatingNotaryService.id, "Raft", "Zurich", "CH") private val clusterName = CordaX500Name(RaftValidatingNotaryService.id, "Raft", "Zurich", "CH")
init { init {

View File

@ -11,7 +11,11 @@ import net.corda.notarydemo.flows.RPCStartableNotaryFlowClient
import net.corda.testing.ALICE import net.corda.testing.ALICE
import net.corda.testing.BOB import net.corda.testing.BOB
import net.corda.testing.DUMMY_NOTARY import net.corda.testing.DUMMY_NOTARY
import net.corda.testing.internal.demorun.* import net.corda.testing.internal.demorun.name
import net.corda.testing.internal.demorun.node
import net.corda.testing.internal.demorun.notary
import net.corda.testing.internal.demorun.rpcUsers
import net.corda.testing.internal.demorun.runNodes
fun main(args: Array<String>) = SingleNotaryCordform.runNodes() fun main(args: Array<String>) = SingleNotaryCordform.runNodes()
@ -19,7 +23,7 @@ val notaryDemoUser = User("demou", "demop", setOf(startFlowPermission<DummyIssue
// This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO // This is not the intended final design for how to use CordformDefinition, please treat this as experimental and DO
// NOT use this as a design to copy. // NOT use this as a design to copy.
object SingleNotaryCordform : CordformDefinition("build" / "notary-demo-nodes", DUMMY_NOTARY.name.toString()) { object SingleNotaryCordform : CordformDefinition("build" / "notary-demo-nodes") {
init { init {
node { node {
name(ALICE.name) name(ALICE.name)

View File

@ -64,7 +64,6 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
ext.rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]] ext.rpcUsers = [['username': "default", 'password': "default", 'permissions': [ 'ALL' ]]]
directory "./build/nodes" directory "./build/nodes"
networkMap "O=Notary Service,L=Zurich,C=CH"
node { node {
name "O=Notary Service,L=Zurich,C=CH" name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true] notary = [validating : true]

View File

@ -51,8 +51,6 @@ task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) {
directory "./build/nodes" directory "./build/nodes"
// This name "Notary" is hard-coded into TraderDemoClientApi so if you change it here, change it there too. // This name "Notary" is hard-coded into TraderDemoClientApi so if you change it here, change it there too.
// In this demo the node that runs a standalone notary also acts as the network map server.
networkMap "O=Notary Service,L=Zurich,C=CH"
node { node {
name "O=Notary Service,L=Zurich,C=CH" name "O=Notary Service,L=Zurich,C=CH"
notary = [validating : true] notary = [validating : true]

View File

@ -4,8 +4,6 @@ package net.corda.testing.internal.demorun
import net.corda.cordform.CordformDefinition import net.corda.cordform.CordformDefinition
import net.corda.cordform.CordformNode import net.corda.cordform.CordformNode
import net.corda.core.identity.CordaX500Name
import net.corda.testing.driver.NetworkMapStartStrategy
import net.corda.testing.driver.PortAllocation import net.corda.testing.driver.PortAllocation
import net.corda.testing.driver.driver import net.corda.testing.driver.driver
@ -20,7 +18,6 @@ fun CordformDefinition.clean() {
fun CordformDefinition.runNodes() = driver( fun CordformDefinition.runNodes() = driver(
isDebug = true, isDebug = true,
driverDirectory = driverDirectory, driverDirectory = driverDirectory,
networkMapStartStrategy = NetworkMapStartStrategy.Nominated(CordaX500Name.parse(networkMapNodeName)),
portAllocation = PortAllocation.Incremental(10001) portAllocation = PortAllocation.Incremental(10001)
) { ) {
setup(this) setup(this)