summaryrefslogtreecommitdiffstats
path: root/ensure-postgresql-upgrade.sh
diff options
context:
space:
mode:
authorPaul McGoldrick <paul.mcgoldrick@att.com>2017-09-28 10:03:55 -0700
committerPaul McGoldrick <paul.mcgoldrick@att.com>2017-09-28 10:16:53 -0700
commit8236d32e16231325b58777dd0c2ebc116f895103 (patch)
tree4b923a7e84b5363ab0fc49799cc57f7329d8d42b /ensure-postgresql-upgrade.sh
parente913ebd1b9db6580d0c45094cc380d530d8bd89e (diff)
initial seed code commit VVP-10
Change-Id: I2a86f5759b330aa7ca8009055d345ec9b3d6d08a Signed-off-by: Paul McGoldrick <paul.mcgoldrick@att.com>
Diffstat (limited to 'ensure-postgresql-upgrade.sh')
-rwxr-xr-xensure-postgresql-upgrade.sh144
1 files changed, 144 insertions, 0 deletions
diff --git a/ensure-postgresql-upgrade.sh b/ensure-postgresql-upgrade.sh
new file mode 100755
index 0000000..0d68350
--- /dev/null
+++ b/ensure-postgresql-upgrade.sh
@@ -0,0 +1,144 @@
+#!/bin/sh
+# ============LICENSE_START==========================================
+# org.onap.vvp/postgresql
+# ===================================================================
+# Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+# ===================================================================
+#
+# Unless otherwise specified, all software contained herein is licensed
+# under the Apache License, Version 2.0 (the “License”);
+# you may not use this software 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.
+#
+#
+#
+# Unless otherwise specified, all documentation contained herein is licensed
+# under the Creative Commons License, Attribution 4.0 Intl. (the “License”);
+# you may not use this documentation except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://creativecommons.org/licenses/by/4.0/
+#
+# Unless required by applicable law or agreed to in writing, documentation
+# 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.
+#
+# ============LICENSE_END============================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+
+set -ex
+
+# This file will be launched with the command:
+#
+# docker-entrypoint.sh ensure-postgresql-upgrade.sh postgres
+#
+# It will perform a postgresql upgrade if needed, then launch postgres as
+# usual.
+
+#
+# See if cluster needs upgrade
+#
+
+if [ -e "$PGDATA/PG_VERSION" ]; then
+ orig_cluster_version="$(head -1 "$PGDATA/PG_VERSION")"
+else
+ orig_cluster_version=
+fi
+
+if [ ! "$orig_cluster_version" ] || \
+ [ "${PG_VERSION#$orig_cluster_version}" != "${PG_VERSION}" ]
+then
+ # Cluster version is the same as container version; no upgrade needed.
+ exec docker-entrypoint.sh "$@"
+fi
+
+echo >&2 "PostgreSQL version in this container is $PG_VERSION"
+echo >&2 "PostgreSQL data was written by version $orig_cluster_version"
+echo >&2 "Cluster upgrade will be performed..."
+
+
+#
+# Move old cluster
+#
+
+# Since we typically mount a volume at $PGDATA, and we want to avoid crossing
+# filesystems, we move the old data to a directory within itself. We take
+# advantage here of the fact that there should be no preexisting dot-directores
+# and '*' skips them.
+mkdir "$PGDATA/.old"
+mv "$PGDATA"/* "$PGDATA/.old/"
+mv "$PGDATA/.old" "$PGDATA/old"
+# If a different container created the old cluster, then their postgres might
+# have a different uid than ours. Just in case, recursively chown all the
+# postgres data.
+chown -Rc postgres.postgres "$PGDATA"
+chmod =,u=rwX "$PGDATA/old"
+
+#
+# Initialize new cluster
+#
+
+# We can't just launch 'docker-entrypoint.sh postgres' here because that will
+# stand up more than an empty cluster, which causes problems for pg_upgrade.
+
+PGDATA="$PGDATA/new" gosu postgres initdb
+
+#
+# Adjust authentication
+#
+
+# The new cluster's auth will be trust by default.
+# We don't necessarily know what the old one was.
+# Make the old one "peer" then later migrate the old one's original settings to
+# the new.
+mv "$PGDATA/old/pg_hba.conf" "$PGDATA/old/pg_hba.conf.bak"
+echo "local all all peer" > "$PGDATA/old/pg_hba.conf"
+chown postgres "$PGDATA/new/pg_hba.conf"
+
+#
+# Run pg_upgrade
+#
+
+cd /tmp # so it can write its log
+
+gosu postgres pg_upgrade \
+ --old-datadir "$PGDATA/old" \
+ --old-bindir "/usr/lib/postgresql/$orig_cluster_version/bin/" \
+ --new-datadir "$PGDATA/new" \
+ --new-bindir "/usr/lib/postgresql/$PG_MAJOR/bin/"
+
+#
+# Restore pg_hba.conf
+#
+mv "$PGDATA/old/pg_hba.conf.bak" "$PGDATA/new/pg_hba.conf"
+
+#
+# Apply old configuration to new
+#
+cp -d "$PGDATA/old/postgresql.conf" "$PGDATA/new/"
+
+#
+# Delete old cluster; move new into place.
+#
+
+rm -rf "$PGDATA/old"
+mv "$PGDATA/new"/* "$PGDATA"
+rmdir "$PGDATA/new"
+
+#
+# Start new cluster
+#
+
+echo >&2 "Database upgrade complete; launching 'docker-entrypoint.sh ""$@""'"
+exec docker-entrypoint.sh "$@"