Skip to content

Commit

Permalink
Docker backend
Browse files Browse the repository at this point in the history
  • Loading branch information
fmaste committed Aug 8, 2022
1 parent be043dc commit 2d00387
Show file tree
Hide file tree
Showing 11 changed files with 700 additions and 14 deletions.
19 changes: 19 additions & 0 deletions nix/pkgs.nix
Expand Up @@ -84,6 +84,11 @@ final: prev: with final; {
supervisord-workbench-nix =
{ workbench ? pkgs.workbench, ... }@args: pkgs.callPackage ./workbench/supervisor.nix args;

docker-workbench-cabal =
{ workbench ? pkgs.workbench, ... }@args: pkgs.callPackage ./workbench/docker.nix (args // { useCabalRun = true; });
docker-workbench-nix =
{ workbench ? pkgs.workbench, ... }@args: pkgs.callPackage ./workbench/docker.nix args;

all-profiles-json = (pkgs.callPackage ./workbench/supervisor.nix {}).all-profiles.JSON;

# An instance of the workbench, specialised to the supervisord backend and a profile,
Expand All @@ -103,6 +108,20 @@ final: prev: with final; {
inherit batchName profileName supervisord-workbench cardano-node-rev;
};

docker-workbench-for-profile =
{ batchName ? customConfig.localCluster.batchName
, profileName ? customConfig.localCluster.profileName
, useCabalRun ? false
, workbenchDevMode ? false
, profiled ? false
, docker-workbench ? pkgs.callPackage ./workbench/docker.nix { inherit useCabalRun; }
, cardano-node-rev ? null
}:
pkgs.callPackage ./workbench/docker-run.nix
{
inherit batchName profileName docker-workbench cardano-node-rev;
};

# Disable failing python uvloop tests
python38 = prev.python38.override {
packageOverrides = pythonFinal: pythonPrev: {
Expand Down
19 changes: 12 additions & 7 deletions nix/workbench/app.sh
Expand Up @@ -35,7 +35,7 @@ app() {
, image: \"$imageName:$imageTag\"
, networks: {
\"cardano-node-network\": {
ipv4_address: \"172.16.22.1\(.value.i)\"
ipv4_address: \"172.22.\(.value.i / 254 | floor).\(.value.i % 254 + 1)\"
}
}
, ports: [\"\(.value.port):\(.value.port)\"]
Expand All @@ -44,11 +44,16 @@ app() {
, \"LOCAL-\(.value.name):/var/cardano-node/local\"
]
, environment: [
\"HOST_ADDR=172.16.22.1\(.value.i)\"
\"HOST_ADDR=172.22.\(.value.i / 254 | floor).\(.value.i % 254 + 1)\"
, \"PORT=\(.value.port)\"
, \"DATA_DIR=/var/cardano-node/local\"
, \"NODE_CONFIG=/var/cardano-node/local/config.json\"
, \"NODE_TOPOLOGY=/var/cardano-node/local/topology.json\"
, \"SOCKET_PATH=/var/cardano-node/local/node.socket\"
, \"RTS_FLAGS=+RTS -N2 -I0 -A16m -qg -qb --disable-delayed-os-memory-return -RTS\"
, \"SHELLEY_KES_KEY=/var/cardano-node/local/../genesis/node-keys/node-kes\(.value.i).skey\"
, \"SHELLEY_VRF_KEY=/var/cardano-node/local/../genesis/node-keys/node-vrf\(.value.i).skey\"
, \"SHELLEY_OPCERT=/var/cardano-node/local/../genesis/node-keys/node\(.value.i).opcert\"
]
}
}
Expand All @@ -64,9 +69,9 @@ app() {
, ipam: {
driver: \"default\"
, config: [{
subnet: \"172.16.22.0/24\"
, ip_range: \"172.16.22.0/24\"
, gateway: \"172.16.22.1\"
subnet: \"172.22.0.0/16\"
, ip_range: \"172.22.0.0/16\"
, gateway: \"172.22.255.254\"
, aux_addresses: {}
}]
}
Expand All @@ -83,7 +88,7 @@ app() {
, driver_opts: {
type: \"none\"
, o: \"bind\"
, device: \"./run/current/\(.value.name)\"
, device: \"./run/\${WB_RUNDIR_TAG:-current}/\(.value.name)\"
}
}
}
Expand All @@ -95,7 +100,7 @@ app() {
, driver_opts: {
type: \"none\"
, o: \"bind\"
, device: \"./run/current\"
, device: \"./run/\${WB_RUNDIR_TAG:-current}\"
}
}
}
Expand Down
80 changes: 80 additions & 0 deletions nix/workbench/docker-conf.nix
@@ -0,0 +1,80 @@
{ pkgs
, lib
, stateDir
, basePort
, node-services
, generator-service
## Last-moment overrides:
, extraSupervisorConfig
}:

with lib;

let
##
## supervisorConf :: SupervisorConf
##
## Refer to: http://supervisord.org/configuration.html
##
supervisorConf =
{
supervisord = {
logfile = "${stateDir}/supervisor/supervisord.log";
pidfile = "${stateDir}/supervisor/supervisord.pid";
strip_ansi = true;
};
supervisorctl = {};
inet_http_server = {
port = "127.0.0.1:9001";
};
"rpcinterface:supervisor" = {
"supervisor.rpcinterface_factory" = "supervisor.rpcinterface:make_main_rpcinterface";
};
}
//
listToAttrs
(mapAttrsToList (_: nodeSvcSupervisorProgram) node-services)
//
{
"program:generator" = {
directory = "${stateDir}/generator";
command = "sh start.sh";
stdout_logfile = "${stateDir}/generator/stdout";
stderr_logfile = "${stateDir}/generator/stderr";
autostart = false;
startretries = 0;
};
}
//
{
"program:tracer" = {
directory = "${stateDir}/tracer";
command = "sh start.sh";
stdout_logfile = "${stateDir}/tracer/stdout";
stderr_logfile = "${stateDir}/tracer/stderr";
autostart = false;
startretries = 0;
};
}
//
extraSupervisorConfig;

##
## nodeSvcSupervisorProgram :: NodeService -> SupervisorConfSection
##
## Refer to: http://supervisord.org/configuration.html#program-x-section-settings
##
nodeSvcSupervisorProgram = { nodeSpec, service, ... }:
nameValuePair "program:${nodeSpec.value.name}" {
directory = "${service.value.stateDir}";
command = "sh start.sh";
stdout_logfile = "${service.value.stateDir}/stdout";
stderr_logfile = "${service.value.stateDir}/stderr";
startretries = 0;
autostart = false;
autorestart = false;
};

in
pkgs.writeText "supervisor.conf"
(generators.toINI {} supervisorConf)
157 changes: 157 additions & 0 deletions nix/workbench/docker-run.nix
@@ -0,0 +1,157 @@
let
batchNameDefault = "plain";
profileNameDefault = "default-bage";
in

{ pkgs
, cardanoNodePackages
, docker-workbench
##
, profileName ? profileNameDefault
, batchName ? batchNameDefault
##
, workbenchDevMode ? false
, cardano-node-rev ? "0000000000000000000000000000000000000000"
}:

let
inherit (docker-workbench) workbench backend cacheDir stateDir basePort;

with-docker-profile =
{ envArgsOverride ? {} }:
workbench.with-profile
{ inherit backend profileName;
envArgs = docker-workbench.env-args-base // envArgsOverride;
};

inherit
(with-docker-profile {})
profileNix profile topology genesis;
in

let

inherit (profile.value) era composition monetary;

path = pkgs.lib.makeBinPath path';
path' =
[ cardanoNodePackages.bech32 pkgs.jq pkgs.gnused pkgs.coreutils pkgs.bash pkgs.moreutils
]
## In dev mode, call the script directly:
++ pkgs.lib.optionals (!workbenchDevMode)
[ workbench.workbench ];

interactive-start = pkgs.writeScriptBin "start-cluster" ''
set -euo pipefail
export PATH=$PATH:${path}
wb start \
--batch-name ${batchName} \
--profile-name ${profileName} \
--profile ${profile} \
--cache-dir ${cacheDir} \
--base-port ${toString basePort} \
''${WB_MODE_CABAL:+--cabal} \
"$@"
'';

interactive-stop = pkgs.writeScriptBin "stop-cluster" ''
set -euo pipefail
wb finish "$@"
'';

interactive-restart = pkgs.writeScriptBin "restart-cluster" ''
set -euo pipefail
wb run restart "$@" && \
echo "workbench: alternate command for this action: wb run restart" >&2
'';

nodeBuildProduct =
name:
"report ${name}-log $out ${name}/stdout";

profile-run =
{ trace ? false }:
let
inherit
(with-docker-profile
{ envArgsOverride = { cacheDir = "./cache"; stateDir = "./"; }; })
profileNix profile topology genesis;

run = pkgs.runCommand "workbench-run-docker-${profileName}"
{ requiredSystemFeatures = [ "benchmark" ];
nativeBuildInputs = with cardanoNodePackages; with pkgs; [
bash
bech32
coreutils
gnused
jq
moreutils
nixWrapped
pstree
python3Packages.docker
workbench.workbench
zstd
];
}
''
mkdir -p $out/{cache,nix-support}
cd $out
export HOME=$out
export WB_BACKEND=docker
export CARDANO_NODE_SOCKET_PATH=$(wb backend get-node-socket-path ${stateDir} node-0)
cmd=(
wb
${pkgs.lib.optionalString trace "--trace"}
start
--profile-name ${profileName}
--profile ${profile}
--topology ${topology}
--genesis-cache-entry ${genesis}
--batch-name smoke-test
--base-port ${toString basePort}
--node-source ${cardanoNodePackages.cardano-node.src.origSrc}
--node-rev ${cardano-node-rev}
--cache-dir ./cache
)
echo "''${cmd[*]}" > $out/wb-start.sh
time "''${cmd[@]}" 2>&1 |
tee $out/wb-start.log
## Convert structure from $out/run/RUN-ID/* to $out/*:
rm -rf cache
rm -f run/{current,-current}
find $out -type s | xargs rm -f
tag=$(cd run; ls)
(cd run; tar c $tag --zstd) > archive.tar.zst
mv run/$tag/* .
rmdir run/$tag run
cat > $out/nix-support/hydra-build-products <<EOF
report workbench-log $out wb-start.log
report meta $out meta.json
${pkgs.lib.concatStringsSep "\n"
(map nodeBuildProduct (__attrNames profileNix.node-specs.value))}
report archive-tar-zst $out archive.tar.zst
EOF
echo "workbench-test: completed run $tag"
'';
in
run // {
analysis = workbench.run-analysis { inherit pkgs workbench profileNix run; };
};
in
{
inherit stateDir;
inherit workbench docker-workbench;
inherit profileNix profile topology genesis;
inherit interactive-start interactive-stop interactive-restart;
inherit profile-run;
}

0 comments on commit 2d00387

Please sign in to comment.