You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.9 KiB
106 lines
2.9 KiB
#!/bin/bash
|
|
|
|
. lib/common
|
|
|
|
set -e
|
|
|
|
DBNAME=$(relation-get dbname) || {
|
|
DBNAME="${BASE_SERVICE_NAME//\./_}"
|
|
relation-set dbname "$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
|
|
err "Error: unexpected database '$matching_db'" \
|
|
"found along with database named '${DBNAME}'."
|
|
exit 1
|
|
fi
|
|
## Let's take for granted that only current source service is
|
|
## concerned by the database. We need to restart source service
|
|
## container only if already running.
|
|
container_ids=($(get_running_containers_for_service "$MASTER_BASE_SERVICE_NAME"))
|
|
for container_id in "${container_ids[@]}"; do
|
|
mongo_url=$(docker:container:env_get "$container_id" MONGO_URL) || return 1
|
|
if [[ "$mongo_url" == */"${matching_db}"* ]]; then
|
|
info "Attempting to stop current containers of service $MASTER_BASE_SERVICE_NAME"
|
|
docker stop -t 5 "$container_id"
|
|
fi
|
|
done
|
|
|
|
mongo:db:rename "$matching_db" "${DBNAME}"
|
|
|
|
## we DO NOT want to start the stopped container again as they are not
|
|
## properly configured
|
|
fi
|
|
else
|
|
err "Failed to query for database list"
|
|
exit 14
|
|
fi
|
|
|
|
|
|
major_version=${version%.*}
|
|
|
|
## XXXvlab: why don't we do this initialisation in init ?
|
|
cmd="db.adminCommand( { setFeatureCompatibilityVersion: \"${major_version}\" } )"
|
|
debug "${WHITE}running:$NORMAL $cmd"
|
|
|
|
out=$(ddb < <(echo "use $DBNAME";
|
|
echo "$cmd"))
|
|
if [[ "$out" == *"\"ok\" : 1"* ]]; then
|
|
info "Feature Compatibility set to ${major_version}. "
|
|
else
|
|
err "Failed to set feature compatibieplicaSet initialisation failed:"
|
|
echo "$out" | prefix " | " >&2
|
|
exit 13
|
|
fi
|