From 827e30cf3018a13c9afc3642b1ff6aa71ea46108 Mon Sep 17 00:00:00 2001 From: Josh Kneubuhl Date: Mon, 4 Apr 2022 14:24:16 -0400 Subject: [PATCH] move ccpackage/ contents into network script Signed-off-by: Josh Kneubuhl --- asset-transfer-basic/chaincode-java/README.md | 28 ++-- .../chaincode-java/SCRATCH.md | 49 ------- .../chaincode-java/ccpackage/ccaas.json | 4 - .../chaincode-java/ccpackage/connection.json | 5 - .../chaincode-java/ccpackage/metadata.json | 4 - ci/scripts/run-k8s-test-network-basic.sh | 5 +- .../kube/org1/org1-cc-template.yaml | 10 +- test-network-k8s/scripts/chaincode.sh | 130 +++++++++++------- test-network-k8s/scripts/utils.sh | 8 ++ 9 files changed, 111 insertions(+), 132 deletions(-) delete mode 100644 asset-transfer-basic/chaincode-java/SCRATCH.md delete mode 100644 asset-transfer-basic/chaincode-java/ccpackage/ccaas.json delete mode 100644 asset-transfer-basic/chaincode-java/ccpackage/connection.json delete mode 100644 asset-transfer-basic/chaincode-java/ccpackage/metadata.json diff --git a/asset-transfer-basic/chaincode-java/README.md b/asset-transfer-basic/chaincode-java/README.md index 96bef4c6..860354a5 100644 --- a/asset-transfer-basic/chaincode-java/README.md +++ b/asset-transfer-basic/chaincode-java/README.md @@ -26,7 +26,7 @@ network up network channel create ``` ``` -network chaincode deploy ${PWD} +network chaincode deploy asset-transfer-basic basic_1.0 ${PWD} ``` ``` network chaincode metadata asset-transfer-basic @@ -44,22 +44,22 @@ network channel create ```shell # Build the chaincode docker image -docker build -t hyperledger/fabric-samples/asset-transfer-basic/chaincode-java . +docker build -t fabric-samples/asset-transfer-basic/chaincode-java . # Load the docker image directly to the KIND control plane. # (Alternately, build/tag/push the image to a remote container registry, e.g. localhost:5000) -kind load docker-image hyperledger/fabric-samples/asset-transfer-basic/chaincode-java +kind load docker-image fabric-samples/asset-transfer-basic/chaincode-java ``` ```shell # Assemble the chaincode package archive -network chaincode package $PWD/ccpackage/ $PWD/build/asset-transfer.tgz +network chaincode package basic_1.0 asset-transfer-basic $PWD/build/asset-transfer.tgz # Determine the ID for the chaincode package CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer.tgz) # Launch the chaincode in k8s as Deployment + Service -network chaincode launch $PWD/build/asset-transfer.tgz +network chaincode launch asset-transfer-basic $CORE_CHAINCODE_ID_NAME fabric-samples/asset-transfer-basic/chaincode-java # Complete the chaincode lifecycle network chaincode install $PWD/build/asset-transfer.tgz @@ -75,7 +75,7 @@ network chaincode query asset-transfer-basic '{"Args":["ReadAsset","asset1"] ``` ```shell -kubectl -n test-network logs -f deployment/org1peer1-cc-asset-transfer-basic +kubectl -n test-network logs -f deployment/org1peer1-ccaas-asset-transfer-basic ``` ## Debugging @@ -96,20 +96,16 @@ docker build -t fabric-samples/asset-transfer-basic/chaincode-java . By instructing the peer to connect to chaincode at the Docker host alias `host.docker.internal`, pods running in Kubernetes will access the local process via a special loopback interface established by KIND. -Set the "address" attribute in the project's [ccpackage/connection.json](ccpackage/connection.json) descriptor and assemble the chaincode package: -```json -{ - "address": "host.docker.internal:9999", -} -``` - +Set the "address" attribute in the package connection.json descriptor and assemble the chaincode package: ```shell -network cc package $PWD/ccpackage/ $PWD/build/asset-transfer-debug.tgz +export TEST_NETWORK_CHAINCODE_ADDRESS=host.docker.internal:9999 + +network cc package basic_1.0 asset-transfer-debug $PWD/build/asset-transfer-debug.tgz ``` ### Launch -When chaincode is launched locally, it must declare the package ID in the enviroment as if the process had been managed +When chaincode is launched locally, it must declare the package ID in the environment as if the process had been managed by the peer's chaincode lifecycle manager. Calculate the package ID and start the chaincode, binding to port 9999 on the local system: @@ -117,7 +113,7 @@ on the local system: export CHAINCODE_SERVER_ADDRESS=0.0.0.0:9999 export CORE_CHAINCODE_ID_NAME=$(network chaincode id $PWD/build/asset-transfer-debug.tgz) -java -jar build/libs/chaincode.jar +java -jar build/libs/chaincode.jar ``` Or using the editor/debugger/IDE of your choice, create a launch target for `ContractMain.main()`, specifying the diff --git a/asset-transfer-basic/chaincode-java/SCRATCH.md b/asset-transfer-basic/chaincode-java/SCRATCH.md deleted file mode 100644 index 02ac7910..00000000 --- a/asset-transfer-basic/chaincode-java/SCRATCH.md +++ /dev/null @@ -1,49 +0,0 @@ - - - -# Scratch notes - Ignore - ... `fabric-cli` redux - -`fabric [options] peer [parameters]` - -``` -fabric => network -peer => implicit (from env/context) -channel => implicit (from env/context) -group => chaincode -[params] => --param=value or NETWORK_$GROUP_$COMMAND_$PARAM=value from env -``` - -```shell -network chaincode package -network chaincode id -network chaincode install -network chaincode approve -network chainocde commit -``` - -```shell -network chaincode list -network chaincode delete -network chaincode describe -network chaincode invoke -network chaincode query -``` - -meta / fictitious targets: -``` -network chaincode launch -network chaincode deploy # package, install, LAUNCH, approve, commit -``` - - -ordinal position args vs. named parameters vs. env overrides -```shell -network chaincode package asset-transfer my-chaincode.tar.gz - -network cc package --name=asset-transfer (or NETWORK_CHAINCODE_PACKAGE_NAME=asset-transfer) -network cc package --name= (or NETWORK_${GROUP}_${COMMAND}_${PARAM}=) - - -``` - - diff --git a/asset-transfer-basic/chaincode-java/ccpackage/ccaas.json b/asset-transfer-basic/chaincode-java/ccpackage/ccaas.json deleted file mode 100644 index 6f1a9468..00000000 --- a/asset-transfer-basic/chaincode-java/ccpackage/ccaas.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "asset-transfer-basic", - "image": "hyperledger/fabric-samples/asset-transfer-basic/chaincode-java:latest" -} \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-java/ccpackage/connection.json b/asset-transfer-basic/chaincode-java/ccpackage/connection.json deleted file mode 100644 index 604b6c5e..00000000 --- a/asset-transfer-basic/chaincode-java/ccpackage/connection.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "address": "{{.peername}}-cc-asset-transfer-basic:9999", - "dial_timeout": "10s", - "tls_required": false -} diff --git a/asset-transfer-basic/chaincode-java/ccpackage/metadata.json b/asset-transfer-basic/chaincode-java/ccpackage/metadata.json deleted file mode 100644 index c52d2a5e..00000000 --- a/asset-transfer-basic/chaincode-java/ccpackage/metadata.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "ccaas", - "label": "basic_1.0" -} diff --git a/ci/scripts/run-k8s-test-network-basic.sh b/ci/scripts/run-k8s-test-network-basic.sh index f53b71b3..77be6403 100755 --- a/ci/scripts/run-k8s-test-network-basic.sh +++ b/ci/scripts/run-k8s-test-network-basic.sh @@ -67,7 +67,7 @@ function createNetwork() { ./network channel create print "Deploying chaincode" - ./network chaincode deploy $TEST_NETWORK_CHAINCODE_PATH + ./network chaincode deploy asset-transfer-basic basic_1.0 $TEST_NETWORK_CHAINCODE_PATH } function stopNetwork() { @@ -82,7 +82,8 @@ trap "quitterLaScene" EXIT createNetwork print "Inserting and querying assets" -( ./network chaincode invoke $CHAINCODE_NAME '{"Args":["InitLedger"]}' \ +( ./network chaincode metadata $CHAINCODE_NAME \ + && ./network chaincode invoke $CHAINCODE_NAME '{"Args":["InitLedger"]}' \ && sleep 5 \ && ./network chaincode query $CHAINCODE_NAME '{"Args":["ReadAsset","asset1"]}' ) print "OK" diff --git a/test-network-k8s/kube/org1/org1-cc-template.yaml b/test-network-k8s/kube/org1/org1-cc-template.yaml index 374289dc..4a4a701f 100644 --- a/test-network-k8s/kube/org1/org1-cc-template.yaml +++ b/test-network-k8s/kube/org1/org1-cc-template.yaml @@ -7,16 +7,16 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}} + name: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}} spec: replicas: 1 selector: matchLabels: - app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}} + app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}} template: metadata: labels: - app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}} + app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}} spec: containers: - name: main @@ -36,11 +36,11 @@ spec: apiVersion: v1 kind: Service metadata: - name: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}} + name: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}} spec: ports: - name: chaincode port: 9999 protocol: TCP selector: - app: org1{{PEER_NAME}}-cc-{{CHAINCODE_NAME}} \ No newline at end of file + app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}} \ No newline at end of file diff --git a/test-network-k8s/scripts/chaincode.sh b/test-network-k8s/scripts/chaincode.sh index 49e927cd..4084ecb7 100755 --- a/test-network-k8s/scripts/chaincode.sh +++ b/test-network-k8s/scripts/chaincode.sh @@ -7,21 +7,35 @@ # Convenience routine to "do everything" required to bring up a sample CC. function deploy_chaincode() { + local cc_name=$1 + local cc_label=$2 + local cc_folder=$(absolute_path $3) + + local temp_folder=$(mktemp -d) + local cc_package=${temp_folder}/${cc_name}.tgz + + package_chaincode ${cc_label} ${cc_name} ${cc_package} + + set_chaincode_id ${cc_package} + set_chaincode_image ${cc_folder} + + build_chaincode_image ${cc_folder} ${CHAINCODE_IMAGE} + kind_load_image ${CHAINCODE_IMAGE} + launch_chaincode ${cc_name} ${CHAINCODE_ID} ${CHAINCODE_IMAGE} + + activate_chaincode ${cc_name} ${cc_package} +} + +# Infer a reasonable name for the chaincode image based on the folder path conventions, or +# allow the user to override with TEST_NETWORK_CHAINCODE_IMAGE. +function set_chaincode_image() { local cc_folder=$1 - local build_folder=${cc_folder}/build - local cc_package=${build_folder}/chaincode.tgz - build_chaincode_image ${cc_folder} - - mkdir -p ${build_folder} - - package_chaincode ${cc_folder}/ccpackage ${cc_package} - extract_chaincode_image ${cc_package} - extract_chaincode_name ${cc_package} - - launch_chaincode ${cc_package} - - activate_chaincode ${CHAINCODE_NAME} ${cc_package} + if [ -z "$TEST_NETWORK_CHAINCODE_IMAGE" ]; then + CHAINCODE_IMAGE=${cc_folder/*fabric-samples/fabric-samples} + else + CHAINCODE_IMAGE=${TEST_NETWORK_CHAINCODE_IMAGE} + fi } # Convenience routine to "do everything other than package and launch" a sample CC. @@ -73,8 +87,6 @@ function invoke_chaincode() { local cc_name=$1 shift - # set -x - export_peer_context org1 peer1 peer chaincode invoke \ @@ -89,24 +101,58 @@ function invoke_chaincode() { function build_chaincode_image() { local cc_folder=$1 - local cc_image=$(jq -r .image ${cc_folder}/ccpackage/ccaas.json) + local cc_image=$2 push_fn "Building chaincode image ${cc_image}" docker build -t ${cc_image} ${cc_folder} + pop_fn +} + +function kind_load_image() { + local cc_image=$1 + + push_fn "Loading chaincode to kind image plane" + kind load docker-image ${cc_image} pop_fn } function package_chaincode() { - local cc_folder=$1 - local cc_archive=$2 - local archive_name=$(basename $cc_archive) - push_fn "Packaging chaincode ${archive_name}" + local cc_label=$1 + local cc_name=$2 + local cc_archive=$3 - tar -C ${cc_folder} -zcf ${cc_folder}/code.tar.gz connection.json ccaas.json + local cc_folder=$(dirname $cc_archive) + local archive_name=$(basename $cc_archive) + + push_fn "Packaging chaincode ${cc_label}" + + mkdir -p ${cc_folder} + + # Allow the user to override the service URL for the endpoint. This allows, for instance, + # local debugging at the 'host.docker.internal' DNS alias. + local cc_default_address="{{.peername}}-ccaas-${cc_name}:9999" + local cc_address=${TEST_NETWORK_CHAINCODE_ADDRESS:-$cc_default_address} + + cat << EOF > ${cc_folder}/connection.json +{ + "address": "${cc_address}", + "dial_timeout": "10s", + "tls_required": false +} +EOF + + cat << EOF > ${cc_folder}/metadata.json +{ + "type": "ccaas", + "label": "${cc_label}" +} +EOF + + tar -C ${cc_folder} -zcf ${cc_folder}/code.tar.gz connection.json tar -C ${cc_folder} -zcf ${cc_archive} code.tar.gz metadata.json rm ${cc_folder}/code.tar.gz @@ -116,26 +162,37 @@ function package_chaincode() { function launch_chaincode_service() { local org=$1 - local cc_id=$2 - local cc_image=$3 - local peer=$4 + local peer=$2 + local cc_name=$3 + local cc_id=$4 + local cc_image=$5 push_fn "Launching chaincode container \"${cc_image}\"" # The chaincode endpoint needs to have the generated chaincode ID available in the environment. # This could be from a config map, a secret, or by directly editing the deployment spec. Here we'll keep # things simple by using sed to substitute script variables into a yaml template. cat kube/${org}/${org}-cc-template.yaml \ - | sed 's,{{CHAINCODE_NAME}},'${CHAINCODE_NAME}',g' \ + | sed 's,{{CHAINCODE_NAME}},'${cc_name}',g' \ | sed 's,{{CHAINCODE_ID}},'${cc_id}',g' \ | sed 's,{{CHAINCODE_IMAGE}},'${cc_image}',g' \ | sed 's,{{PEER_NAME}},'${peer}',g' \ | exec kubectl -n $NS apply -f - - kubectl -n $NS rollout status deploy/${org}${peer}-cc-${CHAINCODE_NAME} + kubectl -n $NS rollout status deploy/${org}${peer}-ccaas-${cc_name} pop_fn } +function launch_chaincode() { + local org=org1 + local cc_name=$1 + local cc_id=$2 + local cc_image=$3 + + launch_chaincode_service ${org} peer1 ${cc_name} ${cc_id} ${cc_image} + launch_chaincode_service ${org} peer2 ${cc_name} ${cc_id} ${cc_image} +} + function install_chaincode_for() { local org=$1 local peer=$2 @@ -202,27 +259,6 @@ function commit_chaincode() { pop_fn } -# The chaincode docker image is stored in the code.tar.gz ccaas.json -function extract_chaincode_image() { - CHAINCODE_IMAGE=$(tar zxfO $1 code.tar.gz | tar zxfO - ccaas.json | jq -r .image) -} - -function extract_chaincode_name() { - CHAINCODE_NAME=$(tar zxfO $1 code.tar.gz | tar zxfO - ccaas.json | jq -r .name) -} - -function launch_chaincode() { - local cc_package=$1 - - set_chaincode_id ${cc_package} - - extract_chaincode_image ${cc_package} - extract_chaincode_name ${cc_package} - - launch_chaincode_service org1 $CHAINCODE_ID $CHAINCODE_IMAGE peer1 - launch_chaincode_service org1 $CHAINCODE_ID $CHAINCODE_IMAGE peer2 -} - function set_chaincode_id() { local cc_package=$1 diff --git a/test-network-k8s/scripts/utils.sh b/test-network-k8s/scripts/utils.sh index f5185961..bc47209c 100644 --- a/test-network-k8s/scripts/utils.sh +++ b/test-network-k8s/scripts/utils.sh @@ -102,3 +102,11 @@ function export_peer_context() { export CORE_PEER_MSPCONFIGPATH=${TEMP_DIR}/enrollments/${org}/users/${org}admin/msp export CORE_PEER_TLS_ROOTCERT_FILE=${TEMP_DIR}/channel-msp/peerOrganizations/${org}/msp/tlscacerts/tlsca-signcert.pem } + +function absolute_path() { + local relative_path=$1 + + local abspath="$( cd "${relative_path}" && pwd )" + + echo $abspath +}