summaryrefslogtreecommitdiffstats
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
parente913ebd1b9db6580d0c45094cc380d530d8bd89e (diff)
initial seed code commit VVP-10
Change-Id: I2a86f5759b330aa7ca8009055d345ec9b3d6d08a Signed-off-by: Paul McGoldrick <paul.mcgoldrick@att.com>
-rwxr-xr-xDockerfile89
-rwxr-xr-xLICENSE.TXT38
-rwxr-xr-xensure-postgresql-upgrade.sh144
-rwxr-xr-xpom.xml122
-rwxr-xr-xtox.ini19
5 files changed, 412 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100755
index 0000000..14428e4
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,89 @@
+# ============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.
+FROM postgres:9.6
+
+# Postgres upgrader container
+#
+# Prior to this container, we ran an Alpine Linux container with Alpine's
+# packaged PostgreSQL 9.4
+#
+# PostgreSQL 9.5 and above will not read data files written by PostgreSQL 9.4;
+# a migration must be performed.
+#
+# We found it difficult to update to a more recent version of Alpine Linux,
+# because doing so would bring along a major-version update of PostgreSQL.
+#
+# One way to migrate a PostgreSQL database is to use pg_dump, transferring
+# files, and pg_restore, maybe while juggling containers.
+#
+# We want to use pg_upgrade with link mode to migrate from 9.4 to 9.6, because
+# - it is "much faster and will use less disk space."
+# - we don't at present have replication or zero-downtime deploys so a small
+# maintenance window is acceptable and expected
+# - the deploy process should be as simple as updating the container twice
+# https://www.postgresql.org/docs/9.6/static/pgupgrade.html
+#
+# pg_upgrade requires the postgresql binaries be installed for both the new
+# version and the old version of the cluster.
+#
+# PostgreSQL9.6 is not available as package for the Alpine version we're using.
+#
+# Upstream's -alpine docker containers compile postgres during the docker
+# build, but their standard containers just apt-get install from a Debian
+# repository. The repository contains packages for many postgresql versions,
+# which will co-exist happily in the same system (container).
+#
+# So, during the upgrade, we use the debian-based container. After the
+# migration is successful, we will switch to the Alpine-based container running
+# the same version of PostgreSQL.
+#
+
+# Install the old version of postgres
+RUN apt-get update \
+ && apt-get install -y postgresql-9.4 postgresql-contrib-9.4 \
+ && rm -rf /var/lib/apt/lists/*
+
+# Docker will call docker-entrypoint.sh with these arguments.
+# docker-entrypoint.sh only performs database initialization when its first
+# argument is 'postgres', then it execs its arguments. So, our upgrade script
+# will perform the upgrade if necessary, then exec docker-entrypoint.sh with
+# its argument, 'postgres', and startup should continue as normal. This also
+# means that if the container is launched with a different "command" it will
+# replace our custom stuff, as a user might expect.
+COPY ensure-postgresql-upgrade.sh /usr/local/bin
+CMD ["ensure-postgresql-upgrade.sh", "postgres"]
diff --git a/LICENSE.TXT b/LICENSE.TXT
new file mode 100755
index 0000000..4202e45
--- /dev/null
+++ b/LICENSE.TXT
@@ -0,0 +1,38 @@
+#
+# ============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.
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 "$@"
diff --git a/pom.xml b/pom.xml
new file mode 100755
index 0000000..3c2109a
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,122 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>oparent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.openecomp.vvp</groupId>
+ <artifactId>vvp-postgresql</artifactId>
+ <packaging>pom</packaging>
+ <version>1.0.0-SNAPSHOT</version>
+ <name>vvp-postgresql</name>
+
+ <properties>
+ <!--nexus-->
+ <sitePath>/content/sites/site/org/openecomp/vvp/${project.artifactId}/${project.version}</sitePath>
+ <!--maven-->
+ <timestamp>${maven.build.timestamp}</timestamp>
+ <maven.build.timestamp.format>yyyy.MM.dd.HH.mm</maven.build.timestamp.format>
+ <!--docker-->
+ <docker.tag>${project.version}-${timestamp}</docker.tag>
+ <docker.latest.tag>${project.version}-latest</docker.latest.tag>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.sonatype.plugins</groupId>
+ <artifactId>nexus-staging-maven-plugin</artifactId>
+ <version>1.6.7</version>
+ <extensions>true</extensions>
+ <configuration>
+ <nexusUrl>${onap.nexus.url}</nexusUrl>
+ <stagingProfileId>176c31dfe190a</stagingProfileId>
+ <serverId>ecomp-staging</serverId>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>io.fabric8</groupId>
+ <artifactId>docker-maven-plugin</artifactId>
+ <version>0.19.1</version>
+ <configuration>
+ <verbose>true</verbose>
+ <apiVersion>1.23</apiVersion>
+ <registry>nexus3.onap.org:10003</registry>
+ <images>
+ <image>
+ <name>openecomp/vvp-postgresql</name>
+ <alias>vvp-postgresql</alias>
+ <build>
+ <cleanup>true</cleanup>
+ <tags>
+ <tag>${docker.tag}</tag>
+ <tag>${docker.latest.tag}</tag>
+ </tags>
+ <dockerFileDir>${project.basedir}</dockerFileDir>
+ </build>
+ </image>
+ </images>
+ </configuration>
+ <executions>
+ <execution>
+ <id>clean-images</id>
+ <phase>pre-clean</phase>
+ <goals>
+ <goal>remove</goal>
+ </goals>
+ <configuration>
+ <removeAll>true</removeAll>
+ </configuration>
+ </execution>
+
+ <execution>
+ <id>generate-images</id>
+ <phase>package</phase>
+ <goals>
+ <goal>build</goal>
+ </goals>
+ </execution>
+
+ <execution>
+ <id>push-images</id>
+ <phase>deploy</phase>
+ <goals>
+ <goal>build</goal>
+ <goal>push</goal>
+ </goals>
+ <configuration>
+ <image>openecomp/vvp-postgresql</image>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <distributionManagement>
+ <site>
+ <id>ecomp-site</id>
+ <url>dav:${onap.nexus.url}${sitePath}</url>
+ </site>
+ </distributionManagement>
+ <repositories>
+ <repository>
+ <id>ecomp-releases</id>
+ <name>ECOMP Release Repository</name>
+ <url>${onap.nexus.url}/content/repositories/releases/</url>
+ </repository>
+ <repository>
+ <id>ecomp-snapshots</id>
+ <name>ECOMP Snapshot Repository</name>
+ <url>${onap.nexus.url}/content/repositories/snapshots/</url>
+ </repository>
+ <repository>
+ <id>ecomp-staging</id>
+ <name>ECOMP Staging Repository</name>
+ <url>${onap.nexus.url}/content/repositories/staging/</url>
+ </repository>
+ </repositories>
+</project>
+
diff --git a/tox.ini b/tox.ini
new file mode 100755
index 0000000..d3ba96e
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,19 @@
+[tox]
+skipsdist=True
+envlist = py27,py3,style
+setupdir = postgresql
+
+[testenv]
+distribute = False
+commands =
+ {envpython} --version
+deps = flake8
+
+[testenv:style]
+commands = flake8
+
+[testenv:py27]
+basepython=python2.7
+
+[testenv:py3]
+basepython=python3.6