From b2aac89e88dbe9d01987273d288d8b6f706cecc6 Mon Sep 17 00:00:00 2001 From: Adnan Date: Mon, 1 Dec 2025 15:31:25 +0100 Subject: [PATCH 1/3] PCSM-202: Make local sharded cluster setup configurable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add flexible shard configuration to hack/sh environment with support for asymmetric cluster testing (different shard counts between source and target). Also remove authentication from all local dev environments to simplify setup and avoid Docker volume permission issues. Authentication removal (all environments: rs, sh, sh-ha): - Remove keyFile files and keyFile config from all *.conf files - Remove users.adm.js and users.js user creation scripts - Update hack/util rsinit function to skip user creation - Remove auth prefixes (adm:pass@) from all mongosh calls - Fix hack/cleanup.sh to handle sh-ha environment properly Configurable shard setup (hack/sh): - Make run.sh configurable via SRC_SHARDS and TGT_SHARDS env vars - Default: 2 shards each (changed from hardcoded 3→2) - Maximum: 3 shards each (validated against available init scripts) - Dynamic service startup and initialization loops - Usage documentation in script header - Add third shard support for both source and target - Create hack/sh/mongo/src/rs2.js init script - Create hack/sh/mongo/tgt/rs2.js init script - Add src-rs20 and tgt-rs20 services/volumes to compose.yml - Add hack/cleanup.sh script for environment teardown - Add /tmp/ to .gitignore for demo artifacts Test configurations now supported: - 1→1, 2→2, 3→3 shards (symmetric) - 3→2, 2→3 shards (asymmetric, for PCSM-202 testing) - Any combination from 1-3 shards per cluster Usage examples: ./hack/sh/run.sh # 2→2 (default) SRC_SHARDS=3 TGT_SHARDS=2 ./hack/sh/run.sh # 3→2 SRC_SHARDS=2 TGT_SHARDS=3 ./hack/sh/run.sh # 2→3 SRC_SHARDS=1 TGT_SHARDS=1 ./hack/sh/run.sh # 1→1 --- .gitignore | 1 + hack/cleanup.sh | 78 ++++++++++++++++++++++++ hack/rs/mongo/keyFile | 16 ----- hack/rs/mongo/users.adm.js | 5 -- hack/rs/mongo/users.js | 11 ---- hack/rs/run.sh | 7 --- hack/sh-ha/mongo/configsvr.conf | 1 - hack/sh-ha/mongo/keyFile | 16 ----- hack/sh-ha/mongo/mongos.conf | 1 - hack/sh-ha/mongo/shardsvr.conf | 1 - hack/sh-ha/mongo/users.adm.js | 5 -- hack/sh-ha/mongo/users.js | 20 ------- hack/sh-ha/run.sh | 6 +- hack/sh/compose.yml | 36 +++++++++++ hack/sh/mongo/configsvr.conf | 1 - hack/sh/mongo/keyFile | 16 ----- hack/sh/mongo/mongos.conf | 1 - hack/sh/mongo/shardsvr.conf | 1 - hack/sh/mongo/src/rs2.js | 8 +++ hack/sh/mongo/tgt/rs2.js | 8 +++ hack/sh/mongo/users.adm.js | 5 -- hack/sh/mongo/users.js | 20 ------- hack/sh/run.sh | 103 ++++++++++++++++++++++++++------ hack/util | 4 +- 24 files changed, 218 insertions(+), 153 deletions(-) create mode 100755 hack/cleanup.sh delete mode 100644 hack/rs/mongo/keyFile delete mode 100644 hack/rs/mongo/users.adm.js delete mode 100644 hack/rs/mongo/users.js delete mode 100644 hack/sh-ha/mongo/keyFile delete mode 100644 hack/sh-ha/mongo/users.adm.js delete mode 100644 hack/sh-ha/mongo/users.js delete mode 100644 hack/sh/mongo/keyFile create mode 100644 hack/sh/mongo/src/rs2.js create mode 100644 hack/sh/mongo/tgt/rs2.js delete mode 100644 hack/sh/mongo/users.adm.js delete mode 100644 hack/sh/mongo/users.js diff --git a/.gitignore b/.gitignore index f610e683..89e9e72e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ .env /bin/ +/tmp/ vendor/ .pytest_cache diff --git a/hack/cleanup.sh b/hack/cleanup.sh new file mode 100755 index 00000000..061d97d8 --- /dev/null +++ b/hack/cleanup.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +# Clean up Docker resources for test environments +# Removes: containers, volumes, networks +# +# Usage: ./cleanup.sh [ENV...] +# (no args) Clean all (rs, sh, sh-ha) +# rs Replica set only +# sh Sharded cluster only (3→2 shards, project: s1) +# sh-ha Sharded cluster HA only +# +# Example: +# ./cleanup.sh rs sh # rs and sh + +set -euo pipefail + +SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") +ENVS_TO_CLEAN=() + +if [[ $# -eq 0 ]]; then + ENVS_TO_CLEAN=("rs" "sh" "sh-ha") +else + while [[ $# -gt 0 ]]; do + case $1 in + rs|sh|sh-ha) + ENVS_TO_CLEAN+=("$1") + shift + ;; + *) + echo "Unknown environment: $1" + echo "Valid: rs, sh, sh-ha" + exit 1 + ;; + esac + done +fi + +# Function to clean up a compose environment +cleanup_env() { + local name=$1 + local compose_file=$2 + local project_name=${3:-} + + if [[ ! -f "$compose_file" ]]; then + echo "Skipping $name (compose file not found)" + return + fi + + echo "Cleaning $name..." + + local compose_cmd="docker compose -f $compose_file" + if [[ -n "$project_name" ]]; then + compose_cmd="docker compose -p $project_name -f $compose_file" + fi + + # Stop and remove containers, then remove volumes + $compose_cmd down --remove-orphans 2>/dev/null || true + $compose_cmd down -v 2>/dev/null || true +} + +# Clean specified environments +for env in "${ENVS_TO_CLEAN[@]}"; do + case $env in + rs) + cleanup_env "rs" "$SCRIPT_DIR/rs/compose.yml" + docker volume ls -q | grep -E '^rs[0-9]+' | xargs -r docker volume rm 2>/dev/null || true + ;; + sh) + cleanup_env "sh" "$SCRIPT_DIR/sh/compose.yml" "s1" + docker volume ls -q | grep -E '^(src-|tgt-|s1_)' | xargs -r docker volume rm 2>/dev/null || true + ;; + sh-ha) + cleanup_env "sh-ha" "$SCRIPT_DIR/sh-ha/compose.yml" "s1" + docker volume ls -q | grep -E '^s1_' | xargs -r docker volume rm 2>/dev/null || true + ;; + esac +done + +echo "Done." diff --git a/hack/rs/mongo/keyFile b/hack/rs/mongo/keyFile deleted file mode 100644 index 76a6bf9e..00000000 --- a/hack/rs/mongo/keyFile +++ /dev/null @@ -1,16 +0,0 @@ -jKXOsAuRH4Br5urlvr2Ur0n6OjRQBiv3W7QrQ3PTQ9PmmCEw/CrLiQ/LjLzL6USe -S+v+Mo9chlswa0KADDnsUCp342LtKIDm68hgWq5/m3H+phOVDx95TJqyuMA9e0tO -P/WJQ+e1s+9OEM5Xqfg2LHq2L9kZKE5fgvpWKPR/HMaPKFYOuSk6CyNvc6Y6c96b -fQImjZ2DVbeEIczu4sNPESi9jwncUu2QD1xTyoa+PNeuLbVoYzQNLwkxzSXxMpxA -zcYaysBWpx0MB3CRn7hCfNPSGDbXfDYac7fopHb8IO3jouzkw+p/dcGuCMfA+VW3 -opmNmJPfogb5nXTwKNVhYh3VcEBc4GX9MnYyT2l0LxcyHQUPFSvN6ksC3fDqTkF/ -dsYTvPNpGjnSVKC3L5VkVarWvNfyL9RXFrz6SHZ0W6ndBT88GH8fzdB41WPhj9fF -BOI9NyIrlLnbP9LbctFQlcXfX7veIwT/eh8fgJwOfYuURVZaQlqcyhTeUm3wiOjx -yBbDF2D0/jyLkzk26zT57txNXlrYN+dGX/Rm/zEr8uJsBIi3W3rDrb+8vsRkrnQG -66D5Ef8GMT+ZUH+tcCjJ7uIvX1UXzieSlUkikDZ+VeKXQ+sKpS7k6qiCTNLQVRBS -lJjNNJg2x3XUVuRCaA/015c45YNCs5Bl0CGIXPZiX3aBoi6nlTb8aZwssLDwaxQD -agsGVfyYSEEj6INibdgFsTEsly15dcBvUhRpBH/uPcw+q3tOZZiS546LhvPn9h3P -ZbRDy/4vKjVsK3XQbyR6IzY8IiORG6AxIHgDuVqH7NC5SW+2xrtwQvZBZY1mn/OR -VFqvhRv9CcDR21wyClHtIvepbjDdzta/Ek3S+6zo/OudxK2G3zxafjf0Jgyc4sUT -gl2wuGxtlTBXf+3ZdSIzB16qnU83JO7CVAnyvO5f9A6082sBgshjf3H4YNNM8xbx -dbZcG9apLsvOlkHzF/O+D6jCYI97WXl42ry0J1UDydBuYeZM diff --git a/hack/rs/mongo/users.adm.js b/hack/rs/mongo/users.adm.js deleted file mode 100644 index 1d0f4a36..00000000 --- a/hack/rs/mongo/users.adm.js +++ /dev/null @@ -1,5 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'adm', - pwd: 'pass', - roles: ['root'], -}); diff --git a/hack/rs/mongo/users.js b/hack/rs/mongo/users.js deleted file mode 100644 index 32986ec5..00000000 --- a/hack/rs/mongo/users.js +++ /dev/null @@ -1,11 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'source', - pwd: 'pass', - roles: ['backup', 'clusterMonitor', 'readAnyDatabase'], -}); - -db.getSiblingDB('admin').createUser({ - user: 'target', - pwd: 'pass', - roles: ['restore', 'clusterMonitor', 'clusterManager', 'readWriteAnyDatabase'], -}); diff --git a/hack/rs/run.sh b/hack/rs/run.sh index d7ce5235..6aff76cd 100755 --- a/hack/rs/run.sh +++ b/hack/rs/run.sh @@ -9,13 +9,6 @@ RDIR="$BASE/rs" export compose="$RDIR/compose.yml" -# https://www.mongodb.com/docs/v7.0/tutorial/deploy-sharded-cluster-with-keyfile-access-control/ -if [ ! -s "$RDIR/mongo/keyFile" ]; then - echo >&2 generate "$RDIR/mongo/keyFile" - openssl rand -base64 756 >"$RDIR/mongo/keyFile" - chmod 400 "$RDIR/mongo/keyFile" -fi - dcf up -d rs00 rs01 rs02 rs10 rs11 rs12 mwait "rs00:30000" diff --git a/hack/sh-ha/mongo/configsvr.conf b/hack/sh-ha/mongo/configsvr.conf index 95a5b9be..f1f7a867 100644 --- a/hack/sh-ha/mongo/configsvr.conf +++ b/hack/sh-ha/mongo/configsvr.conf @@ -2,4 +2,3 @@ systemLog.quiet: true net.bindIpAll: true storage.dbPath: /data/db sharding.clusterRole: configsvr -security.keyFile: /cfg/keyFile diff --git a/hack/sh-ha/mongo/keyFile b/hack/sh-ha/mongo/keyFile deleted file mode 100644 index 2c8d8ca5..00000000 --- a/hack/sh-ha/mongo/keyFile +++ /dev/null @@ -1,16 +0,0 @@ -iitBPDTa3PVSOnB3JxZwsJr+XBmcBYYZDPKDj9Z05bUIFIjH471QZZF9DKA9paB0 -gnYmBBLnZO8hhupYKIYBHSQBr0balLDjjKXDBHCZm/MmOJxFHkuAmKsHygUB0ZlK -3z3WeRhjaAqGKgyDCbv+Yb5GZsek5WsPVt7+oR8xdoaH9xRrAVavF5c6De8lWKRq -qCHmRdh1kcOKbHH02qE2Gfoc+kQyJbN02azasnoatcGY9gEC4Ss5XSVTmSzEo/fa -poM4KDqlgikUpqs4J1pDzJmenav1U8QgrlWVyO/JEFkKG7JGzmpo8AJ0fyaUfokg -jdkNhSAjHAsd2Q9uD0VGXvCitm0QeOYUQUEKFWaJKfdX6Dag/Fj1/lE1YRWYkiOP -IK8Aq75xoKakM8hiamPhtXCFJ1pSnuuwgGC5yP4b9XmDUHBytLse1UMGAny3dUl2 -Usx1MzylRSswu442ipzjxbsjZ9s9kGHNXaUckoUReYiuhkjWB4HBFF+3Lu5qAOQx -XohWsvseZtPDk1LBN5acXZe3WRzKwxqtiJaQWiRM1OC/G5l3nG7bI2mK6mIXjh9G -q7U+Y3ULfBwfMF3P6jSF9CsZw6WFufuEj8uLAleHokwhcz1+j6P5REkhs7jEWImw -jygpl3Utahh0JzMXP4ckIwOQgc4Oj7ZTBezmn4Q9yiHVI3pWjgadxrndyWpEMHv9 -1NT0U0hMCwfUOFXYHDzfyU/VEECzh0iX73nSXyF88gBEuuHAPb0ZOYC/RsdUKxIs -iqOSd04tRQNkBBdUhhjYqMn1cf4EFzbGSaqB87IqdCyVzljYejy0Dp3LxmB5tZEn -2Rm5w77dHVzcgJY23wpjnA83Biu3SNmbC12+keGX4TURdSJfhG/RX2uplr8T8aPR -yvd85NzX0i6XiH5mVqcgADE2PwSOJsEArz14voj1Yqnb87gNDkZPVyFF37r9n0PF -ZpOJqVy/rkSWGa3pAMHVk0M7HKCpf2pC1uGpoxp3+wjpKa4L diff --git a/hack/sh-ha/mongo/mongos.conf b/hack/sh-ha/mongo/mongos.conf index 8984d3e2..8dd37c46 100644 --- a/hack/sh-ha/mongo/mongos.conf +++ b/hack/sh-ha/mongo/mongos.conf @@ -1,3 +1,2 @@ systemLog.quiet: true net.bindIpAll: true -security.keyFile: /cfg/keyFile diff --git a/hack/sh-ha/mongo/shardsvr.conf b/hack/sh-ha/mongo/shardsvr.conf index 2247f32f..e425519b 100644 --- a/hack/sh-ha/mongo/shardsvr.conf +++ b/hack/sh-ha/mongo/shardsvr.conf @@ -2,4 +2,3 @@ systemLog.quiet: true net.bindIpAll: true storage.dbPath: /data/db sharding.clusterRole: shardsvr -security.keyFile: /cfg/keyFile diff --git a/hack/sh-ha/mongo/users.adm.js b/hack/sh-ha/mongo/users.adm.js deleted file mode 100644 index ffb6838b..00000000 --- a/hack/sh-ha/mongo/users.adm.js +++ /dev/null @@ -1,5 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'adm', - pwd: 'pass', - roles: ['root'], -}); diff --git a/hack/sh-ha/mongo/users.js b/hack/sh-ha/mongo/users.js deleted file mode 100644 index cff9241c..00000000 --- a/hack/sh-ha/mongo/users.js +++ /dev/null @@ -1,20 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'source', - pwd: 'pass', - roles: ['backup', 'clusterMonitor', 'readAnyDatabase'], -}); - -db.getSiblingDB('admin').createUser({ - user: 'target', - pwd: 'pass', - roles: ['restore', 'clusterMonitor', 'clusterManager', 'readWriteAnyDatabase'], -}); - -db.createUser({ - user: "mongodb_exporter", - pwd: "pass", - roles: [ - { role: "clusterMonitor", db: "admin" }, - { role: "read", db: "local" }, - ], -}) diff --git a/hack/sh-ha/run.sh b/hack/sh-ha/run.sh index 1c3816f6..ffc0c06d 100755 --- a/hack/sh-ha/run.sh +++ b/hack/sh-ha/run.sh @@ -9,8 +9,6 @@ source "$BASE/util" SDIR="$BASE/sh-ha" -chmod 400 "$SDIR"/mongo/keyFile - export compose=$SDIR/compose.yml # dcf up -d src-cfg0 src-rs00 src-rs10 tgt-cfg0 tgt-rs00 tgt-rs10 @@ -30,7 +28,7 @@ mwait "src-rs12:30102" rsinit "src/rs1" "src-rs10:30100" dcf up -d src-mongos && mwait "src-mongos:27017" -msh "adm:pass@src-mongos:27017" --eval " +msh "src-mongos:27017" --eval " sh.addShard('rs0/src-rs00:30000'); // sh.addShard('rs0/src-rs01:30001'); // sh.addShard('rs0/src-rs02:30002'); // @@ -55,7 +53,7 @@ mwait "tgt-rs12:40102" rsinit "tgt/rs1" "tgt-rs10:40100" dcf up -d tgt-mongos && mwait "tgt-mongos:27017" -msh "adm:pass@tgt-mongos:27017" --eval " +msh "tgt-mongos:27017" --eval " sh.addShard('rs0/tgt-rs00:40000'); // sh.addShard('rs0/tgt-rs01:40001'); // sh.addShard('rs0/tgt-rs02:40002'); // diff --git a/hack/sh/compose.yml b/hack/sh/compose.yml index 1c88598c..2ad06a39 100644 --- a/hack/sh/compose.yml +++ b/hack/sh/compose.yml @@ -67,6 +67,23 @@ services: "30100", ] + src-rs20: + image: "${MONGO_IMAGE:-percona/percona-server-mongodb:8.0}" + container_name: src-rs20 + hostname: src-rs20 + ports: ["30200:30200"] + volumes: ["src-rs20:/data/db", "./mongo/:/cfg:ro"] + command: + [ + "mongod", + "-f", + "/cfg/shardsvr.conf", + "--replSet", + "rs2", + "--port", + "30200", + ] + # ----------------- Target ----------------- tgt-mongos: image: "${MONGO_IMAGE:-percona/percona-server-mongodb:8.0}" @@ -134,10 +151,29 @@ services: "40100", ] + tgt-rs20: + image: "${MONGO_IMAGE:-percona/percona-server-mongodb:8.0}" + container_name: tgt-rs20 + hostname: tgt-rs20 + ports: ["40200:40200"] + volumes: ["tgt-rs20:/data/db", "./mongo/:/cfg:ro"] + command: + [ + "mongod", + "-f", + "/cfg/shardsvr.conf", + "--replSet", + "rs2", + "--port", + "40200", + ] + volumes: src-cfg0: src-rs00: src-rs10: + src-rs20: tgt-cfg0: tgt-rs00: tgt-rs10: + tgt-rs20: diff --git a/hack/sh/mongo/configsvr.conf b/hack/sh/mongo/configsvr.conf index 95a5b9be..f1f7a867 100644 --- a/hack/sh/mongo/configsvr.conf +++ b/hack/sh/mongo/configsvr.conf @@ -2,4 +2,3 @@ systemLog.quiet: true net.bindIpAll: true storage.dbPath: /data/db sharding.clusterRole: configsvr -security.keyFile: /cfg/keyFile diff --git a/hack/sh/mongo/keyFile b/hack/sh/mongo/keyFile deleted file mode 100644 index 2c8d8ca5..00000000 --- a/hack/sh/mongo/keyFile +++ /dev/null @@ -1,16 +0,0 @@ -iitBPDTa3PVSOnB3JxZwsJr+XBmcBYYZDPKDj9Z05bUIFIjH471QZZF9DKA9paB0 -gnYmBBLnZO8hhupYKIYBHSQBr0balLDjjKXDBHCZm/MmOJxFHkuAmKsHygUB0ZlK -3z3WeRhjaAqGKgyDCbv+Yb5GZsek5WsPVt7+oR8xdoaH9xRrAVavF5c6De8lWKRq -qCHmRdh1kcOKbHH02qE2Gfoc+kQyJbN02azasnoatcGY9gEC4Ss5XSVTmSzEo/fa -poM4KDqlgikUpqs4J1pDzJmenav1U8QgrlWVyO/JEFkKG7JGzmpo8AJ0fyaUfokg -jdkNhSAjHAsd2Q9uD0VGXvCitm0QeOYUQUEKFWaJKfdX6Dag/Fj1/lE1YRWYkiOP -IK8Aq75xoKakM8hiamPhtXCFJ1pSnuuwgGC5yP4b9XmDUHBytLse1UMGAny3dUl2 -Usx1MzylRSswu442ipzjxbsjZ9s9kGHNXaUckoUReYiuhkjWB4HBFF+3Lu5qAOQx -XohWsvseZtPDk1LBN5acXZe3WRzKwxqtiJaQWiRM1OC/G5l3nG7bI2mK6mIXjh9G -q7U+Y3ULfBwfMF3P6jSF9CsZw6WFufuEj8uLAleHokwhcz1+j6P5REkhs7jEWImw -jygpl3Utahh0JzMXP4ckIwOQgc4Oj7ZTBezmn4Q9yiHVI3pWjgadxrndyWpEMHv9 -1NT0U0hMCwfUOFXYHDzfyU/VEECzh0iX73nSXyF88gBEuuHAPb0ZOYC/RsdUKxIs -iqOSd04tRQNkBBdUhhjYqMn1cf4EFzbGSaqB87IqdCyVzljYejy0Dp3LxmB5tZEn -2Rm5w77dHVzcgJY23wpjnA83Biu3SNmbC12+keGX4TURdSJfhG/RX2uplr8T8aPR -yvd85NzX0i6XiH5mVqcgADE2PwSOJsEArz14voj1Yqnb87gNDkZPVyFF37r9n0PF -ZpOJqVy/rkSWGa3pAMHVk0M7HKCpf2pC1uGpoxp3+wjpKa4L diff --git a/hack/sh/mongo/mongos.conf b/hack/sh/mongo/mongos.conf index 8984d3e2..8dd37c46 100644 --- a/hack/sh/mongo/mongos.conf +++ b/hack/sh/mongo/mongos.conf @@ -1,3 +1,2 @@ systemLog.quiet: true net.bindIpAll: true -security.keyFile: /cfg/keyFile diff --git a/hack/sh/mongo/shardsvr.conf b/hack/sh/mongo/shardsvr.conf index 2247f32f..e425519b 100644 --- a/hack/sh/mongo/shardsvr.conf +++ b/hack/sh/mongo/shardsvr.conf @@ -2,4 +2,3 @@ systemLog.quiet: true net.bindIpAll: true storage.dbPath: /data/db sharding.clusterRole: shardsvr -security.keyFile: /cfg/keyFile diff --git a/hack/sh/mongo/src/rs2.js b/hack/sh/mongo/src/rs2.js new file mode 100644 index 00000000..9560d6df --- /dev/null +++ b/hack/sh/mongo/src/rs2.js @@ -0,0 +1,8 @@ +rs.initiate({ + _id: 'rs2', + members: [ + { _id: 0, host: 'src-rs20:30200', priority: 2 }, + // { _id: 1, host: 'rs21:30201' }, + // { _id: 2, host: 'rs22:30202' }, + ], +}); diff --git a/hack/sh/mongo/tgt/rs2.js b/hack/sh/mongo/tgt/rs2.js new file mode 100644 index 00000000..7b3fadff --- /dev/null +++ b/hack/sh/mongo/tgt/rs2.js @@ -0,0 +1,8 @@ +rs.initiate({ + _id: 'rs2', + members: [ + { _id: 0, host: 'tgt-rs20:40200', priority: 2 }, + // { _id: 1, host: 'rs21:40201' }, + // { _id: 2, host: 'rs22:40202' }, + ], +}); diff --git a/hack/sh/mongo/users.adm.js b/hack/sh/mongo/users.adm.js deleted file mode 100644 index ffb6838b..00000000 --- a/hack/sh/mongo/users.adm.js +++ /dev/null @@ -1,5 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'adm', - pwd: 'pass', - roles: ['root'], -}); diff --git a/hack/sh/mongo/users.js b/hack/sh/mongo/users.js deleted file mode 100644 index cff9241c..00000000 --- a/hack/sh/mongo/users.js +++ /dev/null @@ -1,20 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'source', - pwd: 'pass', - roles: ['backup', 'clusterMonitor', 'readAnyDatabase'], -}); - -db.getSiblingDB('admin').createUser({ - user: 'target', - pwd: 'pass', - roles: ['restore', 'clusterMonitor', 'clusterManager', 'readWriteAnyDatabase'], -}); - -db.createUser({ - user: "mongodb_exporter", - pwd: "pass", - roles: [ - { role: "clusterMonitor", db: "admin" }, - { role: "read", db: "local" }, - ], -}) diff --git a/hack/sh/run.sh b/hack/sh/run.sh index 20018a85..7fa6e7f9 100755 --- a/hack/sh/run.sh +++ b/hack/sh/run.sh @@ -1,4 +1,16 @@ #!/usr/bin/env bash +# Start MongoDB sharded clusters for source and target +# +# Usage: +# ./run.sh # Default: 2 source shards, 2 target shards +# SRC_SHARDS=1 ./run.sh # Custom source shards, default target +# TGT_SHARDS=3 ./run.sh # Default source, custom target shards +# SRC_SHARDS=3 TGT_SHARDS=1 ./run.sh # Custom both +# +# Limits: Max 3 shards each for source and target +# Services are named: src-rs{N}0 and tgt-rs{N}0 where N is the shard index (0-based) +# Ports: source shards start at 30000 (increment by 100), target shards at 40000 + export COMPOSE_PROJECT_NAME=s1 BASE=$(dirname "$(dirname "$0")") @@ -9,33 +21,86 @@ source "$BASE/util" SDIR="$BASE/sh" -chmod 400 "$SDIR"/mongo/keyFile - export compose=$SDIR/compose.yml -# dcf up -d src-cfg0 src-rs00 src-rs10 tgt-cfg0 tgt-rs00 tgt-rs10 -dcf up -d src-cfg0 src-rs00 src-rs10 +# Configuration: Number of shards for source and target clusters +# Can be overridden with environment variables: SRC_SHARDS=2 TGT_SHARDS=1 ./run.sh +SRC_SHARDS="${SRC_SHARDS:-2}" +TGT_SHARDS="${TGT_SHARDS:-2}" + +# Validate shard counts against available init scripts and compose services +MAX_SRC_SHARDS=3 # src/rs0.js, src/rs1.js, src/rs2.js +MAX_TGT_SHARDS=3 # tgt/rs0.js, tgt/rs1.js, tgt/rs2.js + +if [ "$SRC_SHARDS" -gt "$MAX_SRC_SHARDS" ]; then + echo "ERROR: SRC_SHARDS=$SRC_SHARDS exceeds maximum $MAX_SRC_SHARDS" + echo "Available init scripts: $SDIR/mongo/src/rs{0..$((MAX_SRC_SHARDS-1))}.js" + exit 1 +fi + +if [ "$TGT_SHARDS" -gt "$MAX_TGT_SHARDS" ]; then + echo "ERROR: TGT_SHARDS=$TGT_SHARDS exceeds maximum $MAX_TGT_SHARDS" + echo "Available init scripts: $SDIR/mongo/tgt/rs{0..$((MAX_TGT_SHARDS-1))}.js" + exit 1 +fi + +echo "Starting source cluster with $SRC_SHARDS shards (max: $MAX_SRC_SHARDS)" +echo "Starting target cluster with $TGT_SHARDS shards (max: $MAX_TGT_SHARDS)" + +# Build list of source shard services to start +SRC_SERVICES="src-cfg0" +for i in $(seq 0 $((SRC_SHARDS - 1))); do + SRC_SERVICES="$SRC_SERVICES src-rs${i}0" +done +# Start source config server and shards +dcf up -d $SRC_SERVICES + +# Initialize source config server mwait "src-cfg0:27000" && rsinit "src/cfg" "src-cfg0:27000" -mwait "src-rs00:30000" && rsinit "src/rs0" "src-rs00:30000" -mwait "src-rs10:30100" && rsinit "src/rs1" "src-rs10:30100" +# Initialize source shards +for i in $(seq 0 $((SRC_SHARDS - 1))); do + PORT=$((30000 + i * 100)) + mwait "src-rs${i}0:${PORT}" && rsinit "src/rs${i}" "src-rs${i}0:${PORT}" +done + +# Start source mongos dcf up -d src-mongos && mwait "src-mongos:27017" -msh "adm:pass@src-mongos:27017" --eval " - sh.addShard('rs0/src-rs00:30000'); // - sh.addShard('rs1/src-rs10:30100'); -" -# msh "adm:pass@src-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" -dcf up -d tgt-cfg0 tgt-rs00 tgt-rs10 +# Add source shards to cluster +ADD_SHARDS_CMD="" +for i in $(seq 0 $((SRC_SHARDS - 1))); do + PORT=$((30000 + i * 100)) + ADD_SHARDS_CMD="${ADD_SHARDS_CMD}sh.addShard('rs${i}/src-rs${i}0:${PORT}'); " +done +msh "src-mongos:27017" --eval "$ADD_SHARDS_CMD" + +# Build list of target shard services to start +TGT_SERVICES="tgt-cfg0" +for i in $(seq 0 $((TGT_SHARDS - 1))); do + TGT_SERVICES="$TGT_SERVICES tgt-rs${i}0" +done +# Start target config server and shards +dcf up -d $TGT_SERVICES + +# Initialize target config server mwait "tgt-cfg0:28000" && rsinit "tgt/cfg" "tgt-cfg0:28000" -mwait "tgt-rs00:40000" && rsinit "tgt/rs0" "tgt-rs00:40000" -mwait "tgt-rs10:40100" && rsinit "tgt/rs1" "tgt-rs10:40100" +# Initialize target shards +for i in $(seq 0 $((TGT_SHARDS - 1))); do + PORT=$((40000 + i * 100)) + mwait "tgt-rs${i}0:${PORT}" && rsinit "tgt/rs${i}" "tgt-rs${i}0:${PORT}" +done + +# Start target mongos dcf up -d tgt-mongos && mwait "tgt-mongos:27017" -msh "adm:pass@tgt-mongos:27017" --eval " - sh.addShard('rs0/tgt-rs00:40000'); // - sh.addShard('rs1/tgt-rs10:40100'); -" -# msh "adm:pass@tgt-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" + +# Add target shards to cluster +ADD_SHARDS_CMD="" +for i in $(seq 0 $((TGT_SHARDS - 1))); do + PORT=$((40000 + i * 100)) + ADD_SHARDS_CMD="${ADD_SHARDS_CMD}sh.addShard('rs${i}/tgt-rs${i}0:${PORT}'); " +done +msh "tgt-mongos:27017" --eval "$ADD_SHARDS_CMD" diff --git a/hack/util b/hack/util index 17a2d639..f25d81f2 100755 --- a/hack/util +++ b/hack/util @@ -51,7 +51,5 @@ rsinit() { echo "uninitialized primary: $1" exit 1 fi - msh "$2" "/cfg/users.adm.js" - msh "adm:pass@$2" "/cfg/users.js" - msh "adm:pass@$2" "/cfg/scripts/deprioritize.js" + msh "$2" "/cfg/scripts/deprioritize.js" } From 62ff3fce9ecbac6304d5c120e78d792892cc1ddf Mon Sep 17 00:00:00 2001 From: Adnan Date: Tue, 2 Dec 2025 18:23:29 +0100 Subject: [PATCH 2/3] Fix CI test failures by removing authentication from workflows - Root cause: Local dev removed auth in b2aac89, but CI workflows still had partial auth setup causing WaitTimeoutError in test_drop_capped_collection and test_drop_database tests - Delete user creation scripts from CI (users.adm.js, users.js) - Update util scripts to skip user creation in rsinit function - Remove adm:pass@ credentials from mongos connections in sh/run - Update e2etests.yml to use connection strings without credentials - Ensures consistency: both CI and local dev now run without authentication --- .github/workflows/e2etests.yml | 8 ++++---- .github/workflows/rs/mongo/users.adm.js | 5 ----- .github/workflows/rs/mongo/users.js | 11 ----------- .github/workflows/rs/util | 4 +--- .github/workflows/sh/mongo/users.adm.js | 5 ----- .github/workflows/sh/mongo/users.js | 20 -------------------- .github/workflows/sh/run | 8 ++++---- .github/workflows/sh/util | 4 +--- 8 files changed, 10 insertions(+), 55 deletions(-) delete mode 100644 .github/workflows/rs/mongo/users.adm.js delete mode 100644 .github/workflows/rs/mongo/users.js delete mode 100644 .github/workflows/sh/mongo/users.adm.js delete mode 100644 .github/workflows/sh/mongo/users.js diff --git a/.github/workflows/e2etests.yml b/.github/workflows/e2etests.yml index 63983cf3..bff0e214 100644 --- a/.github/workflows/e2etests.yml +++ b/.github/workflows/e2etests.yml @@ -46,8 +46,8 @@ jobs: - name: Run tests (pytest) run: | - export TEST_SOURCE_URI=mongodb://adm:pass@rs00:30000 - export TEST_TARGET_URI=mongodb://adm:pass@rs10:30100 + export TEST_SOURCE_URI=mongodb://rs00:30000 + export TEST_TARGET_URI=mongodb://rs10:30100 export TEST_PCSM_URL=http://127.0.0.1:2242 export TEST_PCSM_BIN=./bin/pcsm_test @@ -96,8 +96,8 @@ jobs: - name: Run tests (pytest) run: | - export TEST_SOURCE_URI=mongodb://adm:pass@src-mongos:27017 - export TEST_TARGET_URI=mongodb://adm:pass@tgt-mongos:29017 + export TEST_SOURCE_URI=mongodb://src-mongos:27017 + export TEST_TARGET_URI=mongodb://tgt-mongos:29017 export TEST_PCSM_URL=http://127.0.0.1:2242 export TEST_PCSM_BIN=./bin/pcsm_test diff --git a/.github/workflows/rs/mongo/users.adm.js b/.github/workflows/rs/mongo/users.adm.js deleted file mode 100644 index 1d0f4a36..00000000 --- a/.github/workflows/rs/mongo/users.adm.js +++ /dev/null @@ -1,5 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'adm', - pwd: 'pass', - roles: ['root'], -}); diff --git a/.github/workflows/rs/mongo/users.js b/.github/workflows/rs/mongo/users.js deleted file mode 100644 index 32986ec5..00000000 --- a/.github/workflows/rs/mongo/users.js +++ /dev/null @@ -1,11 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'source', - pwd: 'pass', - roles: ['backup', 'clusterMonitor', 'readAnyDatabase'], -}); - -db.getSiblingDB('admin').createUser({ - user: 'target', - pwd: 'pass', - roles: ['restore', 'clusterMonitor', 'clusterManager', 'readWriteAnyDatabase'], -}); diff --git a/.github/workflows/rs/util b/.github/workflows/rs/util index fdf7c6e7..5e1c2767 100755 --- a/.github/workflows/rs/util +++ b/.github/workflows/rs/util @@ -51,7 +51,5 @@ rsinit() { echo "uninitialized primary: $1" exit 1 fi - msh "$2" "/cfg/users.adm.js" - msh "adm:pass@$2" "/cfg/users.js" - msh "adm:pass@$2" "/cfg/scripts/deprioritize.js" + msh "$2" "/cfg/scripts/deprioritize.js" } diff --git a/.github/workflows/sh/mongo/users.adm.js b/.github/workflows/sh/mongo/users.adm.js deleted file mode 100644 index ffb6838b..00000000 --- a/.github/workflows/sh/mongo/users.adm.js +++ /dev/null @@ -1,5 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'adm', - pwd: 'pass', - roles: ['root'], -}); diff --git a/.github/workflows/sh/mongo/users.js b/.github/workflows/sh/mongo/users.js deleted file mode 100644 index cff9241c..00000000 --- a/.github/workflows/sh/mongo/users.js +++ /dev/null @@ -1,20 +0,0 @@ -db.getSiblingDB('admin').createUser({ - user: 'source', - pwd: 'pass', - roles: ['backup', 'clusterMonitor', 'readAnyDatabase'], -}); - -db.getSiblingDB('admin').createUser({ - user: 'target', - pwd: 'pass', - roles: ['restore', 'clusterMonitor', 'clusterManager', 'readWriteAnyDatabase'], -}); - -db.createUser({ - user: "mongodb_exporter", - pwd: "pass", - roles: [ - { role: "clusterMonitor", db: "admin" }, - { role: "read", db: "local" }, - ], -}) diff --git a/.github/workflows/sh/run b/.github/workflows/sh/run index f8f06d30..72481c9f 100755 --- a/.github/workflows/sh/run +++ b/.github/workflows/sh/run @@ -13,11 +13,11 @@ mwait "src-rs00:30000" && rsinit "src/rs0" "src-rs00:30000" mwait "src-rs10:30100" && rsinit "src/rs1" "src-rs10:30100" dcf up -d src-mongos && mwait "src-mongos:27017" -msh "adm:pass@src-mongos:27017" --eval " +msh "src-mongos:27017" --eval " sh.addShard('rs0/src-rs00:30000'); // sh.addShard('rs1/src-rs10:30100'); " -msh "adm:pass@src-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" +msh "src-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" dcf up -d tgt-cfg0 tgt-rs00 tgt-rs10 @@ -26,8 +26,8 @@ mwait "tgt-rs00:40000" && rsinit "tgt/rs0" "tgt-rs00:40000" mwait "tgt-rs10:40100" && rsinit "tgt/rs1" "tgt-rs10:40100" dcf up -d tgt-mongos && mwait "tgt-mongos:27017" -msh "adm:pass@tgt-mongos:27017" --eval " +msh "tgt-mongos:27017" --eval " sh.addShard('rs0/tgt-rs00:40000'); // sh.addShard('rs1/tgt-rs10:40100'); " -msh "adm:pass@tgt-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" +msh "tgt-mongos:27017" --eval "db.adminCommand('transitionFromDedicatedConfigServer');" diff --git a/.github/workflows/sh/util b/.github/workflows/sh/util index 43c3eee9..8f43df1c 100755 --- a/.github/workflows/sh/util +++ b/.github/workflows/sh/util @@ -55,7 +55,5 @@ rsinit() { echo "uninitialized primary: $1" exit 1 fi - msh "$2" "/cfg/users.adm.js" - msh "adm:pass@$2" "/cfg/users.js" - msh "adm:pass@$2" "/cfg/scripts/deprioritize.js" + msh "$2" "/cfg/scripts/deprioritize.js" } From f4e8ec9e69d1af31fb0a89f908e74e2e69109382 Mon Sep 17 00:00:00 2001 From: Adnan Date: Fri, 5 Dec 2025 14:20:11 +0100 Subject: [PATCH 3/3] Simplify port assignment using explicit arrays --- hack/sh/run.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/hack/sh/run.sh b/hack/sh/run.sh index 7fa6e7f9..c8e95c86 100755 --- a/hack/sh/run.sh +++ b/hack/sh/run.sh @@ -28,9 +28,14 @@ export compose=$SDIR/compose.yml SRC_SHARDS="${SRC_SHARDS:-2}" TGT_SHARDS="${TGT_SHARDS:-2}" -# Validate shard counts against available init scripts and compose services -MAX_SRC_SHARDS=3 # src/rs0.js, src/rs1.js, src/rs2.js -MAX_TGT_SHARDS=3 # tgt/rs0.js, tgt/rs1.js, tgt/rs2.js +# Port mappings for each shard (must match compose.yml) +# Source shards: rs0=30000, rs1=30100, rs2=30200 +# Target shards: rs0=40000, rs1=40100, rs2=40200 +SRC_SHARD_PORTS=(30000 30100 30200) +TGT_SHARD_PORTS=(40000 40100 40200) + +MAX_SRC_SHARDS=${#SRC_SHARD_PORTS[@]} +MAX_TGT_SHARDS=${#TGT_SHARD_PORTS[@]} if [ "$SRC_SHARDS" -gt "$MAX_SRC_SHARDS" ]; then echo "ERROR: SRC_SHARDS=$SRC_SHARDS exceeds maximum $MAX_SRC_SHARDS" @@ -61,7 +66,7 @@ mwait "src-cfg0:27000" && rsinit "src/cfg" "src-cfg0:27000" # Initialize source shards for i in $(seq 0 $((SRC_SHARDS - 1))); do - PORT=$((30000 + i * 100)) + PORT=${SRC_SHARD_PORTS[$i]} mwait "src-rs${i}0:${PORT}" && rsinit "src/rs${i}" "src-rs${i}0:${PORT}" done @@ -71,7 +76,7 @@ dcf up -d src-mongos && mwait "src-mongos:27017" # Add source shards to cluster ADD_SHARDS_CMD="" for i in $(seq 0 $((SRC_SHARDS - 1))); do - PORT=$((30000 + i * 100)) + PORT=${SRC_SHARD_PORTS[$i]} ADD_SHARDS_CMD="${ADD_SHARDS_CMD}sh.addShard('rs${i}/src-rs${i}0:${PORT}'); " done msh "src-mongos:27017" --eval "$ADD_SHARDS_CMD" @@ -90,7 +95,7 @@ mwait "tgt-cfg0:28000" && rsinit "tgt/cfg" "tgt-cfg0:28000" # Initialize target shards for i in $(seq 0 $((TGT_SHARDS - 1))); do - PORT=$((40000 + i * 100)) + PORT=${TGT_SHARD_PORTS[$i]} mwait "tgt-rs${i}0:${PORT}" && rsinit "tgt/rs${i}" "tgt-rs${i}0:${PORT}" done @@ -100,7 +105,7 @@ dcf up -d tgt-mongos && mwait "tgt-mongos:27017" # Add target shards to cluster ADD_SHARDS_CMD="" for i in $(seq 0 $((TGT_SHARDS - 1))); do - PORT=$((40000 + i * 100)) + PORT=${TGT_SHARD_PORTS[$i]} ADD_SHARDS_CMD="${ADD_SHARDS_CMD}sh.addShard('rs${i}/tgt-rs${i}0:${PORT}'); " done msh "tgt-mongos:27017" --eval "$ADD_SHARDS_CMD"