2022-10-12 10:22:22 -04:00
#!/usr/bin/env bash
function error_handler() {
2024-07-18 11:37:30 -04:00
echo >&2 "Exited with BAD EXIT CODE '${2}' in ${0} script at line: ${1}."
2022-10-12 10:22:22 -04:00
exit "$2"
}
trap 'error_handler ${LINENO} $?' ERR
set -o errtrace -o errexit -o nounset -o pipefail
export FLASK_SESSION_SECRET_KEY="this_is_recreate_db_secret_key"
2023-02-15 17:07:12 -05:00
if [[ -z "${SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR:-}" ]]; then
2024-07-18 11:37:30 -04:00
script_dir="$(
cd -- "$(dirname "$0")" >/dev/null 2>&1
pwd -P
)"
2022-10-27 15:33:59 -04:00
2023-02-15 17:07:12 -05:00
SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR="${script_dir}/../../../sample-process-models"
if [[ ! -d "$SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR" ]]; then
SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR="${script_dir}/../../sample-process-models"
if [[ ! -d "$SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR" ]]; then
2024-07-18 11:37:30 -04:00
echo >&2 "ERROR: Could not find a location for the sample processes. Last tried: $SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR"
2022-10-27 15:33:59 -04:00
exit 1
fi
fi
2023-02-15 17:07:12 -05:00
export SPIFFWORKFLOW_BACKEND_BPMN_SPEC_ABSOLUTE_DIR
2022-10-27 15:33:59 -04:00
fi
2024-07-18 13:19:59 -04:00
if [[ -n "${SPIFFWORKFLOW_BACKEND_ENV:-}" ]] && ! grep -Eq '^(local_development|unit_testing)$' <<<"$SPIFFWORKFLOW_BACKEND_ENV"; then
echo >&2 "ERROR: SPIFFWORKFLOW_BACKEND_ENV is set to '${SPIFFWORKFLOW_BACKEND_ENV}'. Only local_development and unit_testing are allowed."
exit 1
fi
2023-05-23 12:12:32 -04:00
database_host="localhost"
2024-07-18 11:37:30 -04:00
database_port=""
database_username="root"
database_password=""
2024-07-18 13:19:59 -04:00
databases_to_run_on="spiffworkflow_backend_local_development spiffworkflow_backend_unit_testing"
database_name_from_uri=""
2023-05-23 12:12:32 -04:00
if [[ -n "${SPIFFWORKFLOW_BACKEND_DATABASE_URI:-}" ]]; then
2024-07-18 11:37:30 -04:00
database_host_and_port=$(grep -oP "^[^:]+://.*@\K(.+?)[/]" <<<"$SPIFFWORKFLOW_BACKEND_DATABASE_URI" | sed -E 's/[\/]$//')
database_host=$(awk -F ':' '{print $1}' <<<"$database_host_and_port")
database_port=$(awk -F ':' '{print $2}' <<<"$database_host_and_port")
database_username_and_password=$(grep -oP "^[^:]+://\K([^@]+)[@]" <<<"$SPIFFWORKFLOW_BACKEND_DATABASE_URI" | sed -E 's/[@]$//')
database_username=$(awk -F ':' '{print $1}' <<<"$database_username_and_password")
database_password=$(awk -F ':' '{print $2}' <<<"$database_username_and_password")
2024-07-18 13:19:59 -04:00
database_name_from_uri=$(grep -oP "/\K(\w+)$" <<<"$SPIFFWORKFLOW_BACKEND_DATABASE_URI")
if ! grep "\<$database_name_from_uri\>" <<<"$databases_to_run_on"; then
databases_to_run_on="$database_name_from_uri"
fi
2024-07-18 11:37:30 -04:00
fi
database_host_args="-h $database_host -u $database_username"
if [[ -n "$database_port" ]]; then
database_host_args="${database_host_args} -P${database_port}"
fi
if [[ -n "$database_password" ]]; then
database_host_args="${database_host_args} -p${database_password}"
2023-05-23 12:12:32 -04:00
fi
2023-09-07 14:22:40 -04:00
# uncomment this line to fix branching conflicts
# poetry run flask db merge heads -m "merging heads"
2023-08-21 13:24:50 -04:00
2024-07-18 13:19:59 -04:00
function run_command_on_mysql_databases {
local command="$1"
for database_name in $databases_to_run_on; do
mysql $database_host_args -e "$command $database_name"
done
}
2022-10-12 10:22:22 -04:00
tasks=""
if [[ "${1:-}" == "clean" ]]; then
subcommand="${2:-}"
if [[ "$subcommand" == "rmall" ]]; then
tasks="$tasks init migrate"
rm -rf migrations/
elif [[ -n "$subcommand" ]]; then
2024-07-18 11:37:30 -04:00
echo >&2 "ERROR: you passed a subcommand that was not rmall, and that is not supported: $subcommand"
2022-10-12 10:22:22 -04:00
exit 1
fi
2023-10-12 14:29:51 -04:00
if [[ "${SPIFFWORKFLOW_BACKEND_DATABASE_TYPE:-mysql}" == "sqlite" ]]; then
2023-02-27 17:19:03 -05:00
rm -f ./src/instance/*.sqlite3
2023-10-27 11:02:52 -04:00
elif [[ "${SPIFFWORKFLOW_BACKEND_DATABASE_TYPE:-mysql}" == "mysql" ]]; then
2024-07-18 13:19:59 -04:00
run_command_on_mysql_databases "DROP DATABASE IF EXISTS"
2023-10-27 11:02:52 -04:00
elif [[ "${SPIFFWORKFLOW_BACKEND_DATABASE_TYPE:-}" == "postgres" ]]; then
# TODO: check to see if the db already exists and we can connect to it. also actually clean it up.
# start postgres in background with one db
2023-03-29 14:18:37 -04:00
container_name="postgres-spiff"
container_regex="^postgres-spiff$"
2023-03-29 14:17:26 -04:00
if [[ -n "$(docker ps -qa -f name=$container_regex)" ]]; then
echo ":: Found postgres container - $container_name"
if [[ -n "$(docker ps -q -f name=$container_regex)" ]]; then
echo ":: Stopping running container - $container_name"
docker stop $container_name
fi
echo ":: Removing stopped container - $container_name"
docker rm $container_name
fi
2023-02-24 16:57:53 -05:00
if ! docker exec -it postgres-spiff psql -U spiffworkflow_backend spiffworkflow_backend_unit_testing -c "select 1"; then
docker run --name postgres-spiff -p 5432:5432 -e POSTGRES_PASSWORD=spiffworkflow_backend -e POSTGRES_USER=spiffworkflow_backend -e POSTGRES_DB=spiffworkflow_backend_unit_testing -d postgres
2022-10-12 10:22:22 -04:00
sleep 4 # classy
fi
2023-02-07 15:02:47 -05:00
if ! docker exec -it postgres-spiff psql -U spiffworkflow_backend spiffworkflow_backend_local_development -c "select 1"; then
2023-02-24 16:57:53 -05:00
# create other db. spiffworkflow_backend_unit_testing came with the docker run.
docker exec -it postgres-spiff psql -U spiffworkflow_backend spiffworkflow_backend_unit_testing -c "create database spiffworkflow_backend_local_development;"
2022-10-12 10:22:22 -04:00
fi
fi
2023-03-01 15:54:50 -05:00
tasks="$tasks upgrade"
2023-02-08 12:43:30 -05:00
elif [[ "${1:-}" == "migrate" ]]; then
2023-03-01 16:28:42 -05:00
tasks="$tasks migrate upgrade"
2023-03-01 15:54:50 -05:00
elif [[ "${1:-}" == "downgrade" ]]; then
tasks="$tasks downgrade"
else
tasks="$tasks upgrade"
2022-10-12 10:22:22 -04:00
fi
2023-02-27 17:19:03 -05:00
if [[ "${SPIFFWORKFLOW_BACKEND_DATABASE_TYPE:-mysql}" == "mysql" ]]; then
2024-07-18 13:19:59 -04:00
run_command_on_mysql_databases "CREATE DATABASE IF NOT EXISTS"
2023-02-27 17:19:03 -05:00
fi
2022-10-12 10:22:22 -04:00
for task in $tasks; do
2023-02-07 15:02:47 -05:00
SPIFFWORKFLOW_BACKEND_ENV=local_development FLASK_APP=src/spiffworkflow_backend poetry run flask db "$task"
2022-10-12 10:22:22 -04:00
done
2024-07-18 13:19:59 -04:00
if [[ -z "$database_name_from_uri" ]] || [[ "$database_name_from_uri" == "spiffworkflow_backend_local_development" ]]; then
hacked_up_uri=$(sed -E 's/spiffworkflow_backend_local_development$/spiffworkflow_backend_unit_testing/' <<<"${SPIFFWORKFLOW_BACKEND_DATABASE_URI:-}")
SPIFFWORKFLOW_BACKEND_DATABASE_URI="$hacked_up_uri" SPIFFWORKFLOW_BACKEND_ENV=unit_testing FLASK_APP=src/spiffworkflow_backend poetry run flask db upgrade
2022-12-23 23:39:48 -05:00
fi
2023-06-26 10:07:41 -07:00
# for ./bin/tests-par (parallel tests with xdist)
2024-07-18 11:37:30 -04:00
if [[ -f "./src/instance/db_unit_testing.sqlite3" ]]; then
2023-06-26 10:07:41 -07:00
for i in $(seq 0 16); do
cp ./src/instance/db_unit_testing.sqlite3 ./src/instance/db_unit_testing_gw$i.sqlite3
done
fi