| #!/usr/bin/env bash |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # Script for running the Traffic Ops DB migration tests. |
| # |
| DB_SERVER=db |
| DB_PORT=5432 |
| DB_USER=postgres |
| DB_USER_PASS=twelve |
| DB_NAME=traffic_ops |
| export PGHOST="$DB_SERVER" PGPORT="$DB_PORT" PGUSER="$DB_USER" PGDATABASE="$DB_NAME" |
| |
| # Write config files |
| set -x |
| if [[ ! -r /db-config.sh ]]; then |
| echo "/db-config.sh not found/readable" |
| exit 1 |
| fi |
| . /db-config.sh |
| |
| postgresql_package="$(<<<"postgresql${POSTGRES_VERSION}" sed 's/\.//g' | |
| sed -E 's/([0-9]{2})[0-9]+/\1/g' |
| )" |
| pg_isready=$(rpm -ql "$postgresql_package" | grep bin/pg_isready) |
| if [[ ! -x "$pg_isready" ]] ; then |
| echo "Can't find pg_ready in ${postgresql_package}" |
| exit 1 |
| fi |
| |
| while ! $pg_isready -h"$DB_SERVER" -p"$DB_PORT" -d "$DB_NAME"; do |
| echo "waiting for db on $DB_SERVER $DB_PORT" |
| sleep 3 |
| done |
| |
| echo "*:*:*:postgres:$DB_USER_PASS" > "${HOME}/.pgpass" |
| echo "*:*:*:traffic_ops:$DB_USER_PASS" >> "${HOME}/.pgpass" |
| chmod 0600 "${HOME}/.pgpass" |
| |
| export TO_DIR=/opt/traffic_ops/app |
| |
| export PATH=/usr/local/go/bin:/opt/traffic_ops/go/bin:$PATH |
| export GOPATH=/opt/traffic_ops/go |
| |
| # gets the current DB version. On success, output the version number. On failure, output a failure message starting with 'failed'. |
| get_current_db_version() { |
| local dbversion_output |
| if ! dbversion_output="$(./db/admin --env=production dbversion 2>&1)"; then |
| echo "failed to get dbversion: $dbversion_output" |
| return |
| fi |
| local version=$(echo "$dbversion_output" | egrep '^dbversion [[:digit:]]+$' | awk '{print $2}') |
| if [[ -z "$version" ]]; then |
| echo "failed to get dbversion from output: $db_version_output" |
| return |
| fi |
| echo "$version" |
| } |
| |
| get_db_dumps() { |
| find /db_dumps -name '*.dump' |
| } |
| |
| db_is_empty=true |
| |
| for d in $(get_db_dumps); do |
| db_is_empty=false |
| echo "checking integrity of DB dump: $d" |
| pg_restore -l "$d" > /dev/null || { echo "invalid DB dump: $d. Unable to list contents"; exit 1; } |
| done |
| |
| cd "$TO_DIR" |
| # This NEEDS to be updated if migrations are squashed. It should be the |
| # timestamp of the oldest extant migration. |
| # TODO: this can be determined automatically from an inspection of the migrations dir |
| FIRST_MIGRATION=2022011112591400 |
| |
| old_db_version=$FIRST_MIGRATION |
| |
| if [[ "$db_is_empty" = false ]]; then |
| old_db_version=$(get_current_db_version) |
| [[ "$old_db_version" =~ ^failed ]] && { echo "get_current_db_version failed: $old_db_version"; exit 1; } |
| fi |
| |
| # reset the DB if it is empty (i.e. no db.dump was provided) |
| if [[ "$old_db_version" -eq $FIRST_MIGRATION ]]; then |
| db_is_empty=true |
| ./db/admin --env=production reset || { echo "DB reset failed!"; exit 1; } |
| fi |
| |
| # applies migrations then performs seeding and patching |
| ./db/admin --env=production upgrade || { echo "DB upgrade failed!"; exit 1; } |
| |
| new_db_version=$(get_current_db_version) |
| [[ "$new_db_version" =~ ^failed ]] && { echo "get_current_db_version failed: $new_db_version"; exit 1; } |
| |
| # downgrade the DB until the initial DB version |
| while [[ "$new_db_version" != "$old_db_version" ]]; do |
| ./db/admin --env=production down || { echo "DB downgrade failed!"; exit 1; } |
| new_db_version=$(get_current_db_version) |
| [[ "$new_db_version" =~ ^failed ]] && { echo "get_current_db_version failed: $new_db_version"; exit 1; } |
| done |
| |
| # test full restoration of the initial DB dump |
| for d in $(get_db_dumps); do |
| echo "testing restoration of DB dump: $d" |
| dropdb --echo --if-exists "$DB_NAME" < "$d" > /dev/null || echo "Dropping DB ${DB_NAME} failed: $d" |
| createdb --echo < "$d" > /dev/null || echo "Creating DB ${DB_NAME} failed: $d" |
| pg_restore --verbose --clean --if-exists --exit-on-error -d "$DB_NAME" < "$d" > /dev/null || { echo "DB restoration failed: $d"; exit 1; } |
| done |