postgis/utils/check_cluster_upgrade.sh

144 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
TMPDIR=/tmp/pgis_upgrade_test-$$/
DATADIR=${TMPDIR}/cluster
LOGFILE=${TMPDIR}/log
INIT_SCRIPT=
export PGPORT=15432
export PGHOST=${TMPDIR}
export PGDATABASE=postgis_cluster_upgrade_test
PG_CONFIG_OLD=
PG_CONFIG_NEW=
usage() {
echo "Usage: $0 [-i <init_script>] <pg_config_old> <pg_config_new>"
}
cleanup() {
echo "-- Cleaning up --"
echo "Stopping postmaster on ${DATADIR} up"
${BIN_OLD}/pg_ctl -D ${DATADIR} stop
echo "Removing ${TMPDIR}"
rm -rf ${TMPDIR}
}
trap 'cleanup' EXIT
mkdir -p ${TMPDIR}
while test -n "$1"; do
if test "$1" = "-i"; then
shift
INIT_SCRIPT=$1
if test -f ${INIT_SCRIPT}; then
:
else
echo "${INIT_SCRIPT} is not a file" >&2
exit 1
fi
shift
elif test -z "$PG_CONFIG_OLD"; then
PG_CONFIG_OLD="$1"
shift
elif test -z "$PG_CONFIG_NEW"; then
PG_CONFIG_NEW="$1"
shift
else
echo "Unrecognized argument: $1" >&2
usage >&2
exit 1
fi
done
if test -z "$PG_CONFIG_NEW"; then
echo "Missing new pg_config path" >&2
usage >&2
exit 1
fi
if test "$PG_CONFIG_OLD" = "$PG_CONFIG_NEW"; then
echo "Old and new pg_config paths need be different" >&2
exit 1
fi
BIN_OLD=$(${PG_CONFIG_OLD} --bindir)
BIN_NEW=$(${PG_CONFIG_NEW} --bindir)
echo "Testing cluster upgrade"
echo "FROM: $(${PG_CONFIG_OLD} --version)"
echo " TO: $(${PG_CONFIG_NEW} --version)"
echo "Creating FROM cluster"
${BIN_OLD}/initdb ${DATADIR} > ${LOGFILE} 2>&1 || {
cat ${LOGFILE} && exit 1
}
echo "Starting FROM cluster"
${BIN_OLD}/pg_ctl -D ${DATADIR} -o "-F -p ${PGPORT} -k ${TMPDIR}" -l ${LOGFILE} start || {
cat ${LOGFILE} && exit 1
}
echo "Creating FROM db"
${BIN_OLD}/createdb ${PGDATABASE} || exit 1
# run an custom script
if test -n "$INIT_SCRIPT"; then
${BIN_OLD}/psql -XAt --set ON_ERROR_STOP=1 -f "$INIT_SCRIPT" || exit 1
else
${BIN_OLD}/psql -XAt --set ON_ERROR_STOP=1 -c "CREATE EXTENSION postgis" || exit 1
fi
echo "---- OLD cluster info -------------------------"
${BIN_OLD}/psql -XAt --set ON_ERROR_STOP=1 <<EOF || exit 1
SELECT version();
SELECT postgis_full_version();
EOF
echo "-----------------------------------------------"
echo "Stopping FROM cluster"
${BIN_OLD}/pg_ctl -D ${DATADIR} stop || exit 1
export PGDATAOLD=${DATADIR}.old
mv ${DATADIR} ${PGDATAOLD}
export PGDATANEW=${DATADIR}
echo "Creating TO cluster"
${BIN_NEW}/initdb ${PGDATANEW} > ${LOGFILE} 2>&1 || {
cat ${LOGFILE} && exit 1
}
echo "Upgrading cluster"
cd ${TMPDIR}
${BIN_NEW}/pg_upgrade --link -b ${BIN_OLD} -B ${BIN_NEW} > ${LOGFILE} 2>&1 || {
cat ${LOGFILE}
DUMPLOG=$(grep 'pg_upgrade_dump.*log' ${LOGFILE} | cut -d'"' -f2)
if test -n "${DUMPLOG}"; then
echo "${DUMPLOG} follows:"
tail ${TMPDIR}/${DUMPLOG}
fi
exit 1
}
echo "Starting TO cluster"
${BIN_NEW}/pg_ctl -D ${DATADIR} -o "-F -p ${PGPORT} -k ${TMPDIR}" -l ${LOGFILE} start || {
cat ${LOGFILE} && exit 1
}
echo "---- NEW cluster info -------------------------"
${BIN_NEW}/psql -XAt <<EOF || exit 1
SELECT version();
SELECT postgis_full_version();
EOF
echo "-----------------------------------------------"
echo "---- Extensions upgrade call -------------------"
${BIN_NEW}/psql -XAt <<EOF || exit 1
SELECT postgis_extensions_upgrade();
SELECT postgis_full_version();
EOF
echo "-----------------------------------------------"
# TODO: run some checks with --nocreate and appropriate PG