diff --git a/docs/schema.json b/docs/schema.json index ce6b0fb7..e54f5dea 100644 --- a/docs/schema.json +++ b/docs/schema.json @@ -178,7 +178,8 @@ "type": "string", "enum": [ "sqlite", - "postgres" + "postgres", + "mysql" ] } } diff --git a/e2e-network/docker/test-04-v3-snapshot-ccaas.sh b/e2e-network/docker/test-04-v3-snapshot-ccaas.sh index ebe9f8de..424c3be5 100755 --- a/e2e-network/docker/test-04-v3-snapshot-ccaas.sh +++ b/e2e-network/docker/test-04-v3-snapshot-ccaas.sh @@ -51,7 +51,7 @@ networkUp # check if all nodes are ready waitForContainer "orderer0.group1.orderer.example.com" "Starting Raft node channel=my-channel1" -waitForContainer "db.ca.org1.example.com" "database system is ready to accept connections" +waitForContainer "db.ca.org1.example.com" "ready for connections" waitForContainer "ca.org1.example.com" "Listening on https://0.0.0.0:7054" waitForContainer "couchdb.peer0.org1.example.com" "Apache CouchDB has started. Time to relax." waitForContainer "peer0.org1.example.com" "Joining gossip network of channel my-channel1 with 1 organizations" diff --git a/e2e/__snapshots__/extendConfig.test.ts.snap b/e2e/__snapshots__/extendConfig.test.ts.snap index 68cf83f5..bfd3b68a 100644 --- a/e2e/__snapshots__/extendConfig.test.ts.snap +++ b/e2e/__snapshots__/extendConfig.test.ts.snap @@ -9216,7 +9216,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9358,7 +9358,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9447,7 +9447,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9547,7 +9547,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9689,7 +9689,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9778,7 +9778,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -9877,7 +9877,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -10019,7 +10019,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -10105,7 +10105,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -10247,7 +10247,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -10490,7 +10490,7 @@ exports[`extend config samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -12505,7 +12505,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -12647,7 +12647,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -12736,7 +12736,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -12836,7 +12836,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -12978,7 +12978,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13067,7 +13067,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13166,7 +13166,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13308,7 +13308,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13394,7 +13394,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13536,7 +13536,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, @@ -13779,7 +13779,7 @@ exports[`extend config samples/invalid-fablo-config.json 1`] = ` "address": "ca.org1.example.com", "caAdminNameVar": "ORG1_CA_ADMIN_NAME", "caAdminPassVar": "ORG1_CA_ADMIN_PASSWORD", - "db": "postgres", + "db": "mysql", "exposePort": 7040, "fullAddress": "ca.org1.example.com:7054", "port": 7054, diff --git a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-peer-dev-mode.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-peer-dev-mode.json.test.ts.snap index 849417a1..0fa00920 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-peer-dev-mode.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-1org-1chaincode-peer-dev-mode.json.test.ts.snap @@ -3433,6 +3433,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -3452,11 +3457,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -3492,7 +3503,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else 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 c0338b48..8de51474 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 @@ -3494,6 +3494,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -3513,11 +3518,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -3553,7 +3564,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else diff --git a/e2e/__snapshots__/fablo-config-hlf2-1org-2chaincode-raft-ccaas.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-1org-2chaincode-raft-ccaas.json.test.ts.snap index 433f66a4..007ead22 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-1org-2chaincode-raft-ccaas.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-1org-2chaincode-raft-ccaas.json.test.ts.snap @@ -27,7 +27,7 @@ exports[`samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json should create "domain": "org1.example.com" }, "ca": { - "db": "postgres" + "db": "mysql" }, "peer": { "instances": 1, @@ -2181,8 +2181,8 @@ services: - FABRIC_LOGGING_SPEC=\${LOGGING_LEVEL} - FABRIC_CA_SERVER_TLS_ENABLED=true - FABRIC_CA_SERVER_DB_TLS_ENABLED=false - - FABRIC_CA_SERVER_DB_TYPE=postgres - - FABRIC_CA_SERVER_DB_DATASOURCE=host=db.ca.org1.example.com port=5432 user=postgres password=caDbPass12345 dbname=fabriccaserver sslmode=disable + - FABRIC_CA_SERVER_DB_TYPE=mysql + - FABRIC_CA_SERVER_DB_DATASOURCE=root:caDbPass12345@tcp(db.ca.org1.example.com:3306)/fabriccaserver?parseTime=true ports: - 7040:7054 working_dir: /etc/hyperledger/fabric-ca-server @@ -2198,18 +2198,19 @@ services: db.ca.org1.example.com: container_name: db.ca.org1.example.com - image: postgres:\${FABRIC_CA_POSTGRES_VERSION} + image: mysql:\${FABRIC_CA_MYSQL_VERSION:-5.7} + command: --sql_mode="" environment: - - POSTGRES_PASSWORD=caDbPass12345 - - POSTGRES_USER=postgres - - POSTGRES_DB=fabriccaserver + - MYSQL_ROOT_PASSWORD=caDbPass12345 + - MYSQL_DATABASE=fabriccaserver healthcheck: - test: "pg_isready -h localhost -p 5432 -q -U postgres" + test: ["CMD", "sh", "-c", "MYSQL_PWD=$$MYSQL_ROOT_PASSWORD mysql -h localhost -u root -e 'SELECT 1' fabriccaserver"] interval: 5s timeout: 10s - retries: 7 + retries: 10 + start_period: 10s volumes: - - /var/lib/postgresql/data + - /var/lib/mysql networks: - basic @@ -3672,6 +3673,11 @@ __getCASQLiteNodes() { } __getCAPostgresNodes() { + echo " + " +} + +__getCAMySQLNodes() { echo " db.ca.org1.example.com " @@ -3696,11 +3702,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -3736,7 +3748,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else @@ -3805,7 +3826,7 @@ classDef subgraph_padding fill:none,stroke:none subgraph org1_example_com [Organization: Org1
org1.example.com] subgraph org1_example_com_padding [ ] direction RL - ca_org1_example_com([ca.org1.example.com
postgres]) + ca_org1_example_com([ca.org1.example.com
mysql]) peer0_org1_example_com[peer0.org1.example.com
CouchDb] end class org1_example_com_padding subgraph_padding diff --git a/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-private-data.yaml.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-private-data.yaml.test.ts.snap index 208613d5..3f7a1425 100644 --- a/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-private-data.yaml.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf2-2orgs-2chaincodes-private-data.yaml.test.ts.snap @@ -4451,6 +4451,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -4470,11 +4475,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -4510,7 +4521,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else 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 951bf0f9..e3a49acb 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 @@ -6413,6 +6413,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -6432,11 +6437,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -6472,7 +6483,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else 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 a4d8e5c8..31a1c0fd 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 @@ -7013,6 +7013,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -7032,11 +7037,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -7072,7 +7083,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else diff --git a/e2e/__snapshots__/fablo-config-hlf3-1orgs-1chaincode.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf3-1orgs-1chaincode.json.test.ts.snap index bdd7de2e..efd38cb1 100644 --- a/e2e/__snapshots__/fablo-config-hlf3-1orgs-1chaincode.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf3-1orgs-1chaincode.json.test.ts.snap @@ -3891,6 +3891,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -3910,11 +3915,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -3950,7 +3961,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else diff --git a/e2e/__snapshots__/fablo-config-hlf3-bft-1orgs-1chaincode.json.test.ts.snap b/e2e/__snapshots__/fablo-config-hlf3-bft-1orgs-1chaincode.json.test.ts.snap index 11a436f3..f0cfe3d9 100644 --- a/e2e/__snapshots__/fablo-config-hlf3-bft-1orgs-1chaincode.json.test.ts.snap +++ b/e2e/__snapshots__/fablo-config-hlf3-bft-1orgs-1chaincode.json.test.ts.snap @@ -3916,6 +3916,11 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="\${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -3935,11 +3940,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -3975,7 +3986,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else diff --git a/e2e/__snapshots__/schema.test.ts.snap b/e2e/__snapshots__/schema.test.ts.snap index ef46c0f9..9fbdb632 100644 --- a/e2e/__snapshots__/schema.test.ts.snap +++ b/e2e/__snapshots__/schema.test.ts.snap @@ -399,6 +399,7 @@ exports[`schema should match snapshot 1`] = ` "enum": [ "sqlite", "postgres", + "mysql", ], "title": "Database", "type": "string", diff --git a/samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json b/samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json index 9cb2b42d..d999b727 100644 --- a/samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json +++ b/samples/fablo-config-hlf3-1org-2chaincode-raft-ccaas.json @@ -24,7 +24,7 @@ "domain": "org1.example.com" }, "ca": { - "db": "postgres" + "db": "mysql" }, "peer": { "instances": 1, diff --git a/src/setup-docker/templates/fabric-docker/docker-compose.yaml b/src/setup-docker/templates/fabric-docker/docker-compose.yaml index a209bd53..78a5e148 100755 --- a/src/setup-docker/templates/fabric-docker/docker-compose.yaml +++ b/src/setup-docker/templates/fabric-docker/docker-compose.yaml @@ -20,6 +20,11 @@ services: - FABRIC_CA_SERVER_DB_TYPE=postgres - FABRIC_CA_SERVER_DB_DATASOURCE=host=db.<%= org.ca.address %> port=5432 user=postgres password=caDbPass12345 dbname=fabriccaserver sslmode=disable <%_ } _%> + <%_ if (org.ca.db === "mysql") { _%> + - FABRIC_CA_SERVER_DB_TLS_ENABLED=false + - FABRIC_CA_SERVER_DB_TYPE=mysql + - FABRIC_CA_SERVER_DB_DATASOURCE=root:caDbPass12345@tcp(db.<%= org.ca.address %>:3306)/fabriccaserver?parseTime=true + <%_ } _%> ports: - <%= org.ca.exposePort %>:<%= org.ca.port %> working_dir: /etc/hyperledger/fabric-ca-server @@ -32,6 +37,11 @@ services: db.<%= org.ca.address %>: condition: service_healthy <%_ } _%> + <%_ if (org.ca.db === "mysql") { _%> + depends_on: + db.<%= org.ca.address %>: + condition: service_healthy + <%_ } _%> networks: - basic @@ -53,6 +63,25 @@ services: networks: - basic <%_ } _%> + <%_ if (org.ca.db === "mysql") { _%> + db.<%= org.ca.address %>: + container_name: db.<%= org.ca.address %> + image: mysql:${FABRIC_CA_MYSQL_VERSION:-5.7} + command: --sql_mode="" + environment: + - MYSQL_ROOT_PASSWORD=caDbPass12345 + - MYSQL_DATABASE=fabriccaserver + healthcheck: + test: ["CMD", "sh", "-c", "MYSQL_PWD=$$MYSQL_ROOT_PASSWORD mysql -h localhost -u root -e 'SELECT 1' fabriccaserver"] + interval: 5s + timeout: 10s + retries: 10 + start_period: 10s + volumes: + - /var/lib/mysql + networks: + - basic + <%_ } _%> <%= org.cli.address %>: container_name: <%= org.cli.address %> diff --git a/src/setup-docker/templates/fabric-docker/snapshot-scripts.sh b/src/setup-docker/templates/fabric-docker/snapshot-scripts.sh index 8ba0c648..5f2f7f7a 100644 --- a/src/setup-docker/templates/fabric-docker/snapshot-scripts.sh +++ b/src/setup-docker/templates/fabric-docker/snapshot-scripts.sh @@ -29,6 +29,14 @@ __getCAPostgresNodes() { " } +__getCAMySQLNodes() { + echo " + <%_ orgs.filter((org) => org.ca.db === 'mysql').forEach((org) => { _%> + db.<%= org.ca.address %> + <%_ }) _%> + " +} + __createSnapshot() { cd "$FABLO_NETWORK_ROOT/.." backup_dir="${1:-"snapshot-$(date -u +"%Y%m%d%H%M%S")"}" @@ -48,11 +56,17 @@ __createSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Saving state of $node..." + echo "Saving state of $node (PostgreSQL)..." mkdir -p "$backup_dir/$node/pg-data" docker exec "$node" pg_dump -c --if-exists -U postgres fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" done + for node in $(__getCAMySQLNodes); do + echo "Saving state of $node (MySQL)..." + mkdir -p "$backup_dir/$node/mysql-data" + docker exec -e MYSQL_PWD=caDbPass12345 "$node" mysqldump -u root --add-drop-database --databases fabriccaserver >"$backup_dir/$node/fabriccaserver.sql" + done + for node in $(__getOrdererAndPeerNodes); do echo "Saving state of $node..." docker cp "$node:/var/hyperledger/production/" "$backup_dir/$node/" @@ -88,7 +102,16 @@ __cloneSnapshot() { done for node in $(__getCAPostgresNodes); do - echo "Restoring $node..." + echo "Restoring $node (PostgreSQL)..." + if [ ! -d "$node" ]; then + echo "Warning: Cannot restore '$node', directory does not exist!" + else + docker cp "./$node/fabriccaserver.sql" "$node:/docker-entrypoint-initdb.d/fabriccaserver.sql" + fi + done + + for node in $(__getCAMySQLNodes); do + echo "Restoring $node (MySQL)..." if [ ! -d "$node" ]; then echo "Warning: Cannot restore '$node', directory does not exist!" else