mirror of
https://github.com/hyperledger/fabric-samples.git
synced 2026-06-19 16:15:09 +00:00
* Fix creating channel when ${PWD} contains space.
If the path of the project contains spaces, the "test-network/scripts/envVar.sh" script sets the value of "$ORDERER_CA" to a value containg "${PWD}" which, in turn, contains space(s).
When the variable used in "test-network/scripts/createChannel.sh", The first part of the value (before the first space) is handled as the whole value for "--cafile". Other parts are considered to be part of the command!
I tried putting (escaped) quotes in the "test-network/scripts/envVar.sh" definition for the variable "$ORDERER_CA" to make the fix more general, but the quotation marks were sometime interpreted to be part of the path that consisted of concatenated parts somewhere and it did not work.
While this edit will fix this issue, I belive this is just a work around. I expect that there is a better way to solve the root cause of the problem instead of just fixing it in one place. Moreover, All variables/paths that may include spaces should be properly handled as well.
Thanks
Signed-off-by: Waleed Mortaja <waleedmortaja@protonmail.com>
* Double quote variables evaluations that depends on $PWD
I tried to handle most (if not all) of the variables evaluations in the project that depends on $PWD by wrapping them in double-quotations to avoid values that contains white spaces.
Some lines I was not sure if they are Okay or not but I left them as they are. Samples (not all lines) as follows:
- commercial-paper/network-clean.sh:15:DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
- commercial-paper/network-starter.sh:15:DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
- asset-transfer-basic/chaincode-javascript/node_modules/fabric-shim/coverage/fabric-shim/lib/chaincode.js.html:997: optsCpy.pem = fs.readFileSync(process.env.CORE_PEER_TLS_ROOTCERT_FILE).toString();
- commercial-paper/organization/digibank/digibank.sh:29:export PEER_PARMS="${PEER_CONN_PARMS##*( )}"
The next sample I was not really sure, but still edited it:
- test-network/addOrg3/fabric-ca/registerEnroll.sh:68: cp ${PWD}/../organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/tlscacerts/* ${PWD}/../organizations/peerOrganizations/org3.example.com/peers/peer0.org3.example.com/tls/ca.crt
I deliberately ignored some lines because I think they are not problem. These lines include:
- `export` sentences
- assignment sentences like: test-network/scripts/createChannel.sh:48: FABRIC_CFG_PATH=$PWD/../config/
- gradlew files: the line SAVED="`pwd`"
- gradlew files: the line APP_HOME="`pwd -P`"
- gradlew files: the line CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
Signed-off-by: Waleed Mortaja <waleedmortaja@protonmail.com>
* remove unnecessary leading space trimming
Signed-off-by: Waleed Mortaja <waleedmortaja@protonmail.com>
* resolved conflict with master
Co-authored-by: Arnaud J Le Hors <lehors@us.ibm.com>
242 lines
8.1 KiB
Bash
Executable file
242 lines
8.1 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
|
|
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
|