Skip to content

Commit 138a0e3

Browse files
authored
Feat: CCaaS dev mode (#622)
1 parent b841751 commit 138a0e3

24 files changed

+1219
-318
lines changed

.github/workflows/test-on-push.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ jobs:
2121
./fablo-build.sh
2222
2323
- name: Test simple network
24-
run: e2e-network/docker/test-01-v2-simple.sh
24+
run: e2e-network/docker/test-01-v3-simple.sh
2525

2626
- uses: actions/upload-artifact@v4
2727
if: always()
2828
with:
2929
name: test-main
3030
path: |
31-
e2e-network/docker/test-01-v2-simple.sh.logs/*
32-
e2e-network/docker/test-01-v2-simple.sh.tmpdir/fablo-target/**/*
31+
e2e-network/docker/test-01-v3-simple.sh.logs/*
32+
e2e-network/docker/test-01-v3-simple.sh.tmpdir/fablo-target/**/*
3333
3434
- name: Test generators
3535
run: |

README.md

Lines changed: 180 additions & 143 deletions
Large diffs are not rendered by default.

SUPPORTED_FEATURES.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,42 @@ This document provides an overview of Fablo features. The table below tracks fea
77
| Feature | Fabric v2 | Fabric v3 | Documented | CI tests | Relevant issues |
88
|----------------------------------------|-----------|-----------|------------|----------|-----------------|
99
| <br>**NETWORK CONFIGURATION** | | | | | |
10+
| BFT Consensus | - ||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
1011
| RAFT Consensus |||| [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
11-
| SOLO Consensus || - || [07_v2](/e2e-network/docker/test-07-v2-peer-dev-mode.sh) | |
12-
| BFT Consensus | - ||| [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | [#559](https://github.com/hyperledger-labs/fablo/issues/559) |
13-
| TLS |||| [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
12+
| SOLO Consensus || - || [03_v2](/e2e-network/docker/test-03-v2-private-data.sh), [07_v2](/e2e-network/docker/test-07-v2-peer-dev-mode.sh) | |
13+
| TLS |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
1414
| Orderer Groups |||| [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | [#560](https://github.com/hyperledger-labs/fablo/issues/560) |
15-
| Peer DB - LevelDB |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
15+
| Peer dev mode | ✓ (no TLS) | ✕ . || [07_v2](/e2e-network/docker/test-07-v2-peer-dev-mode.sh) | |
16+
| Peer DB - LevelDB |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
1617
| Peer DB - CouchDB |||| [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
17-
| CA DB - SQLite |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
18+
| CA DB - SQLite |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
1819
| CA DB - Postgres |||| [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
1920
| CA DB - MySQL |||| | [#561](https://github.com/hyperledger-labs/fablo/issues/561) |
2021
| <br>**CHANNELS** | | | | | |
21-
| Channel query scripts ||| | [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
22+
| Channel query scripts ||| | [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
2223
| <br>**CHAINCODES** | | | | | |
23-
| Node ||| | [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
24+
| Node ||| | [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
2425
| Go ||| | | |
2526
| Java ||| | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
2627
| Chaincode-as-a-Service (CCaaS) ||| | [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
28+
| CCaaS hot reload ||| | [01_v3](/e2e-network/docker/test-01-v3-simple.sh) | |
2729
| Endorsement Policies ||| | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
2830
| Multi-org Endorsements ||| | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh) | |
2931
| Private Data Collections ||| | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh) | |
30-
| Chaincode scripts (list/query/invoke) ||| | [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [03_v2](/e2e-network/docker/test-03-v2-private-data.sh), [04_v2](/e2e-network/docker/test-04-v2-snapshot.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
32+
| Chaincode scripts (list/query/invoke) ||| | [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [03_v2](/e2e-network/docker/test-03-v2-private-data.sh), [04_v2](/e2e-network/docker/test-04-v2-snapshot.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
3133
| Commands: install / upgrade ||| | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
3234
| <br>**TOOLS** | | | | | |
3335
| Fablo REST ||| | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
3436
| Explorer ||| | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
3537
| <br>**FABLO COMMANDS** | | | | | |
36-
| `generate` |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
37-
| `up` |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
38+
| `generate` |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
39+
| `up` |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
3840
| `start`, `stop`, `restart` |||| [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
39-
| `down`, `reset` |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
41+
| `down`, `reset` |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
4042
| `prune`, `recreate` |||| [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
4143
| `validate`, `extend-config` |||| [e2e](/e2e/fabloCommands.test.ts) | |
4244
| `version` |||| [e2e](/e2e/fabloCommands.test.ts) | |
43-
| `init` (node, rest, dev) |||| [01_v2](/e2e-network/docker/test-01-v2-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
45+
| `init` (node, rest, dev) |||| [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [05_v3](/e2e-network/docker/test-05-v3.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
4446
| `export-network-topology` to Mermaid |||| | [#579](https://github.com/hyperledger-labs/fablo/pull/579) |
4547
| Other `init` options | | | | | [#444](https://github.com/hyperledger-labs/fablo/issues/444) |
4648
| <br>**SNAPSHOT** | | | | | |

e2e-network/docker/test-01-v2-simple.sh renamed to e2e-network/docker/test-01-v3-simple.sh

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export FABLO_HOME
1010

1111
networkUp() {
1212
"$FABLO_HOME/fablo-build.sh"
13-
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" init node)
13+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" init node dev)
1414
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" up)
1515
}
1616

@@ -21,7 +21,6 @@ dumpLogs() {
2121
}
2222

2323
networkDown() {
24-
rm -rf "$TEST_LOGS"
2524
(for name in $(docker ps --format '{{.Names}}'); do dumpLogs "$name"; done)
2625
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" down)
2726
}
@@ -46,21 +45,39 @@ expectQuery() {
4645
(cd "$TEST_TMP" && sh ../expect-query-cli.sh "$1" "$2" "$3" "$4" "$5")
4746
}
4847

48+
expectQueryWithRetry() {
49+
local output=""
50+
for i in {1..20}; do
51+
output="$(expectQuery "$1" "$2" "$3" "$4" "$5" 2>&1 || true)"
52+
if ! echo "$output" | grep -q 'failed (cli)'; then
53+
echo "$output"
54+
return 0
55+
fi
56+
echo "Query failed, retrying... ($i)"
57+
sleep 1
58+
done
59+
echo "$output"
60+
exit 1
61+
}
62+
4963
trap networkDown EXIT
5064
trap 'networkDown ; echo "Test failed" ; exit 1' ERR SIGINT
5165

5266
# start the network
5367
networkUp
5468

55-
waitForContainer "orderer0.group1.orderer.example.com" "Created and started new.*my-channel1"
56-
waitForContainer "ca.org1.example.com" "Listening on http://0.0.0.0:7054"
69+
waitForContainer "orderer0.group1.orderer.example.com" "Channel created"
70+
waitForContainer "orderer1.group1.orderer.example.com" "Channel created"
71+
waitForContainer "ca.org1.example.com" "Listening on https://0.0.0.0:7054"
5772
waitForContainer "peer0.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
5873
waitForContainer "peer1.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations"
5974
waitForContainer "peer0.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
6075
waitForContainer "peer0.org1.example.com" "Anchor peer.*with same endpoint, skipping connecting to myself"
6176
waitForContainer "peer0.org1.example.com" "Membership view has changed. peers went online:.*peer1.org1.example.com:7042"
6277
waitForContainer "peer1.org1.example.com" "Learning about the configured anchor peers of Org1MSP for channel my-channel1"
6378
waitForContainer "peer1.org1.example.com" "Membership view has changed. peers went online:.*peer0.org1.example.com:7041"
79+
waitForContainer "ccaas_peer0.org1.example.com_my-channel1_chaincode1_0.0.1" "Bootstrap process completed"
80+
waitForContainer "ccaas_peer1.org1.example.com_my-channel1_chaincode1_0.0.1" "Bootstrap process completed"
6481

6582
# Test simple chaincode
6683
expectInvoke "peer0.org1.example.com" "my-channel1" "chaincode1" \
@@ -70,25 +87,34 @@ expectQuery "peer1.org1.example.com" "my-channel1" "chaincode1" \
7087
'{"Args":["KVContract:get", "name"]}' \
7188
'{"success":"Willy Wonka"}'
7289

90+
# Test code reload (ccaas dev mode)
91+
expectQuery "peer1.org1.example.com" "my-channel1" "chaincode1" \
92+
'{"Args":["KVContract:get", "unknown"]}' \
93+
'{"error":"NOT_FOUND"}'
94+
perl -i -pe 's/NOT_FOUND/SORRY_NOT_FOUND/g' "$TEST_TMP/chaincodes/chaincode-kv-node/index.js"
95+
expectQueryWithRetry "peer1.org1.example.com" "my-channel1" "chaincode1" \
96+
'{"Args":["KVContract:get", "unknown"]}' \
97+
'{"error":"SORRY_NOT_FOUND"}'
98+
7399
# Verify channel query scripts
74100
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch newest my-channel1 org1 peer1)
75101
expectCommand "cat \"$TEST_TMP/newest.block\"" "KVContract:put"
76102

77-
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch 4 my-channel1 org1 peer1 "another.block")
103+
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch 3 my-channel1 org1 peer1 "another.block")
78104
expectCommand "cat \"$TEST_TMP/another.block\"" "KVContract:put"
79105

80106
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch config my-channel1 org1 peer1 "channel-config.json")
81107
expectCommand "cat \"$TEST_TMP/channel-config.json\"" "\"mod_policy\": \"Admins\","
82108

83-
expectCommand "(cd \"$TEST_TMP\" && \"$FABLO_HOME/fablo.sh\" channel getinfo my-channel1 org1 peer1)" "\"height\":5"
109+
expectCommand "(cd \"$TEST_TMP\" && \"$FABLO_HOME/fablo.sh\" channel getinfo my-channel1 org1 peer1)" "\"height\":4"
84110

85111
# Reset and ensure the state is lost after reset
86112
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" reset)
87113
waitForChaincode "peer0.org1.example.com" "my-channel1" "chaincode1" "0.0.1"
88114
waitForChaincode "peer1.org1.example.com" "my-channel1" "chaincode1" "0.0.1"
89-
expectQuery "peer0.org1.example.com" "my-channel1" "chaincode1" \
115+
expectQueryWithRetry "peer0.org1.example.com" "my-channel1" "chaincode1" \
90116
'{"Args":["KVContract:get", "name"]}' \
91-
'{"error":"NOT_FOUND"}'
117+
'{"error":"SORRY_NOT_FOUND"}'
92118

93119
# Put some data again
94120
expectInvoke "peer0.org1.example.com" "my-channel1" "chaincode1" \

e2e/__snapshots__/extendConfig.test.ts.snap

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9186,6 +9186,8 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json
91869186
{
91879187
"chaincodes": [
91889188
{
9189+
"chaincodeMountPath": undefined,
9190+
"chaincodeStartCommand": undefined,
91899191
"channel": {
91909192
"instantiatingOrg": {
91919193
"anchorPeers": [
@@ -9515,6 +9517,8 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json
95159517
"version": "0.0.1",
95169518
},
95179519
{
9520+
"chaincodeMountPath": undefined,
9521+
"chaincodeStartCommand": undefined,
95189522
"channel": {
95199523
"instantiatingOrg": {
95209524
"anchorPeers": [
@@ -12468,6 +12472,8 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = `
1246812472
{
1246912473
"chaincodes": [
1247012474
{
12475+
"chaincodeMountPath": undefined,
12476+
"chaincodeStartCommand": undefined,
1247112477
"channel": {
1247212478
"instantiatingOrg": {
1247312479
"anchorPeers": [
@@ -12797,6 +12803,8 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = `
1279712803
"version": "0.0.1",
1279812804
},
1279912805
{
12806+
"chaincodeMountPath": undefined,
12807+
"chaincodeStartCommand": undefined,
1280012808
"channel": {
1280112809
"instantiatingOrg": {
1280212810
"anchorPeers": [

e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-peer-dev-mode.json.test.ts.snap

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1852,11 +1852,11 @@ stopNetwork() {
18521852
18531853
networkDown() {
18541854
printf "Removing chaincode containers & images... \\U1F5D1 \\n"
1855-
for container in $(docker ps -a | grep "peer0.org1.example.com-chaincode1" | awk '{print $1}'); do
1855+
for container in $(docker ps -a | grep "peer0.org1.example.com.*chaincode1" | awk '{print $1}'); do
18561856
echo "Removing container $container..."
18571857
docker rm -f "$container" || echo "docker rm of $container failed. Check if all fabric dockers properly was deleted"
18581858
done
1859-
for image in $(docker images "peer0.org1.example.com-chaincode1*" -q); do
1859+
for image in $(docker images "peer0.org1.example.com.*chaincode1*" -q); do
18601860
echo "Removing image $image..."
18611861
docker rmi "$image" || echo "docker rmi of $image failed. Check if all fabric dockers properly was deleted"
18621862
done
@@ -2680,6 +2680,8 @@ startCCaaSContainer() {
26802680
local CA_CERT="$7"
26812681
local CONTAINER_NAME="$8"
26822682
CONTAINER_NAME=$(echo "$CONTAINER_NAME" | tr '[:upper:]' '[:lower:]')
2683+
local CHAINCODE_MOUNT_PATH="$9"
2684+
local CHAINCODE_START_COMMAND="\${10}"
26832685
26842686
# Query installed chaincodes to get the package ID
26852687
local CA_CERT_PARAMS=()
@@ -2740,6 +2742,18 @@ startCCaaSContainer() {
27402742
fi
27412743
fi
27422744
2745+
MOUNT_PATH_PARAMS=()
2746+
if [ -n "$CHAINCODE_MOUNT_PATH" ]; then
2747+
MOUNT_PATH_PARAMS=(-v "$CHAINCODE_MOUNT_PATH:/usr/src/app:ro" --workdir /usr/src/app)
2748+
fi
2749+
2750+
ENTRYPOINT_PARAMS=()
2751+
START_COMMAND_PARAMS=()
2752+
if [ -n "$CHAINCODE_START_COMMAND" ]; then
2753+
ENTRYPOINT_PARAMS=(--entrypoint sh)
2754+
START_COMMAND_PARAMS=(-c "$CHAINCODE_START_COMMAND")
2755+
fi
2756+
27432757
docker run -d \\
27442758
--name "$CONTAINER_NAME" \\
27452759
-e CORE_CHAINCODE_ADDRESS="0.0.0.0:7052" \\
@@ -2756,9 +2770,11 @@ startCCaaSContainer() {
27562770
-v "$CCAAS_TLS_PATH/client.key:/etc/hyperledger/fabric/client.key" \\
27572771
-v "$CCAAS_TLS_PATH/client.crt:/etc/hyperledger/fabric/client.crt" \\
27582772
-v "$CCAAS_TLS_PATH/peer.crt:/etc/hyperledger/fabric/peer.crt" \\
2773+
"\${MOUNT_PATH_PARAMS[@]+"\${MOUNT_PATH_PARAMS[@]}"}" \\
27592774
-p "$PORT_MAP" \\
27602775
--network "$NETWORK" \\
2761-
"$CHAINCODE_IMAGE"
2776+
"\${ENTRYPOINT_PARAMS[@]+"\${ENTRYPOINT_PARAMS[@]}"}" \\
2777+
"$CHAINCODE_IMAGE" "\${START_COMMAND_PARAMS[@]+"\${START_COMMAND_PARAMS[@]}"}"
27622778
}
27632779
27642780
chaincodeApprove() {

0 commit comments

Comments
 (0)