-
Notifications
You must be signed in to change notification settings - Fork 3.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FAB-8165] Adding upgrade function to byfn
Adding upgrade functionality to byfn.sh to upgrade the fabric network from v1.0.x to v1.1 and scripts for cli to enable /Channel, /Channel/Orderer, /Channel/Application capabilities Usage: git fetch origin git checkout origin/release ./byfn.sh -m up -i 1.0.6 git checkout origin/master ./byfn.sh upgrade Change-Id: I6f53a6db39501e2653dc4c325d3d42d78f463e87 Signed-off-by: Surya <[email protected]> Signed-off-by: Jason Yellick <[email protected]>
- Loading branch information
Showing
5 changed files
with
305 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{ | ||
"mod_policy": "Admins", | ||
"value": { | ||
"capabilities": { | ||
"V1_1": {} | ||
} | ||
}, | ||
"version": "0" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -29,57 +29,37 @@ if [ "$LANGUAGE" = "node" ]; then | |
CC_SRC_PATH="/opt/gopath/src/github.com/chaincode/chaincode_example02/node/" | ||
fi | ||
|
||
# import utils | ||
. scripts/utils.sh | ||
|
||
echo | ||
echo "========= Creating config transaction to add org3 to network =========== " | ||
echo | ||
|
||
echo "Installing jq" | ||
apt-get -y update && apt-get -y install jq | ||
|
||
echo "Fetching the most recent configuration block for the channel" | ||
peer channel fetch config config_block.pb -o orderer.example.com:7050 -c ${CHANNEL_NAME} --tls --cafile ${ORDERER_CA} | ||
|
||
echo "Creating config transaction adding org3 to the network" | ||
# translate channel configuration block into JSON format | ||
configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json | ||
# Fetch the config for the channel, writing it to config.json | ||
fetchChannelConfig ${CHANNEL_NAME} config.json | ||
|
||
# strip away all of the encapsulating wrappers | ||
jq .data.data[0].payload.data.config config_block.json > config.json | ||
|
||
# append new org to the configuration | ||
# Modify the configuration to append the new org | ||
jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"Org3MSP":.[1]}}}}}' config.json ./channel-artifacts/org3.json > modified_config.json | ||
|
||
# translate json config files back to protobuf | ||
configtxlator proto_encode --input config.json --type common.Config --output config.pb | ||
configtxlator proto_encode --input modified_config.json --type common.Config --output modified_config.pb | ||
|
||
# get delta between old and new configs | ||
configtxlator compute_update --channel_id ${CHANNEL_NAME} --original config.pb --updated modified_config.pb --output org3_update.pb | ||
|
||
# translate protobuf delta to json | ||
configtxlator proto_decode --input org3_update.pb --type common.ConfigUpdate --output org3_update.json | ||
|
||
# wrap delta in an envelope message | ||
echo '{"payload":{"header":{"channel_header":{"channel_id":"'${CHANNEL_NAME}'", "type":2}},"data":{"config_update":'$(cat org3_update.json)'}}}' | jq . > org3_update_in_envelope.json | ||
|
||
# translate json back to protobuf | ||
configtxlator proto_encode --input org3_update_in_envelope.json --type common.Envelope --output org3_update_in_envelope.pb | ||
# Compute a config update, based on the differences between config.json and modified_config.json, write it as a transaction to org3_update_in_envelope.pb | ||
createConfigUpdate ${CHANNEL_NAME} config.json modified_config.json org3_update_in_envelope.pb | ||
|
||
echo | ||
echo "========= Config transaction to add org3 to network created ===== " | ||
echo | ||
|
||
echo "Signing config transaction" | ||
echo | ||
peer channel signconfigtx -f org3_update_in_envelope.pb | ||
signConfigtxAsPeerOrg 1 org3_update_in_envelope.pb | ||
|
||
echo | ||
echo "========= Submitting transaction from a different peer (peer0.org2) which also signs it ========= " | ||
echo | ||
export CORE_PEER_LOCALMSPID="Org2MSP" | ||
export 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 | ||
export CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/[email protected]/msp | ||
export CORE_PEER_ADDRESS=peer0.org2.example.com:7051 | ||
setGlobals 0 2 | ||
peer channel update -f org3_update_in_envelope.pb -c ${CHANNEL_NAME} -o orderer.example.com:7050 --tls --cafile ${ORDERER_CA} | ||
|
||
echo | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
#!/bin/bash | ||
|
||
echo | ||
echo " ____ _____ _ ____ _____ " | ||
echo "/ ___| |_ _| / \ | _ \ |_ _|" | ||
echo "\___ \ | | / _ \ | |_) | | | " | ||
echo " ___) | | | / ___ \ | _ < | | " | ||
echo "|____/ |_| /_/ \_\ |_| \_\ |_| " | ||
echo | ||
echo "Upgrade your first network (BYFN) from v1.0.x to v1.1 end-to-end test" | ||
echo | ||
CHANNEL_NAME="$1" | ||
DELAY="$2" | ||
LANGUAGE="$3" | ||
TIMEOUT="$4" | ||
: ${CHANNEL_NAME:="mychannel"} | ||
: ${DELAY:="5"} | ||
: ${LANGUAGE:="golang"} | ||
: ${TIMEOUT:="10"} | ||
LANGUAGE=`echo "$LANGUAGE" | tr [:upper:] [:lower:]` | ||
COUNTER=1 | ||
MAX_RETRY=5 | ||
ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem | ||
|
||
CC_SRC_PATH="github.com/chaincode/chaincode_example02/go/" | ||
if [ "$LANGUAGE" = "node" ]; then | ||
CC_SRC_PATH="/opt/gopath/src/github.com/chaincode/chaincode_example02/node/" | ||
fi | ||
|
||
echo "Channel name : "$CHANNEL_NAME | ||
|
||
# import utils | ||
. scripts/utils.sh | ||
|
||
# addCapabilityToChannel <channel_id> <capabilities_group> | ||
# This function pulls the current channel config, modifies it with capabilities | ||
# for the specified group, computes the config update, signs, and submits it. | ||
addCapabilityToChannel() { | ||
CH_NAME=$1 | ||
GROUP=$2 | ||
|
||
setOrdererGlobals | ||
|
||
# Get the current channel config, decode and write it to config.json | ||
fetchChannelConfig $CH_NAME config.json | ||
|
||
# Modify the correct section of the config based on capabilities group | ||
if [ $GROUP == "orderer" ]; then | ||
jq -s '.[0] * {"channel_group":{"groups":{"Orderer": {"values": {"Capabilities": .[1]}}}}}' config.json ./scripts/capabilities.json > modified_config.json | ||
elif [ $GROUP == "channel" ]; then | ||
jq -s '.[0] * {"channel_group":{"values": {"Capabilities": .[1]}}}' config.json ./scripts/capabilities.json > modified_config.json | ||
elif [ $GROUP == "application" ]; then | ||
jq -s '.[0] * {"channel_group":{"groups":{"Application": {"values": {"Capabilities": .[1]}}}}}' config.json ./scripts/capabilities.json > modified_config.json | ||
fi | ||
|
||
# Create a config updated for this channel based on the differences between config.json and modified_config.json | ||
# write the output to config_update_in_envelope.pb | ||
createConfigUpdate "$CH_NAME" config.json modified_config.json config_update_in_envelope.pb | ||
|
||
# Sign, and set the correct identity for submission. | ||
if [ $CH_NAME != "testchainid" ] ; then | ||
if [ $GROUP == "orderer" ]; then | ||
# Modifying the orderer group requires only the Orderer admin to sign. | ||
# Prepare to sign the update as the OrdererOrg.Admin | ||
setOrdererGlobals | ||
elif [ $GROUP == "channel" ]; then | ||
# Modifying the channel group requires a majority of application admins and the orderer admin to sign. | ||
# Sign with PeerOrg1.Admin | ||
signConfigtxAsPeerOrg 1 config_update_in_envelope.pb | ||
# Sign with PeerOrg2.Admin | ||
signConfigtxAsPeerOrg 2 config_update_in_envelope.pb | ||
# Prepare to sign the update as the OrdererOrg.Admin | ||
setOrdererGlobals | ||
elif [ $GROUP == "application" ]; then | ||
# Modifying the application group requires a majority of application admins to sign. | ||
# Sign with PeerOrg1.Admin | ||
signConfigtxAsPeerOrg 1 config_update_in_envelope.pb | ||
# Prepare to sign the update as the PeerOrg2.Admin | ||
setGlobals 0 2 | ||
fi | ||
else | ||
# For the orderer system channel, only the orderer admin needs sign | ||
# which will be attached during the update | ||
setOrdererGlobals | ||
fi | ||
|
||
if [ -z "$CORE_PEER_TLS_ENABLED" -o "$CORE_PEER_TLS_ENABLED" = "false" ]; then | ||
peer channel update -f config_update_in_envelope.pb -c $CH_NAME -o orderer.example.com:7050 --cafile $ORDERER_CA | ||
else | ||
peer channel update -f config_update_in_envelope.pb -c $CH_NAME -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA | ||
fi | ||
res=$? | ||
verifyResult $res "Config update for \"$GROUP\" on \"$CH_NAME\" failed" | ||
echo "===================== Config update for \"$GROUP\" on \"$CH_NAME\" is completed ===================== " | ||
|
||
} | ||
|
||
echo "Installing jq" | ||
apt-get update | ||
apt-get install -y jq | ||
|
||
sleep $DELAY | ||
|
||
#Config update for /Channel/Orderer on testchainid | ||
echo "Config update for /Channel/Orderer on testchainid" | ||
addCapabilityToChannel testchainid orderer | ||
|
||
sleep $DELAY | ||
|
||
#Config update for /Channel on testchainid | ||
echo "Config update for /Channel on testchainid" | ||
addCapabilityToChannel testchainid channel | ||
|
||
sleep $DELAY | ||
|
||
#Config update for /Channel/Orderer | ||
echo "Config update for /Channel/Orderer on \"$CHANNEL_NAME\"" | ||
addCapabilityToChannel $CHANNEL_NAME orderer | ||
|
||
sleep $DELAY | ||
|
||
#Config update for /Channel/Application | ||
echo "Config update for /Channel/Application on \"$CHANNEL_NAME\"" | ||
addCapabilityToChannel $CHANNEL_NAME application | ||
|
||
sleep $DELAY | ||
|
||
#Config update for /Channel | ||
echo "Config update for /Channel on \"$CHANNEL_NAME\"" | ||
addCapabilityToChannel $CHANNEL_NAME channel | ||
|
||
#Query on chaincode on Peer0/Org1 | ||
echo "Querying chaincode on org1/peer0..." | ||
chaincodeQuery 0 1 90 | ||
|
||
#Invoke on chaincode on Peer0/Org1 | ||
echo "Sending invoke transaction on org1/peer0..." | ||
chaincodeInvoke 0 1 | ||
|
||
sleep $DELAY | ||
|
||
#Query on chaincode on Peer0/Org1 | ||
echo "Querying chaincode on org1/peer0..." | ||
chaincodeQuery 0 1 80 | ||
|
||
##Invoke on chaincode on Peer0/Org2 | ||
echo "Sending invoke transaction on org2/peer0..." | ||
chaincodeInvoke 0 2 | ||
|
||
sleep $DELAY | ||
|
||
#Query on chaincode on Peer0/Org2 | ||
echo "Querying chaincode on org2/peer0..." | ||
chaincodeQuery 0 2 70 | ||
|
||
echo | ||
echo "===================== All GOOD, End-2-End UPGRADE Scenario execution completed ===================== " | ||
echo | ||
|
||
echo | ||
echo " _____ _ _ ____ _____ ____ _____ " | ||
echo "| ____| | \ | | | _ \ | ____| |___ \ | ____|" | ||
echo "| _| | \| | | | | | _____ | _| __) | | _| " | ||
echo "| |___ | |\ | | |_| | |_____| | |___ / __/ | |___ " | ||
echo "|_____| |_| \_| |____/ |_____| |_____| |_____|" | ||
echo | ||
|
||
exit 0 |
Oops, something went wrong.