1
1
#! /bin/bash
2
2
set -euxo pipefail
3
3
4
- TAG=" ${TAG:- " master" } "
4
+ TAG=${TAG:- ${CI_COMMIT_REF_SLUG :- " master" }}
5
5
IMAGE2TEST=" registry.gitlab.com/postgres-ai/database-lab/dblab-server:${TAG} "
6
+ DLE_SERVER_NAME=" dblab_server_test"
6
7
7
8
# Environment variables for replacement rules
8
9
export SOURCE_DBNAME=" ${SOURCE_DBNAME:- test} "
@@ -11,37 +12,52 @@ export SOURCE_PORT="${SOURCE_PORT:-7432}"
11
12
export SOURCE_USERNAME=" ${SOURCE_USERNAME:- postgres} "
12
13
export SOURCE_PASSWORD=" ${SOURCE_PASSWORD:- secretpassword} "
13
14
export 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}
14
20
15
21
DIR=${0%/* }
16
22
17
23
if [[ " ${SOURCE_HOST} " = " 172.17.0.1" ]]; then
18
24
# ## 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
+
20
35
sudo docker run \
21
36
--name postgres" ${POSTGRES_VERSION} " \
22
37
--label pgdb \
38
+ --label dblab_test \
23
39
--privileged \
24
40
--publish 172.17.0.1:" ${SOURCE_PORT} " :5432 \
25
41
--env PGDATA=/var/lib/postgresql/pgdata \
26
42
--env POSTGRES_USER=" ${SOURCE_USERNAME} " \
27
43
--env POSTGRES_PASSWORD=" ${SOURCE_PASSWORD} " \
28
44
--env POSTGRES_DB=" ${SOURCE_DBNAME} " \
29
45
--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 \
31
47
--detach \
32
48
postgres:" ${POSTGRES_VERSION} -alpine"
33
49
34
50
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"
36
52
sleep 1
37
53
done
38
54
39
55
# Generate data in the test database using pgbench
40
56
# 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} "
42
58
43
59
# 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} "
45
61
fi
46
62
47
63
# ## Step 1. Prepare a machine with disk, Docker, and ZFS
@@ -65,23 +81,35 @@ yq eval -i '
65
81
.global.debug = true |
66
82
.global.telemetry.enabled = false |
67
83
.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" |
68
89
.retrieval.spec.logicalDump.options.source.connection.dbname = strenv(SOURCE_DBNAME) |
69
90
.retrieval.spec.logicalDump.options.source.connection.host = strenv(SOURCE_HOST) |
70
91
.retrieval.spec.logicalDump.options.source.connection.port = env(SOURCE_PORT) |
71
92
.retrieval.spec.logicalDump.options.source.connection.username = strenv(SOURCE_USERNAME) |
72
93
.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" |
73
95
.databaseContainer.dockerImage = "postgresai/extended-postgres:" + strenv(POSTGRES_VERSION)
74
96
' " ${configDir} /server.yml"
75
97
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
+
76
103
# # Launch Database Lab server
77
104
sudo docker run \
78
- --name dblab_server \
105
+ --name ${DLE_SERVER_NAME} \
79
106
--label dblab_control \
107
+ --label dblab_test \
80
108
--privileged \
81
- --publish 2345:2345 \
109
+ --publish ${DLE_SERVER_PORT} : ${DLE_SERVER_PORT} \
82
110
--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 \
85
113
--volume " ${configDir} " :/home/dblab/configs:ro \
86
114
--volume " ${metaDir} " :/home/dblab/meta \
87
115
--volume /sys/kernel/debug:/sys/kernel/debug:rw \
@@ -92,11 +120,11 @@ sudo docker run \
92
120
" ${IMAGE2TEST} "
93
121
94
122
# 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}' &
96
124
97
125
# ## Waiting for the Database Lab Engine initialization.
98
126
for 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"
100
128
sleep 1
101
129
done
102
130
@@ -112,7 +140,7 @@ dblab --version
112
140
# Initialize CLI configuration
113
141
dblab init \
114
142
--environment-id=test \
115
- --url=http://localhost:2345 \
143
+ --url=http://localhost:${DLE_SERVER_PORT} \
116
144
--token=secret_token \
117
145
--insecure
118
146
@@ -128,14 +156,14 @@ dblab clone create \
128
156
129
157
# Connect to a clone and check the available table
130
158
PGPASSWORD=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+'
132
160
133
161
# Drop table
134
162
PGPASSWORD=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'
136
164
137
165
PGPASSWORD=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+'
139
167
140
168
# # Reset clone
141
169
dblab clone reset testclone
@@ -145,11 +173,14 @@ dblab clone status testclone
145
173
146
174
# Check the database objects (everything should be the same as when we started)
147
175
PGPASSWORD=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+'
149
177
150
178
# ## Step 4. Destroy clone
151
179
dblab clone destroy testclone
152
180
dblab clone list
153
181
182
+ # # Stop DLE.
183
+ sudo docker stop ${DLE_SERVER_NAME}
184
+
154
185
# ## Finish. clean up
155
186
source " ${DIR} /_cleanup.sh"
0 commit comments