move ccpackage/ contents into network script

Signed-off-by: Josh Kneubuhl <jkneubuh@us.ibm.com>
This commit is contained in:
Josh Kneubuhl 2022-04-04 14:24:16 -04:00
parent a48aa0a46f
commit 827e30cf30
9 changed files with 111 additions and 132 deletions

View file

@ -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

View file

@ -1,49 +0,0 @@
# Scratch notes - Ignore - ... `fabric-cli` redux
`fabric [options] peer <group> <command> [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 <folder-path> <bundle-path>
network chaincode id <bundle-path>
network chaincode install <bundle-path>
network chaincode approve <name> <id>
network chainocde commit <name>
```
```shell
network chaincode list
network chaincode delete <name>
network chaincode describe <name>
network chaincode invoke <name> <payload>
network chaincode query <name> <payload>
```
meta / fictitious targets:
```
network chaincode launch <name> <CC_IMAGE>
network chaincode deploy <name> <folder-path> # 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}=<value>)
```

View file

@ -1,4 +0,0 @@
{
"name": "asset-transfer-basic",
"image": "hyperledger/fabric-samples/asset-transfer-basic/chaincode-java:latest"
}

View file

@ -1,5 +0,0 @@
{
"address": "{{.peername}}-cc-asset-transfer-basic:9999",
"dial_timeout": "10s",
"tls_required": false
}

View file

@ -1,4 +0,0 @@
{
"type": "ccaas",
"label": "basic_1.0"
}

View file

@ -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"

View file

@ -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}}
app: org1{{PEER_NAME}}-ccaas-{{CHAINCODE_NAME}}

View file

@ -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

View file

@ -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
}