Skip to content

Commit

Permalink
Merge 090dab5 into 6b3a6d1
Browse files Browse the repository at this point in the history
  • Loading branch information
beautifulentropy committed Mar 10, 2021
2 parents 6b3a6d1 + 090dab5 commit 6a24da3
Show file tree
Hide file tree
Showing 10 changed files with 324 additions and 39 deletions.
6 changes: 4 additions & 2 deletions .github/workflows/boulder-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,11 @@ jobs:
- "docker-compose run --use-aliases boulder ./test.sh --integration"
# Config changes that have landed in main but not yet been applied to
# production can be made in boulder-config-next.json.
- "docker-compose run --use-aliases boulder ./test.sh --integration --config-next"
# Database migrations in `sa/_db-next/migrations` are only performed
# when `docker-compose` is called using the `bouldernext` alias
- "docker-compose -f docker-compose.yml -f docker-compose.next.yml run --use-aliases boulder ./test.sh --integration"
- "docker-compose run --use-aliases boulder ./test.sh --unit --enable-race-detection"
- "docker-compose run --use-aliases boulder ./test.sh --unit --enable-race-detection --config-next"
- "docker-compose -f docker-compose.yml -f docker-compose.next.yml run --use-aliases boulder ./test.sh --unit --enable-race-detection"
- "docker-compose run --use-aliases boulder ./test.sh --start-py"
# gomod-vendor runs with a separate network access definition
# because it needs to fetch packages from GitHub et. al., which
Expand Down
6 changes: 3 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ env:
- TESTFLAGS="--lints --integration --generate --rpm"
# Config changes that have landed in main but not yet been applied to
# production can be made in boulder-config-next.json.
- TESTFLAGS="--integration --config-next"
- TESTFLAGS="--integration" OVERRIDES="-f docker-compose.yml -f docker-compose.next.yml"
- TESTFLAGS="--unit --enable-race-detection"
- TESTFLAGS="--unit --enable-race-detection --config-next"
- TESTFLAGS="--unit --enable-race-detection" OVERRIDES="-f docker-compose.yml -f docker-compose.next.yml"
- TESTFLAGS="--start-py"
# gomod-vendor runs with a separate container because it needs to fetch
# packages from GitHub et. al., which is incompatible with the DNS server
Expand All @@ -51,7 +51,7 @@ before_script:

script:
- >-
docker-compose run --use-aliases
docker-compose ${OVERRIDES} run --use-aliases
-e TRAVIS_BRANCH
-e TRAVIS_JOB_ID
-e TRAVIS_PULL_REQUEST
Expand Down
16 changes: 16 additions & 0 deletions docker-compose.next.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
version: '3'
services:
boulder:
environment:
FAKE_DNS: 10.77.77.77
BOULDER_CONFIG_DIR: test/config-next
GOFLAGS: -mod=vendor
# This is required so Python doesn't throw an error when printing
# non-ASCII to stdout.
PYTHONIOENCODING: utf-8
# These are variables you can set to affect what tests get run or
# how they are run. Including them here with no value means they are
# passed through from the environment.
RUN: ""
INT_FILTER: ""
RACE: ""
1 change: 1 addition & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ services:
environment:
GO111MODULE: "on"
GOFLAGS: "-mod=vendor"
BOULDER_CONFIG_DIR: test/config
networks:
- bluenet
volumes:
Expand Down
10 changes: 0 additions & 10 deletions sa/_db-next/dbconf.yml

This file was deleted.

1 change: 1 addition & 0 deletions sa/_db-next/dbconf.yml
1 change: 1 addition & 0 deletions sa/_db-next/migrations/19700101000000_CombinedSchema.sql
232 changes: 232 additions & 0 deletions sa/migrations.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
#!/usr/bin/env bash

# -e Stops execution in the instance of a command or pipeline error
# -u Treat unset variables as an error and exit immediately
set -eu

# Run all tests and coverage checks. Called from Travis automatically, also
# suitable to run manually. See list of prerequisite packages in .travis.yml
if type realpath >/dev/null 2>&1 ; then
cd "$(realpath -- $(dirname -- "$0"))"
fi

#
# Defaults
#
DB_NEXT_PATH="_db-next/migrations"
esc=$'\033'
aesc="${esc}[" # posix compliant escape sequence
OUTCOME="ERROR"
PROMOTE=()
RUN=()

#
# Print Functions
#
function print_outcome() {
if [ "$OUTCOME" == OK ]
then
echo -e "${aesc}0;32m""$OUTCOME""${aesc}0m"
else
echo -e "${aesc}0;31m""$OUTCOME""${aesc}0m"
fi
}

function print_usage_exit() {
echo "$USAGE"
exit 0
}

function print_heading() {
echo
echo -e "${aesc}0;34m"$1"${aesc}0m"
}

function print_from() {
echo -e "from: ${aesc}0;36m"$1"${aesc}0m"
}

function print_to() {
echo -e "to: ${aesc}0;32m"$1"${aesc}0m"
}

#
# CLI Helper Functions
#
function check_arg() {
if [ -z "$OPTARG" ]
then
exit_msg "No arg for --$OPT option, use: -h for help">&2
fi
}

function exit_msg() {
# complain to STDERR and exit with error
echo "$*" >&2
exit 2
}

#
# Utility Functions
#
function get_migrations() {
migrations=( $(find $DB_NEXT_PATH -mindepth 1 -maxdepth 1 -not -path '*/\.*' -type "$1" 2> /dev/null | sort) )
if [ -z "${migrations[@]+x}" ]
then
echo "There are no migrations at path: "\"$DB_NEXT_PATH\"""
exit 1
fi
}

function list_next() {
print_heading "Next Schemas"
get_migrations "f"
iter=1
migopts=()
for mig_file in "${migrations[@]}"
do
echo ""$iter") $(basename -- "${mig_file}")"
migopts+=("$iter")
iter=$(expr "$iter" + 1)
done
}

function list_current() {
print_heading "Current Schemas"
get_migrations "l"
iter=0
for mig_file in "${migrations[@]}"
do
echo "[$iter] $(basename -- "${mig_file}")"
iter=$(expr $iter + 1)
done
}

function promote_schema() {
print_heading "Promote Schema"
get_migrations "f"
declare -a mig_index=()
declare -A mig_file=()
for i in "${!migrations[@]}"; do
mig_index[$i]="${migrations[$i]%% *}"
mig_file[${mig_index[$i]}]="${migrations[$i]#* }"
done

promote=""
PS3='Which schema would you like to promote? (q to cancel): '
select opt in "${mig_index[@]}"; do
case "$opt" in
"") echo "Invalid option or cancelled, exiting..." ; break ;;
*) promote="${mig_file[$opt]}" ; break ;;
esac
done
if [ ! -z "$promote" ]
then
schema_name="$(basename -- "$promote")"
promoted_path="_db/migrations/"$schema_name""

print_heading "Promoting Schema"
print_from "$promote"
print_to "$promoted_path"
mv "$promote" "$promoted_path"
ln -s "$(realpath "$promoted_path")" "$DB_NEXT_PATH"
fi
}

function demote_schema() {
print_heading "Demote Schema"
get_migrations "l"
declare -a mig_index=()
declare -A mig_file=()
for i in "${!migrations[@]}"; do
mig_index[$i]="${migrations[$i]%% *}"
mig_file[${mig_index[$i]}]="${migrations[$i]#* }"
done

demote=""
PS3='Which schema would you like to demote? (q to cancel): '
select opt in "${mig_index[@]}"; do
case "$opt" in
"") echo "Invalid option or cancelled, exiting..." ; break ;;
*) demote="${mig_file[$opt]}" ; break ;;
esac
done
if [ ! -z "$demote" ]
then
schema_name="$(basename -- "$demote")"
promoted_path="_db/migrations/"$schema_name""

print_heading "Demoting Schema"
print_from "_db/migrations/"$schema_name""
print_to "$demote"
rm "$demote"
mv "$promoted_path" "$demote"
fi
}

#
# Main CLI Parser
#
USAGE="$(cat -- <<-EOM
Usage:
Boulder DB Migrations CLI:
Helper for listing, promoting, and demoting Boulder schema files
./$(basename "${0}") [OPTION]...
-l, --list-next Lists schemas exclusively present in sa/db-next
-c, --list-current Lists schemas exclusively present in sa/db
-p, --promote Promotes a given schema from sa/db-next to sa/db
-d, --demote Demotes a given schema from sa/db to sa/db-next
-h, --help Shows this help message
EOM
)"

while getopts nchpd-: OPT; do
if [ "$OPT" = - ]; then # long option: reformulate OPT and OPTARG
OPT="${OPTARG%%=*}" # extract long option name
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty)
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=`
fi
case "$OPT" in
n | list-next ) RUN+=("list_next") ;;
c | list-current ) RUN+=("list_current") ;;
p | promote ) RUN+=("promote") ;;
d | demote ) RUN+=("demote") ;;
h | help ) print_usage_exit ;;
??* ) exit_msg "Illegal option --$OPT" ;; # bad long option
? ) exit 2 ;; # bad short option (error reported via getopts)
esac
done
shift $((OPTIND-1)) # remove parsed migrations and args from $@ list

# On EXIT, trap and print outcome
trap "print_outcome" EXIT

STEP="list_next"
if [[ "${RUN[@]}" =~ "$STEP" ]] ; then
list_next
fi

STEP="list_current"
if [[ "${RUN[@]}" =~ "$STEP" ]] ; then
list_current
fi

STEP="promote"
if [[ "${RUN[@]}" =~ "$STEP" ]] ; then
promote_schema
fi

STEP="demote"
if [[ "${RUN[@]}" =~ "$STEP" ]] ; then
demote_schema
fi


# Because set -e stops execution in the instance of a command or pipeline
# error; if we got here we assume success
OUTCOME="OK"
1 change: 0 additions & 1 deletion test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ fi
# Defaults
#
export RACE="false"
export BOULDER_CONFIG_DIR="test/config"
STAGE="starting"
STATUS="FAILURE"
RUN=()
Expand Down

0 comments on commit 6a24da3

Please sign in to comment.