#!/bin/bash . lib/common set -e DBNAME=$(relation-get dbname) || { DBNAME="${BASE_SERVICE_NAME//\./_}" relation-set dbname "$DBNAME" } dbs=$(mongo:db:ls) || exit 1 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 ## 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 exit 0 fi if [[ "$out" == *"\"ok\" : 1"* ]]; then exit 0 fi err Replicate Set initialisation failed echo "$out" >&2