From dae1e07c65250ba9c91eabefca223eb7995833a3 Mon Sep 17 00:00:00 2001 From: Owen Ou <169064+owenthereal@users.noreply.github.com> Date: Mon, 24 Oct 2022 16:07:49 -0700 Subject: [PATCH] [HYD-175] Add pgsql-http extension (#5) * Add `pgsql-http` extension * Enable `http` fdw by default for spilo * Rename files/default to files/spilo * Enable http for postgres images * Add http ext acceptance tests * Fix lint * Pin pgsql_http to v1.5.0 --- Dockerfile | 14 +++- Dockerfile.spilo | 5 +- acceptance/shared/cases.go | 80 ++++++++++++++++++- docker-bake.hcl | 35 ++++++++ .../docker-entrypoint-initdb.d/columnar.sql | 2 + .../docker-entrypoint-initdb.d/http.sql | 2 + .../scripts/configure_spilo.py | 2 +- .../postgres-appliance/scripts/post_init.sh | 2 + .../scripts/spilo_commons.py | 1 + http/Dockerfile | 20 +++++ 10 files changed, 158 insertions(+), 5 deletions(-) create mode 100644 files/postgres/docker-entrypoint-initdb.d/columnar.sql create mode 100644 files/postgres/docker-entrypoint-initdb.d/http.sql rename files/{default => spilo}/postgres-appliance/scripts/configure_spilo.py (99%) rename files/{default => spilo}/postgres-appliance/scripts/post_init.sh (99%) rename files/{default => spilo}/postgres-appliance/scripts/spilo_commons.py (98%) create mode 100644 http/Dockerfile diff --git a/Dockerfile b/Dockerfile index 88379ffe..95a0fd04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,18 @@ FROM postgres_base +# columnar ext COPY --from=columnar /pg_ext / -RUN mkdir -p /docker-entrypoint-initdb.d && echo 'CREATE EXTENSION IF NOT EXISTS columnar;\nALTER EXTENSION columnar UPDATE;' > /docker-entrypoint-initdb.d/columnar.sql +# http deps +RUN set -eux; \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + ca-certificates \ + libcurl4-gnutls-dev \ + ; \ + rm -rf /var/lib/apt/lists/* +# http ext +COPY --from=http /pg_ext / + +COPY files/postgres/docker-entrypoint-initdb.d /docker-entrypoint-initdb.d/ diff --git a/Dockerfile.spilo b/Dockerfile.spilo index 71f445a1..ac45f273 100644 --- a/Dockerfile.spilo +++ b/Dockerfile.spilo @@ -4,7 +4,10 @@ FROM spilo_base COPY --from=columnar_13 /pg_ext / COPY --from=columnar_14 /pg_ext / -COPY files/default/postgres-appliance/scripts /scripts/ +COPY files/spilo/postgres-appliance/scripts /scripts/ + +COPY --from=http_13 /pg_ext / +COPY --from=http_14 /pg_ext / ARG POSTGRES_BASE_VERSION # Default envs diff --git a/acceptance/shared/cases.go b/acceptance/shared/cases.go index 948b5a29..5aa84057 100644 --- a/acceptance/shared/cases.go +++ b/acceptance/shared/cases.go @@ -20,7 +20,7 @@ type Case struct { // images. var AcceptanceCases = []Case{ { - Name: "columnar ext", + Name: "columnar ext available", SQL: ` SELECT count(1) FROM pg_available_extensions WHERE name = 'columnar'; `, @@ -31,7 +31,23 @@ SELECT count(1) FROM pg_available_extensions WHERE name = 'columnar'; } if want, got := 1, count; want != got { - t.Errorf("columnar ext should exist") + t.Error("columnar ext should exist") + } + }, + }, + { + Name: "columnar ext enabled", + SQL: ` +SELECT count(1) FROM pg_extension WHERE extname = 'columnar'; + `, + Validate: func(t *testing.T, row pgx.Row) { + var count int + if err := row.Scan(&count); err != nil { + t.Fatal(err) + } + + if want, got := 1, count; want != got { + t.Error("columnar ext should exist") } }, }, @@ -182,5 +198,65 @@ CREATE TABLE columnar_table2 } }, }, + { + Name: "http ext available", + SQL: ` +SELECT count(1) FROM pg_available_extensions WHERE name = 'http'; + `, + Validate: func(t *testing.T, row pgx.Row) { + var count int + if err := row.Scan(&count); err != nil { + t.Fatal(err) + } + + if want, got := 1, count; want != got { + t.Errorf("columnar ext should exist") + } + }, + }, + { + Name: "http ext enabled", + SQL: ` +SELECT count(1) FROM pg_extension WHERE extname = 'http'; + `, + Validate: func(t *testing.T, row pgx.Row) { + var count int + if err := row.Scan(&count); err != nil { + t.Fatal(err) + } + + if want, got := 1, count; want != got { + t.Errorf("columnar ext should exist") + } + }, + }, + { + Name: "http put", + SQL: ` +SELECT status, content_type, content::json->>'data' AS data + FROM http_put('http://httpbin.org/put', 'some text', 'text/plain'); + `, + Validate: func(t *testing.T, row pgx.Row) { + var result struct { + Status int + ContentType string + Data string + } + + if err := row.Scan(&result.Status, &result.ContentType, &result.Data); err != nil { + t.Fatal(err) + } + + if want, got := 200, result.Status; want != got { + t.Errorf("http put response status should match: want=%d got=%d", want, got) + } + if want, got := "application/json", result.ContentType; want != got { + t.Errorf("http put response content type should match: want=%s got=%s", want, got) + } + if want, got := "some text", result.Data; want != got { + t.Errorf("http put response data should match: want=%s got=%s", want, got) + } + }, + }, } ) diff --git a/docker-bake.hcl b/docker-bake.hcl index 0b3e03f5..a16d150a 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -40,6 +40,7 @@ target "postgres" { postgres_base = "docker-image://postgres:${POSTGRES_BASE_VERSION}" columnar = "target:columnar_${POSTGRES_BASE_VERSION}" + http = "target:http_${POSTGRES_BASE_VERSION}" } tags = [ @@ -60,6 +61,8 @@ target "spilo" { spilo_base = "target:spilo_base" columnar_13 = "target:columnar_13" columnar_14 = "target:columnar_14" + http_13 = "target:http_13" + http_14 = "target:http_14" } args = { @@ -90,6 +93,38 @@ target "spilo_base" { cache-from = ["type=local,src=tmp/bake_cache/spilo_base"] } +target "http" { + inherits = ["shared"] + context = "http" + target = "output" + + args = { + PGSQL_HTTP_TAG = "v1.5.0" + } +} + +target "http_13" { + inherits = ["http"] + + args = { + POSTGRES_BASE_VERSION = 13 + } + + cache-to = ["type=local,dest=tmp/bake_cache/http_13"] + cache-from = ["type=local,src=tmp/bake_cache/http_13"] +} + +target "http_14" { + inherits = ["http"] + + args = { + POSTGRES_BASE_VERSION = 14 + } + + cache-to = ["type=local,dest=tmp/bake_cache/http_14"] + cache-from = ["type=local,src=tmp/bake_cache/http_14"] +} + target "columnar" { inherits = ["shared"] context = "columnar" diff --git a/files/postgres/docker-entrypoint-initdb.d/columnar.sql b/files/postgres/docker-entrypoint-initdb.d/columnar.sql new file mode 100644 index 00000000..37196359 --- /dev/null +++ b/files/postgres/docker-entrypoint-initdb.d/columnar.sql @@ -0,0 +1,2 @@ +CREATE EXTENSION IF NOT EXISTS columnar; +ALTER EXTENSION columnar UPDATE; diff --git a/files/postgres/docker-entrypoint-initdb.d/http.sql b/files/postgres/docker-entrypoint-initdb.d/http.sql new file mode 100644 index 00000000..e8bdcbb2 --- /dev/null +++ b/files/postgres/docker-entrypoint-initdb.d/http.sql @@ -0,0 +1,2 @@ +CREATE EXTENSION IF NOT EXISTS http; +ALTER EXTENSION http UPDATE; diff --git a/files/default/postgres-appliance/scripts/configure_spilo.py b/files/spilo/postgres-appliance/scripts/configure_spilo.py similarity index 99% rename from files/default/postgres-appliance/scripts/configure_spilo.py rename to files/spilo/postgres-appliance/scripts/configure_spilo.py index 60f43459..d8b8fb6c 100755 --- a/files/default/postgres-appliance/scripts/configure_spilo.py +++ b/files/spilo/postgres-appliance/scripts/configure_spilo.py @@ -307,7 +307,7 @@ def deep_update(a, b): {{/SSL_CRL_FILE}} ssl_cert_file: {{SSL_CERTIFICATE_FILE}} ssl_key_file: {{SSL_PRIVATE_KEY_FILE}} - shared_preload_libraries: 'bg_mon,pg_stat_statements,pgextwlist,pg_auth_mon,set_user,columnar,pg_cron' + shared_preload_libraries: 'bg_mon,pg_stat_statements,pgextwlist,pg_auth_mon,set_user,columnar,http,pg_cron' bg_mon.listen_address: '{{BGMON_LISTEN_IP}}' bg_mon.history_buckets: 120 pg_stat_statements.track_utility: 'off' diff --git a/files/default/postgres-appliance/scripts/post_init.sh b/files/spilo/postgres-appliance/scripts/post_init.sh similarity index 99% rename from files/default/postgres-appliance/scripts/post_init.sh rename to files/spilo/postgres-appliance/scripts/post_init.sh index 62a068c7..6bd7e1c2 100755 --- a/files/default/postgres-appliance/scripts/post_init.sh +++ b/files/spilo/postgres-appliance/scripts/post_init.sh @@ -197,6 +197,8 @@ UPDATE pg_catalog.pg_extension SET extname = 'columnar' WHERE extname = 'citus_c UPDATE pg_catalog.pg_proc SET probin = '\$libdir/columnar' WHERE probin = '\$libdir/citus_columnar'; CREATE EXTENSION IF NOT EXISTS columnar; ALTER EXTENSION columnar UPDATE; +CREATE EXTENSION IF NOT EXISTS http; +ALTER EXTENSION http UPDATE; GRANT EXECUTE ON FUNCTION public.set_user(text) TO admin; GRANT EXECUTE ON FUNCTION public.pg_stat_statements_reset($RESET_ARGS) TO admin;" if [ "$PGVER" -lt 10 ]; then diff --git a/files/default/postgres-appliance/scripts/spilo_commons.py b/files/spilo/postgres-appliance/scripts/spilo_commons.py similarity index 98% rename from files/default/postgres-appliance/scripts/spilo_commons.py rename to files/spilo/postgres-appliance/scripts/spilo_commons.py index 77acb05c..5b4f3e13 100644 --- a/files/default/postgres-appliance/scripts/spilo_commons.py +++ b/files/spilo/postgres-appliance/scripts/spilo_commons.py @@ -13,6 +13,7 @@ # (min_version, max_version, shared_preload_libraries, extwlist.extensions) extensions = { 'columnar': (13, 14, True, True), + 'http': (13, 14, True, True), 'pg_cron': (9.5, 14, True, True), 'pg_stat_kcache': (9.4, 14, True, False), 'pg_partman': (9.4, 14, False, True) diff --git a/http/Dockerfile b/http/Dockerfile new file mode 100644 index 00000000..275f856e --- /dev/null +++ b/http/Dockerfile @@ -0,0 +1,20 @@ +FROM ubuntu:22.04 as setup + +ARG PGSQL_HTTP_TAG +ARG POSTGRES_BASE_VERSION=13 + +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install gnupg postgresql-common git -y +RUN sh /usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y +RUN export DEBIAN_FRONTEND=noninteractive && apt-get update && apt-get upgrade -y && apt-get install lsb-release gcc make libssl-dev autoconf pkg-config postgresql-${POSTGRES_BASE_VERSION} postgresql-server-dev-${POSTGRES_BASE_VERSION} libcurl4-gnutls-dev liblz4-dev libzstd-dev -y + +FROM setup as builder + +RUN git clone https://github.com/pramsey/pgsql-http && \ + cd pgsql-http && \ + git checkout ${PGSQL_HTTP_TAG} && \ + DESTDIR=/pg_ext make && \ + DESTDIR=/pg_ext make install + +FROM scratch as output + +COPY --from=builder /pg_ext /pg_ext