diff --git a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-raft-explorer.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-raft-explorer.json.test.ts.snap index c5a630c2..236d3752 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-raft-explorer.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-raft-explorer.json.test.ts.snap @@ -1724,12 +1724,13 @@ installChaincodes() { if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then local version=\\"0.0.1\\" printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"\\" printItalics \\"Committing chaincode 'chaincode1' on channel 'my-channel1' as 'Org1'\\" \\"U1F618\\" chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" + else echo \\"Warning! Skipping chaincode 'chaincode1' installation. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" @@ -1753,7 +1754,7 @@ installChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"\\" @@ -1761,6 +1762,7 @@ installChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' install. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -1800,7 +1802,7 @@ upgradeChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"\\" @@ -1808,6 +1810,7 @@ upgradeChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' upgrade. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -2469,6 +2472,8 @@ exports[`samples/fablo-config-hlf2-1org-1chaincode-raft-explorer.json should cre # phrase \\"\${CA_CERT_PARAMS[@]+\\"\${CA_CERT_PARAMS[@]}\\"}\\" is needed in older bash versions ( <4 ) for array expansion. # see: https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u +CC_PACKAGE_ID=\\"\\" + dockerPullIfMissing() { local IMAGE=\\"$1\\" if [[ \\"$(docker images -q \\"$IMAGE\\" 2>/dev/null)\\" == \\"\\" ]]; then @@ -2476,7 +2481,7 @@ dockerPullIfMissing() { fi } -chaincodeBuild() { +chaincodeBuildDirPath() { local CHAINCODE_NAME=$1 local CHAINCODE_LANG=$2 local CHAINCODE_DIR_PATH=$3 @@ -2541,6 +2546,80 @@ chaincodeBuild() { fi } +chaincodeBuildCCAASImage() { + local CHAINCODE_NAME=$1 + local CHAINCODE_DIR_PATH=$2 + # build the docker container + echo \\"Building Chaincode-as-a-Service docker image '\${CHAINCODE_NAME}' '\${CHAINCODE_DIR_PATH}'\\" + echo \\"This may take several minutes...\\" + docker build -f \\"$CHAINCODE_DIR_PATH\\"/Dockerfile -t \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest --build-arg CC_SERVER_PORT=9999 \\"$CHAINCODE_DIR_PATH\\" >&log.txt +} + +chaincodeExternalPackage() { + local CLI_NAME=$1 + local PEER_ADDRESS=$2 + local CHAINCODE_NAME=$3 + local CHAINCODE_VERSION=$4 + local CHAINCODE_LABEL=\\"\${CHAINCODE_NAME}_$CHAINCODE_VERSION\\" + local CHAINCODE_LANG=$5 + local CCAAS_SERVER_PORT=9999 + + echo \\"Packaging external chaincode $CHAINCODE_NAME...\\" + inputLog \\"CHAINCODE_VERSION: $CHAINCODE_VERSION\\" + inputLog \\"CHAINCODE_LANG: $CHAINCODE_LANG\\" + inputLog \\"PEER_ADDRESS: $PEER_ADDRESS\\" + inputLog \\"CLI_NAME: $CLI_NAME\\" + inputLog \\"CCAAS_SERVER_PORT: $CCAAS_SERVER_PORT\\" + + local address=\\"\${CHAINCODE_NAME}_ccaas:\${CCAAS_SERVER_PORT}\\" + + docker exec \\"$CLI_NAME\\" mktemp -d -t 'chaincode.XXXXXXXX' >tempdir.txt + TEMP_DIR=$(cat tempdir.txt) + + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/src + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/pkg + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"address\\\\\\": \\\\\\"\${address}\\\\\\", + \\\\\\"dial_timeout\\\\\\": \\\\\\"10s\\\\\\", + \\\\\\"tls_required\\\\\\": false + }' > $TEMP_DIR/src/connection.json\\" + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"type\\\\\\": \\\\\\"ccaas\\\\\\", + \\\\\\"label\\\\\\": \\\\\\"$CHAINCODE_LABEL\\\\\\" + }' > $TEMP_DIR/pkg/metadata.json\\" + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/src -czf \\"$TEMP_DIR\\"/pkg/code.tar.gz . + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/pkg -czf /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz metadata.json code.tar.gz + + docker exec \\"$CLI_NAME\\" rm -Rf \\"$TEMP_DIR\\" + + # Calculate package ID + docker exec \\"$CLI_NAME\\" peer lifecycle chaincode calculatepackageid /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz + + # Clean up local temp file + rm tempdir.txt + + docker exec \\"$CLI_NAME\\" chown \\"$(id -u):$(id -g)\\" \\"/var/hyperledger/cli/chaincode-packages/$CHAINCODE_LABEL.tar.gz\\" + inputLog \\"$CHAINCODE_LABEL\\" + + inputLog \\"Chaincode is packaged \${address}\\" +} + +chaincodeRunCCAASContainers() { + echo \\"Running Chaincode-as-a-Service container\\" + local CHAINCODE_NAME=$1 + local CCAAS_SERVER_PORT=9999 + + docker run --rm -d --name \\"\${CHAINCODE_NAME}\\"_ccaas --network \\"\${COMPOSE_PROJECT_NAME}_basic\\" \\\\ + -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:\${CCAAS_SERVER_PORT} \\\\ + -e CHAINCODE_ID=\\"$CC_PACKAGE_ID\\" -e CORE_CHAINCODE_ID_NAME=\\"$CC_PACKAGE_ID\\" \\\\ + \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest + +} + chaincodePackage() { local CLI_NAME=$1 local PEER_ADDRESS=$2 @@ -2634,7 +2713,6 @@ chaincodeApprove() { fi local QUERYINSTALLED_RESPONSE - local CC_PACKAGE_ID QUERYINSTALLED_RESPONSE=\\"$( docker exec -e CORE_PEER_ADDRESS=\\"$PEER_ADDRESS\\" \\"$CLI_NAME\\" peer lifecycle chaincode queryinstalled \\\\ diff --git a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode.json.test.ts.snap index c8e5fa41..ee90f6a1 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode.json.test.ts.snap @@ -1676,13 +1676,14 @@ installChaincodes() { if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then local version=\\"0.0.1\\" printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"\\" \\"\\" printItalics \\"Committing chaincode 'chaincode1' on channel 'my-channel1' as 'Org1'\\" \\"U1F618\\" chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"\\" \\"peer0.org1.example.com:7041\\" \\"\\" \\"\\" + else echo \\"Warning! Skipping chaincode 'chaincode1' installation. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" @@ -1706,7 +1707,7 @@ installChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"\\" @@ -1715,6 +1716,7 @@ installChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"\\" \\"peer0.org1.example.com:7041\\" \\"\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' install. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -1754,7 +1756,7 @@ upgradeChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"\\" @@ -1763,6 +1765,7 @@ upgradeChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"\\" \\"peer0.org1.example.com:7041\\" \\"\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' upgrade. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -2333,6 +2336,8 @@ exports[`samples/fablo-config-hlf2-1org-1chaincode.json should create proper e2e # phrase \\"\${CA_CERT_PARAMS[@]+\\"\${CA_CERT_PARAMS[@]}\\"}\\" is needed in older bash versions ( <4 ) for array expansion. # see: https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u +CC_PACKAGE_ID=\\"\\" + dockerPullIfMissing() { local IMAGE=\\"$1\\" if [[ \\"$(docker images -q \\"$IMAGE\\" 2>/dev/null)\\" == \\"\\" ]]; then @@ -2340,7 +2345,7 @@ dockerPullIfMissing() { fi } -chaincodeBuild() { +chaincodeBuildDirPath() { local CHAINCODE_NAME=$1 local CHAINCODE_LANG=$2 local CHAINCODE_DIR_PATH=$3 @@ -2405,6 +2410,80 @@ chaincodeBuild() { fi } +chaincodeBuildCCAASImage() { + local CHAINCODE_NAME=$1 + local CHAINCODE_DIR_PATH=$2 + # build the docker container + echo \\"Building Chaincode-as-a-Service docker image '\${CHAINCODE_NAME}' '\${CHAINCODE_DIR_PATH}'\\" + echo \\"This may take several minutes...\\" + docker build -f \\"$CHAINCODE_DIR_PATH\\"/Dockerfile -t \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest --build-arg CC_SERVER_PORT=9999 \\"$CHAINCODE_DIR_PATH\\" >&log.txt +} + +chaincodeExternalPackage() { + local CLI_NAME=$1 + local PEER_ADDRESS=$2 + local CHAINCODE_NAME=$3 + local CHAINCODE_VERSION=$4 + local CHAINCODE_LABEL=\\"\${CHAINCODE_NAME}_$CHAINCODE_VERSION\\" + local CHAINCODE_LANG=$5 + local CCAAS_SERVER_PORT=9999 + + echo \\"Packaging external chaincode $CHAINCODE_NAME...\\" + inputLog \\"CHAINCODE_VERSION: $CHAINCODE_VERSION\\" + inputLog \\"CHAINCODE_LANG: $CHAINCODE_LANG\\" + inputLog \\"PEER_ADDRESS: $PEER_ADDRESS\\" + inputLog \\"CLI_NAME: $CLI_NAME\\" + inputLog \\"CCAAS_SERVER_PORT: $CCAAS_SERVER_PORT\\" + + local address=\\"\${CHAINCODE_NAME}_ccaas:\${CCAAS_SERVER_PORT}\\" + + docker exec \\"$CLI_NAME\\" mktemp -d -t 'chaincode.XXXXXXXX' >tempdir.txt + TEMP_DIR=$(cat tempdir.txt) + + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/src + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/pkg + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"address\\\\\\": \\\\\\"\${address}\\\\\\", + \\\\\\"dial_timeout\\\\\\": \\\\\\"10s\\\\\\", + \\\\\\"tls_required\\\\\\": false + }' > $TEMP_DIR/src/connection.json\\" + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"type\\\\\\": \\\\\\"ccaas\\\\\\", + \\\\\\"label\\\\\\": \\\\\\"$CHAINCODE_LABEL\\\\\\" + }' > $TEMP_DIR/pkg/metadata.json\\" + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/src -czf \\"$TEMP_DIR\\"/pkg/code.tar.gz . + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/pkg -czf /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz metadata.json code.tar.gz + + docker exec \\"$CLI_NAME\\" rm -Rf \\"$TEMP_DIR\\" + + # Calculate package ID + docker exec \\"$CLI_NAME\\" peer lifecycle chaincode calculatepackageid /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz + + # Clean up local temp file + rm tempdir.txt + + docker exec \\"$CLI_NAME\\" chown \\"$(id -u):$(id -g)\\" \\"/var/hyperledger/cli/chaincode-packages/$CHAINCODE_LABEL.tar.gz\\" + inputLog \\"$CHAINCODE_LABEL\\" + + inputLog \\"Chaincode is packaged \${address}\\" +} + +chaincodeRunCCAASContainers() { + echo \\"Running Chaincode-as-a-Service container\\" + local CHAINCODE_NAME=$1 + local CCAAS_SERVER_PORT=9999 + + docker run --rm -d --name \\"\${CHAINCODE_NAME}\\"_ccaas --network \\"\${COMPOSE_PROJECT_NAME}_basic\\" \\\\ + -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:\${CCAAS_SERVER_PORT} \\\\ + -e CHAINCODE_ID=\\"$CC_PACKAGE_ID\\" -e CORE_CHAINCODE_ID_NAME=\\"$CC_PACKAGE_ID\\" \\\\ + \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest + +} + chaincodePackage() { local CLI_NAME=$1 local PEER_ADDRESS=$2 @@ -2498,7 +2577,6 @@ chaincodeApprove() { fi local QUERYINSTALLED_RESPONSE - local CC_PACKAGE_ID QUERYINSTALLED_RESPONSE=\\"$( docker exec -e CORE_PEER_ADDRESS=\\"$PEER_ADDRESS\\" \\"$CLI_NAME\\" peer lifecycle chaincode queryinstalled \\\\ diff --git a/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-raft.yaml.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-raft.yaml.test.ts.snap index 831a525a..167b61e7 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-raft.yaml.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-raft.yaml.test.ts.snap @@ -3522,7 +3522,7 @@ installChaincodes() { if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then local version=\\"0.0.1\\" printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3531,6 +3531,7 @@ installChaincodes() { chaincodeApprove \\"cli.org2.example.com\\" \\"peer0.org2.example.com:7081\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" printItalics \\"Committing chaincode 'chaincode1' on channel 'my-channel1' as 'Org1'\\" \\"U1F618\\" chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer0.org1.example.com:7061,peer0.org2.example.com:7081\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt,crypto-peer/peer0.org2.example.com/tls/ca.crt\\" \\"\\" + else echo \\"Warning! Skipping chaincode 'chaincode1' installation. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" @@ -3538,7 +3539,7 @@ installChaincodes() { if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\")\\" ]; then local version=\\"0.0.1\\" printHeadline \\"Packaging chaincode 'chaincode2'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"java\\" printHeadline \\"Installing 'chaincode2' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3547,6 +3548,7 @@ installChaincodes() { chaincodeApprove \\"cli.org2.example.com\\" \\"peer1.org2.example.com:7082\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" printItalics \\"Committing chaincode 'chaincode2' on channel 'my-channel2' as 'Org1'\\" \\"U1F618\\" chaincodeCommit \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer1.org1.example.com:7062,peer1.org2.example.com:7082\\" \\"crypto-peer/peer1.org1.example.com/tls/ca.crt,crypto-peer/peer1.org2.example.com/tls/ca.crt\\" \\"\\" + else echo \\"Warning! Skipping chaincode 'chaincode2' installation. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple'\\" @@ -3570,7 +3572,7 @@ installChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3581,6 +3583,7 @@ installChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer0.org1.example.com:7061,peer0.org2.example.com:7081\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt,crypto-peer/peer0.org2.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' install. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -3588,7 +3591,7 @@ installChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode2\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode2'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"java\\" printHeadline \\"Installing 'chaincode2' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3599,6 +3602,7 @@ installChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer1.org1.example.com:7062,peer1.org2.example.com:7082\\" \\"crypto-peer/peer1.org1.example.com/tls/ca.crt,crypto-peer/peer1.org2.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode2' install. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple'\\" fi @@ -3650,7 +3654,7 @@ upgradeChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3661,6 +3665,7 @@ upgradeChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7061\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer0.org1.example.com:7061,peer0.org2.example.com:7081\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt,crypto-peer/peer0.org2.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' upgrade. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -3668,7 +3673,7 @@ upgradeChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode2\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode2'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" + chaincodeBuildDirPath \\"chaincode2\\" \\"java\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple\\" \\"16\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"java\\" printHeadline \\"Installing 'chaincode2' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"chaincode2\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"\\" @@ -3679,6 +3684,7 @@ upgradeChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7062\\" \\"my-channel2\\" \\"chaincode2\\" \\"$version\\" \\"orderer0.group1.orderer1.com:7030\\" \\"OR ('Org1MSP.member', 'Org2MSP.member')\\" \\"false\\" \\"crypto-orderer/tlsca.orderer1.com-cert.pem\\" \\"peer1.org1.example.com:7062,peer1.org2.example.com:7082\\" \\"crypto-peer/peer1.org1.example.com/tls/ca.crt,crypto-peer/peer1.org2.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode2' upgrade. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-java-simple'\\" fi @@ -4669,6 +4675,8 @@ exports[`samples/fablo-config-hlf2-2orgs-2chaincodes-raft.yaml should create pro # phrase \\"\${CA_CERT_PARAMS[@]+\\"\${CA_CERT_PARAMS[@]}\\"}\\" is needed in older bash versions ( <4 ) for array expansion. # see: https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u +CC_PACKAGE_ID=\\"\\" + dockerPullIfMissing() { local IMAGE=\\"$1\\" if [[ \\"$(docker images -q \\"$IMAGE\\" 2>/dev/null)\\" == \\"\\" ]]; then @@ -4676,7 +4684,7 @@ dockerPullIfMissing() { fi } -chaincodeBuild() { +chaincodeBuildDirPath() { local CHAINCODE_NAME=$1 local CHAINCODE_LANG=$2 local CHAINCODE_DIR_PATH=$3 @@ -4741,6 +4749,80 @@ chaincodeBuild() { fi } +chaincodeBuildCCAASImage() { + local CHAINCODE_NAME=$1 + local CHAINCODE_DIR_PATH=$2 + # build the docker container + echo \\"Building Chaincode-as-a-Service docker image '\${CHAINCODE_NAME}' '\${CHAINCODE_DIR_PATH}'\\" + echo \\"This may take several minutes...\\" + docker build -f \\"$CHAINCODE_DIR_PATH\\"/Dockerfile -t \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest --build-arg CC_SERVER_PORT=9999 \\"$CHAINCODE_DIR_PATH\\" >&log.txt +} + +chaincodeExternalPackage() { + local CLI_NAME=$1 + local PEER_ADDRESS=$2 + local CHAINCODE_NAME=$3 + local CHAINCODE_VERSION=$4 + local CHAINCODE_LABEL=\\"\${CHAINCODE_NAME}_$CHAINCODE_VERSION\\" + local CHAINCODE_LANG=$5 + local CCAAS_SERVER_PORT=9999 + + echo \\"Packaging external chaincode $CHAINCODE_NAME...\\" + inputLog \\"CHAINCODE_VERSION: $CHAINCODE_VERSION\\" + inputLog \\"CHAINCODE_LANG: $CHAINCODE_LANG\\" + inputLog \\"PEER_ADDRESS: $PEER_ADDRESS\\" + inputLog \\"CLI_NAME: $CLI_NAME\\" + inputLog \\"CCAAS_SERVER_PORT: $CCAAS_SERVER_PORT\\" + + local address=\\"\${CHAINCODE_NAME}_ccaas:\${CCAAS_SERVER_PORT}\\" + + docker exec \\"$CLI_NAME\\" mktemp -d -t 'chaincode.XXXXXXXX' >tempdir.txt + TEMP_DIR=$(cat tempdir.txt) + + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/src + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/pkg + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"address\\\\\\": \\\\\\"\${address}\\\\\\", + \\\\\\"dial_timeout\\\\\\": \\\\\\"10s\\\\\\", + \\\\\\"tls_required\\\\\\": false + }' > $TEMP_DIR/src/connection.json\\" + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"type\\\\\\": \\\\\\"ccaas\\\\\\", + \\\\\\"label\\\\\\": \\\\\\"$CHAINCODE_LABEL\\\\\\" + }' > $TEMP_DIR/pkg/metadata.json\\" + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/src -czf \\"$TEMP_DIR\\"/pkg/code.tar.gz . + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/pkg -czf /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz metadata.json code.tar.gz + + docker exec \\"$CLI_NAME\\" rm -Rf \\"$TEMP_DIR\\" + + # Calculate package ID + docker exec \\"$CLI_NAME\\" peer lifecycle chaincode calculatepackageid /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz + + # Clean up local temp file + rm tempdir.txt + + docker exec \\"$CLI_NAME\\" chown \\"$(id -u):$(id -g)\\" \\"/var/hyperledger/cli/chaincode-packages/$CHAINCODE_LABEL.tar.gz\\" + inputLog \\"$CHAINCODE_LABEL\\" + + inputLog \\"Chaincode is packaged \${address}\\" +} + +chaincodeRunCCAASContainers() { + echo \\"Running Chaincode-as-a-Service container\\" + local CHAINCODE_NAME=$1 + local CCAAS_SERVER_PORT=9999 + + docker run --rm -d --name \\"\${CHAINCODE_NAME}\\"_ccaas --network \\"\${COMPOSE_PROJECT_NAME}_basic\\" \\\\ + -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:\${CCAAS_SERVER_PORT} \\\\ + -e CHAINCODE_ID=\\"$CC_PACKAGE_ID\\" -e CORE_CHAINCODE_ID_NAME=\\"$CC_PACKAGE_ID\\" \\\\ + \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest + +} + chaincodePackage() { local CLI_NAME=$1 local PEER_ADDRESS=$2 @@ -4834,7 +4916,6 @@ chaincodeApprove() { fi local QUERYINSTALLED_RESPONSE - local CC_PACKAGE_ID QUERYINSTALLED_RESPONSE=\\"$( docker exec -e CORE_PEER_ADDRESS=\\"$PEER_ADDRESS\\" \\"$CLI_NAME\\" peer lifecycle chaincode queryinstalled \\\\ diff --git a/e2e/__snapshots__/fablo-config-hlf2-3orgs-1chaincode-raft-explorer.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-3orgs-1chaincode-raft-explorer.json.test.ts.snap index e87c73fd..93f3d166 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-3orgs-1chaincode-raft-explorer.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-3orgs-1chaincode-raft-explorer.json.test.ts.snap @@ -3860,13 +3860,14 @@ installChaincodes() { if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then local version=\\"0.0.1\\" printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeApprove \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"\\" printItalics \\"Committing chaincode 'chaincode1' on channel 'my-channel1' as 'Org1'\\" \\"U1F618\\" chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" + else echo \\"Warning! Skipping chaincode 'chaincode1' installation. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" @@ -3890,7 +3891,7 @@ installChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" @@ -3899,6 +3900,7 @@ installChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' install. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -3938,7 +3940,7 @@ upgradeChaincode() { if [ \\"$chaincodeName\\" = \\"chaincode1\\" ]; then if [ -n \\"$(ls \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\")\\" ]; then printHeadline \\"Packaging chaincode 'chaincode1'\\" \\"U1F60E\\" - chaincodeBuild \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" + chaincodeBuildDirPath \\"chaincode1\\" \\"node\\" \\"$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node\\" \\"12\\" chaincodePackage \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"node\\" printHeadline \\"Installing 'chaincode1' for Org1\\" \\"U1F60E\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" chaincodeInstall \\"cli.org1.example.com\\" \\"peer1.org1.example.com:7042\\" \\"chaincode1\\" \\"$version\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" @@ -3947,6 +3949,7 @@ upgradeChaincode() { chaincodeCommit \\"cli.org1.example.com\\" \\"peer0.org1.example.com:7041\\" \\"my-channel1\\" \\"chaincode1\\" \\"$version\\" \\"orderer0.group1.orderer.example.com:7030\\" \\"\\" \\"false\\" \\"crypto-orderer/tlsca.orderer.example.com-cert.pem\\" \\"peer0.org1.example.com:7041\\" \\"crypto-peer/peer0.org1.example.com/tls/ca.crt\\" \\"\\" else + echo \\"Warning! Skipping chaincode 'chaincode1' upgrade. Chaincode directory is empty.\\" echo \\"Looked in dir: '$CHAINCODES_BASE_DIR/./chaincodes/chaincode-kv-node'\\" fi @@ -5175,6 +5178,8 @@ exports[`samples/fablo-config-hlf2-3orgs-1chaincode-raft-explorer.json should cr # phrase \\"\${CA_CERT_PARAMS[@]+\\"\${CA_CERT_PARAMS[@]}\\"}\\" is needed in older bash versions ( <4 ) for array expansion. # see: https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u +CC_PACKAGE_ID=\\"\\" + dockerPullIfMissing() { local IMAGE=\\"$1\\" if [[ \\"$(docker images -q \\"$IMAGE\\" 2>/dev/null)\\" == \\"\\" ]]; then @@ -5182,7 +5187,7 @@ dockerPullIfMissing() { fi } -chaincodeBuild() { +chaincodeBuildDirPath() { local CHAINCODE_NAME=$1 local CHAINCODE_LANG=$2 local CHAINCODE_DIR_PATH=$3 @@ -5247,6 +5252,80 @@ chaincodeBuild() { fi } +chaincodeBuildCCAASImage() { + local CHAINCODE_NAME=$1 + local CHAINCODE_DIR_PATH=$2 + # build the docker container + echo \\"Building Chaincode-as-a-Service docker image '\${CHAINCODE_NAME}' '\${CHAINCODE_DIR_PATH}'\\" + echo \\"This may take several minutes...\\" + docker build -f \\"$CHAINCODE_DIR_PATH\\"/Dockerfile -t \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest --build-arg CC_SERVER_PORT=9999 \\"$CHAINCODE_DIR_PATH\\" >&log.txt +} + +chaincodeExternalPackage() { + local CLI_NAME=$1 + local PEER_ADDRESS=$2 + local CHAINCODE_NAME=$3 + local CHAINCODE_VERSION=$4 + local CHAINCODE_LABEL=\\"\${CHAINCODE_NAME}_$CHAINCODE_VERSION\\" + local CHAINCODE_LANG=$5 + local CCAAS_SERVER_PORT=9999 + + echo \\"Packaging external chaincode $CHAINCODE_NAME...\\" + inputLog \\"CHAINCODE_VERSION: $CHAINCODE_VERSION\\" + inputLog \\"CHAINCODE_LANG: $CHAINCODE_LANG\\" + inputLog \\"PEER_ADDRESS: $PEER_ADDRESS\\" + inputLog \\"CLI_NAME: $CLI_NAME\\" + inputLog \\"CCAAS_SERVER_PORT: $CCAAS_SERVER_PORT\\" + + local address=\\"\${CHAINCODE_NAME}_ccaas:\${CCAAS_SERVER_PORT}\\" + + docker exec \\"$CLI_NAME\\" mktemp -d -t 'chaincode.XXXXXXXX' >tempdir.txt + TEMP_DIR=$(cat tempdir.txt) + + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/src + docker exec \\"$CLI_NAME\\" mkdir -p \\"$TEMP_DIR\\"/pkg + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"address\\\\\\": \\\\\\"\${address}\\\\\\", + \\\\\\"dial_timeout\\\\\\": \\\\\\"10s\\\\\\", + \\\\\\"tls_required\\\\\\": false + }' > $TEMP_DIR/src/connection.json\\" + + docker exec \\"$CLI_NAME\\" sh -c \\"echo '{ + \\\\\\"type\\\\\\": \\\\\\"ccaas\\\\\\", + \\\\\\"label\\\\\\": \\\\\\"$CHAINCODE_LABEL\\\\\\" + }' > $TEMP_DIR/pkg/metadata.json\\" + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/src -czf \\"$TEMP_DIR\\"/pkg/code.tar.gz . + + docker exec \\"$CLI_NAME\\" tar -C \\"$TEMP_DIR\\"/pkg -czf /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz metadata.json code.tar.gz + + docker exec \\"$CLI_NAME\\" rm -Rf \\"$TEMP_DIR\\" + + # Calculate package ID + docker exec \\"$CLI_NAME\\" peer lifecycle chaincode calculatepackageid /var/hyperledger/cli/chaincode-packages/\\"$CHAINCODE_LABEL\\".tar.gz + + # Clean up local temp file + rm tempdir.txt + + docker exec \\"$CLI_NAME\\" chown \\"$(id -u):$(id -g)\\" \\"/var/hyperledger/cli/chaincode-packages/$CHAINCODE_LABEL.tar.gz\\" + inputLog \\"$CHAINCODE_LABEL\\" + + inputLog \\"Chaincode is packaged \${address}\\" +} + +chaincodeRunCCAASContainers() { + echo \\"Running Chaincode-as-a-Service container\\" + local CHAINCODE_NAME=$1 + local CCAAS_SERVER_PORT=9999 + + docker run --rm -d --name \\"\${CHAINCODE_NAME}\\"_ccaas --network \\"\${COMPOSE_PROJECT_NAME}_basic\\" \\\\ + -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:\${CCAAS_SERVER_PORT} \\\\ + -e CHAINCODE_ID=\\"$CC_PACKAGE_ID\\" -e CORE_CHAINCODE_ID_NAME=\\"$CC_PACKAGE_ID\\" \\\\ + \\"\${CHAINCODE_NAME}\\"_ccaas_image:latest + +} + chaincodePackage() { local CLI_NAME=$1 local PEER_ADDRESS=$2 @@ -5340,7 +5419,6 @@ chaincodeApprove() { fi local QUERYINSTALLED_RESPONSE - local CC_PACKAGE_ID QUERYINSTALLED_RESPONSE=\\"$( docker exec -e CORE_PEER_ADDRESS=\\"$PEER_ADDRESS\\" \\"$CLI_NAME\\" peer lifecycle chaincode queryinstalled \\\\ diff --git a/src/setup-docker/templates/fabric-docker/commands-generated/chaincode-install-v2.sh b/src/setup-docker/templates/fabric-docker/commands-generated/chaincode-install-v2.sh index 8455856e..e765d812 100644 --- a/src/setup-docker/templates/fabric-docker/commands-generated/chaincode-install-v2.sh +++ b/src/setup-docker/templates/fabric-docker/commands-generated/chaincode-install-v2.sh @@ -8,17 +8,29 @@ - global */-%> printHeadline "Packaging chaincode '<%= chaincode.name %>'" "U1F60E" -chaincodeBuild <% -%> - "<%= chaincode.name %>" <% -%> - "<%= chaincode.lang %>" <% -%> - "$CHAINCODES_BASE_DIR/<%= chaincode.directory %>" <% -%> - "<%= global.fabricRecommendedNodeVersion %>" -chaincodePackage <% -%> - "<%= chaincode.instantiatingOrg.cli.address %>" <% -%> - "<%= chaincode.instantiatingOrg.headPeer.fullAddress %>" <% -%> - "<%= chaincode.name %>" <% -%> - "$version" <% -%> - "<%= chaincode.lang %>" <% -%> +<% if (chaincode.directory) { -%> + chaincodeBuildDirPath <% -%> + "<%= chaincode.name %>" <% -%> + "<%= chaincode.lang %>" <% -%> + "$CHAINCODES_BASE_DIR/<%= chaincode.directory %>" <% -%> + "<%= global.fabricRecommendedNodeVersion %>" + chaincodePackage <% -%> + "<%= chaincode.instantiatingOrg.cli.address %>" <% -%> + "<%= chaincode.instantiatingOrg.headPeer.fullAddress %>" <% -%> + "<%= chaincode.name %>" <% -%> + "$version" <% -%> + "<%= chaincode.lang %>" <% -%> +<% } else { -%> + chaincodeBuildCCAASImage <% -%> + "<%= chaincode.name %>" <% -%> + "$CHAINCODES_BASE_DIR/<%= chaincode.directory %>" + chaincodeExternalPackage <% -%> + "<%= chaincode.instantiatingOrg.cli.address %>" <% -%> + "<%= chaincode.instantiatingOrg.headPeer.fullAddress %>" <% -%> + "<%= chaincode.name %>" <% -%> + "$version" <% -%> + "<%= chaincode.lang %>" <% -%> +<% } -%> <% chaincode.channel.orgs.forEach((org) => { -%> printHeadline "Installing '<%= chaincode.name %>' for <%= org.name %>" "U1F60E" <% org.peers.forEach((peer) => { -%> @@ -55,3 +67,8 @@ chaincodeCommit <% -%> "<%= chaincode.channel.orgs.map((o) => o.headPeer.fullAddress).join(',') %>" <% -%> "<%= !global.tls ? '' : chaincode.channel.orgs.map(o => `crypto-peer/${o.headPeer.address}/tls/ca.crt`).join(',') %>" <% -%> "<%= chaincode.privateDataConfigFile || '' %>" + +<% if (!chaincode.directory) { -%> + chaincodeRunCCAASContainers <% -%> + "<%= chaincode.name %>" <% -%> +<% } %> \ No newline at end of file diff --git a/src/setup-docker/templates/fabric-docker/scripts/chaincode-functions-v2.sh b/src/setup-docker/templates/fabric-docker/scripts/chaincode-functions-v2.sh index 50010e6d..c57be59d 100644 --- a/src/setup-docker/templates/fabric-docker/scripts/chaincode-functions-v2.sh +++ b/src/setup-docker/templates/fabric-docker/scripts/chaincode-functions-v2.sh @@ -2,6 +2,8 @@ # phrase "${CA_CERT_PARAMS[@]+"${CA_CERT_PARAMS[@]}"}" is needed in older bash versions ( <4 ) for array expansion. # see: https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u +CC_PACKAGE_ID="" + dockerPullIfMissing() { local IMAGE="$1" if [[ "$(docker images -q "$IMAGE" 2>/dev/null)" == "" ]]; then @@ -9,7 +11,7 @@ dockerPullIfMissing() { fi } -chaincodeBuild() { +chaincodeBuildDirPath() { local CHAINCODE_NAME=$1 local CHAINCODE_LANG=$2 local CHAINCODE_DIR_PATH=$3 @@ -74,6 +76,81 @@ chaincodeBuild() { fi } +chaincodeBuildCCAASImage() { + local CHAINCODE_NAME=$1 + local CHAINCODE_DIR_PATH=$2 + # build the docker container + echo "Building Chaincode-as-a-Service docker image '${CHAINCODE_NAME}' '${CHAINCODE_DIR_PATH}'" + echo "This may take several minutes..." + docker build -f "$CHAINCODE_DIR_PATH"/Dockerfile -t "${CHAINCODE_NAME}"_ccaas_image:latest --build-arg CC_SERVER_PORT=9999 "$CHAINCODE_DIR_PATH" >&log.txt +} + +chaincodeExternalPackage() { + local CLI_NAME=$1 + local PEER_ADDRESS=$2 + local CHAINCODE_NAME=$3 + local CHAINCODE_VERSION=$4 + local CHAINCODE_LABEL="${CHAINCODE_NAME}_$CHAINCODE_VERSION" + local CHAINCODE_LANG=$5 + local CCAAS_SERVER_PORT=9999 + + echo "Packaging external chaincode $CHAINCODE_NAME..." + inputLog "CHAINCODE_VERSION: $CHAINCODE_VERSION" + inputLog "CHAINCODE_LANG: $CHAINCODE_LANG" + inputLog "PEER_ADDRESS: $PEER_ADDRESS" + inputLog "CLI_NAME: $CLI_NAME" + inputLog "CCAAS_SERVER_PORT: $CCAAS_SERVER_PORT" + + local address="${CHAINCODE_NAME}_ccaas:${CCAAS_SERVER_PORT}" + + docker exec "$CLI_NAME" mktemp -d -t 'chaincode.XXXXXXXX' > tempdir.txt + TEMP_DIR=$(cat tempdir.txt) + + docker exec "$CLI_NAME" mkdir -p "$TEMP_DIR"/src + docker exec "$CLI_NAME" mkdir -p "$TEMP_DIR"/pkg + + docker exec "$CLI_NAME" sh -c "echo '{ + \"address\": \"${address}\", + \"dial_timeout\": \"10s\", + \"tls_required\": false + }' > $TEMP_DIR/src/connection.json" + + docker exec "$CLI_NAME" sh -c "echo '{ + \"type\": \"ccaas\", + \"label\": \"$CHAINCODE_LABEL\" + }' > $TEMP_DIR/pkg/metadata.json" + + docker exec "$CLI_NAME" tar -C "$TEMP_DIR"/src -czf "$TEMP_DIR"/pkg/code.tar.gz . + + docker exec "$CLI_NAME" tar -C "$TEMP_DIR"/pkg -czf /var/hyperledger/cli/chaincode-packages/"$CHAINCODE_LABEL".tar.gz metadata.json code.tar.gz + + docker exec "$CLI_NAME" rm -Rf "$TEMP_DIR" + + # Calculate package ID + docker exec "$CLI_NAME" peer lifecycle chaincode calculatepackageid /var/hyperledger/cli/chaincode-packages/"$CHAINCODE_LABEL".tar.gz + + # Clean up local temp file + rm tempdir.txt + + docker exec "$CLI_NAME" chown "$(id -u):$(id -g)" "/var/hyperledger/cli/chaincode-packages/$CHAINCODE_LABEL.tar.gz" + inputLog "$CHAINCODE_LABEL" + + inputLog "Chaincode is packaged ${address}" +} + +chaincodeRunCCAASContainers() { + echo "Running Chaincode-as-a-Service container" + local CHAINCODE_NAME=$1 + local CCAAS_SERVER_PORT=9999 + + docker run --rm -d --name "${CHAINCODE_NAME}"_ccaas --network "${COMPOSE_PROJECT_NAME}_basic" \ + -e CHAINCODE_SERVER_ADDRESS=0.0.0.0:${CCAAS_SERVER_PORT} \ + -e CHAINCODE_ID="$CC_PACKAGE_ID" -e CORE_CHAINCODE_ID_NAME="$CC_PACKAGE_ID" \ + "${CHAINCODE_NAME}"_ccaas_image:latest + +} + + chaincodePackage() { local CLI_NAME=$1 local PEER_ADDRESS=$2 @@ -167,7 +244,6 @@ chaincodeApprove() { fi local QUERYINSTALLED_RESPONSE - local CC_PACKAGE_ID QUERYINSTALLED_RESPONSE="$( docker exec -e CORE_PEER_ADDRESS="$PEER_ADDRESS" "$CLI_NAME" peer lifecycle chaincode queryinstalled \ diff --git a/src/types/FabloConfigExtended.ts b/src/types/FabloConfigExtended.ts index f912c689..a05fb51c 100644 --- a/src/types/FabloConfigExtended.ts +++ b/src/types/FabloConfigExtended.ts @@ -134,7 +134,8 @@ export interface OrgConfig { } export interface ChaincodeConfig { - directory: string; + directory?: string; + image?: string; name: string; version: string; lang: string; diff --git a/src/types/FabloConfigJson.ts b/src/types/FabloConfigJson.ts index b2bb11ee..3c8ea21e 100644 --- a/src/types/FabloConfigJson.ts +++ b/src/types/FabloConfigJson.ts @@ -59,7 +59,8 @@ export interface ChaincodeJson { init?: string; initRequired?: boolean; endorsement?: string; - directory: string; + directory?: string; + image?: string; privateData: PrivateDataJson[]; }