11#! /bin/bash
22set -euxo pipefail
33
4- TAG=" ${TAG:- " master" } "
4+ TAG=${TAG:- ${CI_COMMIT_REF_SLUG :- " master" }}
55IMAGE2TEST=" registry.gitlab.com/postgres-ai/database-lab/dblab-server:${TAG} "
6+ DLE_SERVER_NAME=" dblab_server_test"
67
78# Environment variables for replacement rules
89export SOURCE_DBNAME=" ${SOURCE_DBNAME:- test} "
@@ -11,37 +12,52 @@ export SOURCE_PORT="${SOURCE_PORT:-7432}"
1112export SOURCE_USERNAME=" ${SOURCE_USERNAME:- postgres} "
1213export SOURCE_PASSWORD=" ${SOURCE_PASSWORD:- secretpassword} "
1314export POSTGRES_VERSION=" ${POSTGRES_VERSION:- 13} "
15+ export DLE_TEST_MOUNT_DIR=" /var/lib/test/dblab"
16+ export DLE_TEST_POOL_NAME=" test_dblab_pool"
17+ export DLE_SERVER_PORT=${DLE_SERVER_PORT:- 12345}
18+ export DLE_PORT_POOL_FROM=${DLE_PORT_POOL_FROM:- 9000}
19+ export DLE_PORT_POOL_TO=${DLE_PORT_POOL_TO:- 9100}
1420
1521DIR=${0%/* }
1622
1723if [[ " ${SOURCE_HOST} " = " 172.17.0.1" ]]; then
1824# ## Step 0. Create source database
19- sudo rm -rf " $( pwd) " /postgresql/" ${POSTGRES_VERSION} " /test || true
25+ TMP_DATA_DIR=" /tmp/dle_test/logical_generic"
26+ cleanup_testdata_dir () {
27+ sudo rm -rf " ${TMP_DATA_DIR} " /postgresql/" ${POSTGRES_VERSION} " /test || true
28+ }
29+
30+ trap cleanup_testdata_dir EXIT
31+
32+ cleanup_testdata_dir
33+ sudo docker rm postgres" ${POSTGRES_VERSION} " || true
34+
2035 sudo docker run \
2136 --name postgres" ${POSTGRES_VERSION} " \
2237 --label pgdb \
38+ --label dblab_test \
2339 --privileged \
2440 --publish 172.17.0.1:" ${SOURCE_PORT} " :5432 \
2541 --env PGDATA=/var/lib/postgresql/pgdata \
2642 --env POSTGRES_USER=" ${SOURCE_USERNAME} " \
2743 --env POSTGRES_PASSWORD=" ${SOURCE_PASSWORD} " \
2844 --env POSTGRES_DB=" ${SOURCE_DBNAME} " \
2945 --env POSTGRES_HOST_AUTH_METHOD=md5 \
30- --volume " $( pwd ) " /postgresql/" ${POSTGRES_VERSION} " /test:/var/lib/postgresql/pgdata \
46+ --volume " ${TMP_DATA_DIR} " /postgresql/" ${POSTGRES_VERSION} " /test:/var/lib/postgresql/pgdata \
3147 --detach \
3248 postgres:" ${POSTGRES_VERSION} -alpine"
3349
3450 for i in {1..300}; do
35- sudo docker exec -it postgres" ${POSTGRES_VERSION} " psql -d " ${SOURCE_DBNAME} " -U postgres -c ' select' > /dev/null 2>&1 && break || echo " test database is not ready yet"
51+ sudo docker exec postgres" ${POSTGRES_VERSION} " psql -d " ${SOURCE_DBNAME} " -U postgres -c ' select' > /dev/null 2>&1 && break || echo " test database is not ready yet"
3652 sleep 1
3753 done
3854
3955 # Generate data in the test database using pgbench
4056 # 1,000,000 accounts, ~0.14 GiB of data.
41- sudo docker exec -it postgres" ${POSTGRES_VERSION} " pgbench -U postgres -i -s 10 " ${SOURCE_DBNAME} "
57+ sudo docker exec postgres" ${POSTGRES_VERSION} " pgbench -U postgres -i -s 10 " ${SOURCE_DBNAME} "
4258
4359 # Database info
44- sudo docker exec -it postgres" ${POSTGRES_VERSION} " psql -U postgres -c " \l+ ${SOURCE_DBNAME} "
60+ sudo docker exec postgres" ${POSTGRES_VERSION} " psql -U postgres -c " \l+ ${SOURCE_DBNAME} "
4561fi
4662
4763# ## Step 1. Prepare a machine with disk, Docker, and ZFS
@@ -65,23 +81,35 @@ yq eval -i '
6581 .global.debug = true |
6682 .global.telemetry.enabled = false |
6783 .localUI.enabled = false |
84+ .server.port = env(DLE_SERVER_PORT) |
85+ .poolManager.mountDir = env(DLE_TEST_MOUNT_DIR) |
86+ .provision.portPool.from = env(DLE_PORT_POOL_FROM) |
87+ .provision.portPool.to = env(DLE_PORT_POOL_TO) |
88+ .retrieval.spec.logicalDump.options.dumpLocation = env(DLE_TEST_MOUNT_DIR) + "/" + env(DLE_TEST_POOL_NAME) + "/dump" |
6889 .retrieval.spec.logicalDump.options.source.connection.dbname = strenv(SOURCE_DBNAME) |
6990 .retrieval.spec.logicalDump.options.source.connection.host = strenv(SOURCE_HOST) |
7091 .retrieval.spec.logicalDump.options.source.connection.port = env(SOURCE_PORT) |
7192 .retrieval.spec.logicalDump.options.source.connection.username = strenv(SOURCE_USERNAME) |
7293 .retrieval.spec.logicalDump.options.source.connection.password = strenv(SOURCE_PASSWORD) |
94+ .retrieval.spec.logicalRestore.options.dumpLocation = env(DLE_TEST_MOUNT_DIR) + "/" + env(DLE_TEST_POOL_NAME) + "/dump" |
7395 .databaseContainer.dockerImage = "postgresai/extended-postgres:" + strenv(POSTGRES_VERSION)
7496' " ${configDir} /server.yml"
7597
98+ # logerrors is not supported in PostgreSQL 9.6
99+ if [ " ${POSTGRES_VERSION} " = " 9.6" ]; then
100+ yq eval -i ' .databaseConfigs.configs.shared_preload_libraries = "pg_stat_statements, auto_explain"' " ${configDir} /server.yml"
101+ fi
102+
76103# # Launch Database Lab server
77104sudo docker run \
78- --name dblab_server \
105+ --name ${DLE_SERVER_NAME} \
79106 --label dblab_control \
107+ --label dblab_test \
80108 --privileged \
81- --publish 2345:2345 \
109+ --publish ${DLE_SERVER_PORT} : ${DLE_SERVER_PORT} \
82110 --volume /var/run/docker.sock:/var/run/docker.sock \
83- --volume /var/lib/dblab/dblab_pool/ dump:/var/lib/dblab/dblab_pool /dump \
84- --volume /var/lib/dblab:/var/lib/dblab /:rshared \
111+ --volume ${DLE_TEST_MOUNT_DIR} / ${DLE_TEST_POOL_NAME} / dump:${DLE_TEST_MOUNT_DIR} / ${DLE_TEST_POOL_NAME} /dump \
112+ --volume ${DLE_TEST_MOUNT_DIR} : ${DLE_TEST_MOUNT_DIR} /:rshared \
85113 --volume " ${configDir} " :/home/dblab/configs:ro \
86114 --volume " ${metaDir} " :/home/dblab/meta \
87115 --volume /sys/kernel/debug:/sys/kernel/debug:rw \
@@ -92,11 +120,11 @@ sudo docker run \
92120 " ${IMAGE2TEST} "
93121
94122# Check the Database Lab Engine logs
95- sudo docker logs dblab_server -f 2>&1 | awk ' {print "[CONTAINER dblab_server]: "$0}' &
123+ sudo docker logs ${DLE_SERVER_NAME} -f 2>&1 | awk ' {print "[CONTAINER dblab_server]: "$0}' &
96124
97125# ## Waiting for the Database Lab Engine initialization.
98126for i in {1..300}; do
99- curl http://localhost:2345 > /dev/null 2>&1 && break || echo " dblab is not ready yet"
127+ curl http://localhost:${DLE_SERVER_PORT} > /dev/null 2>&1 && break || echo " dblab is not ready yet"
100128 sleep 1
101129done
102130
@@ -112,7 +140,7 @@ dblab --version
112140# Initialize CLI configuration
113141dblab init \
114142 --environment-id=test \
115- --url=http://localhost:2345 \
143+ --url=http://localhost:${DLE_SERVER_PORT} \
116144 --token=secret_token \
117145 --insecure
118146
@@ -128,14 +156,14 @@ dblab clone create \
128156
129157# Connect to a clone and check the available table
130158PGPASSWORD=secret_password psql \
131- " host=localhost port=6000 user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
159+ " host=localhost port=${DLE_PORT_POOL_FROM} user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
132160
133161# Drop table
134162PGPASSWORD=secret_password psql \
135- " host=localhost port=6000 user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' drop table pgbench_accounts'
163+ " host=localhost port=${DLE_PORT_POOL_FROM} user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' drop table pgbench_accounts'
136164
137165PGPASSWORD=secret_password psql \
138- " host=localhost port=6000 user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
166+ " host=localhost port=${DLE_PORT_POOL_FROM} user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
139167
140168# # Reset clone
141169dblab clone reset testclone
@@ -145,11 +173,14 @@ dblab clone status testclone
145173
146174# Check the database objects (everything should be the same as when we started)
147175PGPASSWORD=secret_password psql \
148- " host=localhost port=6000 user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
176+ " host=localhost port=${DLE_PORT_POOL_FROM} user=dblab_user_1 dbname=${SOURCE_DBNAME} " -c ' \dt+'
149177
150178# ## Step 4. Destroy clone
151179dblab clone destroy testclone
152180dblab clone list
153181
182+ # # Stop DLE.
183+ sudo docker stop ${DLE_SERVER_NAME}
184+
154185# ## Finish. clean up
155186source " ${DIR} /_cleanup.sh"
0 commit comments