diff --git a/tools/ansible/roles/dockerfile/files/wait-for-migrations b/tools/ansible/roles/dockerfile/files/wait-for-migrations new file mode 100755 index 0000000000..3c92f2630c --- /dev/null +++ b/tools/ansible/roles/dockerfile/files/wait-for-migrations @@ -0,0 +1,51 @@ +#!/bin/bash + +set -o errexit +set -o nounset + +readonly CMDNAME=$(basename "$0") + +readonly MIN_SLEEP=0.5 +readonly MAX_SLEEP=30 +readonly ATTEMPTS=10 +readonly TIMEOUT=60 + +log_message() { echo "[${CMDNAME}]" "$@" >&2; } +log_error() { echo "[${CMDNAME}] ERROR:" "$@" >&2; } + +# Args: last_sleep +next_sleep() { + awk "BEGIN {ns = ${1} * 2; ns = ns > ${MAX_SLEEP} ? ${MAX_SLEEP} : ns; print(ns)}" +} + +wait_for() { + local rc=1 + local attempt=1 + local next_sleep="${MIN_SLEEP}" + + while true; do + log_message "Attempt ${attempt} of ${ATTEMPTS}" + + timeout "${TIMEOUT}" \ + /bin/bash -c "! awx-manage showmigrations | grep '\[ \]'" &>/dev/null \ + && return || rc=$? + + (( ++attempt > ATTEMPTS )) && break + + log_message "Waiting ${next_sleep} seconds before next attempt" + sleep "${next_sleep}" + next_sleep=$(next_sleep ${next_sleep}) + done + + return $rc +} + +main() { + log_message "Waiting for database migrations..." + if ! wait_for "$@"; then + log_message "ERROR: Database migrations not applied" + exit 1 + fi +} + +main "$@" diff --git a/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 b/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 index bbdcfadcf5..ab2964b728 100644 --- a/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 +++ b/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 @@ -181,6 +181,7 @@ RUN openssl req -nodes -newkey rsa:2048 -keyout /etc/nginx/nginx.key -out /etc/n # Create default awx rsyslog config ADD tools/ansible/roles/dockerfile/files/rsyslog.conf /var/lib/awx/rsyslog/rsyslog.conf +ADD tools/ansible/roles/dockerfile/files/wait-for-migrations /usr/local/bin/wait-for-migrations ## File mappings {% if build_dev|bool %} diff --git a/tools/docker-compose/ansible/roles/sources/templates/docker-compose.yml.j2 b/tools/docker-compose/ansible/roles/sources/templates/docker-compose.yml.j2 index 34d32df891..8f884f9150 100644 --- a/tools/docker-compose/ansible/roles/sources/templates/docker-compose.yml.j2 +++ b/tools/docker-compose/ansible/roles/sources/templates/docker-compose.yml.j2 @@ -18,6 +18,9 @@ services: SDB_PORT: {{ awx_sdb_port_start }} AWX_GROUP_QUEUES: tower RECEPTORCTL_SOCKET: /var/run/receptor/receptor.sock +{% if loop.index == 1 %} + RUN_MIGRATIONS: 1 +{% endif %} links: - postgres - redis_{{ container_postfix }} diff --git a/tools/docker-compose/bootstrap_development.sh b/tools/docker-compose/bootstrap_development.sh index b1cd48e4eb..3f3cb586a3 100755 --- a/tools/docker-compose/bootstrap_development.sh +++ b/tools/docker-compose/bootstrap_development.sh @@ -12,7 +12,13 @@ make awx-link # AWX bootstrapping make version_file -make migrate + +if [[ -n "$RUN_MIGRATIONS" ]]; then + make migrate +else + wait-for-migrations +fi + make init