From 949d15a0e9a93d5afb21139b93c07f17b432d704 Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Sat, 6 Aug 2022 16:18:45 +0200 Subject: [PATCH] fix: [mongo] make charm compatible with mongo versions >= ``4.2`` Signed-off-by: Valentin Lab --- mongo/hooks/mongo_database-relation-joined | 67 +++++++++++++++------- mongo/lib/common | 12 ++++ 2 files changed, 59 insertions(+), 20 deletions(-) diff --git a/mongo/hooks/mongo_database-relation-joined b/mongo/hooks/mongo_database-relation-joined index 41409a4..eed4b1b 100755 --- a/mongo/hooks/mongo_database-relation-joined +++ b/mongo/hooks/mongo_database-relation-joined @@ -10,8 +10,55 @@ DBNAME=$(relation-get dbname) || { } +## From: https://stackoverflow.com/questions/16989598 +function version_gt() { test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1"; } + + ensure_db_docker_running + +## ReplicaSet initialization + +cmd="rs.initiate({ _id: 'rs01', members: [ { _id: 0, host: '$TARGET_SERVICE_NAME:27017' } ]})" +debug "${WHITE}running:$NORMAL $cmd" + +out=$(ddb < <(echo "use $DBNAME"; + echo "$cmd")) + +if [[ "$out" == *"\"codeName\" : \"AlreadyInitialized\""* ]]; then + info "ReplicaSet already initialized." +elif [[ "$out" == *"\"ok\" : 1"* ]]; then + info "ReplicaSet initialized. " +else + err "ReplicaSet initialisation failed:" + echo "$out" >&2 + exit 13 +fi + + +## Enable read if db version >= 4.2 + +if ! version=$(mongo:db:version); then + err "Couldn't get database version" + exit 1 +fi + +echo "Current mongo database version: '$version'." >&2 + +if version_gt "$version" 4.1; then + cmd="db.getMongo().setSecondaryOk()" + debug "${WHITE}running:$NORMAL $cmd" + + out=$(ddb < <(echo "use $DBNAME"; + echo "$cmd")) || { + err "Failed database command. Output:" + echo "$out" | prefix " | " >&2 + exit 1 + } + +fi + + if dbs=$(mongo:db:ls); then if matching_db=$(e "$dbs" | egrep "[a-zA-Z0-9.-_]*_${DBNAME}"); then if e "$dbs" | grep "^${DBNAME}$"; then @@ -41,23 +88,3 @@ else exit 14 fi -## ReplicaSet initialization - -cmd="rs.initiate({ _id: 'rs01', members: [ { _id: 0, host: '$TARGET_SERVICE_NAME:27017' } ]})" -debug "${WHITE}running:$NORMAL $cmd" - -out=$(ddb < <(echo "use $DBNAME"; - echo "$cmd")) - -if [[ "$out" == *"\"codeName\" : \"AlreadyInitialized\""* ]]; then - info "ReplicaSet already initialized." -elif [[ "$out" == *"\"ok\" : 1"* ]]; then - info "ReplicaSet initialized. " -else - err "ReplicaSet initialisation failed:" - echo "$out" >&2 - exit 13 -fi - - - diff --git a/mongo/lib/common b/mongo/lib/common index 9824eee..cf3bf7e 100644 --- a/mongo/lib/common +++ b/mongo/lib/common @@ -90,4 +90,16 @@ EOF return 1 fi debug "$out" +} + + +mongo:db:version() { + local out + if out=$(ddb < <(echo "db.version()")); then + e "$out" + return 0 + else + err "Could not query version of database." + return 1 + fi } \ No newline at end of file