diff --git a/default.nix b/default.nix index ebad92df285..be3cb738223 100644 --- a/default.nix +++ b/default.nix @@ -41,6 +41,7 @@ let allOverlays.postgresql-legacy allOverlays.postgresql-future (allOverlays.haskell-packages { inherit compiler; }) + allOverlays.slocat ]; # Evaluated expression of the Nixpkgs repository. diff --git a/nix/overlays/default.nix b/nix/overlays/default.nix index 43d15486882..8b0b3af4ff2 100644 --- a/nix/overlays/default.nix +++ b/nix/overlays/default.nix @@ -7,4 +7,5 @@ postgresql-default = import ./postgresql-default.nix; postgresql-legacy = import ./postgresql-legacy.nix; postgresql-future = import ./postgresql-future.nix; + slocat = import ./slocat.nix; } diff --git a/nix/overlays/slocat.nix b/nix/overlays/slocat.nix new file mode 100644 index 00000000000..cb17963c0e0 --- /dev/null +++ b/nix/overlays/slocat.nix @@ -0,0 +1,13 @@ +final: prev: +{ + slocat = prev.buildGoModule { + name = "slocat"; + src = prev.fetchFromGitHub { + owner = "robx"; + repo = "slocat"; + rev = "52e7512c6029fd00483e41ccce260a3b4b9b3b64"; + sha256 = "sha256-qn6luuh5wqREu3s8RfuMCP5PKdS2WdwPrujRYTpfzQ8="; + }; + vendorSha256 = "sha256-pQpattmS9VmO3ZIQUFn66az8GSmB4IvYhTTCFn6SUmo="; + }; +} diff --git a/nix/tools/withTools.nix b/nix/tools/withTools.nix index 7c7b2753e61..c7dceb49b16 100644 --- a/nix/tools/withTools.nix +++ b/nix/tools/withTools.nix @@ -8,6 +8,7 @@ , lib , postgresqlVersions , postgrest +, slocat , writeText }: let @@ -137,6 +138,81 @@ let withPg = builtins.head withPgVersions; + withSlowPg = + checkedShellScript + { + name = "postgrest-with-slow-pg"; + docs = "Run the given command with simulated high latency postgresql"; + args = + [ + "ARG_POSITIONAL_SINGLE([command], [Command to run])" + "ARG_LEFTOVERS([command arguments])" + "ARG_USE_ENV([PGHOST], [], [PG host (socket name)])" + "ARG_USE_ENV([PGDELAY], [0ms], [extra PG latency (duration)])" + ]; + positionalCompletion = "_command"; + inRootDir = true; + redirectTixFiles = false; + withTmpDir = true; + } + '' + delay="''${PGDELAY:-0ms}" + echo "delaying data to/from postgres by $delay" + + REALPGHOST="$PGHOST" + export PGHOST="$tmpdir/socket" + mkdir -p "$PGHOST" + + ${slocat}/bin/slocat -delay "$delay" -src "$PGHOST/.s.PGSQL.5432" -dst "$REALPGHOST/.s.PGSQL.5432" & + SLOCAT_PID=$! + # shellcheck disable=SC2317 + stop_slocat() { + kill "$SLOCAT_PID" || true + wait "$SLOCAT_PID" || true + } + trap stop_slocat EXIT + sleep 1 # should wait for socket file to appear instead + + ("$_arg_command" "''${_arg_leftovers[@]}") + ''; + + withSlowPgrst = + checkedShellScript + { + name = "postgrest-with-slow-postgrest"; + docs = "Run the given command with simulated high latency postgrest"; + args = + [ + "ARG_POSITIONAL_SINGLE([command], [Command to run])" + "ARG_LEFTOVERS([command arguments])" + "ARG_USE_ENV([PGRST_SERVER_UNIX_SOCKET], [], [PostgREST host (socket name)])" + "ARG_USE_ENV([PGRST_DELAY], [0ms], [extra PostgREST latency (duration)])" + ]; + positionalCompletion = "_command"; + inRootDir = true; + redirectTixFiles = false; + withTmpDir = true; + } + '' + delay="''${PGRST_DELAY:-0ms}" + echo "delaying data to/from PostgREST by $delay" + + REAL_PGRST_SERVER_UNIX_SOCKET="$PGRST_SERVER_UNIX_SOCKET" + export PGRST_SERVER_UNIX_SOCKET="$tmpdir/postgrest.socket" + + ${slocat}/bin/slocat -delay "$delay" -src "$PGRST_SERVER_UNIX_SOCKET" -dst "$REAL_PGRST_SERVER_UNIX_SOCKET" & + SLOCAT_PID=$! + # shellcheck disable=SC2317 + stop_slocat() { + kill "$SLOCAT_PID" || true + wait "$SLOCAT_PID" || true + } + trap stop_slocat EXIT + sleep 1 # should wait for socket file to appear instead + + ("$_arg_command" "''${_arg_leftovers[@]}") + ''; + withGit = let name = "postgrest-with-git"; @@ -288,7 +364,7 @@ in buildToolbox { name = "postgrest-with"; - tools = [ withPgAll withGit withPgrst ] ++ withPgVersions; + tools = [ withPgAll withGit withPgrst withSlowPg withSlowPgrst ] ++ withPgVersions; # make withTools available for other nix files - extra = { inherit withGit withPg withPgAll withPgrst; }; + extra = { inherit withGit withPg withPgAll withPgrst withSlowPg withSlowPgrst; }; }