Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/test-on-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ jobs:
./fablo-build.sh

- name: Test simple network
run: e2e-network/docker/test-01-v2-simple.sh
run: e2e-network/docker/test-01-v3-simple.sh

- uses: actions/upload-artifact@v4
if: always()
with:
name: test-main
path: |
e2e-network/docker/test-01-v2-simple.sh.logs/*
e2e-network/docker/test-01-v2-simple.sh.tmpdir/fablo-target/**/*
e2e-network/docker/test-01-v3-simple.sh.logs/*
e2e-network/docker/test-01-v3-simple.sh.tmpdir/fablo-target/**/*

- name: Test generators
run: |
Expand Down
323 changes: 180 additions & 143 deletions README.md

Large diffs are not rendered by default.

26 changes: 14 additions & 12 deletions SUPPORTED_FEATURES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,40 +7,42 @@ This document provides an overview of Fablo features. The table below tracks fea
| Feature | Fabric v2 | Fabric v3 | Documented | CI tests | Relevant issues |
|----------------------------------------|-----------|-----------|------------|----------|-----------------|
| <br>**NETWORK CONFIGURATION** | | | | | |
| BFT Consensus | - | ✓ | ✓ | [01_v3](/e2e-network/docker/test-01-v3-simple.sh), [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | |
| RAFT Consensus | ✓ | ✓ | ✓ | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| SOLO Consensus | ✓ | - | ✓ | [07_v2](/e2e-network/docker/test-07-v2-peer-dev-mode.sh) | |
| BFT Consensus | - | ✓ | ✓ | [06_v3](/e2e-network/docker/test-06-v3-bft.sh) | [#559](https://github.com/hyperledger-labs/fablo/issues/559) |
| 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) | |
| 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) | |
| 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) | |
| Orderer Groups | ✕ | ✕ | ✕ | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | [#560](https://github.com/hyperledger-labs/fablo/issues/560) |
| 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) | |
| Peer dev mode | ✓ (no TLS) | ✕ . | ✓ | [07_v2](/e2e-network/docker/test-07-v2-peer-dev-mode.sh) | |
| 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) | |
| Peer DB - CouchDB | ✓ | ✓ | ✓ | [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
| 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) | |
| 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) | |
| CA DB - Postgres | ✓ | ✓ | ✓ | [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
| CA DB - MySQL | ✕ | ✕ | ✓ | | [#561](https://github.com/hyperledger-labs/fablo/issues/561) |
| <br>**CHANNELS** | | | | | |
| 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) | |
| 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) | |
| <br>**CHAINCODES** | | | | | |
| 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) | |
| 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) | |
| Go | ✓ | ✓ | | | |
| Java | ✓ | ✓ | | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| Chaincode-as-a-Service (CCaaS) | ✓ | ✓ | | [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
| CCaaS hot reload | ✓ | ✓ | | [01_v3](/e2e-network/docker/test-01-v3-simple.sh) | |
| Endorsement Policies | ✓ | ✓ | | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh), [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| Multi-org Endorsements | ✓ | ✓ | | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh) | |
| Private Data Collections | ✓ | ✓ | | [03_v2](/e2e-network/docker/test-03-v2-private-data.sh) | |
| 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) | |
| 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) | |
| Commands: install / upgrade | ✓ | ✓ | | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| <br>**TOOLS** | | | | | |
| Fablo REST | ✓ | ✓ | | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh), [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
| Explorer | ✓ | ✕ | | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| <br>**FABLO COMMANDS** | | | | | |
| `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) | |
| `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) | |
| `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) | |
| `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) | |
| `start`, `stop`, `restart` | ✓ | ✓ | ✓ | [02_v2](/e2e-network/docker/test-02-v2-raft-2orgs.sh) | |
| `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) | |
| `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) | |
| `prune`, `recreate` | ✓ | ✓ | ✓ | [04_v3](/e2e-network/docker/test-04-v3-snapshot-ccaas.sh) | |
| `validate`, `extend-config` | ✓ | ✓ | ✓ | [e2e](/e2e/fabloCommands.test.ts) | |
| `version` | ✓ | ✓ | ✓ | [e2e](/e2e/fabloCommands.test.ts) | |
| `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) | |
| `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) | |
| `export-network-topology` to Mermaid | ✓ | ✓ | ✓ | | [#579](https://github.com/hyperledger-labs/fablo/pull/579) |
| Other `init` options | | | | | [#444](https://github.com/hyperledger-labs/fablo/issues/444) |
| <br>**SNAPSHOT** | | | | | |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export FABLO_HOME

networkUp() {
"$FABLO_HOME/fablo-build.sh"
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" init node)
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" init node dev)
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" up)
}

Expand All @@ -21,7 +21,6 @@ dumpLogs() {
}

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

expectQueryWithRetry() {
local output=""
for i in {1..20}; do
output="$(expectQuery "$1" "$2" "$3" "$4" "$5" 2>&1 || true)"
if ! echo "$output" | grep -q 'failed (cli)'; then
echo "$output"
return 0
fi
echo "Query failed, retrying... ($i)"
sleep 1
done
echo "$output"
exit 1
}

trap networkDown EXIT
trap 'networkDown ; echo "Test failed" ; exit 1' ERR SIGINT

# start the network
networkUp

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

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

# Test code reload (ccaas dev mode)
expectQuery "peer1.org1.example.com" "my-channel1" "chaincode1" \
'{"Args":["KVContract:get", "unknown"]}' \
'{"error":"NOT_FOUND"}'
perl -i -pe 's/NOT_FOUND/SORRY_NOT_FOUND/g' "$TEST_TMP/chaincodes/chaincode-kv-node/index.js"
expectQueryWithRetry "peer1.org1.example.com" "my-channel1" "chaincode1" \
'{"Args":["KVContract:get", "unknown"]}' \
'{"error":"SORRY_NOT_FOUND"}'

# Verify channel query scripts
(cd "$TEST_TMP" && "$FABLO_HOME/fablo.sh" channel fetch newest my-channel1 org1 peer1)
expectCommand "cat \"$TEST_TMP/newest.block\"" "KVContract:put"

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

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

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

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

# Put some data again
expectInvoke "peer0.org1.example.com" "my-channel1" "chaincode1" \
Expand Down
8 changes: 8 additions & 0 deletions e2e/__snapshots__/extendConfig.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -9186,6 +9186,8 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json
{
"chaincodes": [
{
"chaincodeMountPath": undefined,
"chaincodeStartCommand": undefined,
"channel": {
"instantiatingOrg": {
"anchorPeers": [
Expand Down Expand Up @@ -9515,6 +9517,8 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json
"version": "0.0.1",
},
{
"chaincodeMountPath": undefined,
"chaincodeStartCommand": undefined,
"channel": {
"instantiatingOrg": {
"anchorPeers": [
Expand Down Expand Up @@ -12468,6 +12472,8 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = `
{
"chaincodes": [
{
"chaincodeMountPath": undefined,
"chaincodeStartCommand": undefined,
"channel": {
"instantiatingOrg": {
"anchorPeers": [
Expand Down Expand Up @@ -12797,6 +12803,8 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = `
"version": "0.0.1",
},
{
"chaincodeMountPath": undefined,
"chaincodeStartCommand": undefined,
"channel": {
"instantiatingOrg": {
"anchorPeers": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1852,11 +1852,11 @@ stopNetwork() {

networkDown() {
printf "Removing chaincode containers & images... \\U1F5D1 \\n"
for container in $(docker ps -a | grep "peer0.org1.example.com-chaincode1" | awk '{print $1}'); do
for container in $(docker ps -a | grep "peer0.org1.example.com.*chaincode1" | awk '{print $1}'); do
echo "Removing container $container..."
docker rm -f "$container" || echo "docker rm of $container failed. Check if all fabric dockers properly was deleted"
done
for image in $(docker images "peer0.org1.example.com-chaincode1*" -q); do
for image in $(docker images "peer0.org1.example.com.*chaincode1*" -q); do
echo "Removing image $image..."
docker rmi "$image" || echo "docker rmi of $image failed. Check if all fabric dockers properly was deleted"
done
Expand Down Expand Up @@ -2680,6 +2680,8 @@ startCCaaSContainer() {
local CA_CERT="$7"
local CONTAINER_NAME="$8"
CONTAINER_NAME=$(echo "$CONTAINER_NAME" | tr '[:upper:]' '[:lower:]')
local CHAINCODE_MOUNT_PATH="$9"
local CHAINCODE_START_COMMAND="\${10}"

# Query installed chaincodes to get the package ID
local CA_CERT_PARAMS=()
Expand Down Expand Up @@ -2740,6 +2742,18 @@ startCCaaSContainer() {
fi
fi

MOUNT_PATH_PARAMS=()
if [ -n "$CHAINCODE_MOUNT_PATH" ]; then
MOUNT_PATH_PARAMS=(-v "$CHAINCODE_MOUNT_PATH:/usr/src/app:ro" --workdir /usr/src/app)
fi

ENTRYPOINT_PARAMS=()
START_COMMAND_PARAMS=()
if [ -n "$CHAINCODE_START_COMMAND" ]; then
ENTRYPOINT_PARAMS=(--entrypoint sh)
START_COMMAND_PARAMS=(-c "$CHAINCODE_START_COMMAND")
fi

docker run -d \\
--name "$CONTAINER_NAME" \\
-e CORE_CHAINCODE_ADDRESS="0.0.0.0:7052" \\
Expand All @@ -2756,9 +2770,11 @@ startCCaaSContainer() {
-v "$CCAAS_TLS_PATH/client.key:/etc/hyperledger/fabric/client.key" \\
-v "$CCAAS_TLS_PATH/client.crt:/etc/hyperledger/fabric/client.crt" \\
-v "$CCAAS_TLS_PATH/peer.crt:/etc/hyperledger/fabric/peer.crt" \\
"\${MOUNT_PATH_PARAMS[@]+"\${MOUNT_PATH_PARAMS[@]}"}" \\
-p "$PORT_MAP" \\
--network "$NETWORK" \\
"$CHAINCODE_IMAGE"
"\${ENTRYPOINT_PARAMS[@]+"\${ENTRYPOINT_PARAMS[@]}"}" \\
"$CHAINCODE_IMAGE" "\${START_COMMAND_PARAMS[@]+"\${START_COMMAND_PARAMS[@]}"}"
}

chaincodeApprove() {
Expand Down
Loading
Loading