mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-17 15:35:09 +00:00
byfn test failing intermittently in CI due to peer not being available when the join channel command is executed. Need to wait for peer to finsih establishing connection with couchdb before joining channel. The exit code was not being correctly captured from the peer join command and thus the retry logic was not being executed. Change-Id: I2c27d17cd769c6b8de1bdcfed263d9b0f758b432 Signed-off-by: Saad Karim <skarim@us.ibm.com>
275 lines
10 KiB
Bash
Executable file
275 lines
10 KiB
Bash
Executable file
#
|
|
# Copyright IBM Corp All Rights Reserved
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
# This is a collection of bash functions used by different scripts
|
|
|
|
|
|
# verify the result of the end-to-end test
|
|
verifyResult () {
|
|
if [ $1 -ne 0 ] ; then
|
|
echo "!!!!!!!!!!!!!!! "$2" !!!!!!!!!!!!!!!!"
|
|
echo "========= ERROR !!! FAILED to execute End-2-End Scenario ==========="
|
|
echo
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Set OrdererOrg.Admin globals
|
|
setOrdererGlobals() {
|
|
CORE_PEER_LOCALMSPID="OrdererMSP"
|
|
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
|
|
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/users/Admin@example.com/msp
|
|
}
|
|
|
|
setGlobals () {
|
|
PEER=$1
|
|
ORG=$2
|
|
if [ $ORG -eq 1 ] ; then
|
|
CORE_PEER_LOCALMSPID="Org1MSP"
|
|
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
|
|
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
|
|
if [ $PEER -eq 0 ]; then
|
|
CORE_PEER_ADDRESS=peer0.org1.example.com:7051
|
|
else
|
|
CORE_PEER_ADDRESS=peer1.org1.example.com:7051
|
|
fi
|
|
elif [ $ORG -eq 2 ] ; then
|
|
CORE_PEER_LOCALMSPID="Org2MSP"
|
|
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
|
|
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
|
|
if [ $PEER -eq 0 ]; then
|
|
CORE_PEER_ADDRESS=peer0.org2.example.com:7051
|
|
else
|
|
CORE_PEER_ADDRESS=peer1.org2.example.com:7051
|
|
fi
|
|
|
|
elif [ $ORG -eq 3 ] ; then
|
|
CORE_PEER_LOCALMSPID="Org3MSP"
|
|
CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
|
|
CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org3.example.com/users/Admin@org3.example.com/msp
|
|
if [ $PEER -eq 0 ]; then
|
|
CORE_PEER_ADDRESS=peer0.org3.example.com:7051
|
|
else
|
|
CORE_PEER_ADDRESS=peer1.org3.example.com:7051
|
|
fi
|
|
else
|
|
echo "================== ERROR !!! ORG Unknown =================="
|
|
fi
|
|
|
|
env |grep CORE
|
|
}
|
|
|
|
|
|
updateAnchorPeers() {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
|
|
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
|
set -x
|
|
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx >&log.txt
|
|
res=$?
|
|
set +x
|
|
else
|
|
set -x
|
|
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA >&log.txt
|
|
res=$?
|
|
set +x
|
|
fi
|
|
cat log.txt
|
|
verifyResult $res "Anchor peer update failed"
|
|
echo "===================== Anchor peers for org \"$CORE_PEER_LOCALMSPID\" on \"$CHANNEL_NAME\" is updated successfully ===================== "
|
|
sleep $DELAY
|
|
echo
|
|
}
|
|
|
|
## Sometimes Join takes time hence RETRY at least for 5 times
|
|
joinChannelWithRetry () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
|
|
set -x
|
|
peer channel join -b $CHANNEL_NAME.block >&log.txt
|
|
res=$?
|
|
set +x
|
|
cat log.txt
|
|
if [ $res -ne 0 -a $COUNTER -lt $MAX_RETRY ]; then
|
|
COUNTER=` expr $COUNTER + 1`
|
|
echo "peer${PEER}.org${ORG} failed to join the channel, Retry after $DELAY seconds"
|
|
sleep $DELAY
|
|
joinChannelWithRetry $PEER $ORG
|
|
else
|
|
COUNTER=1
|
|
fi
|
|
verifyResult $res "After $MAX_RETRY attempts, peer${PEER}.org${ORG} has failed to Join the Channel"
|
|
}
|
|
|
|
installChaincode () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
VERSION=${3:-1.0}
|
|
set -x
|
|
peer chaincode install -n mycc -v ${VERSION} -l ${LANGUAGE} -p ${CC_SRC_PATH} >&log.txt
|
|
res=$?
|
|
set +x
|
|
cat log.txt
|
|
verifyResult $res "Chaincode installation on peer${PEER}.org${ORG} has Failed"
|
|
echo "===================== Chaincode is installed on peer${PEER}.org${ORG} ===================== "
|
|
echo
|
|
}
|
|
|
|
instantiateChaincode () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
VERSION=${3:-1.0}
|
|
|
|
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
|
|
# lets supply it directly as we know it using the "-o" option
|
|
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
|
set -x
|
|
peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v ${VERSION} -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" >&log.txt
|
|
res=$?
|
|
set +x
|
|
else
|
|
set -x
|
|
peer chaincode instantiate -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -l ${LANGUAGE} -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')" >&log.txt
|
|
res=$?
|
|
set +x
|
|
fi
|
|
cat log.txt
|
|
verifyResult $res "Chaincode instantiation on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' failed"
|
|
echo "===================== Chaincode Instantiation on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' is successful ===================== "
|
|
echo
|
|
}
|
|
|
|
upgradeChaincode () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
|
|
set -x
|
|
peer chaincode upgrade -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -v 2.0 -c '{"Args":["init","a","90","b","210"]}' -P "OR ('Org1MSP.peer','Org2MSP.peer','Org3MSP.peer')"
|
|
res=$?
|
|
set +x
|
|
cat log.txt
|
|
verifyResult $res "Chaincode upgrade on org${ORG} peer${PEER} has Failed"
|
|
echo "===================== Chaincode is upgraded on org${ORG} peer${PEER} ===================== "
|
|
echo
|
|
}
|
|
|
|
chaincodeQuery () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
EXPECTED_RESULT=$3
|
|
echo "===================== Querying on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME'... ===================== "
|
|
local rc=1
|
|
local starttime=$(date +%s)
|
|
|
|
# continue to poll
|
|
# we either get a successful response, or reach TIMEOUT
|
|
while test "$(($(date +%s)-starttime))" -lt "$TIMEOUT" -a $rc -ne 0
|
|
do
|
|
sleep $DELAY
|
|
echo "Attempting to Query peer${PEER}.org${ORG} ...$(($(date +%s)-starttime)) secs"
|
|
set -x
|
|
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >&log.txt
|
|
res=$?
|
|
set +x
|
|
test $res -eq 0 && VALUE=$(cat log.txt | awk '/Query Result/ {print $NF}')
|
|
test "$VALUE" = "$EXPECTED_RESULT" && let rc=0
|
|
done
|
|
echo
|
|
cat log.txt
|
|
if test $rc -eq 0 ; then
|
|
echo "===================== Query on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' is successful ===================== "
|
|
else
|
|
echo "!!!!!!!!!!!!!!! Query result on peer${PEER}.org${ORG} is INVALID !!!!!!!!!!!!!!!!"
|
|
echo "================== ERROR !!! FAILED to execute End-2-End Scenario =================="
|
|
echo
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# fetchChannelConfig <channel_id> <output_json>
|
|
# Writes the current channel config for a given channel to a JSON file
|
|
fetchChannelConfig() {
|
|
CHANNEL=$1
|
|
OUTPUT=$2
|
|
|
|
setOrdererGlobals
|
|
|
|
echo "Fetching the most recent configuration block for the channel"
|
|
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
|
set -x
|
|
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --cafile $ORDERER_CA
|
|
set +x
|
|
else
|
|
set -x
|
|
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c $CHANNEL --tls --cafile $ORDERER_CA
|
|
set +x
|
|
fi
|
|
|
|
echo "Decoding config block to JSON and isolating config to ${OUTPUT}"
|
|
set -x
|
|
configtxlator proto_decode --input config_block.pb --type common.Block | jq .data.data[0].payload.data.config > "${OUTPUT}"
|
|
set +x
|
|
}
|
|
|
|
# signConfigtxAsPeerOrg <org> <configtx.pb>
|
|
# Set the peerOrg admin of an org and signing the config update
|
|
signConfigtxAsPeerOrg() {
|
|
PEERORG=$1
|
|
TX=$2
|
|
setGlobals 0 $PEERORG
|
|
set -x
|
|
peer channel signconfigtx -f "${TX}"
|
|
set +x
|
|
}
|
|
|
|
# createConfigUpdate <channel_id> <original_config.json> <modified_config.json> <output.pb>
|
|
# Takes an original and modified config, and produces the config update tx which transitions between the two
|
|
createConfigUpdate() {
|
|
CHANNEL=$1
|
|
ORIGINAL=$2
|
|
MODIFIED=$3
|
|
OUTPUT=$4
|
|
|
|
set -x
|
|
configtxlator proto_encode --input "${ORIGINAL}" --type common.Config > original_config.pb
|
|
configtxlator proto_encode --input "${MODIFIED}" --type common.Config > modified_config.pb
|
|
configtxlator compute_update --channel_id "${CHANNEL}" --original original_config.pb --updated modified_config.pb > config_update.pb
|
|
configtxlator proto_decode --input config_update.pb --type common.ConfigUpdate > config_update.json
|
|
echo '{"payload":{"header":{"channel_header":{"channel_id":"'$CHANNEL'", "type":2}},"data":{"config_update":'$(cat config_update.json)'}}}' | jq . > config_update_in_envelope.json
|
|
configtxlator proto_encode --input config_update_in_envelope.json --type common.Envelope > "${OUTPUT}"
|
|
set +x
|
|
}
|
|
|
|
chaincodeInvoke () {
|
|
PEER=$1
|
|
ORG=$2
|
|
setGlobals $PEER $ORG
|
|
# while 'peer chaincode' command can get the orderer endpoint from the peer (if join was successful),
|
|
# lets supply it directly as we know it using the "-o" option
|
|
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then
|
|
set -x
|
|
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}' >&log.txt
|
|
res=$?
|
|
set +x
|
|
else
|
|
set -x
|
|
peer chaincode invoke -o orderer.example.com:7050 --tls $CORE_PEER_TLS_ENABLED --cafile $ORDERER_CA -C $CHANNEL_NAME -n mycc -c '{"Args":["invoke","a","b","10"]}' >&log.txt
|
|
res=$?
|
|
set +x
|
|
fi
|
|
cat log.txt
|
|
verifyResult $res "Invoke execution on peer${PEER}.org${ORG} failed "
|
|
echo "===================== Invoke transaction on peer${PEER}.org${ORG} on channel '$CHANNEL_NAME' is successful ===================== "
|
|
echo
|
|
}
|