From 1f27c327f3afb88d6933edee850155eb6831606c Mon Sep 17 00:00:00 2001 From: Bret Harrison Date: Wed, 24 Jun 2020 10:18:31 -0400 Subject: [PATCH] Allow install of a chaincode options on the network script to deploy chaincode -ccn The name to be used as the deployed name and used as the short name of known chaincodes when the -ccp is not included. known short names 'basic' - asset-transfer-basic 'secure' - asset-transfer-secured-agreement 'ledger' - asset-transfer-ledger-queries 'private' - asset-transfer-private-data -ccl the language of the chaincode -ccv the version -ccs the sequence -ccp [optional] the path to the chaincode, when provided the -ccn will be the deployed name -cci [optional] the chaincode function to call during deployment that will perform an initialization of the channel state required for this chaincode Signed-off-by: Bret Harrison --- ci/templates/test-network/azure-pipelines.yml | 5 +- fabcar/startFabric.sh | 18 +- test-network/.gitignore | 2 +- test-network/README.md | 2 +- test-network/network.sh | 93 ++-- test-network/scripts/deployCC.sh | 396 ++++++++++-------- test-network/scripts/envVar.sh | 2 +- .../scripts/org3-scripts/envVarCLI.sh | 2 +- 8 files changed, 306 insertions(+), 214 deletions(-) diff --git a/ci/templates/test-network/azure-pipelines.yml b/ci/templates/test-network/azure-pipelines.yml index f4a3edc2..e934455c 100644 --- a/ci/templates/test-network/azure-pipelines.yml +++ b/ci/templates/test-network/azure-pipelines.yml @@ -5,7 +5,10 @@ steps: - script: | ./network.sh up createChannel -s couchdb -i ${FABRIC_VERSION} # FABRIC_VERSION is set in ci/azure-pipelines.yml - ./network.sh deployCC -l javascript + ./network.sh deployCC -ccn basic -ccv 1 -ccl javascript -cci initLedger + ./network.sh deployCC -ccn basic -ccv 2 -ccl golang -cci initLedger + ./network.sh deployCC -ccn basic -ccv 3 -ccl typescript -cci initLedger + ./network.sh deployCC -ccn secure -ccv 1 -ccl golang ./network.sh down workingDirectory: test-network displayName: Start Test Network diff --git a/fabcar/startFabric.sh b/fabcar/startFabric.sh index 5f1452cd..8ce18cb3 100755 --- a/fabcar/startFabric.sh +++ b/fabcar/startFabric.sh @@ -12,13 +12,19 @@ export MSYS_NO_PATHCONV=1 starttime=$(date +%s) CC_SRC_LANGUAGE=${1:-"go"} CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]` -if [ "$CC_SRC_LANGUAGE" != "go" -a "$CC_SRC_LANGUAGE" != "golang" -a "$CC_SRC_LANGUAGE" != "java" \ - -a "$CC_SRC_LANGUAGE" != "javascript" -a "$CC_SRC_LANGUAGE" != "typescript" ] ; then +if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ] ; then + CC_SRC_PATH="../chaincode/fabcar/go/" +elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then + CC_SRC_PATH="../chaincode/fabcar/javascript/" +elif [ "$CC_SRC_LANGUAGE" = "java" ]; then + CC_SRC_PATH="../chaincode/fabcar/java" +elif [ "$CC_SRC_LANGUAGE" = "typescript" ]; then + CC_SRC_PATH="../chaincode/fabcar/typescript/" +else echo The chaincode language ${CC_SRC_LANGUAGE} is not supported by this script - echo Supported chaincode languages are: go, java, javascript, and typescript - exit 1 - + echo Supported chaincode languages are: go, java, javascript, and typescript + exit 1 fi # clean out any old identites in the wallets @@ -31,7 +37,7 @@ rm -rf go/wallet/* pushd ../test-network ./network.sh down ./network.sh up createChannel -ca -s couchdb -./network.sh deployCC -l ${CC_SRC_LANGUAGE} +./network.sh deployCC -ccn fabcar -ccv 1 -cci initLedger -ccl ${CC_SRC_LANGUAGE} -ccp ${CC_SRC_PATH} popd cat < [Flags]" - echo " " - echo " - 'up' - bring up fabric orderer and peer nodes. No channel is created" - echo " - 'up createChannel' - bring up fabric network with one channel" - echo " - 'createChannel' - create and join a channel after the network is created" - echo " - 'deployCC' - deploy the fabcar chaincode on the channel" - echo " - 'down' - clear the network with docker-compose down" - echo " - 'restart' - restart the network" + echo " Modes:" + echo " "$'\e[0;32m'up$'\e[0m' - bring up fabric orderer and peer nodes. No channel is created + echo " "$'\e[0;32m'up createChannel$'\e[0m' - bring up fabric network with one channel + echo " "$'\e[0;32m'createChannel$'\e[0m' - create and join a channel after the network is created + echo " "$'\e[0;32m'deployCC$'\e[0m' - deploy the asset transfer basic chaincode on the channel or specify + echo " "$'\e[0;32m'down$'\e[0m' - clear the network with docker-compose down + echo " "$'\e[0;32m'restart$'\e[0m' - restart the network echo echo " Flags:" echo " -ca - create Certificate Authorities to generate the crypto material" @@ -34,26 +34,31 @@ function printHelp() { echo " -s - the database backend to use: goleveldb (default) or couchdb" echo " -r - CLI times out after certain number of attempts (defaults to 5)" echo " -d - delay duration in seconds (defaults to 3)" - echo " -l - the programming language of the chaincode to deploy: go (default), java, javascript, typescript" - echo " -v - chaincode version. Must be a round number, 1, 2, 3, etc" + echo " -ccn - the short name of the chaincode to deploy: basic (default),ledger, private, secured" + echo " -ccl - the programming language of the chaincode to deploy: go (default), java, javascript, typescript" + echo " -ccv - chaincode version. 1.0 (default)" + echo " -ccs - chaincode definition sequence. Must be an integer, 1 (default), 2, 3, etc" + echo " -ccp - Optional, chaincode path. Path to the chaincode. When provided the -ccn will be used as the deployed name and not the short name of the known chaincodes." + echo " -cci - Optional, chaincode init required function to invoke. When provided this function will be invoked after deployment of the chaincode and will define the chaincode as initialization required." echo " -i - the tag to be used to launch the network (defaults to \"latest\")" echo " -cai - the image tag to be used for CA (defaults to \"${CA_IMAGETAG}\")" echo " -verbose - verbose mode" - echo " network.sh -h (print this message)" + echo " -h - print this message" echo - echo " Possible Mode and flags" - echo " network.sh up -ca -c -r -d -s -i -verbose" - echo " network.sh up createChannel -ca -c -r -d -s -i -verbose" - echo " network.sh createChannel -c -r -d -verbose" - echo " network.sh deployCC -l -v -r -d -verbose" + echo " Possible Mode and flag combinations" + echo " "$'\e[0;32m'up$'\e[0m' -ca -c -r -d -s -i -verbose + echo " "$'\e[0;32m'up createChannel$'\e[0m' -ca -c -r -d -s -i -verbose + echo " "$'\e[0;32m'createChannel$'\e[0m' -c -r -d -verbose + echo " "$'\e[0;32m'deployCC$'\e[0m' -ccn -ccl -ccv -ccs -ccp -cci -r -d -verbose echo echo " Taking all defaults:" - echo " network.sh up" + echo " network.sh up" echo echo " Examples:" - echo " network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0" - echo " network.sh createChannel -c channelName" - echo " network.sh deployCC -l javascript" + echo " network.sh up createChannel -ca -c mychannel -s couchdb -i 2.0.0" + echo " network.sh createChannel -c channelName" + echo " network.sh deployCC -ccn basic -ccl javascript" + echo " network.sh deployCC -ccn mychaincode -ccp ./user/mychaincode -ccv 1 -ccl javascript" } # Obtain CONTAINER_IDS and remove them @@ -81,7 +86,7 @@ function removeUnwantedImages() { } # Versions of fabric known not to work with the test network -BLACKLISTED_VERSIONS="^1\.0\. ^1\.1\. ^1\.2\. ^1\.3\. ^1\.4\." +NONWORKING_VERSIONS="^1\.0\. ^1\.1\. ^1\.2\. ^1\.3\. ^1\.4\." # Do some basic sanity checking to make sure that the appropriate versions of fabric # binaries/images are available. In the future, additional checking for the presence @@ -112,7 +117,7 @@ function checkPrereqs() { echo "===============================================" fi - for UNSUPPORTED_VERSION in $BLACKLISTED_VERSIONS; do + for UNSUPPORTED_VERSION in $NONWORKING_VERSIONS; do echo "$LOCAL_VERSION" | grep -q $UNSUPPORTED_VERSION if [ $? -eq 0 ]; then echo "ERROR! Local Fabric binary version of $LOCAL_VERSION does not match the versions supported by the test network." @@ -205,7 +210,7 @@ function createOrgs() { res=$? set +x if [ $res -ne 0 ]; then - echo "Failed to generate certificates..." + echo $'\e[1;32m'"Failed to generate certificates..."$'\e[0m' exit 1 fi @@ -218,7 +223,7 @@ function createOrgs() { res=$? set +x if [ $res -ne 0 ]; then - echo "Failed to generate certificates..." + echo $'\e[1;32m'"Failed to generate certificates..."$'\e[0m' exit 1 fi @@ -231,7 +236,7 @@ function createOrgs() { res=$? set +x if [ $res -ne 0 ]; then - echo "Failed to generate certificates..." + echo $'\e[1;32m'"Failed to generate certificates..."$'\e[0m' exit 1 fi @@ -320,7 +325,7 @@ function createConsortium() { res=$? set +x if [ $res -ne 0 ]; then - echo "Failed to generate orderer genesis block..." + echo $'\e[1;32m'"Failed to generate orderer genesis block..."$'\e[0m' exit 1 fi } @@ -381,7 +386,7 @@ function createChannel() { ## Call the script to isntall and instantiate a chaincode on the channel function deployCC() { - scripts/deployCC.sh $CHANNEL_NAME $CC_SRC_LANGUAGE $VERSION $CLI_DELAY $MAX_RETRY $VERBOSE + scripts/deployCC.sh $CHANNEL_NAME $CC_NAME $CC_SRC_PATH $CC_SRC_LANGUAGE $CC_VERSION $CC_SEQUENCE $CC_INIT_FCN $CLI_DELAY $MAX_RETRY $VERBOSE if [ $? -ne 0 ]; then echo "ERROR !!! Deploying chaincode failed" @@ -431,6 +436,12 @@ MAX_RETRY=5 CLI_DELAY=3 # channel name defaults to "mychannel" CHANNEL_NAME="mychannel" +# chaincode name defaults to "basic" +CC_NAME="basic" +# chaincode path defaults to "NA" +CC_SRC_PATH="NA" +# chaincode init function defaults to "NA" +CC_INIT_FCN="NA" # use this as the default docker-compose yaml definition COMPOSE_FILE_BASE=docker/docker-compose-test-net.yaml # docker-compose.yaml file if you are using couchdb @@ -442,10 +453,12 @@ COMPOSE_FILE_COUCH_ORG3=addOrg3/docker/docker-compose-couch-org3.yaml # use this as the default docker-compose yaml definition for org3 COMPOSE_FILE_ORG3=addOrg3/docker/docker-compose-org3.yaml # -# use golang as the default language for chaincode -CC_SRC_LANGUAGE=golang +# use go as the default language for chaincode +CC_SRC_LANGUAGE="go" # Chaincode version -VERSION=1 +CC_VERSION="1.0" +# Chaincode definition sequence +CC_SEQUENCE=1 # default image tag IMAGETAG="latest" # default ca image tag @@ -501,12 +514,28 @@ while [[ $# -ge 1 ]] ; do DATABASE="$2" shift ;; - -l ) + -ccl ) CC_SRC_LANGUAGE="$2" shift ;; - -v ) - VERSION="$2" + -ccn ) + CC_NAME="$2" + shift + ;; + -ccv ) + CC_VERSION="$2" + shift + ;; + -ccs ) + CC_SEQUENCE="$2" + shift + ;; + -ccp ) + CC_SRC_PATH="$2" + shift + ;; + -cci ) + CC_INIT_FCN="$2" shift ;; -i ) diff --git a/test-network/scripts/deployCC.sh b/test-network/scripts/deployCC.sh index 926f7be6..e94afd66 100755 --- a/test-network/scripts/deployCC.sh +++ b/test-network/scripts/deployCC.sh @@ -1,50 +1,94 @@ +CHANNEL_NAME=${1:-"mychannel"} +CC_NAME=${2:-"basic"} +CC_SRC_PATH=${3:-"NA"} +CC_SRC_LANGUAGE=${4:-"go"} +CC_VERSION=${5:-"1.0"} +CC_SEQUENCE=${6:-"1"} +CC_INIT_FCN=${7:-"NA"} +DELAY=${8:-"3"} +MAX_RETRY=${9:-"5"} +VERBOSE=${10:-"false"} + +echo --- executing with the following +echo - CHANNEL_NAME:$'\e[0;32m'$CHANNEL_NAME$'\e[0m' +echo - CC_NAME:$'\e[0;32m'$CC_NAME$'\e[0m' +echo - CC_SRC_PATH:$'\e[0;32m'$CC_SRC_PATH$'\e[0m' +echo - CC_SRC_LANGUAGE:$'\e[0;32m'$CC_SRC_LANGUAGE$'\e[0m' +echo - CC_VERSION:$'\e[0;32m'$CC_VERSION$'\e[0m' +echo - CC_SEQUENCE:$'\e[0;32m'$CC_SEQUENCE$'\e[0m' +echo - CC_INIT_FCN:$'\e[0;32m'$CC_INIT_FCN$'\e[0m' +echo - DELAY:$'\e[0;32m'$DELAY$'\e[0m' +echo - MAX_RETRY:$'\e[0;32m'$MAX_RETRY$'\e[0m' +echo - VERBOSE:$'\e[0;32m'$VERBOSE$'\e[0m' -CHANNEL_NAME="$1" -CC_SRC_LANGUAGE="$2" -VERSION="$3" -DELAY="$4" -MAX_RETRY="$5" -VERBOSE="$6" -: ${CHANNEL_NAME:="mychannel"} -: ${CC_SRC_LANGUAGE:="golang"} -: ${VERSION:="1"} -: ${DELAY:="3"} -: ${MAX_RETRY:="5"} -: ${VERBOSE:="false"} CC_SRC_LANGUAGE=`echo "$CC_SRC_LANGUAGE" | tr [:upper:] [:lower:]` FABRIC_CFG_PATH=$PWD/../config/ -if [ "$CC_SRC_LANGUAGE" = "go" -o "$CC_SRC_LANGUAGE" = "golang" ] ; then - CC_RUNTIME_LANGUAGE=golang - CC_SRC_PATH="../chaincode/fabcar/go/" +# User has not provided a path, therefore the CC_NAME must +# be the short name of a known chaincode sample +if [ "$CC_SRC_PATH" = "NA" ]; then + echo Determining the path to the chaincode + # first see which chaincode we have. This will be based on the + # short name of the known chaincode sample + if [ "$CC_NAME" = "basic" ]; then + echo $'\e[0;32m'asset-transfer-basic$'\e[0m' chaincode + CC_SRC_PATH="../asset-transfer-basic" + elif [ "$CC_NAME" = "secure" ]; then + echo $'\e[0;32m'asset-transfer-secured-agreeement$'\e[0m' chaincode + CC_SRC_PATH="../asset-transfer-secured-agreement" + elif [ "$CC_NAME" = "ledger" ]; then + echo $'\e[0;32m'asset-transfer-secured-agreeement$'\e[0m' chaincode + CC_SRC_PATH="../asset-transfer-ledger-queries" + elif [ "$CC_NAME" = "private" ]; then + echo $'\e[0;32m'asset-transfer-private-data$'\e[0m' chaincode + CC_SRC_PATH="../asset-transfer-private-data" + else + echo The chaincode name ${CC_NAME} is not supported by this script + echo Supported chaincode names are: basic, secure, and private + exit 1 + fi - echo Vendoring Go dependencies ... - pushd ../chaincode/fabcar/go + # now see what language it is written in + if [ "$CC_SRC_LANGUAGE" = "go" ]; then + CC_SRC_PATH="$CC_SRC_PATH/chaincode-go/" + elif [ "$CC_SRC_LANGUAGE" = "java" ]; then + CC_SRC_PATH="$CC_SRC_PATH/chaincode-java/" + elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then + CC_SRC_PATH="$CC_SRC_PATH/chaincode-javascript/" + elif [ "$CC_SRC_LANGUAGE" = "typescript" ]; then + CC_SRC_PATH="$CC_SRC_PATH/chaincode-typescript/" + fi +fi + +# do some language specific preparation to the chaincode before packaging +if [ "$CC_SRC_LANGUAGE" = "go" ]; then + CC_RUNTIME_LANGUAGE=golang + + echo Vendoring Go dependencies at $CC_SRC_PATH + pushd $CC_SRC_PATH GO111MODULE=on go mod vendor popd echo Finished vendoring Go dependencies -elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then - CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js - CC_SRC_PATH="../chaincode/fabcar/javascript/" - elif [ "$CC_SRC_LANGUAGE" = "java" ]; then CC_RUNTIME_LANGUAGE=java - CC_SRC_PATH="../chaincode/fabcar/java/build/install/fabcar" echo Compiling Java code ... - pushd ../chaincode/fabcar/java + pushd $CC_SRC_PATH ./gradlew installDist popd echo Finished compiling Java code + CC_SRC_PATH=$CC_SRC_PATH/build/install/$CC_NAME + +elif [ "$CC_SRC_LANGUAGE" = "javascript" ]; then + CC_RUNTIME_LANGUAGE=node elif [ "$CC_SRC_LANGUAGE" = "typescript" ]; then - CC_RUNTIME_LANGUAGE=node # chaincode runtime language is node.js - CC_SRC_PATH="../chaincode/fabcar/typescript/" + CC_RUNTIME_LANGUAGE=node echo Compiling TypeScript code into JavaScript ... - pushd ../chaincode/fabcar/typescript + pushd $CC_SRC_PATH npm install npm run build popd @@ -56,200 +100,210 @@ else exit 1 fi +INIT_REQUIRED="--init-required" +# check if the init fcn should be called +if [ "$CC_INIT_FCN" = "NA" ]; then + INIT_REQUIRED="" +fi + # import utils . scripts/envVar.sh packageChaincode() { - ORG=$1 - setGlobals $ORG - set -x - peer lifecycle chaincode package fabcar.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label fabcar_${VERSION} >&log.txt - res=$? - set +x - cat log.txt - verifyResult $res "Chaincode packaging on peer0.org${ORG} has failed" - echo "===================== Chaincode is packaged on peer0.org${ORG} ===================== " - echo + ORG=$1 + setGlobals $ORG + set -x + peer lifecycle chaincode package ${CC_NAME}.tar.gz --path ${CC_SRC_PATH} --lang ${CC_RUNTIME_LANGUAGE} --label ${CC_NAME}_${CC_VERSION} >&log.txt + res=$? + set +x + cat log.txt + verifyResult $res "Chaincode packaging on peer0.org${ORG} has failed" + echo "===================== Chaincode is packaged on peer0.org${ORG} ===================== " + echo } # installChaincode PEER ORG installChaincode() { - ORG=$1 - setGlobals $ORG - set -x - peer lifecycle chaincode install fabcar.tar.gz >&log.txt - res=$? - set +x - cat log.txt - verifyResult $res "Chaincode installation on peer0.org${ORG} has failed" - echo "===================== Chaincode is installed on peer0.org${ORG} ===================== " - echo + ORG=$1 + setGlobals $ORG + set -x + peer lifecycle chaincode install ${CC_NAME}.tar.gz >&log.txt + res=$? + set +x + cat log.txt + verifyResult $res "Chaincode installation on peer0.org${ORG} has failed" + echo "===================== Chaincode is installed on peer0.org${ORG} ===================== " + echo } # queryInstalled PEER ORG queryInstalled() { - ORG=$1 - setGlobals $ORG - set -x - peer lifecycle chaincode queryinstalled >&log.txt - res=$? - set +x - cat log.txt - PACKAGE_ID=$(sed -n "/fabcar_${VERSION}/{s/^Package ID: //; s/, Label:.*$//; p;}" log.txt) - verifyResult $res "Query installed on peer0.org${ORG} has failed" - echo "===================== Query installed successful on peer0.org${ORG} on channel ===================== " - echo + ORG=$1 + setGlobals $ORG + set -x + peer lifecycle chaincode queryinstalled >&log.txt + res=$? + set +x + cat log.txt + PACKAGE_ID=$(sed -n "/${CC_NAME}_${CC_VERSION}/{s/^Package ID: //; s/, Label:.*$//; p;}" log.txt) + verifyResult $res "Query installed on peer0.org${ORG} has failed" + echo "===================== Query installed successful on peer0.org${ORG} on channel ===================== " + echo } # approveForMyOrg VERSION PEER ORG approveForMyOrg() { - ORG=$1 - setGlobals $ORG - set -x - peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name fabcar --version ${VERSION} --init-required --package-id ${PACKAGE_ID} --sequence ${VERSION} >&log.txt - set +x - cat log.txt - verifyResult $res "Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' failed" - echo "===================== Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " - echo + ORG=$1 + setGlobals $ORG + set -x + peer lifecycle chaincode approveformyorg -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --package-id ${PACKAGE_ID} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} >&log.txt + set +x + cat log.txt + verifyResult $res "Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' failed" + echo "===================== Chaincode definition approved on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " + echo } # checkCommitReadiness VERSION PEER ORG checkCommitReadiness() { - ORG=$1 - shift 1 - setGlobals $ORG - echo "===================== Checking the commit readiness of the chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " + ORG=$1 + shift 1 + setGlobals $ORG + echo "===================== Checking the commit readiness of the chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 local COUNTER=1 # continue to poll - # we either get a successful response, or reach MAX RETRY - while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do - sleep $DELAY - echo "Attempting to check the commit readiness of the chaincode definition on peer0.org${ORG}, Retry after $DELAY seconds." - set -x - peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name fabcar --version ${VERSION} --sequence ${VERSION} --output json --init-required >&log.txt - res=$? - set +x - let rc=0 - for var in "$@" - do - grep "$var" log.txt &>/dev/null || let rc=1 - done + # we either get a successful response, or reach MAX RETRY + while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do + sleep $DELAY + echo "Attempting to check the commit readiness of the chaincode definition on peer0.org${ORG}, Retry after $DELAY seconds." + set -x + peer lifecycle chaincode checkcommitreadiness --channelID $CHANNEL_NAME --name ${CC_NAME} --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} --output json >&log.txt + res=$? + set +x + let rc=0 + for var in "$@"; do + grep "$var" log.txt &>/dev/null || let rc=1 + done COUNTER=$(expr $COUNTER + 1) done - cat log.txt - if test $rc -eq 0; then - echo "===================== Checking the commit readiness of the chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " - else - echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Check commit readiness result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" - echo - exit 1 - fi + cat log.txt + if test $rc -eq 0; then + echo "===================== Checking the commit readiness of the chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " + else + echo + echo $'\e[1;31m'"!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Check commit readiness result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!"$'\e[0m' + echo + exit 1 + fi } # commitChaincodeDefinition VERSION PEER ORG (PEER ORG)... commitChaincodeDefinition() { - parsePeerConnectionParameters $@ - res=$? - verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " + parsePeerConnectionParameters $@ + res=$? + verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " - # while 'peer chaincode' command can get the orderer endpoint from the - # peer (if join was successful), let's supply it directly as we know - # it using the "-o" option - set -x - peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name fabcar $PEER_CONN_PARMS --version ${VERSION} --sequence ${VERSION} --init-required >&log.txt - res=$? - set +x - cat log.txt - verifyResult $res "Chaincode definition commit failed on peer0.org${ORG} on channel '$CHANNEL_NAME' failed" - echo "===================== Chaincode definition committed on channel '$CHANNEL_NAME' ===================== " - echo + # while 'peer chaincode' command can get the orderer endpoint from the + # peer (if join was successful), let's supply it directly as we know + # it using the "-o" option + set -x + peer lifecycle chaincode commit -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA --channelID $CHANNEL_NAME --name ${CC_NAME} $PEER_CONN_PARMS --version ${CC_VERSION} --sequence ${CC_SEQUENCE} ${INIT_REQUIRED} >&log.txt + res=$? + set +x + cat log.txt + verifyResult $res "Chaincode definition commit failed on peer0.org${ORG} on channel '$CHANNEL_NAME' failed" + echo "===================== Chaincode definition committed on channel '$CHANNEL_NAME' ===================== " + echo } # queryCommitted ORG queryCommitted() { - ORG=$1 - setGlobals $ORG - EXPECTED_RESULT="Version: ${VERSION}, Sequence: ${VERSION}, Endorsement Plugin: escc, Validation Plugin: vscc" - echo "===================== Querying chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " + ORG=$1 + setGlobals $ORG + EXPECTED_RESULT="Version: ${CC_VERSION}, Sequence: ${CC_SEQUENCE}, Endorsement Plugin: escc, Validation Plugin: vscc" + echo "===================== Querying chaincode definition on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 local COUNTER=1 # continue to poll - # we either get a successful response, or reach MAX RETRY - while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do - sleep $DELAY - echo "Attempting to Query committed status on peer0.org${ORG}, Retry after $DELAY seconds." - set -x - peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name fabcar >&log.txt - res=$? - set +x - test $res -eq 0 && VALUE=$(cat log.txt | grep -o '^Version: [0-9], Sequence: [0-9], Endorsement Plugin: escc, Validation Plugin: vscc') - test "$VALUE" = "$EXPECTED_RESULT" && let rc=0 + # we either get a successful response, or reach MAX RETRY + while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do + sleep $DELAY + echo "Attempting to Query committed status on peer0.org${ORG}, Retry after $DELAY seconds." + set -x + peer lifecycle chaincode querycommitted --channelID $CHANNEL_NAME --name ${CC_NAME} >&log.txt + res=$? + set +x + test $res -eq 0 && VALUE=$(cat log.txt | grep -o '^Version: '$CC_VERSION', Sequence: [0-9], Endorsement Plugin: escc, Validation Plugin: vscc') + test "$VALUE" = "$EXPECTED_RESULT" && let rc=0 COUNTER=$(expr $COUNTER + 1) done - echo - cat log.txt - if test $rc -eq 0; then - echo "===================== Query chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " + echo + cat log.txt + if test $rc -eq 0; then + echo "===================== Query chaincode definition successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " echo - else - echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query chaincode definition result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" - echo - exit 1 - fi + else + echo + echo $'\e[1;31m'"!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query chaincode definition result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!"$'\e[0m' + echo + exit 1 + fi } chaincodeInvokeInit() { - parsePeerConnectionParameters $@ - res=$? - verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " + parsePeerConnectionParameters $@ + res=$? + verifyResult $res "Invoke transaction failed on channel '$CHANNEL_NAME' due to uneven number of peer and org parameters " - # while 'peer chaincode' command can get the orderer endpoint from the - # peer (if join was successful), let's supply it directly as we know - # it using the "-o" option - set -x - peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n fabcar $PEER_CONN_PARMS --isInit -c '{"function":"initLedger","Args":[]}' >&log.txt - res=$? - set +x - cat log.txt - verifyResult $res "Invoke execution on $PEERS failed " - echo "===================== Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME' ===================== " - echo + # while 'peer chaincode' command can get the orderer endpoint from the + # peer (if join was successful), let's supply it directly as we know + # it using the "-o" option + set -x + fcn_call='{"function":"'${CC_INIT_FCN}'","Args":[]}' + echo invoke fcn call:${fcn_call} + peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile $ORDERER_CA -C $CHANNEL_NAME -n ${CC_NAME} $PEER_CONN_PARMS --isInit -c ${fcn_call} >&log.txt + res=$? + set +x + cat log.txt + verifyResult $res "Invoke execution on $PEERS failed " + echo "===================== Invoke transaction successful on $PEERS on channel '$CHANNEL_NAME' ===================== " + echo } chaincodeQuery() { - ORG=$1 - setGlobals $ORG - echo "===================== Querying on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " + ORG=$1 + setGlobals $ORG + echo "===================== Querying on peer0.org${ORG} on channel '$CHANNEL_NAME'... ===================== " local rc=1 local COUNTER=1 # continue to poll - # we either get a successful response, or reach MAX RETRY - while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ] ; do - sleep $DELAY - echo "Attempting to Query peer0.org${ORG}, Retry after $DELAY seconds." - set -x - peer chaincode query -C $CHANNEL_NAME -n fabcar -c '{"Args":["queryAllCars"]}' >&log.txt - res=$? - set +x + # we either get a successful response, or reach MAX RETRY + while [ $rc -ne 0 -a $COUNTER -lt $MAX_RETRY ]; do + sleep $DELAY + echo "Attempting to Query peer0.org${ORG}, Retry after $DELAY seconds." + set -x + peer chaincode query -C $CHANNEL_NAME -n ${CC_NAME} -c '{"Args":["queryAllCars"]}' >&log.txt + res=$? + set +x let rc=$res COUNTER=$(expr $COUNTER + 1) done - echo - cat log.txt - if test $rc -eq 0; then - echo "===================== Query successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " + echo + cat log.txt + if test $rc -eq 0; then + echo "===================== Query successful on peer0.org${ORG} on channel '$CHANNEL_NAME' ===================== " echo - else - echo "!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!" - echo - exit 1 - fi + else + echo + echo $'\e[1;31m'"!!!!!!!!!!!!!!! After $MAX_RETRY attempts, Query result on peer0.org${ORG} is INVALID !!!!!!!!!!!!!!!!"$'\e[0m' + echo + exit 1 + fi } -## at first we package the chaincode +## package the chaincode packageChaincode 1 ## Install chaincode on peer0.org1 and peer0.org2 @@ -284,13 +338,13 @@ commitChaincodeDefinition 1 2 queryCommitted 1 queryCommitted 2 -## Invoke the chaincode -chaincodeInvokeInit 1 2 - -sleep 10 - -# Query chaincode on peer0.org1 -echo "Querying chaincode on peer0.org1..." -chaincodeQuery 1 +## Invoke the chaincode - this does require that the chaincode have the 'initLedger' +## method defined +if [ "$CC_INIT_FCN" = "NA" ]; then + echo "===================== Chaincode initialization is not required ===================== " + echo +else + chaincodeInvokeInit 1 2 +fi exit 0 diff --git a/test-network/scripts/envVar.sh b/test-network/scripts/envVar.sh index 0506914d..6ab0aaa0 100755 --- a/test-network/scripts/envVar.sh +++ b/test-network/scripts/envVar.sh @@ -78,7 +78,7 @@ parsePeerConnectionParameters() { verifyResult() { if [ $1 -ne 0 ]; then - echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!" + echo $'\e[1;31m'!!!!!!!!!!!!!!! $2 !!!!!!!!!!!!!!!!$'\e[0m' echo exit 1 fi diff --git a/test-network/scripts/org3-scripts/envVarCLI.sh b/test-network/scripts/org3-scripts/envVarCLI.sh index 01578bc5..5607196e 100644 --- a/test-network/scripts/org3-scripts/envVarCLI.sh +++ b/test-network/scripts/org3-scripts/envVarCLI.sh @@ -47,7 +47,7 @@ setGlobals() { verifyResult() { if [ $1 -ne 0 ]; then - echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!" + echo $'\e[1;31m'!!!!!!!!!!!!!!! $2 !!!!!!!!!!!!!!!!$'\e[0m' echo exit 1 fi