#!/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 [-t ] [-i ] [-v]" echo " - 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 - CLI timeout duration in seconds (defaults to 10)" echo " -i - 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 echo Vendoring Go dependencies ... pushd ../chaincode GO111MODULE=on go mod vendor popd echo Finished vendoring Go dependencies # 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