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 |                     |