mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-18 07:55:10 +00:00
backporting fixes from master to v1.4 for interest rate sample Change-Id: If7648c91c53dff737103de178bd8a09556765951 Signed-off-by: NIKHIL E GUPTA <negupta@us.ibm.com>
237 lines
8 KiB
Bash
Executable file
237 lines
8 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# Copyright IBM Corp All Rights Reserved
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
|
|
# This script brings up a test network for the interest-rate swap fabric example.
|
|
# It relies on two tools:
|
|
# * cryptogen - generates the x509 certificates used to identify and
|
|
# authenticate the various components in the network.
|
|
# * configtxgen - generates the requisite configuration artifacts for orderer
|
|
# bootstrap and channel creation.
|
|
#
|
|
# Each tool consumes a configuration yaml file, within which we specify the topology
|
|
# of our network (cryptogen) and the location of our certificates for various
|
|
# configuration operations (configtxgen). Once the tools have been successfully run,
|
|
# we are able to launch our network. More detail on the tools and the structure of
|
|
# the network will be provided later in this document. For now, let's get going...
|
|
|
|
# prepending $PWD/../bin to PATH to ensure we are picking up the correct binaries
|
|
# this may be commented out to resolve installed version of tools if desired
|
|
export PATH=${PWD}/../../bin:${PWD}:$PATH
|
|
export FABRIC_CFG_PATH=${PWD}
|
|
export VERBOSE=false
|
|
|
|
# Print the usage message
|
|
function printHelp() {
|
|
echo "Usage: "
|
|
echo " start_network.sh <mode> [-t <timeout>] [-i <imagetag>] [-v]"
|
|
echo " <mode> - one of 'up', 'down' or 'generate'"
|
|
echo " - 'up' - bring up the network with docker-compose up"
|
|
echo " - 'down' - clear the network with docker-compose down"
|
|
echo " - 'generate' - generate required certificates and genesis block"
|
|
echo " -t <timeout> - CLI timeout duration in seconds (defaults to 10)"
|
|
echo " -i <imagetag> - the tag to be used to launch the network (defaults to \"latest\")"
|
|
echo " -v - verbose mode"
|
|
echo
|
|
echo "Typically, one would first generate the required certificates and "
|
|
echo "genesis block, then bring up the network."
|
|
}
|
|
|
|
# Obtain CONTAINER_IDS and remove them
|
|
# TODO Might want to make this optional - could clear other containers
|
|
function clearContainers() {
|
|
CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /dev-.*irscc.*/) {print $1}')
|
|
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
|
|
echo "---- No containers available for deletion ----"
|
|
else
|
|
docker rm -f $CONTAINER_IDS
|
|
fi
|
|
}
|
|
|
|
# Delete any images that were generated as a part of this setup
|
|
# specifically the following images are often left behind:
|
|
# TODO list generated image naming patterns
|
|
function removeUnwantedImages() {
|
|
DOCKER_IMAGE_IDS=$(docker images | awk '($1 ~ /dev.*irscc.*/) {print $3}')
|
|
if [ -z "$DOCKER_IMAGE_IDS" -o "$DOCKER_IMAGE_IDS" == " " ]; then
|
|
echo "---- No images available for deletion ----"
|
|
else
|
|
docker rmi -f $DOCKER_IMAGE_IDS
|
|
fi
|
|
}
|
|
|
|
# Versions of fabric known not to work with this release of first-network
|
|
BLACKLISTED_VERSIONS="^1\.0\. ^1\.1\.0-preview ^1\.1\.0-alpha"
|
|
|
|
# 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
|
|
# of go or other items could be added.
|
|
function checkPrereqs() {
|
|
# Note, we check configtxlator externally because it does not require a config file, and peer in the
|
|
# docker image because of FAB-8551 that makes configtxlator return 'development version' in docker
|
|
LOCAL_VERSION=$(configtxgen -version | sed -ne 's/ Version: //p')
|
|
DOCKER_IMAGE_VERSION=$(docker run --rm hyperledger/fabric-tools:$IMAGETAG peer version | sed -ne 's/ Version: //p' | head -1)
|
|
|
|
echo "LOCAL_VERSION=$LOCAL_VERSION"
|
|
echo "DOCKER_IMAGE_VERSION=$DOCKER_IMAGE_VERSION"
|
|
|
|
if [ "$LOCAL_VERSION" != "$DOCKER_IMAGE_VERSION" ]; then
|
|
echo "=================== WARNING ==================="
|
|
echo " Local fabric binaries and docker images are "
|
|
echo " out of sync. This may cause problems. "
|
|
echo "==============================================="
|
|
fi
|
|
|
|
for UNSUPPORTED_VERSION in $BLACKLISTED_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 this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
|
exit 1
|
|
fi
|
|
|
|
echo "$DOCKER_IMAGE_VERSION" | grep -q $UNSUPPORTED_VERSION
|
|
if [ $? -eq 0 ]; then
|
|
echo "ERROR! Fabric Docker image version of $DOCKER_IMAGE_VERSION does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples."
|
|
exit 1
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Generate the needed certificates, the genesis block and start the network.
|
|
function networkUp() {
|
|
checkPrereqs
|
|
# generate artifacts if they don't exist
|
|
if [ ! -d "crypto-config" ]; then
|
|
generateCerts
|
|
generateChannelArtifacts
|
|
fi
|
|
IMAGE_TAG=$IMAGETAG docker-compose -f $COMPOSE_FILE up -d orderer partya partyb partyc auditor rrprovider cli 2>&1
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR !!!! Unable to start network"
|
|
exit 1
|
|
fi
|
|
# now run the end to end script
|
|
docker exec cli scripts/script.sh
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR !!!! Test failed"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Tear down running network
|
|
function networkDown() {
|
|
# stop org3 containers also in addition to org1 and org2, in case we were running sample to add org3
|
|
docker-compose -f $COMPOSE_FILE down --volumes --remove-orphans
|
|
|
|
# Bring down the network, deleting the volumes
|
|
#Delete any ledger backups
|
|
docker run -v $PWD:/tmp/first-network --rm hyperledger/fabric-tools:$IMAGETAG rm -Rf /tmp/first-network/ledgers-backup
|
|
#Cleanup the chaincode containers
|
|
clearContainers
|
|
#Cleanup images
|
|
removeUnwantedImages
|
|
# remove orderer block and other channel configuration transactions and certs
|
|
rm -rf channel-artifacts/*.block channel-artifacts/*.tx crypto-config
|
|
}
|
|
|
|
# Generates Org certs using cryptogen tool
|
|
function generateCerts() {
|
|
which cryptogen
|
|
if [ "$?" -ne 0 ]; then
|
|
echo "cryptogen tool not found. exiting"
|
|
exit 1
|
|
fi
|
|
echo "##### Generate certificates using cryptogen tool #########"
|
|
|
|
if [ -d "crypto-config" ]; then
|
|
rm -Rf crypto-config
|
|
fi
|
|
cryptogen generate --config=./crypto-config.yaml
|
|
res=$?
|
|
if [ $res -ne 0 ]; then
|
|
echo "Failed to generate certificates..."
|
|
exit 1
|
|
fi
|
|
echo
|
|
}
|
|
|
|
# Generate orderer genesis block and channel configuration transaction with configtxgen
|
|
function generateChannelArtifacts() {
|
|
which configtxgen
|
|
if [ "$?" -ne 0 ]; then
|
|
echo "configtxgen tool not found. exiting"
|
|
exit 1
|
|
fi
|
|
|
|
echo "######### Generating Orderer Genesis block ##############"
|
|
mkdir channel-artifacts
|
|
configtxgen -profile IRSNetGenesis -outputBlock ./channel-artifacts/genesis.block -channelID system-channel
|
|
res=$?
|
|
if [ $res -ne 0 ]; then
|
|
echo "Failed to generate orderer genesis block..."
|
|
exit 1
|
|
fi
|
|
echo
|
|
echo "### Generating channel configuration transaction 'channel.tx' ###"
|
|
configtxgen -profile IRSChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
|
|
res=$?
|
|
if [ $res -ne 0 ]; then
|
|
echo "Failed to generate channel configuration transaction..."
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
CHANNEL_NAME="irs"
|
|
COMPOSE_FILE=docker-compose.yaml
|
|
COMPOSE_PROJECT_NAME=fabric-irs
|
|
#
|
|
# default image tag
|
|
IMAGETAG="latest"
|
|
# Parse commandline args
|
|
MODE=$1
|
|
shift
|
|
# Determine whether starting, stopping, generating
|
|
if [ "$MODE" == "up" ]; then
|
|
EXPMODE="Starting"
|
|
elif [ "$MODE" == "down" ]; then
|
|
EXPMODE="Stopping"
|
|
elif [ "$MODE" == "generate" ]; then
|
|
EXPMODE="Generating certs and genesis block"
|
|
else
|
|
printHelp
|
|
exit 1
|
|
fi
|
|
|
|
while getopts "t:i:v" opt; do
|
|
case "$opt" in
|
|
t)
|
|
CLI_TIMEOUT=$OPTARG
|
|
;;
|
|
i)
|
|
IMAGETAG=$(go env GOARCH)"-"$OPTARG
|
|
;;
|
|
v)
|
|
VERBOSE=true
|
|
;;
|
|
esac
|
|
done
|
|
|
|
|
|
# Announce what was requested
|
|
echo "${EXPMODE} for channel '${CHANNEL_NAME}'"
|
|
|
|
#Create the network using docker compose
|
|
if [ "${MODE}" == "up" ]; then
|
|
networkUp
|
|
elif [ "${MODE}" == "down" ]; then ## Clear the network
|
|
networkDown
|
|
elif [ "${MODE}" == "generate" ]; then ## Generate Artifacts
|
|
generateCerts
|
|
generateChannelArtifacts
|
|
else
|
|
printHelp
|
|
exit 1
|
|
fi
|