github.com/darrenli6/fabric-sdk-example@v0.0.0-20220109053535-94b13b56df8c/bddtests/features/bootstrap.feature (about) 1 # Copyright IBM Corp. 2016 All Rights Reserved. 2 # 3 # SPDX-License-Identifier: Apache-2.0 4 # 5 6 # Test Bootstrap function 7 # 8 # Tags that can be used and will affect test internals: 9 # @doNotDecompose will NOT decompose the named compose_yaml after scenario ends. Useful for setting up environment and reviewing after scenario. 10 # 11 # @generateDocs will generate documentation for the scenario that can be used for both verification and comprehension. 12 # 13 14 @bootstrap 15 Feature: Bootstrap 16 As a blockchain entrepreneur 17 I want to bootstrap a new blockchain network 18 19 # @doNotDecompose 20 @generateDocs 21 Scenario Outline: Bootstrap a development network with 4 peers (2 orgs) and 1 orderer (1 org), each having a single independent root of trust (No fabric-ca, just openssl) 22 #creates 1 self-signed key/cert pair per orderer organization 23 Given the orderer network has organizations: 24 | Organization | Readers | Writers | Admins | 25 | ordererOrg0 | member | member | admin | 26 # | ordererOrg1 | member | member | admin | 27 28 And user requests role of orderer admin by creating a key and csr for orderer and acquires signed certificate from organization: 29 | User | Orderer | Organization | AliasSavedUnder | 30 | orderer0Signer | orderer0 | ordererOrg0 | | 31 | orderer1Signer | orderer1 | ordererOrg0 | | 32 | orderer2Signer | orderer2 | ordererOrg0 | | 33 | orderer0Admin | orderer0 | ordererOrg0 | | 34 | orderer1Admin | orderer1 | ordererOrg0 | | 35 | orderer2Admin | orderer2 | ordererOrg0 | | 36 | configAdminOrdererOrg0 | configAdmin | ordererOrg0 | config-admin-cert | 37 # | configAdminOrdererOrg1 | configAdmin | ordererOrg1 | config-admin-cert | 38 39 40 # Rolenames : MspPrincipal.proto 41 And the peer network has organizations: 42 | Organization | Readers | Writers | Admins | 43 | peerOrg0 | member | member | admin | 44 | peerOrg1 | member | member | admin | 45 | peerOrg2 | member | member | admin | 46 47 48 49 And a ordererBootstrapAdmin is identified and given access to all public certificates and orderer node info 50 51 And the ordererBootstrapAdmin creates a cert alias "bootstrapCertAlias" for orderer network bootstrap purposes for organizations 52 | Organization | 53 | ordererOrg0 | 54 55 And the ordererBootstrapAdmin generates a GUUID to identify the orderer system chain and refer to it by name as "ordererSystemChannelId" 56 57 # We now have an orderer network with NO peers. Now need to configure and start the peer network 58 # This can be currently automated through folder creation of the proper form and placing PEMs. 59 And user requests role for peer by creating a key and csr for peer and acquires signed certificate from organization: 60 | User | Peer | Organization | AliasSavedUnder | 61 | peer0Signer | peer0 | peerOrg0 | | 62 | peer1Signer | peer1 | peerOrg0 | | 63 | peer2Signer | peer2 | peerOrg1 | | 64 | peer3Signer | peer3 | peerOrg1 | | 65 | peer0Admin | peer0 | peerOrg0 | peer-admin-cert | 66 | peer1Admin | peer1 | peerOrg0 | peer-admin-cert | 67 | peer2Admin | peer2 | peerOrg1 | peer-admin-cert | 68 | peer3Admin | peer3 | peerOrg1 | peer-admin-cert | 69 | configAdminPeerOrg0 | configAdmin | peerOrg0 | config-admin-cert | 70 | configAdminPeerOrg1 | configAdmin | peerOrg1 | config-admin-cert | 71 72 73 # Order info includes orderer admin/orderer information and address (host:port) from previous steps 74 # Only the peer organizations can vary. 75 And the ordererBootstrapAdmin using cert alias "bootstrapCertAlias" creates the genesis block "ordererGenesisBlock" for chain "ordererSystemChannelId" for composition "<ComposeFile>" and consensus "<ConsensusType>" with consortiums modification policy "/Channel/Orderer/Admins" using consortiums: 76 | Consortium | 77 # | consortium1 | 78 79 80 And the orderer admins inspect and approve the genesis block for chain "ordererSystemChannelId" 81 82 # to be used for setting the orderer genesis block path parameter in composition 83 And the orderer admins use the genesis block for chain "ordererSystemChannelId" to configure orderers 84 85 And we compose "<ComposeFile>" 86 87 # Sleep as to allow system up time 88 And I wait "<SystemUpWaitTime>" seconds 89 90 Given user "ordererBootstrapAdmin" gives "ordererSystemChannelId" to user "configAdminOrdererOrg0" 91 And user "ordererBootstrapAdmin" gives "ordererGenesisBlock" to user "configAdminOrdererOrg0" 92 93 And the orderer config admin "configAdminOrdererOrg0" creates a consortium "consortium1" with modification policy "/Channel/Orderer/Admins" for peer orgs who wish to form a network: 94 | Organization | 95 | peerOrg0 | 96 | peerOrg1 | 97 | peerOrg2 | 98 99 And user "configAdminOrdererOrg0" using cert alias "config-admin-cert" connects to deliver function on orderer "<orderer0>" 100 101 And user "configAdminOrdererOrg0" retrieves the latest config update "latestOrdererConfig" from orderer "<orderer0>" for channel "{ordererSystemChannelId}" 102 103 And the orderer config admin "configAdminOrdererOrg0" creates a consortiums config update "consortiumsConfigUpdate1" using config "latestOrdererConfig" using orderer system channel ID "ordererSystemChannelId" to add consortiums: 104 | Consortium | 105 | consortium1 | 106 107 And the user "configAdminOrdererOrg0" creates a configUpdateEnvelope "consortiumsConfigUpdate1Envelope" using configUpdate "consortiumsConfigUpdate1" 108 109 And the user "configAdminOrdererOrg0" collects signatures for ConfigUpdateEnvelope "consortiumsConfigUpdate1Envelope" from developers: 110 | Developer | Cert Alias | 111 | configAdminOrdererOrg0 | config-admin-cert | 112 # | configAdminOrdererOrg1 | config-admin-cert | 113 114 And the user "configAdminOrdererOrg0" creates a ConfigUpdate Tx "consortiumsConfigUpdateTx1" using cert alias "config-admin-cert" using signed ConfigUpdateEnvelope "consortiumsConfigUpdate1Envelope" 115 116 And the user "configAdminOrdererOrg0" using cert alias "config-admin-cert" broadcasts ConfigUpdate Tx "consortiumsConfigUpdateTx1" to orderer "<orderer0>" 117 118 119 Given the following application developers are defined for peer organizations and each saves their cert as alias 120 | Developer | Consortium | Organization | AliasSavedUnder | 121 | dev0Org0 | consortium1 | peerOrg0 | consortium1-cert | 122 | dev0Org1 | consortium1 | peerOrg1 | consortium1-cert | 123 124 And user "configAdminOrdererOrg0" gives "consortium1" to user "dev0Org0" 125 126 And the user "dev0Org0" creates a peer organization set "peerOrgSet1" with peer organizations: 127 | Organization | 128 | peerOrg0 | 129 | peerOrg1 | 130 # | peerOrg2 | 131 132 And the user "dev0Org0" creates an peer anchor set "anchors1" for orgs: 133 | User | Peer | Organization | 134 | peer0Signer | peer0 | peerOrg0 | 135 | peer2Signer | peer2 | peerOrg1 | 136 137 # Entry point for creating a channel 138 And the user "dev0Org0" creates a new channel ConfigUpdate "createChannelConfigUpdate1" using consortium "consortium1" 139 | ChannelID | PeerOrgSet | [PeerAnchorSet] | 140 | com.acme.blockchain.jdoe.channel1 | peerOrgSet1 | | 141 142 And the user "dev0Org0" creates a configUpdateEnvelope "createChannelConfigUpdate1Envelope" using configUpdate "createChannelConfigUpdate1" 143 144 145 And the user "dev0Org0" collects signatures for ConfigUpdateEnvelope "createChannelConfigUpdate1Envelope" from developers: 146 | Developer | Cert Alias | 147 | dev0Org0 | consortium1-cert | 148 | dev0Org1 | consortium1-cert | 149 150 And the user "dev0Org0" creates a ConfigUpdate Tx "configUpdateTx1" using cert alias "consortium1-cert" using signed ConfigUpdateEnvelope "createChannelConfigUpdate1Envelope" 151 152 And the user "dev0Org0" using cert alias "consortium1-cert" broadcasts ConfigUpdate Tx "configUpdateTx1" to orderer "<orderer0>" 153 154 # Sleep as the local orderer needs to bring up the resources that correspond to the new channel 155 # For the Kafka orderer, this includes setting up a producer and consumer for the channel's partition 156 # Requesting a deliver earlier may result in a SERVICE_UNAVAILABLE response and a connection drop 157 And I wait "<ChannelJoinDelay>" seconds 158 159 When user "dev0Org0" using cert alias "consortium1-cert" connects to deliver function on orderer "<orderer0>" 160 And user "dev0Org0" sends deliver a seek request on orderer "<orderer0>" with properties: 161 | ChainId | Start | End | 162 | com.acme.blockchain.jdoe.channel1 | 0 | 0 | 163 164 Then user "dev0Org0" should get a delivery "genesisBlockForMyNewChannel" from "<orderer0>" of "1" blocks with "1" messages within "1" seconds 165 166 Given user "dev0Org0" gives "genesisBlockForMyNewChannel" to user "dev0Org1" 167 168 Given user "dev0Org0" gives "genesisBlockForMyNewChannel" to user "peer0Admin" 169 Given user "dev0Org0" gives "genesisBlockForMyNewChannel" to user "peer1Admin" 170 171 172 # This is entry point for joining an existing channel 173 When user "peer0Admin" using cert alias "peer-admin-cert" requests to join channel using genesis block "genesisBlockForMyNewChannel" on peers with result "joinChannelResult" 174 | Peer | 175 | peer0 | 176 177 Then user "peer0Admin" expects result code for "joinChannelResult" of "200" from peers: 178 | Peer | 179 | peer0 | 180 181 When user "peer1Admin" using cert alias "peer-admin-cert" requests to join channel using genesis block "genesisBlockForMyNewChannel" on peers with result "joinChannelResult" 182 | Peer | 183 | peer1 | 184 185 Then user "peer1Admin" expects result code for "joinChannelResult" of "200" from peers: 186 | Peer | 187 | peer1 | 188 189 Given the user "configAdminPeerOrg0" creates an peer anchor set "anchors1" for orgs: 190 | User | Peer | Organization | 191 | peer0Signer | peer0 | peerOrg0 | 192 193 And user "configAdminPeerOrg0" using cert alias "config-admin-cert" connects to deliver function on orderer "<orderer0>" 194 195 And user "configAdminPeerOrg0" retrieves the latest config update "latestChannelConfigUpdate" from orderer "<orderer0>" for channel "com.acme.blockchain.jdoe.channel1" 196 197 And the user "configAdminPeerOrg0" creates an existing channel config update "existingChannelConfigUpdate1" using config update "latestChannelConfigUpdate" 198 | ChannelID | [PeerAnchorSet] | 199 | com.acme.blockchain.jdoe.channel1 | anchors1 | 200 201 202 203 204 205 206 Given the user "configAdminPeerOrg0" creates a configUpdateEnvelope "existingChannelConfigUpdate1Envelope" using configUpdate "existingChannelConfigUpdate1" 207 208 209 And the user "configAdminPeerOrg0" collects signatures for ConfigUpdateEnvelope "existingChannelConfigUpdate1Envelope" from developers: 210 | Developer | Cert Alias | 211 | configAdminPeerOrg0 | config-admin-cert | 212 213 And the user "configAdminPeerOrg0" creates a ConfigUpdate Tx "existingChannelConfigUpdateTx1" using cert alias "config-admin-cert" using signed ConfigUpdateEnvelope "existingChannelConfigUpdate1Envelope" 214 215 216 When the user "configAdminPeerOrg0" broadcasts transaction "existingChannelConfigUpdateTx1" to orderer "<orderer0>" 217 218 And I wait "<BroadcastWaitTime>" seconds 219 220 And user "configAdminPeerOrg0" sends deliver a seek request on orderer "<orderer0>" with properties: 221 | ChainId | Start | End | 222 | com.acme.blockchain.jdoe.channel1 | 1 | 1 | 223 224 Then user "configAdminPeerOrg0" should get a delivery "deliveredExistingChannelConfigUpdateTx1Block" from "<orderer0>" of "1" blocks with "1" messages within "1" seconds 225 226 227 # And I quit 228 229 Given user "dev0Org1" gives "genesisBlockForMyNewChannel" to user "peer2Admin" 230 Given user "dev0Org1" gives "genesisBlockForMyNewChannel" to user "peer3Admin" 231 232 When user "peer2Admin" using cert alias "peer-admin-cert" requests to join channel using genesis block "genesisBlockForMyNewChannel" on peers with result "joinChannelResult" 233 | Peer | 234 | peer2 | 235 236 Then user "peer2Admin" expects result code for "joinChannelResult" of "200" from peers: 237 | Peer | 238 | peer2 | 239 240 When user "peer3Admin" using cert alias "peer-admin-cert" requests to join channel using genesis block "genesisBlockForMyNewChannel" on peers with result "joinChannelResult" 241 | Peer | 242 | peer3 | 243 244 Then user "peer3Admin" expects result code for "joinChannelResult" of "200" from peers: 245 | Peer | 246 | peer3 | 247 248 Given the user "configAdminPeerOrg1" creates an peer anchor set "anchors1" for orgs: 249 | User | Peer | Organization | 250 | peer2Signer | peer2 | peerOrg1 | 251 252 253 # Entry point for invoking on an existing channel 254 When user "peer0Admin" creates a chaincode spec "ccSpec" with name "example02" of type "GOLANG" for chaincode "github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" with args 255 | funcName | arg1 | arg2 | arg3 | arg4 | 256 | init | a | 100 | b | 200 | 257 258 # Under the covers, create a deployment spec, etc. 259 And user "peer0Admin" using cert alias "peer-admin-cert" creates a install proposal "installProposal1" for channel "com.acme.blockchain.jdoe.channel1" using chaincode spec "ccSpec" 260 261 And user "peer0Admin" using cert alias "peer-admin-cert" sends proposal "installProposal1" to endorsers with timeout of "90" seconds with proposal responses "installProposalResponses": 262 | Endorser | 263 | peer0 | 264 265 Then user "peer0Admin" expects proposal responses "installProposalResponses" with status "200" from endorsers: 266 | Endorser | 267 | peer0 | 268 269 Given user "peer0Admin" gives "ccSpec" to user "peer2Admin" 270 271 # Under the covers, create a deployment spec, etc. 272 When user "peer2Admin" using cert alias "peer-admin-cert" creates a install proposal "installProposal1" for channel "com.acme.blockchain.jdoe.channel1" using chaincode spec "ccSpec" 273 274 And user "peer2Admin" using cert alias "peer-admin-cert" sends proposal "installProposal1" to endorsers with timeout of "90" seconds with proposal responses "installProposalResponses": 275 | Endorser | 276 | peer2 | 277 278 Then user "peer2Admin" expects proposal responses "installProposalResponses" with status "200" from endorsers: 279 | Endorser | 280 | peer2 | 281 282 283 Given user "peer0Admin" gives "ccSpec" to user "dev0Org0" 284 And user "peer0Admin" gives "ccSpec" to user "configAdminPeerOrg0" 285 286 287 When user "configAdminPeerOrg0" using cert alias "config-admin-cert" creates a instantiate proposal "instantiateProposal1" for channel "com.acme.blockchain.jdoe.channel1" using chaincode spec "ccSpec" 288 289 And user "configAdminPeerOrg0" using cert alias "config-admin-cert" sends proposal "instantiateProposal1" to endorsers with timeout of "90" seconds with proposal responses "instantiateProposalResponses": 290 | Endorser | 291 | peer0 | 292 | peer2 | 293 294 295 Then user "configAdminPeerOrg0" expects proposal responses "instantiateProposalResponses" with status "200" from endorsers: 296 | Endorser | 297 | peer0 | 298 | peer2 | 299 300 And user "configAdminPeerOrg0" expects proposal responses "instantiateProposalResponses" each have the same value from endorsers: 301 | Endorser | 302 | peer0 | 303 | peer2 | 304 305 When the user "configAdminPeerOrg0" creates transaction "instantiateTx1" from proposal "instantiateProposal1" and proposal responses "instantiateProposalResponses" for channel "com.acme.blockchain.jdoe.channel1" 306 307 And the user "configAdminPeerOrg0" broadcasts transaction "instantiateTx1" to orderer "<orderer1>" 308 309 # Sleep as the local orderer ledger needs to create the block that corresponds to the start number of the seek request 310 And I wait "<BroadcastWaitTime>" seconds 311 312 And user "configAdminPeerOrg0" sends deliver a seek request on orderer "<orderer0>" with properties: 313 | ChainId | Start | End | 314 | com.acme.blockchain.jdoe.channel1 | 2 | 2 | 315 316 Then user "configAdminPeerOrg0" should get a delivery "deliveredInstantiateTx1Block" from "<orderer0>" of "1" blocks with "1" messages within "1" seconds 317 318 # Sleep to allow for chaincode instantiation on the peer 319 And I wait "5" seconds 320 321 # Entry point for invoking on an existing channel 322 When user "dev0Org0" creates a chaincode invocation spec "querySpec1" using spec "ccSpec" with input: 323 | funcName | arg1 | 324 | query | a | 325 326 # Under the covers, create a deployment spec, etc. 327 And user "dev0Org0" using cert alias "consortium1-cert" creates a proposal "queryProposal1" for channel "com.acme.blockchain.jdoe.channel1" using chaincode spec "querySpec1" 328 329 And user "dev0Org0" using cert alias "consortium1-cert" sends proposal "queryProposal1" to endorsers with timeout of "30" seconds with proposal responses "queryProposal1Responses": 330 | Endorser | 331 | peer0 | 332 | peer2 | 333 334 Then user "dev0Org0" expects proposal responses "queryProposal1Responses" with status "200" from endorsers: 335 | Endorser | 336 | peer0 | 337 | peer2 | 338 339 And user "dev0Org0" expects proposal responses "queryProposal1Responses" each have the same value from endorsers: 340 | Endorser | 341 | peer0 | 342 | peer2 | 343 344 345 # Entry point for invoking on an existing channel 346 When user "dev0Org0" creates a chaincode invocation spec "invocationSpec1" using spec "ccSpec" with input: 347 | funcName | arg1 | arg2 | arg3 | 348 | invoke | a | b | 10 | 349 350 # Under the covers, create a deployment spec, etc. 351 And user "dev0Org0" using cert alias "consortium1-cert" creates a proposal "invokeProposal1" for channel "com.acme.blockchain.jdoe.channel1" using chaincode spec "invocationSpec1" 352 353 And user "dev0Org0" using cert alias "consortium1-cert" sends proposal "invokeProposal1" to endorsers with timeout of "30" seconds with proposal responses "invokeProposal1Responses": 354 | Endorser | 355 | peer0 | 356 | peer2 | 357 358 Then user "dev0Org0" expects proposal responses "invokeProposal1Responses" with status "200" from endorsers: 359 | Endorser | 360 | peer0 | 361 | peer2 | 362 363 And user "dev0Org0" expects proposal responses "invokeProposal1Responses" each have the same value from endorsers: 364 | Endorser | 365 | peer0 | 366 | peer2 | 367 368 When the user "dev0Org0" creates transaction "invokeTx1" from proposal "invokeProposal1" and proposal responses "invokeProposal1Responses" for channel "com.acme.blockchain.jdoe.channel1" 369 370 And the user "dev0Org0" broadcasts transaction "invokeTx1" to orderer "<orderer2>" 371 372 # Sleep as the local orderer ledger needs to create the block that corresponds to the start number of the seek request 373 And I wait "<BroadcastWaitTime>" seconds 374 375 And user "dev0Org0" sends deliver a seek request on orderer "<orderer0>" with properties: 376 | ChainId | Start | End | 377 | com.acme.blockchain.jdoe.channel1 | 3 | 3 | 378 379 Then user "dev0Org0" should get a delivery "deliveredInvokeTx1Block" from "<orderer0>" of "1" blocks with "1" messages within "1" seconds 380 381 382 # TODO: Once events are working, consider listen event listener as well. 383 384 Examples: Orderer Options 385 | ComposeFile | SystemUpWaitTime | ConsensusType | ChannelJoinDelay | BroadcastWaitTime | orderer0 | orderer1 | orderer2 |Orderer Specific Info| 386 | dc-base.yml | 0 | solo | 2 | 2 | orderer0 | orderer0 | orderer0 | | 387 # | dc-base.yml dc-peer-couchdb.yml | 10 | solo | 2 | 2 | orderer0 | orderer0 | orderer0 | | 388 # | dc-base.yml dc-orderer-kafka.yml | 40 | kafka | 10 | 5 | orderer0 | orderer1 | orderer2 | | 389 # | dc-base.yml dc-peer-couchdb.yml dc-orderer-kafka.yml | 40 | kafka | 10 | 5 | orderer0 | orderer1 | orderer2 | |