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