99, slocat
1010, writeText
1111, writers
12+ , toxiproxy
1213} :
1314let
1415 withTmpDb =
3536 positionalCompletion = "_command" ;
3637 workingDir = "/" ;
3738 redirectTixFiles = false ;
38- withPath = [ postgresql ] ;
39+ withPath = [ postgresql toxiproxy ] ;
3940 withTmpDir = true ;
4041 }
4142 ''
5556
5657 export PGDATA="$tmpdir/db"
5758 export PGHOST="$tmpdir/socket"
59+ export PGPORT=6432
5860 export PGUSER
5961 export PGDATABASE
6062 export PGRST_DB_SCHEMAS
6365
6466 HBA_FILE="$tmpdir/pg_hba.conf"
6567 echo "local $PGDATABASE some_protected_user password" > "$HBA_FILE"
66- echo "local $PGDATABASE all trust" >> "$HBA_FILE"
67- echo "local replication all trust" >> "$HBA_FILE"
68+ {
69+ echo "local $PGDATABASE all trust"
70+ echo "local replication all trust"
71+ echo "host $PGDATABASE all localhost trust"
72+ } >> "$HBA_FILE"
73+
74+ UNIX_PGHOST="$PGHOST"
75+ export TCP_PGHOST="localhost"
76+ REAL_PGPORT="$PGPORT"
77+ export TOXI_PGPORT=7432
6878
6979 log "Initializing database cluster..."
7080 # We try to make the database cluster as independent as possible from the host
8191 # On MacOS, it's 104 chars
8292 # See: https://serverfault.com/questions/641347/check-if-a-path-exceeds-maximum-for-unix-domain-socket
8393
84- pg_ctl -l "$tmpdir/db.log" -w start -o "-F -c listen_addresses=\"\" -c hba_file=$HBA_FILE -k $PGHOST -c log_statement=\"all\" " \
94+ pg_ctl -l "$tmpdir/db.log" -w start -o "-F -c listen_addresses=\"$TCP_PGHOST \" -c port=$REAL_PGPORT -c hba_file=$HBA_FILE -k $UNIX_PGHOST -c log_statement=\"all\" " \
8595 >> "$setuplog"
8696
97+ LOG_LEVEL=error toxiproxy-server&
98+ TOXIPROXY_PID=$!
99+ sleep 1 # give the server a moment to start
100+ toxiproxy-cli create -l "$TCP_PGHOST:$TOXI_PGPORT" -u "$TCP_PGHOST:$REAL_PGPORT" pg
101+
87102 log "Creating a minimally privileged $PGUSER connection role..."
88103 createuser "$PGUSER" -U postgres --host="$tmpdir/socket" --no-createdb --no-inherit --no-superuser --no-createrole --no-replication --login
89104
94109 replica_slot="replica_$RANDOM"
95110 replica_dir="$tmpdir/$replica_slot"
96111 replica_host="$tmpdir/socket_$replica_slot"
112+ replica_port=6433
113+ TOXI_REPLICA_PGPORT=7433
97114
98115 mkdir -p "$replica_host"
99116
@@ -106,15 +123,17 @@ let
106123
107124 log "Starting replica on $replica_host"
108125
109- pg_ctl -D "$replica_dir" -l "$replica_dblog" -w start -o "-F -c listen_addresses=\"\" -c hba_file=$HBA_FILE -k $replica_host -c log_statement=\"all\" " \
126+ pg_ctl -D "$replica_dir" -l "$replica_dblog" -w start -o "-F -c listen_addresses=\"$TCP_PGHOST\" -c port=$replica_port -c hba_file=$HBA_FILE -k $replica_host -c log_statement=\"all\" " \
110127 >> "$setuplog"
128+ toxiproxy-cli create -l $TCP_PGHOST:$TOXI_REPLICA_PGPORT -u $TCP_PGHOST:$replica_port pg_replica
111129
112130 >&2 echo "${ commandName } : Replica enabled. You can connect to it with: psql 'postgres:///$PGDATABASE?host=$replica_host' -U postgres"
113131 >&2 echo "${ commandName } : You can tail the replica logs with: tail -f $replica_dblog"
114132
115- export PGREPLICAHOST="$replica_host"
133+ export PGREPLICAHOST="$TCP_PGHOST"
134+ export PGREPLICAPORT="$TOXI_REPLICA_PGPORT"
116135 export PGREPLICASLOT="$replica_slot"
117- export PGRST_DB_URI="postgres:///$PGDATABASE?host=$PGREPLICAHOST,$PGHOST "
136+ export PGRST_DB_URI="postgres:///$PGDATABASE?host=$PGREPLICAHOST,$TCP_PGHOST&port=$PGREPLICAPORT,$TOXI_PGPORT "
118137 fi
119138
120139 # shellcheck disable=SC2317
127146 pg_ctl -D "$replica_dir" stop --mode=immediate >> "$setuplog"
128147 rm -rf "$replica_dir"
129148 fi
149+ kill "$TOXIPROXY_PID" || true
150+ wait "$TOXIPROXY_PID" || true
130151 }
131152 trap stop EXIT
132153 fi
139160 >&2 printf " done in %ss. Running command...\n" "$load_end"
140161 fi
141162
142- ("$_arg_command" "'' ${_arg_leftovers[@]}")
163+ (PGHOST="$TCP_PGHOST" PGPORT="$TOXI_PGPORT" "$_arg_command" "'' ${_arg_leftovers[@]}")
143164 '' ;
144165
145166 # Helper script for running a command against all PostgreSQL versions.
0 commit comments