From bd79b935b005104432cbd14b4fa9a0487598c61c Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Tue, 9 Dec 2025 13:15:52 +0100 Subject: [PATCH 1/9] Draft configure-netns.sh script for namespaced Leios experiments --- demo/2025-11/build.nix | 7 +++- demo/2025-11/configure-netns.sh | 74 +++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 demo/2025-11/configure-netns.sh diff --git a/demo/2025-11/build.nix b/demo/2025-11/build.nix index 63450b97b..0a381a6e5 100644 --- a/demo/2025-11/build.nix +++ b/demo/2025-11/build.nix @@ -13,7 +13,12 @@ name = "dev-demo-2025-11"; src = ./.; inputsFrom = [ config.devShells.dev-demo ]; - packages = [ pkgs.process-compose ]; + packages = [ + pkgs.process-compose + pkgs.iproute2 + pkgs.sqlite + config.packages.ss_http_exporter + ]; inherit (config.devShells.dev-demo) IMMDB_SERVER CARDANO_NODE; }; }; diff --git a/demo/2025-11/configure-netns.sh b/demo/2025-11/configure-netns.sh new file mode 100644 index 000000000..c07dcc800 --- /dev/null +++ b/demo/2025-11/configure-netns.sh @@ -0,0 +1,74 @@ +NS_PREFIX="leios_experiment" +NS_UPSTREAM="${NS_PREFIX}-upstream" +NS_NODE0="${NS_PREFIX}-node0" +NS_DOWNSTREAM="${NS_PREFIX}-downstream" + +# Delete all namespaces +ip netns del "$NS_UPSTREAM"; +ip netns del "$NS_NODE0"; +ip netns del "$NS_DOWNSTREAM"; + +# Create all namespaces +ip netns add "$NS_UPSTREAM"; +ip netns add "$NS_NODE0"; +ip netns add "$NS_DOWNSTREAM"; + +# Create a VETH link upstream <-> node0 +ip link add "up->n0" type veth peer name "n0->up" +ip link set "up->n0" netns "$NS_UPSTREAM" +ip link set "n0->up" netns "$NS_NODE0" +ip netns exec "$NS_UPSTREAM" ip link set "up->n0" up +ip netns exec "$NS_NODE0" ip link set "n0->up" up + +# Create a VETH link node0 <-> downstream +ip link add "n0->down" type veth peer name "down->n0" +ip link set "n0->down" netns "$NS_NODE0" +ip link set "down->n0" netns "$NS_DOWNSTREAM" +ip netns exec "$NS_NODE0" ip link set "n0->down" up +ip netns exec "$NS_DOWNSTREAM" ip link set "down->n0" up + +# Configure IFB devices for TC +ip netns exec "$NS_UPSTREAM" ip link add "ifb!up->n0" type ifb +ip netns exec "$NS_NODE0" ip link add "ifb!n0->up" type ifb +ip netns exec "$NS_NODE0" ip link add "ifb!n0->down" type ifb +ip netns exec "$NS_DOWNSTREAM" ip link add "ifb!down->n0" type ifb + +ip netns exec "$NS_UPSTREAM" ip link set "ifb!up->n0" up +ip netns exec "$NS_NODE0" ip link set "ifb!n0->up" up +ip netns exec "$NS_NODE0" ip link set "ifb!n0->down" up +ip netns exec "$NS_DOWNSTREAM" ip link set "ifb!down->n0" up + +# Configure traffic control + +function limit_rate() { + ns="$1" + veth_dev="$2" + rate="$3" + ip netns exec "$ns" tc qdisc add dev "$veth_dev" root handle 1: htb default 1 + ip netns exec "$ns" tc class add dev "$veth_dev" parent 1: classid 1:1 htb rate "$rate" + ip netns exec "$ns" tc qdisc add dev "$veth_dev" parent 1:1 handle 10: fq_codel +} + +function delay() { + ns="$1" + veth_dev="$2" + delay="$3" + ip netns exec "$ns" tc qdisc add dev "$veth_dev" handle ffff: ingress + ip netns exec "$ns" tc filter add dev "$veth_dev" parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev "ifb!$veth_dev" + ip netns exec "$ns" tc qdisc add dev "ifb!$veth_dev" root netem delay "$delay" +} + +limit_rate "$NS_UPSTREAM" "up->n0" "100mbit" +delay "$NS_UPSTREAM" "up->n0" "20ms" + +limit_rate "$NS_NODE0" "n0->up" "100mbit" +delay "$NS_NODE0" "n0->up" "20ms" +limit_rate "$NS_NODE0" "n0->down" "100mbit" +delay "$NS_NODE0" "n0->down" "20ms" + +limit_rate "$NS_DOWNSTREAM" "down->n0" "100mbit" +delay "$NS_DOWNSTREAM" "down->n0" "20ms" + +# Configure UPSTREAM network +# ip netns exec "$NS_UPSTREAM" ip addr add "$NET_NODE0" dev "upstream->node0" + From 2f3728eb8365c62e174b3321d5f1c965870131bf Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Tue, 9 Dec 2025 13:37:55 +0100 Subject: [PATCH 2/9] Configure IP assignments and network routes --- demo/2025-11/configure-netns.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/demo/2025-11/configure-netns.sh b/demo/2025-11/configure-netns.sh index c07dcc800..939aefb36 100644 --- a/demo/2025-11/configure-netns.sh +++ b/demo/2025-11/configure-netns.sh @@ -2,6 +2,9 @@ NS_PREFIX="leios_experiment" NS_UPSTREAM="${NS_PREFIX}-upstream" NS_NODE0="${NS_PREFIX}-node0" NS_DOWNSTREAM="${NS_PREFIX}-downstream" +IP_UPSTREAM="10.0.0.1" +IP_NODE0="10.0.0.2" +IP_DOWNSTREAM="10.0.0.3" # Delete all namespaces ip netns del "$NS_UPSTREAM"; @@ -69,6 +72,9 @@ delay "$NS_NODE0" "n0->down" "20ms" limit_rate "$NS_DOWNSTREAM" "down->n0" "100mbit" delay "$NS_DOWNSTREAM" "down->n0" "20ms" -# Configure UPSTREAM network -# ip netns exec "$NS_UPSTREAM" ip addr add "$NET_NODE0" dev "upstream->node0" +# Configure IP assignments and network routes +ip netns exec "$NS_UPSTREAM" ip addr add local "$IP_UPSTREAM" peer "$IP_NODE0" dev "up->n0" +ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_UPSTREAM" dev "n0->up" +ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_DOWNSTREAM" dev "n0->down" +ip netns exec "$NS_DOWNSTREAM" ip addr add local "$IP_DOWNSTREAM" peer "$IP_NODE0" dev "down->n0" From 624cc9e32116555a7626860e82608862e96e9690 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Wed, 10 Dec 2025 11:00:16 +0100 Subject: [PATCH 3/9] Major refactor to accomodate running in namespaces --- demo/.shellcheckrc | 2 +- demo/2025-11/.env | 22 ++- demo/2025-11/README.md | 9 +- demo/2025-11/build.nix | 18 +- demo/2025-11/data/topology.template.json | 2 +- demo/2025-11/process-compose.yaml | 166 +++--------------- demo/2025-11/scripts/downstream-node.sh | 11 ++ .../init-namespaces.sh} | 54 +++--- demo/2025-11/scripts/init.sh | 53 ++++++ demo/2025-11/scripts/node0.sh | 11 ++ .../scripts/prepare-downstream-node.sh | 20 +++ demo/2025-11/scripts/prepare-node0.sh | 20 +++ demo/2025-11/scripts/prepare-upstream-node.sh | 28 +++ demo/2025-11/scripts/upstream-node.sh | 13 ++ demo/pre-commit-hooks.nix | 1 + 15 files changed, 256 insertions(+), 174 deletions(-) create mode 100755 demo/2025-11/scripts/downstream-node.sh rename demo/2025-11/{configure-netns.sh => scripts/init-namespaces.sh} (63%) mode change 100644 => 100755 create mode 100755 demo/2025-11/scripts/init.sh create mode 100755 demo/2025-11/scripts/node0.sh create mode 100755 demo/2025-11/scripts/prepare-downstream-node.sh create mode 100755 demo/2025-11/scripts/prepare-node0.sh create mode 100755 demo/2025-11/scripts/prepare-upstream-node.sh create mode 100755 demo/2025-11/scripts/upstream-node.sh diff --git a/demo/.shellcheckrc b/demo/.shellcheckrc index 3f3c577cf..7c6cc25ef 100644 --- a/demo/.shellcheckrc +++ b/demo/.shellcheckrc @@ -1 +1 @@ -disable=SC2148,SC1090,SC2002 +disable=SC2148,SC1090,SC1091,SC2002 diff --git a/demo/2025-11/.env b/demo/2025-11/.env index a71c8e192..4ec412867 100644 --- a/demo/2025-11/.env +++ b/demo/2025-11/.env @@ -1,5 +1,7 @@ WORKING_DIR=.tmp-leios-202511-demo +SCRIPTS=./scripts + DEF_CARDANO_NODE=cardano-node DEF_IMMDB_SERVER=immdb-server DEF_DATA_DIR=data @@ -8,6 +10,20 @@ DEF_SECONDS_UNTIL_REF_SLOT=5 DEF_LEIOS_MANIFEST=manifest.json DEF_ANALYSE_PY=analyse.py DEF_PYTHON3=python -DEF_UPSTREAM_NODE_PORT=3001 -DEF_NODE0_PORT=3002 -DEF_DOWNSTREAM_NODE_PORT=3003 + +DEF_PORT_UPSTREAM_NODE=3001 +DEF_PORT_NODE0=3002 +DEF_PORT_DOWNSTREAM_NODE=3003 + +DEF_IP_UPSTREAM_NODE="10.0.0.1" +DEF_IP_NODE0="10.0.0.2" +DEF_IP_DOWNSTREAM_NODE="10.0.0.3" + +DEF_RATE_UP_TO_N0="100Mbps" +DEF_DELAY_UP_TO_N0="20ms" +DEF_RATE_N0_TO_UP="100Mbps" +DEF_DELAY_N0_TO_UP="20ms" +DEF_RATE_N0_TO_DOWN="100Mbps" +DEF_DELAY_N0_TO_DOWN="20ms" +DEF_RATE_DOWN_TO_N0="100Mbps" +DEF_DELAY_DOWN_TO_N0="20ms" diff --git a/demo/2025-11/README.md b/demo/2025-11/README.md index 3a1a618e2..97e2f0367 100644 --- a/demo/2025-11/README.md +++ b/demo/2025-11/README.md @@ -72,7 +72,14 @@ LEIOS_MANIFEST=manifest.json ANALYSE_PY=analyse.py PYTHON3=python CARDANO_NODE=cardano-node -IMMDB_SERVER=immdb-server +RATE_UP_TO_N0="100Mbps"; +DELAY_UP_TO_N0="20ms"; +RATE_N0_TO_UP="100Mbps"; +DELAY_N0_TO_UP="20ms"; +RATE_N0_TO_DOWN="100Mbps"; +DELAY_N0_TO_DOWN="20ms"; +RATE_DOWN_TO_N0="100Mbps"; +DMMDB_SERVER=immdb-server ``` To clean up just delete the working directories diff --git a/demo/2025-11/build.nix b/demo/2025-11/build.nix index 0a381a6e5..f309cabbf 100644 --- a/demo/2025-11/build.nix +++ b/demo/2025-11/build.nix @@ -33,9 +33,13 @@ runtimeEnv = { # Non configurable WORKING_DIR = ".tmp-leios-202511-demo"; - UPSTREAM_NODE_PORT = 3001; - NODE0_PORT = 3002; - DOWNSTREAM_NODE_PORT = 3003; + SCRIPTS=./scripts; + PORT_UPSTREAM_NODE = 3001; + PORT_NODE0 = 3002; + PORT_DOWNSTREAM_NODE = 3003; + IP_UPSTREAM_NODE="10.0.0.1"; + IP_NODE0="10.0.0.2"; + IP_DOWNSTREAM_NODE="10.0.0.3"; # Configurable (if you see DEF_FOO that's a default value for FOO if unset) DEF_CARDANO_NODE = config.devShells.dev-demo-2025-11.CARDANO_NODE; DEF_IMMDB_SERVER = config.devShells.dev-demo-2025-11.IMMDB_SERVER; @@ -52,6 +56,14 @@ ] ) ); + DEF_RATE_UP_TO_N0="100Mbps"; + DEF_DELAY_UP_TO_N0="20ms"; + DEF_RATE_N0_TO_UP="100Mbps"; + DEF_DELAY_N0_TO_UP="20ms"; + DEF_RATE_N0_TO_DOWN="100Mbps"; + DEF_DELAY_N0_TO_DOWN="20ms"; + DEF_RATE_DOWN_TO_N0="100Mbps"; + DEF_DELAY_DOWN_TO_N0="20ms"; }; text = '' process-compose --no-server -f ${./process-compose.yaml}; diff --git a/demo/2025-11/data/topology.template.json b/demo/2025-11/data/topology.template.json index 6da4530b9..55796ded9 100644 --- a/demo/2025-11/data/topology.template.json +++ b/demo/2025-11/data/topology.template.json @@ -4,7 +4,7 @@ { "accessPoints": [ { - "address": "127.0.0.1", + "address": "#REPLACE#", "port": "#REPLACE#" } ], diff --git a/demo/2025-11/process-compose.yaml b/demo/2025-11/process-compose.yaml index c837d5155..f478540db 100644 --- a/demo/2025-11/process-compose.yaml +++ b/demo/2025-11/process-compose.yaml @@ -1,102 +1,34 @@ version: "0.5" +is_strict: true processes: Init: command: | - set -exo pipefail; - - echo "Initializing WORKING_DIR"; - if [ ! -d "$WORKING_DIR" ]; then - mkdir "$WORKING_DIR" - echo "Working directory created: $WORKING_DIR" - fi; - - cat <<-EOF > "$WORKING_DIR/.env" - CARDANO_NODE=${CARDANO_NODE:-"$DEF_CARDANO_NODE"} - IMMDB_SERVER=${IMMDB_SERVER:-"$DEF_IMMDB_SERVER"} - SECONDS_UNTIL_REF_SLOT=${SECONDS_UNTIL_REF_SLOT:-"$DEF_SECONDS_UNTIL_REF_SLOT"} - REF_SLOT=${REF_SLOT:-"$DEF_REF_SLOT"} - DATA_DIR=${DATA_DIR:-"$DEF_DATA_DIR"} - LEIOS_MANIFEST=${LEIOS_MANIFEST:-"$DEF_LEIOS_MANIFEST"} - PYTHON3=${PYTHON3:-"$DEF_PYTHON3"} - ANALYSE_PY=${ANALYSE_PY:-"$DEF_ANALYSE_PY"} - UPSTREAM_NODE_DIR="$WORKING_DIR/upstream-node" - NODE0_DIR="$WORKING_DIR/node0" - DOWNSTREAM_NODE_DIR="$WORKING_DIR/downstream-node" - UPSTREAM_NODE_PORT=${UPSTREAM_NODE_PORT:-"$DEF_UPSTREAM_NODE_PORT"} - NODE0_PORT=${NODE0_PORT:-"$DEF_NODE0_PORT"} - DOWNSTREAM_NODE_PORT=${DOWNSTREAM_NODE_PORT:-"$DEF_DOWNSTREAM_NODE_PORT"} - EOF - - set -a && source "$WORKING_DIR/.env" && set +a; - - if [ ! -d "$WORKING_DIR/genesis" ]; then - echo "Copying genesis"; - cp -fr "$DATA_DIR/genesis" "$WORKING_DIR/genesis"; - chmod -R +rw "$WORKING_DIR/genesis"; - fi; - - now=$(date +%s); - cat <<-EOF >> "$WORKING_DIR/.env" - ONSET_OF_REF_SLOT=$(( now + SECONDS_UNTIL_REF_SLOT )) - EOF - - + bash "${SCRIPTS}/init.sh" availability: restart: "on_failure" + InitNamespaces: + is_elevated: true + command: | + bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/init-namespaces.sh" + depends_on: + Init: + condition: process_completed_successfully PrepareUpstreamNode: command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - if [ -d "$UPSTREAM_NODE_DIR" ]; then - echo "Removing old $UPSTREAM_NODE_DIR" - rm -fr "$UPSTREAM_NODE_DIR"; - fi - - mkdir "$UPSTREAM_NODE_DIR"; - echo "Working directory created for upstream-node: $UPSTREAM_NODE_DIR"; - - echo "Generate the Leios DB and the schedules"; - - leiosdemo202510 generate \ - "$UPSTREAM_NODE_DIR/leios.db" \ - "$LEIOS_MANIFEST" \ - "$UPSTREAM_NODE_DIR/base-schedule.json"; - - if [[ ! -v LEIOS_SCHEDULE ]]; then - jq 'map(.[0] = 182.9)' "$UPSTREAM_NODE_DIR/base-schedule.json" > "$UPSTREAM_NODE_DIR/schedule.json" - echo "LEIOS_SCHEDULE not set, using default"; - else - cp -f "$LEIOS_SCHEDULE" "$UPSTREAM_NODE_DIR/schedule.json"; - fi; - - cp -f "$DATA_DIR/upstream-node/config.json" "$UPSTREAM_NODE_DIR/config.json"; - tar -xzf "$DATA_DIR/upstream-node/immutable.tar.gz" -C "$UPSTREAM_NODE_DIR"; - chmod -R +rw "$UPSTREAM_NODE_DIR"; - + bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/prepare-upstream-node.sh" depends_on: - Init: + InitNamespaces: condition: process_completed_successfully availability: restart: "on_failure" UpstreamNode: + is_elevated: true command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - cd "$UPSTREAM_NODE_DIR"; - $IMMDB_SERVER \ - --db "immutable/" \ - --config "config.json" \ - --initial-slot "$REF_SLOT" \ - --initial-time "$ONSET_OF_REF_SLOT" \ - --leios-schedule "schedule.json" \ - --leios-db "leios.db" \ - --port $((UPSTREAM_NODE_PORT)); + ip netns exec leios-experiment:upstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/upstream-node.sh" log_location: "${WORKING_DIR}/upstream-node/log" depends_on: PrepareUpstreamNode: @@ -106,41 +38,17 @@ processes: PrepareNode0: command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - if [ -d "$NODE0_DIR" ]; then - echo "Removing old $NODE0_DIR" - rm -fr "$NODE0_DIR"; - fi - - mkdir "$NODE0_DIR"; - echo "Working directory created for node0: $NODE0_DIR"; - - cat "$DATA_DIR/leios-schema.sql" | sqlite3 "$NODE0_DIR/leios.db"; - jq --argjson port "$UPSTREAM_NODE_PORT" '.localRoots[0].accessPoints[0].port = $port' "$DATA_DIR/topology.template.json" > "$NODE0_DIR/topology.json"; - cp -f "$DATA_DIR/node0/config.json" "$NODE0_DIR/config.json"; - + bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/prepare-node0.sh" depends_on: - Init: + InitNamespaces: condition: process_completed_successfully availability: restart: "on_failure" Node0: + is_elevated: true command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - cd "$NODE0_DIR"; - echo $NODE0_PORT; - export LEIOS_DB_PATH="leios.db"; - "$CARDANO_NODE" run \ - --config "config.json" \ - --topology "topology.json" \ - --database-path "db" \ - --socket-path "socket" \ - --host-addr 127.0.0.1 --port "$NODE0_PORT"; + ip netns exec leios-experiment:node0 bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/node0.sh" log_location: "${WORKING_DIR}/node0/log" depends_on: PrepareNode0: @@ -150,41 +58,17 @@ processes: PrepareDownstreamNode: command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - if [ -d "$DOWNSTREAM_NODE_DIR" ]; then - echo "Removing old $DOWNSTREAM_NODE_DIR" - rm -fr "$DOWNSTREAM_NODE_DIR"; - fi - - mkdir "$DOWNSTREAM_NODE_DIR"; - echo "Working directory created for downstream-node: $DOWNSTREAM_NODE_DIR"; - - cat "$DATA_DIR/leios-schema.sql" | sqlite3 "$DOWNSTREAM_NODE_DIR/leios.db"; - jq --argjson port "$NODE0_PORT" '.localRoots[0].accessPoints[0].port = $port' "$DATA_DIR/topology.template.json" > "$DOWNSTREAM_NODE_DIR/topology.json"; - cp -f "$DATA_DIR/downstream-node/config.json" "$DOWNSTREAM_NODE_DIR/config.json"; - + bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/prepare-downstream-node.sh" depends_on: - Init: + InitNamespaces: condition: process_completed_successfully availability: restart: "on_failure" DownstreamNode: + is_elevated: true command: | - set -exuo pipefail; - set -a && source "$WORKING_DIR/.env" && set +a; - - cd "$DOWNSTREAM_NODE_DIR"; - export LEIOS_DB_PATH="leios.db"; - "$CARDANO_NODE" run \ - --config "config.json" \ - --topology "topology.json" \ - --database-path "db" \ - --socket-path "socket" \ - --host-addr 127.0.0.1 --port "$DOWNSTREAM_NODE_PORT"; - + ip netns exec leios-experiment:downstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/downstream-node.sh" log_location: "${WORKING_DIR}/downstream-node/log" depends_on: PrepareDownstreamNode: @@ -210,8 +94,12 @@ processes: log_location: "${WORKING_DIR}/analyse.log" depends_on: - Init: - condition: process_completed_successfully + UpstreamNode: + condition: process_started + Node0: + condition: process_started + DownstreamNode: + condition: process_started availability: restart: "always" diff --git a/demo/2025-11/scripts/downstream-node.sh b/demo/2025-11/scripts/downstream-node.sh new file mode 100755 index 000000000..8d770218d --- /dev/null +++ b/demo/2025-11/scripts/downstream-node.sh @@ -0,0 +1,11 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +cd "$DOWNSTREAM_NODE_DIR" +export LEIOS_DB_PATH="leios.db" +"$CARDANO_NODE" run \ + --config "config.json" \ + --topology "topology.json" \ + --database-path "db" \ + --socket-path "socket" \ + --host-addr 127.0.0.1 --port "$PORT_DOWNSTREAM_NODE" diff --git a/demo/2025-11/configure-netns.sh b/demo/2025-11/scripts/init-namespaces.sh old mode 100644 new mode 100755 similarity index 63% rename from demo/2025-11/configure-netns.sh rename to demo/2025-11/scripts/init-namespaces.sh index 939aefb36..e0091f8a7 --- a/demo/2025-11/configure-netns.sh +++ b/demo/2025-11/scripts/init-namespaces.sh @@ -1,20 +1,20 @@ -NS_PREFIX="leios_experiment" -NS_UPSTREAM="${NS_PREFIX}-upstream" -NS_NODE0="${NS_PREFIX}-node0" -NS_DOWNSTREAM="${NS_PREFIX}-downstream" -IP_UPSTREAM="10.0.0.1" -IP_NODE0="10.0.0.2" -IP_DOWNSTREAM="10.0.0.3" +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +NS_PREFIX="leios-experiment" +NS_UPSTREAM="${NS_PREFIX}:upstream" +NS_NODE0="${NS_PREFIX}:node0" +NS_DOWNSTREAM="${NS_PREFIX}:downstream" # Delete all namespaces -ip netns del "$NS_UPSTREAM"; -ip netns del "$NS_NODE0"; -ip netns del "$NS_DOWNSTREAM"; +ip netns del "$NS_UPSTREAM" || true +ip netns del "$NS_NODE0" || true +ip netns del "$NS_DOWNSTREAM" || true # Create all namespaces -ip netns add "$NS_UPSTREAM"; -ip netns add "$NS_NODE0"; -ip netns add "$NS_DOWNSTREAM"; +ip netns add "$NS_UPSTREAM" +ip netns add "$NS_NODE0" +ip netns add "$NS_DOWNSTREAM" # Create a VETH link upstream <-> node0 ip link add "up->n0" type veth peer name "n0->up" @@ -61,20 +61,22 @@ function delay() { ip netns exec "$ns" tc qdisc add dev "ifb!$veth_dev" root netem delay "$delay" } -limit_rate "$NS_UPSTREAM" "up->n0" "100mbit" -delay "$NS_UPSTREAM" "up->n0" "20ms" +limit_rate "$NS_UPSTREAM" "up->n0" "$RATE_UP_TO_N0" +delay "$NS_UPSTREAM" "up->n0" "$DELAY_UP_TO_N0" -limit_rate "$NS_NODE0" "n0->up" "100mbit" -delay "$NS_NODE0" "n0->up" "20ms" -limit_rate "$NS_NODE0" "n0->down" "100mbit" -delay "$NS_NODE0" "n0->down" "20ms" +limit_rate "$NS_NODE0" "n0->up" "$RATE_N0_TO_UP" +delay "$NS_NODE0" "n0->up" "$DELAY_N0_TO_UP" +limit_rate "$NS_NODE0" "n0->down" "$RATE_N0_TO_DOWN" +delay "$NS_NODE0" "n0->down" "$DELAY_N0_TO_DOWN" -limit_rate "$NS_DOWNSTREAM" "down->n0" "100mbit" -delay "$NS_DOWNSTREAM" "down->n0" "20ms" +limit_rate "$NS_DOWNSTREAM" "down->n0" "$RATE_DOWN_TO_N0" +delay "$NS_DOWNSTREAM" "down->n0" "$DELAY_DOWN_TO_N0" # Configure IP assignments and network routes -ip netns exec "$NS_UPSTREAM" ip addr add local "$IP_UPSTREAM" peer "$IP_NODE0" dev "up->n0" -ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_UPSTREAM" dev "n0->up" -ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_DOWNSTREAM" dev "n0->down" -ip netns exec "$NS_DOWNSTREAM" ip addr add local "$IP_DOWNSTREAM" peer "$IP_NODE0" dev "down->n0" - +ip netns exec "$NS_UPSTREAM" ip addr add local "$IP_UPSTREAM_NODE" peer "$IP_NODE0" dev "up->n0" +ip netns exec "$NS_UPSTREAM" ip addr add local "127.0.0.1" dev "lo" +ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_UPSTREAM_NODE" dev "n0->up" +ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_DOWNSTREAM_NODE" dev "n0->down" +ip netns exec "$NS_NODE0" ip addr add local "127.0.0.1" dev "lo" +ip netns exec "$NS_DOWNSTREAM" ip addr add local "$IP_DOWNSTREAM_NODE" peer "$IP_NODE0" dev "down->n0" +ip netns exec "$NS_DOWNSTREAM" ip addr add local "127.0.0.1" dev "lo" diff --git a/demo/2025-11/scripts/init.sh b/demo/2025-11/scripts/init.sh new file mode 100755 index 000000000..1ebb02113 --- /dev/null +++ b/demo/2025-11/scripts/init.sh @@ -0,0 +1,53 @@ +set -exo pipefail + +echo "Initializing WORKING_DIR" +if [ ! -d "$WORKING_DIR" ]; then + mkdir "$WORKING_DIR" + echo "Working directory created: $WORKING_DIR" +fi + +touch "$WORKING_DIR/.env" +VARS_TO_DEFAULT=( + CARDANO_NODE + IMMDB_SERVER + SECONDS_UNTIL_REF_SLOT + REF_SLOT + DATA_DIR + LEIOS_MANIFEST + PYTHON3 + ANALYSE_PY + PORT_UPSTREAM_NODE + PORT_NODE0 + PORT_DOWNSTREAM_NODE + IP_UPSTREAM_NODE + IP_NODE0 + IP_DOWNSTREAM_NODE + RATE_UP_TO_N0 + DELAY_UP_TO_N0 + RATE_N0_TO_UP + DELAY_N0_TO_UP + RATE_N0_TO_DOWN + DELAY_N0_TO_DOWN + RATE_DOWN_TO_N0 + DELAY_DOWN_TO_N0 +) + +for var in "${VARS_TO_DEFAULT[@]}"; do + def_var="DEF_$var" + val=${!var:-${!def_var}} + echo "$var=$val" >>"$WORKING_DIR/.env" +done + +echo "UPSTREAM_NODE_DIR=$WORKING_DIR/upstream-node" >>"$WORKING_DIR/.env" +echo "NODE0_DIR=$WORKING_DIR/node0" >>"$WORKING_DIR/.env" +echo "DOWNSTREAM_NODE_DIR=$WORKING_DIR/downstream-node" >>"$WORKING_DIR/.env" +now=$(date +%s) +echo "ONSET_OF_REF_SLOT=$((now + SECONDS_UNTIL_REF_SLOT))" >>"$WORKING_DIR/.env" + +set -a && source "$WORKING_DIR/.env" && set +a + +if [ ! -d "$WORKING_DIR/genesis" ]; then + echo "Copying genesis" + cp -fr "$DATA_DIR/genesis" "$WORKING_DIR/genesis" + chmod -R +rw "$WORKING_DIR/genesis" +fi diff --git a/demo/2025-11/scripts/node0.sh b/demo/2025-11/scripts/node0.sh new file mode 100755 index 000000000..ede918077 --- /dev/null +++ b/demo/2025-11/scripts/node0.sh @@ -0,0 +1,11 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +cd "$NODE0_DIR" +export LEIOS_DB_PATH="leios.db" +"$CARDANO_NODE" run \ + --config "config.json" \ + --topology "topology.json" \ + --database-path "db" \ + --socket-path "socket" \ + --host-addr 127.0.0.1 --port "$PORT_NODE0" diff --git a/demo/2025-11/scripts/prepare-downstream-node.sh b/demo/2025-11/scripts/prepare-downstream-node.sh new file mode 100755 index 000000000..fdd711c1a --- /dev/null +++ b/demo/2025-11/scripts/prepare-downstream-node.sh @@ -0,0 +1,20 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +if [ -d "$DOWNSTREAM_NODE_DIR" ]; then + echo "Removing old $DOWNSTREAM_NODE_DIR" + rm -fr "$DOWNSTREAM_NODE_DIR" +fi + +mkdir "$DOWNSTREAM_NODE_DIR" +echo "Working directory created for downstream-node: $DOWNSTREAM_NODE_DIR" + +cat "$DATA_DIR/leios-schema.sql" | sqlite3 "$DOWNSTREAM_NODE_DIR/leios.db" + +jq \ + --argjson port "$PORT_NODE0" \ + --arg address "$IP_NODE0" \ + '.localRoots[0].accessPoints[0].port = $port | .localRoots[0].accessPoints[0].address = $address' \ + "$DATA_DIR/topology.template.json" >"$DOWNSTREAM_NODE_DIR/topology.json" + +cp -f "$DATA_DIR/downstream-node/config.json" "$DOWNSTREAM_NODE_DIR/config.json" diff --git a/demo/2025-11/scripts/prepare-node0.sh b/demo/2025-11/scripts/prepare-node0.sh new file mode 100755 index 000000000..5d3d6abaf --- /dev/null +++ b/demo/2025-11/scripts/prepare-node0.sh @@ -0,0 +1,20 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +if [ -d "$NODE0_DIR" ]; then + echo "Removing old $NODE0_DIR" + rm -fr "$NODE0_DIR" +fi + +mkdir "$NODE0_DIR" +echo "Working directory created for node0: $NODE0_DIR" + +cat "$DATA_DIR/leios-schema.sql" | sqlite3 "$NODE0_DIR/leios.db" + +jq \ + --argjson port "$PORT_UPSTREAM_NODE" \ + --arg address "$IP_UPSTREAM_NODE" \ + '.localRoots[0].accessPoints[0].port = $port | .localRoots[0].accessPoints[0].address = $address' \ + "$DATA_DIR/topology.template.json" >"$NODE0_DIR/topology.json" + +cp -f "$DATA_DIR/node0/config.json" "$NODE0_DIR/config.json" diff --git a/demo/2025-11/scripts/prepare-upstream-node.sh b/demo/2025-11/scripts/prepare-upstream-node.sh new file mode 100755 index 000000000..8adf00cf3 --- /dev/null +++ b/demo/2025-11/scripts/prepare-upstream-node.sh @@ -0,0 +1,28 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +if [ -d "$UPSTREAM_NODE_DIR" ]; then + echo "Removing old $UPSTREAM_NODE_DIR" + rm -fr "$UPSTREAM_NODE_DIR" +fi + +mkdir "$UPSTREAM_NODE_DIR" +echo "Working directory created for upstream-node: $UPSTREAM_NODE_DIR" + +echo "Generate the Leios DB and the schedules" + +leiosdemo202510 generate \ + "$UPSTREAM_NODE_DIR/leios.db" \ + "$LEIOS_MANIFEST" \ + "$UPSTREAM_NODE_DIR/base-schedule.json" + +if [[ ! -v LEIOS_SCHEDULE ]]; then + jq 'map(.[0] = 182.9)' "$UPSTREAM_NODE_DIR/base-schedule.json" >"$UPSTREAM_NODE_DIR/schedule.json" + echo "LEIOS_SCHEDULE not set, using default" +else + cp -f "$LEIOS_SCHEDULE" "$UPSTREAM_NODE_DIR/schedule.json" +fi + +cp -f "$DATA_DIR/upstream-node/config.json" "$UPSTREAM_NODE_DIR/config.json" +tar -xzf "$DATA_DIR/upstream-node/immutable.tar.gz" -C "$UPSTREAM_NODE_DIR" +chmod -R +rw "$UPSTREAM_NODE_DIR" diff --git a/demo/2025-11/scripts/upstream-node.sh b/demo/2025-11/scripts/upstream-node.sh new file mode 100755 index 000000000..89576efb0 --- /dev/null +++ b/demo/2025-11/scripts/upstream-node.sh @@ -0,0 +1,13 @@ +set -exuo pipefail +set -a && source "$WORKING_DIR/.env" && set +a + +cd "$UPSTREAM_NODE_DIR" +$IMMDB_SERVER \ + --db "immutable/" \ + --config "config.json" \ + --initial-slot "$REF_SLOT" \ + --initial-time "$ONSET_OF_REF_SLOT" \ + --leios-schedule "schedule.json" \ + --leios-db "leios.db" \ + --address "0.0.0.0" +--port "$PORT_UPSTREAM_NODE" diff --git a/demo/pre-commit-hooks.nix b/demo/pre-commit-hooks.nix index 4fc4aa06c..30c984c0d 100644 --- a/demo/pre-commit-hooks.nix +++ b/demo/pre-commit-hooks.nix @@ -12,6 +12,7 @@ # Shell shellcheck.enable = true; + shfmt.enable = true; # Python black.enable = true; From 7ccf359178b6d549dfcb80c25d1a85c1b20104b5 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Wed, 10 Dec 2025 13:38:58 +0100 Subject: [PATCH 4/9] Configure and apply shfmt in demo/ --- demo/.editorconfig | 3 + demo/.shellcheckrc | 2 +- demo/2025-10/run-demo.sh | 137 +++++++++--------- demo/2025-11/build.nix | 24 +-- demo/2025-11/scripts/init.sh | 12 +- demo/2025-11/scripts/upstream-node.sh | 4 +- .../prometheus-http-sd.sh | 8 +- demo/pre-commit-hooks.nix | 1 + 8 files changed, 97 insertions(+), 94 deletions(-) create mode 100644 demo/.editorconfig diff --git a/demo/.editorconfig b/demo/.editorconfig new file mode 100644 index 000000000..b9a948f40 --- /dev/null +++ b/demo/.editorconfig @@ -0,0 +1,3 @@ +[*.sh] +indent_style = space +indent_size = 2 diff --git a/demo/.shellcheckrc b/demo/.shellcheckrc index 7c6cc25ef..5c8d73723 100644 --- a/demo/.shellcheckrc +++ b/demo/.shellcheckrc @@ -1 +1 @@ -disable=SC2148,SC1090,SC1091,SC2002 +disable=SC2148,SC1090,SC1091,SC2002,SC2153 diff --git a/demo/2025-10/run-demo.sh b/demo/2025-10/run-demo.sh index 5c11cbe73..bce01c8e3 100755 --- a/demo/2025-10/run-demo.sh +++ b/demo/2025-10/run-demo.sh @@ -8,37 +8,36 @@ ln -s "$TMP_DIR" ./leios-run-tmp-dir echo "Generate the Leios DB and the schedules" leiosdemo202510 generate "$TMP_DIR/upstream.db" manifest.json "$TMP_DIR/base-schedule.json" # Make a schedule.json from the base-schedule.json such that the first number in each array is 182.9 -jq 'map(.[0] = 182.9)' "$TMP_DIR/base-schedule.json" > "$TMP_DIR/schedule.json" - +jq 'map(.[0] = 182.9)' "$TMP_DIR/base-schedule.json" >"$TMP_DIR/schedule.json" if [[ ! "$SECONDS_UNTIL_REF_SLOT" =~ ^[0-9]*$ ]] || [[ "$SECONDS_UNTIL_REF_SLOT" -le 0 ]]; then - echo "Error: \${SECONDS_UNTIL_REF_SLOT} must be a positive integer of seconds, which will be added to the execution time of this script." >&2 - exit 1 + echo "Error: \${SECONDS_UNTIL_REF_SLOT} must be a positive integer of seconds, which will be added to the execution time of this script." >&2 + exit 1 fi if [ ! -d "${DATA%/}" ]; then - DATA="${DATA%/}" - echo "Error: DATA directory '$DATA' not found or is not a directory." >&2 - exit 1 + DATA="${DATA%/}" + echo "Error: DATA directory '$DATA' not found or is not a directory." >&2 + exit 1 fi if [[ -z "${CARDANO_NODE}" ]]; then - echo "Error: \${CARDANO_NODE} must be the path to the cardano-node exe." >&2 - exit 1 + echo "Error: \${CARDANO_NODE} must be the path to the cardano-node exe." >&2 + exit 1 fi if [[ -z "${IMMDB_SERVER}" ]]; then - echo "Error: \${IMMDB_SERVER} must be the path to the immdb-server exe." >&2 - exit 1 + echo "Error: \${IMMDB_SERVER} must be the path to the immdb-server exe." >&2 + exit 1 fi if [[ -z "${REF_SLOT}" ]] || [[ ! "$REF_SLOT" =~ ^[0-9]*$ ]] || [[ "$REF_SLOT" -lt 0 ]]; then - echo "Error: \${REF_SLOT} must be a non-negative integer, a slot number" >&2 - exit 1 + echo "Error: \${REF_SLOT} must be a non-negative integer, a slot number" >&2 + exit 1 fi now=$(date +%s) -ONSET_OF_REF_SLOT=$(( now + SECONDS_UNTIL_REF_SLOT )) +ONSET_OF_REF_SLOT=$((now + SECONDS_UNTIL_REF_SLOT)) echo "REF_SLOT=$REF_SLOT" echo "ONSET_OF_REF_SLOT=$ONSET_OF_REF_SLOT" echo "$REF_SLOT" @@ -52,18 +51,17 @@ PORT3=3003 TOXIPROXY=100 -if pgrep -fx "toxiproxy-server" > /dev/null -then - echo "Toxiproxy is already running" +if pgrep -fx "toxiproxy-server" >/dev/null; then + echo "Toxiproxy is already running" else - echo "Starting Toxiproxy" - toxiproxy-server 1> "$TMP_DIR/toxiproxy.log" 2>&1 & + echo "Starting Toxiproxy" + toxiproxy-server 1>"$TMP_DIR/toxiproxy.log" 2>&1 & fi # shellcheck disable=SC2329 cleanup_proxy() { - toxiproxy-cli delete mocked-upstream-peer-proxy 2>/dev/null || true - toxiproxy-cli delete node0-proxy 2>/dev/null || true + toxiproxy-cli delete mocked-upstream-peer-proxy 2>/dev/null || true + toxiproxy-cli delete node0-proxy 2>/dev/null || true } trap cleanup_proxy EXIT INT TERM @@ -75,21 +73,20 @@ toxiproxy-cli create --listen 127.0.0.1:"$PORT1" --upstream 127.0.0.1:"$((TOXIPR toxiproxy-cli create --listen 127.0.0.1:"$PORT2" --upstream 127.0.0.1:"$((TOXIPROXY + PORT2))" node0-proxy for i in mocked-upstream-peer-proxy node0-proxy; do - # TODO magic numbers - toxiproxy-cli toxic add --type latency --attribute latency=150 --attribute jitter=30 $i # milliseconds - toxiproxy-cli toxic add --type bandwidth --attribute rate=2500 $i # kilobytes per second - # FYI, 125 kilobyte/s = 1 megabit/s, so EG 2500 kilobyte/s = 20 megabit/s + # TODO magic numbers + toxiproxy-cli toxic add --type latency --attribute latency=150 --attribute jitter=30 $i # milliseconds + toxiproxy-cli toxic add --type bandwidth --attribute rate=2500 $i # kilobytes per second + # FYI, 125 kilobyte/s = 1 megabit/s, so EG 2500 kilobyte/s = 20 megabit/s done echo "Ports: ${PORT1} ${PORT2} ${PORT3}, each plus ${TOXIPROXY} for toxiproxy" - ## ## Run cardano-node (node-0) ## echo "Creating $TMP_DIR/topology-node-0.json" -cat << EOF > "$TMP_DIR/topology-node-0.json" +cat <"$TMP_DIR/topology-node-0.json" { "bootstrapPeers": [], "localRoots": [ @@ -113,13 +110,13 @@ mkdir -p "$TMP_DIR/node-0/db" cat leios-schema.sql | sqlite3 "$TMP_DIR/node-0/leios.db" env LEIOS_DB_PATH="$TMP_DIR/node-0/leios.db" \ - "$CARDANO_NODE" run \ - --config "$DATA/leios-node/config.json" \ - --topology "$TMP_DIR/topology-node-0.json" \ - --database-path "$TMP_DIR/node-0/db" \ - --socket-path "$TMP_DIR/node-0.socket" \ - --host-addr 127.0.0.1 --port $((TOXIPROXY + PORT2)) \ - &> "$TMP_DIR/cardano-node-0.log" & + "$CARDANO_NODE" run \ + --config "$DATA/leios-node/config.json" \ + --topology "$TMP_DIR/topology-node-0.json" \ + --database-path "$TMP_DIR/node-0/db" \ + --socket-path "$TMP_DIR/node-0.socket" \ + --host-addr 127.0.0.1 --port $((TOXIPROXY + PORT2)) \ + &>"$TMP_DIR/cardano-node-0.log" & CARDANO_NODE_0_PID=$! @@ -129,7 +126,7 @@ echo "Cardano node 0 started with PID: $CARDANO_NODE_0_PID" ## Run a second Cardano-node (To be eventually replaced by a mocked downstream node) ## -cat << EOF > "$TMP_DIR/topology-node-1.json" +cat <"$TMP_DIR/topology-node-1.json" { "bootstrapPeers": [], "localRoots": [ @@ -153,13 +150,13 @@ mkdir -p "$TMP_DIR/node-1/db" cat leios-schema.sql | sqlite3 "$TMP_DIR/node-1/leios.db" env LEIOS_DB_PATH="$TMP_DIR/node-1/leios.db" \ - "$CARDANO_NODE" run \ - --config "$DATA/leios-node/config.json" \ - --topology "$TMP_DIR/topology-node-1.json" \ - --database-path "$TMP_DIR/node-1/db" \ - --socket-path "$TMP_DIR/node-1.socket" \ - --host-addr 127.0.0.1 --port "$PORT3" \ - &> "$TMP_DIR/cardano-node-1.log" & + "$CARDANO_NODE" run \ + --config "$DATA/leios-node/config.json" \ + --topology "$TMP_DIR/topology-node-1.json" \ + --database-path "$TMP_DIR/node-1/db" \ + --socket-path "$TMP_DIR/node-1.socket" \ + --host-addr 127.0.0.1 --port "$PORT3" \ + &>"$TMP_DIR/cardano-node-1.log" & MOCKED_PEER_PID=$! @@ -170,14 +167,14 @@ echo "Cardano node 1 started with PID: $MOCKED_PEER_PID" ## "$IMMDB_SERVER" \ - --db "$DATA/immdb-node/immutable/" \ - --config "$DATA/immdb-node/config.json" \ - --initial-slot "$REF_SLOT" \ - --initial-time "$ONSET_OF_REF_SLOT" \ - --leios-schedule "$TMP_DIR/schedule.json" \ - --leios-db "$TMP_DIR/upstream.db" \ - --port $((TOXIPROXY + PORT1)) \ - &> "$TMP_DIR/immdb-server.log" & + --db "$DATA/immdb-node/immutable/" \ + --config "$DATA/immdb-node/config.json" \ + --initial-slot "$REF_SLOT" \ + --initial-time "$ONSET_OF_REF_SLOT" \ + --leios-schedule "$TMP_DIR/schedule.json" \ + --leios-db "$TMP_DIR/upstream.db" \ + --port $((TOXIPROXY + PORT1)) \ + &>"$TMP_DIR/immdb-server.log" & IMMDB_SERVER_PID=$! @@ -186,11 +183,11 @@ echo "ImmDB server started with PID: $IMMDB_SERVER_PID" # Wait briefly and check if immdb-server is still running sleep 2 if ! kill -0 "$IMMDB_SERVER_PID" 2>/dev/null; then - echo "ERROR: ImmDB server (PID $IMMDB_SERVER_PID) failed to start" >&2 - echo "Log output from $TMP_DIR/immdb-server.log:" >&2 - cat "$TMP_DIR/immdb-server.log" >&2 - kill "$CARDANO_NODE_0_PID" "$MOCKED_PEER_PID" 2>/dev/null || true - exit 1 + echo "ERROR: ImmDB server (PID $IMMDB_SERVER_PID) failed to start" >&2 + echo "Log output from $TMP_DIR/immdb-server.log:" >&2 + cat "$TMP_DIR/immdb-server.log" >&2 + kill "$CARDANO_NODE_0_PID" "$MOCKED_PEER_PID" 2>/dev/null || true + exit 1 fi echo "All processes running successfully" @@ -215,25 +212,25 @@ echo "=== Database Dumps ===" echo echo "--- ImmDB Server (immutable db) ---" -db-analyser --db "$DATA/immdb-node/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/immdb-node/config.json" > "$TMP_DIR/immdb-server-db-dump.txt" 2>&1 +db-analyser --db "$DATA/immdb-node/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/immdb-node/config.json" >"$TMP_DIR/immdb-server-db-dump.txt" 2>&1 echo "Saved to: $TMP_DIR/immdb-server-db-dump.txt" echo echo "--- Node 0 (immutable db) ---" if [ -d "$TMP_DIR/node-0/db/immutable" ]; then - db-analyser --db "$TMP_DIR/node-0/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" > "$TMP_DIR/node-0-db-dump.txt" 2>&1 - echo "Saved to: $TMP_DIR/node-0-db-dump.txt" + db-analyser --db "$TMP_DIR/node-0/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" >"$TMP_DIR/node-0-db-dump.txt" 2>&1 + echo "Saved to: $TMP_DIR/node-0-db-dump.txt" else - echo "No immutable db found at $TMP_DIR/node-0/db/immutable/" + echo "No immutable db found at $TMP_DIR/node-0/db/immutable/" fi echo echo "--- Node 1 (immutable db) ---" if [ -d "$TMP_DIR/node-1/db/immutable" ]; then - db-analyser --db "$TMP_DIR/node-1/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" > "$TMP_DIR/node-1-db-dump.txt" 2>&1 - echo "Saved to: $TMP_DIR/node-1-db-dump.txt" + db-analyser --db "$TMP_DIR/node-1/db/" --show-slot-block-no --v2-in-mem cardano --config "$DATA/leios-node/config.json" >"$TMP_DIR/node-1-db-dump.txt" 2>&1 + echo "Saved to: $TMP_DIR/node-1-db-dump.txt" else - echo "No immutable db found at $TMP_DIR/node-1/db/immutable/" + echo "No immutable db found at $TMP_DIR/node-1/db/immutable/" fi echo @@ -241,29 +238,29 @@ echo "=== Leios SQLite Databases ===" echo echo "--- Upstream Leios DB ---" -sqlite3 "$TMP_DIR/upstream.db" ".dump" > "$TMP_DIR/upstream-leios-db-dump.sql" +sqlite3 "$TMP_DIR/upstream.db" ".dump" >"$TMP_DIR/upstream-leios-db-dump.sql" echo "Saved to: $TMP_DIR/upstream-leios-db-dump.sql" echo echo "--- Node 0 Leios DB ---" -sqlite3 "$TMP_DIR/node-0/leios.db" ".dump" > "$TMP_DIR/node-0-leios-db-dump.sql" +sqlite3 "$TMP_DIR/node-0/leios.db" ".dump" >"$TMP_DIR/node-0-leios-db-dump.sql" echo "Saved to: $TMP_DIR/node-0-leios-db-dump.sql" echo echo "--- Node 1 Leios DB ---" -sqlite3 "$TMP_DIR/node-1/leios.db" ".dump" > "$TMP_DIR/node-1-leios-db-dump.sql" +sqlite3 "$TMP_DIR/node-1/leios.db" ".dump" >"$TMP_DIR/node-1-leios-db-dump.sql" echo "Saved to: $TMP_DIR/node-1-leios-db-dump.sql" echo # Log analysis -cat "$TMP_DIR/cardano-node-0.log" | grep -v -i -e leios > "$TMP_DIR/logA" -cat "$TMP_DIR/cardano-node-1.log" | grep -v -i -e leios > "$TMP_DIR/logB" +cat "$TMP_DIR/cardano-node-0.log" | grep -v -i -e leios >"$TMP_DIR/logA" +cat "$TMP_DIR/cardano-node-1.log" | grep -v -i -e leios >"$TMP_DIR/logB" python3 analyse.py \ - "$REF_SLOT" "$ONSET_OF_REF_SLOT" \ - "$TMP_DIR/logA" "$TMP_DIR/logB" \ - "$TMP_DIR/scatter_plot.png" + "$REF_SLOT" "$ONSET_OF_REF_SLOT" \ + "$TMP_DIR/logA" "$TMP_DIR/logB" \ + "$TMP_DIR/scatter_plot.png" # Status diff --git a/demo/2025-11/build.nix b/demo/2025-11/build.nix index f309cabbf..15471bca3 100644 --- a/demo/2025-11/build.nix +++ b/demo/2025-11/build.nix @@ -33,13 +33,13 @@ runtimeEnv = { # Non configurable WORKING_DIR = ".tmp-leios-202511-demo"; - SCRIPTS=./scripts; + SCRIPTS = ./scripts; PORT_UPSTREAM_NODE = 3001; PORT_NODE0 = 3002; PORT_DOWNSTREAM_NODE = 3003; - IP_UPSTREAM_NODE="10.0.0.1"; - IP_NODE0="10.0.0.2"; - IP_DOWNSTREAM_NODE="10.0.0.3"; + IP_UPSTREAM_NODE = "10.0.0.1"; + IP_NODE0 = "10.0.0.2"; + IP_DOWNSTREAM_NODE = "10.0.0.3"; # Configurable (if you see DEF_FOO that's a default value for FOO if unset) DEF_CARDANO_NODE = config.devShells.dev-demo-2025-11.CARDANO_NODE; DEF_IMMDB_SERVER = config.devShells.dev-demo-2025-11.IMMDB_SERVER; @@ -56,14 +56,14 @@ ] ) ); - DEF_RATE_UP_TO_N0="100Mbps"; - DEF_DELAY_UP_TO_N0="20ms"; - DEF_RATE_N0_TO_UP="100Mbps"; - DEF_DELAY_N0_TO_UP="20ms"; - DEF_RATE_N0_TO_DOWN="100Mbps"; - DEF_DELAY_N0_TO_DOWN="20ms"; - DEF_RATE_DOWN_TO_N0="100Mbps"; - DEF_DELAY_DOWN_TO_N0="20ms"; + DEF_RATE_UP_TO_N0 = "100Mbps"; + DEF_DELAY_UP_TO_N0 = "20ms"; + DEF_RATE_N0_TO_UP = "100Mbps"; + DEF_DELAY_N0_TO_UP = "20ms"; + DEF_RATE_N0_TO_DOWN = "100Mbps"; + DEF_DELAY_N0_TO_DOWN = "20ms"; + DEF_RATE_DOWN_TO_N0 = "100Mbps"; + DEF_DELAY_DOWN_TO_N0 = "20ms"; }; text = '' process-compose --no-server -f ${./process-compose.yaml}; diff --git a/demo/2025-11/scripts/init.sh b/demo/2025-11/scripts/init.sh index 1ebb02113..c6711655d 100755 --- a/demo/2025-11/scripts/init.sh +++ b/demo/2025-11/scripts/init.sh @@ -38,11 +38,13 @@ for var in "${VARS_TO_DEFAULT[@]}"; do echo "$var=$val" >>"$WORKING_DIR/.env" done -echo "UPSTREAM_NODE_DIR=$WORKING_DIR/upstream-node" >>"$WORKING_DIR/.env" -echo "NODE0_DIR=$WORKING_DIR/node0" >>"$WORKING_DIR/.env" -echo "DOWNSTREAM_NODE_DIR=$WORKING_DIR/downstream-node" >>"$WORKING_DIR/.env" -now=$(date +%s) -echo "ONSET_OF_REF_SLOT=$((now + SECONDS_UNTIL_REF_SLOT))" >>"$WORKING_DIR/.env" +{ + echo "UPSTREAM_NODE_DIR=$WORKING_DIR/upstream-node" + echo "NODE0_DIR=$WORKING_DIR/node0" + echo "DOWNSTREAM_NODE_DIR=$WORKING_DIR/downstream-node" + now=$(date +%s) + echo "ONSET_OF_REF_SLOT=$((now + SECONDS_UNTIL_REF_SLOT))" +} >>"$WORKING_DIR/.env" set -a && source "$WORKING_DIR/.env" && set +a diff --git a/demo/2025-11/scripts/upstream-node.sh b/demo/2025-11/scripts/upstream-node.sh index 89576efb0..dd67ae77f 100755 --- a/demo/2025-11/scripts/upstream-node.sh +++ b/demo/2025-11/scripts/upstream-node.sh @@ -9,5 +9,5 @@ $IMMDB_SERVER \ --initial-time "$ONSET_OF_REF_SLOT" \ --leios-schedule "schedule.json" \ --leios-db "leios.db" \ - --address "0.0.0.0" ---port "$PORT_UPSTREAM_NODE" + --address "0.0.0.0" \ + --port "$PORT_UPSTREAM_NODE" diff --git a/demo/nixos-tests/services/simple-cardano-tracer/prometheus-http-sd.sh b/demo/nixos-tests/services/simple-cardano-tracer/prometheus-http-sd.sh index 778ee871f..05e73e669 100755 --- a/demo/nixos-tests/services/simple-cardano-tracer/prometheus-http-sd.sh +++ b/demo/nixos-tests/services/simple-cardano-tracer/prometheus-http-sd.sh @@ -1,9 +1,9 @@ read -r REQUEST_LINE if [[ "$REQUEST_LINE" =~ ^GET ]]; then - INPUT_NODES=$(curl -H "Accept: application/json" "http://$CARDANO_TRACER_PROMETHEUS") + INPUT_NODES=$(curl -H "Accept: application/json" "http://$CARDANO_TRACER_PROMETHEUS") - PROMETHEUS_JSON=$(echo "$INPUT_NODES" | jq --arg ENDPOINT "$CARDANO_TRACER_PROMETHEUS" ' + PROMETHEUS_JSON=$(echo "$INPUT_NODES" | jq --arg ENDPOINT "$CARDANO_TRACER_PROMETHEUS" ' to_entries | map({ targets: [ $ENDPOINT ], @@ -15,7 +15,7 @@ if [[ "$REQUEST_LINE" =~ ^GET ]]; then }) ') - echo -e "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: ${#PROMETHEUS_JSON}\r\nConnection: close\r\n\r\n${PROMETHEUS_JSON}" + echo -e "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: ${#PROMETHEUS_JSON}\r\nConnection: close\r\n\r\n${PROMETHEUS_JSON}" else - echo -e "HTTP/1.1 405 Method Not Allowed\r\n\r\n" + echo -e "HTTP/1.1 405 Method Not Allowed\r\n\r\n" fi diff --git a/demo/pre-commit-hooks.nix b/demo/pre-commit-hooks.nix index 30c984c0d..9a0e9eb2f 100644 --- a/demo/pre-commit-hooks.nix +++ b/demo/pre-commit-hooks.nix @@ -13,6 +13,7 @@ # Shell shellcheck.enable = true; shfmt.enable = true; + shfmt.settings.simplify = false; # Python black.enable = true; From b7cffe6044e3f8dc6c0b536d501c24f0290434d7 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Thu, 11 Dec 2025 09:12:48 +0100 Subject: [PATCH 5/9] Implement SS on Downstream --- demo/2025-11/data/downstream-node/config.json | 2 +- demo/2025-11/data/node0/config.json | 2 +- demo/2025-11/data/upstream-node/config.json | 2 +- demo/2025-11/process-compose.yaml | 12 +++++++ demo/2025-11/scripts/downstream-node.sh | 2 +- demo/2025-11/scripts/init-namespaces.sh | 35 +++++++++++++++++++ demo/2025-11/scripts/node0.sh | 2 +- demo/2025-11/scripts/ss-on-downstream.sh | 5 +++ demo/extras/x_ray/alloy | 24 ++++++++++--- 9 files changed, 77 insertions(+), 9 deletions(-) create mode 100755 demo/2025-11/scripts/ss-on-downstream.sh diff --git a/demo/2025-11/data/downstream-node/config.json b/demo/2025-11/data/downstream-node/config.json index deb7dd43f..e9fbc8be7 100644 --- a/demo/2025-11/data/downstream-node/config.json +++ b/demo/2025-11/data/downstream-node/config.json @@ -37,7 +37,7 @@ "": { "backends": [ "Stdout MachineFormat", - "PrometheusSimple 127.0.0.1 12902" + "PrometheusSimple 0.0.0.0 12900" ], "detail": "DNormal", "severity": "Notice" diff --git a/demo/2025-11/data/node0/config.json b/demo/2025-11/data/node0/config.json index c36172a23..d5085048d 100644 --- a/demo/2025-11/data/node0/config.json +++ b/demo/2025-11/data/node0/config.json @@ -37,7 +37,7 @@ "": { "backends": [ "Stdout MachineFormat", - "PrometheusSimple 127.0.0.1 12901" + "PrometheusSimple 0.0.0.0 12900" ], "detail": "DNormal", "severity": "Notice" diff --git a/demo/2025-11/data/upstream-node/config.json b/demo/2025-11/data/upstream-node/config.json index c447c6495..4de01b4a2 100644 --- a/demo/2025-11/data/upstream-node/config.json +++ b/demo/2025-11/data/upstream-node/config.json @@ -37,7 +37,7 @@ "": { "backends": [ "Stdout MachineFormat", - "PrometheusSimple 127.0.0.1 12900" + "PrometheusSimple 0.0.0.0 12900" ], "detail": "DNormal", "severity": "Notice" diff --git a/demo/2025-11/process-compose.yaml b/demo/2025-11/process-compose.yaml index f478540db..59663fcd3 100644 --- a/demo/2025-11/process-compose.yaml +++ b/demo/2025-11/process-compose.yaml @@ -37,6 +37,7 @@ processes: restart: "always" PrepareNode0: + is_elevated: true command: | bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/prepare-node0.sh" depends_on: @@ -57,6 +58,7 @@ processes: restart: "always" PrepareDownstreamNode: + is_elevated: true command: | bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/prepare-downstream-node.sh" depends_on: @@ -76,6 +78,16 @@ processes: availability: restart: "always" + SSOnDownstreamNode: + is_elevated: true + command: | + ip netns exec leios-experiment:downstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/ss-on-downstream.sh" + depends_on: + DownstreamNode: + condition: "process_started" + availability: + restart: "always" + Analyze: command: | set -exuo pipefail; diff --git a/demo/2025-11/scripts/downstream-node.sh b/demo/2025-11/scripts/downstream-node.sh index 8d770218d..a6ee10616 100755 --- a/demo/2025-11/scripts/downstream-node.sh +++ b/demo/2025-11/scripts/downstream-node.sh @@ -8,4 +8,4 @@ export LEIOS_DB_PATH="leios.db" --topology "topology.json" \ --database-path "db" \ --socket-path "socket" \ - --host-addr 127.0.0.1 --port "$PORT_DOWNSTREAM_NODE" + --host-addr "0.0.0.0" --port "$PORT_DOWNSTREAM_NODE" diff --git a/demo/2025-11/scripts/init-namespaces.sh b/demo/2025-11/scripts/init-namespaces.sh index e0091f8a7..f5a5d2a85 100755 --- a/demo/2025-11/scripts/init-namespaces.sh +++ b/demo/2025-11/scripts/init-namespaces.sh @@ -30,6 +30,24 @@ ip link set "down->n0" netns "$NS_DOWNSTREAM" ip netns exec "$NS_NODE0" ip link set "n0->down" up ip netns exec "$NS_DOWNSTREAM" ip link set "down->n0" up +# Create a VETH link host <-> upstream +ip link add "host->up" type veth peer name "up->host" +ip link set "up->host" netns "$NS_UPSTREAM" +ip link set "host->up" up +ip netns exec "$NS_UPSTREAM" ip link set "up->host" up + +# Create a VETH link host <-> node0 +ip link add "host->n0" type veth peer name "n0->host" +ip link set "n0->host" netns "$NS_NODE0" +ip link set "host->n0" up +ip netns exec "$NS_NODE0" ip link set "n0->host" up + +# Create a VETH link host <-> downstream +ip link add "host->down" type veth peer name "down->host" +ip link set "down->host" netns "$NS_DOWNSTREAM" +ip link set "host->down" up +ip netns exec "$NS_DOWNSTREAM" ip link set "down->host" up + # Configure IFB devices for TC ip netns exec "$NS_UPSTREAM" ip link add "ifb!up->n0" type ifb ip netns exec "$NS_NODE0" ip link add "ifb!n0->up" type ifb @@ -80,3 +98,20 @@ ip netns exec "$NS_NODE0" ip addr add local "$IP_NODE0" peer "$IP_DOWNSTREAM_NOD ip netns exec "$NS_NODE0" ip addr add local "127.0.0.1" dev "lo" ip netns exec "$NS_DOWNSTREAM" ip addr add local "$IP_DOWNSTREAM_NODE" peer "$IP_NODE0" dev "down->n0" ip netns exec "$NS_DOWNSTREAM" ip addr add local "127.0.0.1" dev "lo" + +IP_HOST="10.0.0.4" +ip addr add "$IP_HOST" dev "host->up" +ip route add "$IP_UPSTREAM_NODE" dev "host->up" +ip netns exec "$NS_UPSTREAM" ip addr add "$IP_UPSTREAM_NODE" dev "up->host" +ip netns exec "$NS_UPSTREAM" ip route add "$IP_HOST" dev "up->host" + +ip addr add "$IP_HOST" dev "host->n0" +ip route add "$IP_NODE0" dev "host->n0" +ip netns exec "$NS_NODE0" ip addr add "$IP_NODE0" dev "n0->host" +ip netns exec "$NS_NODE0" ip route add "$IP_HOST" dev "n0->host" + +ip addr add "$IP_HOST" dev "host->down" +ip route add "$IP_DOWNSTREAM_NODE" dev "host->down" +ip netns exec "$NS_DOWNSTREAM" ip addr add "$IP_DOWNSTREAM_NODE" dev "down->host" +ip netns exec "$NS_DOWNSTREAM" ip route add "$IP_HOST" dev "down->host" + diff --git a/demo/2025-11/scripts/node0.sh b/demo/2025-11/scripts/node0.sh index ede918077..e5e0d311e 100755 --- a/demo/2025-11/scripts/node0.sh +++ b/demo/2025-11/scripts/node0.sh @@ -8,4 +8,4 @@ export LEIOS_DB_PATH="leios.db" --topology "topology.json" \ --database-path "db" \ --socket-path "socket" \ - --host-addr 127.0.0.1 --port "$PORT_NODE0" + --host-addr 0.0.0.0 --port "$PORT_NODE0" diff --git a/demo/2025-11/scripts/ss-on-downstream.sh b/demo/2025-11/scripts/ss-on-downstream.sh new file mode 100755 index 000000000..997c3a5f8 --- /dev/null +++ b/demo/2025-11/scripts/ss-on-downstream.sh @@ -0,0 +1,5 @@ +set -exuo pipefail; + +set -a && source "$WORKING_DIR/.env" && set +a + +ss_http_exporter "$IP_DOWNSTREAM_NODE" 9100 "( sport = $PORT_NODE0 and dport = $PORT_DOWNSTREAM_NODE ) or ( sport = $PORT_DOWNSTREAM_NODE and dport = $PORT_NODE0 )" diff --git a/demo/extras/x_ray/alloy b/demo/extras/x_ray/alloy index 5eafe8492..d2e71fa18 100644 --- a/demo/extras/x_ray/alloy +++ b/demo/extras/x_ray/alloy @@ -7,9 +7,25 @@ prometheus.remote_write "prometheus" { prometheus.scrape "ss_exporter" { targets = [ { - "__address__" = "127.0.0.1:9100", + "__address__" = "10.0.0.1:9100", "job" = "ss_metrics", "instance" = "localhost", + "alias" = "upstream-node", + "process" = "UpstreamNode", + }, + { + "__address__" = "10.0.0.2:9100", + "job" = "ss_metrics", + "instance" = "localhost", + "alias" = "node0", + "process" = "Node0", + }, + { + "__address__" = "10.0.0.3:9100", + "job" = "ss_metrics", + "instance" = "localhost", + "alias" = "downstream-node", + "process" = "DownstreamNode", }, ] @@ -25,21 +41,21 @@ prometheus.scrape "ss_exporter" { prometheus.scrape "cardano_node_exporter" { targets = [ { - "__address__" = "127.0.0.1:12900", + "__address__" = "10.0.0.1:12900", "job" = "cardano_node_metrics", "instance" = "localhost", "alias" = "upstream-node", "process" = "UpstreamNode", }, { - "__address__" = "127.0.0.1:12901", + "__address__" = "10.0.0.2:12900", "job" = "cardano_node_metrics", "instance" = "localhost", "alias" = "node0", "process" = "Node0", }, { - "__address__" = "127.0.0.1:12902", + "__address__" = "10.0.0.3:12900", "job" = "cardano_node_metrics", "instance" = "localhost", "alias" = "downstream-node", From ab093f732cc1ad56d50e775378b70680b33e3a30 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Thu, 11 Dec 2025 11:55:52 +0100 Subject: [PATCH 6/9] Implement SS on Upstream and Node0 --- demo/2025-11/process-compose.yaml | 32 +++++++++++++++++++++----- demo/2025-11/scripts/ss-on-node0.sh | 5 ++++ demo/2025-11/scripts/ss-on-upstream.sh | 5 ++++ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100755 demo/2025-11/scripts/ss-on-node0.sh create mode 100755 demo/2025-11/scripts/ss-on-upstream.sh diff --git a/demo/2025-11/process-compose.yaml b/demo/2025-11/process-compose.yaml index 59663fcd3..cad07a1f2 100644 --- a/demo/2025-11/process-compose.yaml +++ b/demo/2025-11/process-compose.yaml @@ -29,7 +29,7 @@ processes: is_elevated: true command: | ip netns exec leios-experiment:upstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/upstream-node.sh" - log_location: "${WORKING_DIR}/upstream-node/log" + log_location: "${WORKING_DIR}/upstream-node.log" depends_on: PrepareUpstreamNode: condition: process_completed_successfully @@ -50,7 +50,7 @@ processes: is_elevated: true command: | ip netns exec leios-experiment:node0 bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/node0.sh" - log_location: "${WORKING_DIR}/node0/log" + log_location: "${WORKING_DIR}/node0.log" depends_on: PrepareNode0: condition: process_completed_successfully @@ -71,13 +71,33 @@ processes: is_elevated: true command: | ip netns exec leios-experiment:downstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/downstream-node.sh" - log_location: "${WORKING_DIR}/downstream-node/log" + log_location: "${WORKING_DIR}/downstream-node.log" depends_on: PrepareDownstreamNode: condition: process_completed_successfully availability: restart: "always" + SSOnUpstreamNode: + is_elevated: true + command: | + ip netns exec leios-experiment:upstream bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/ss-on-upstream.sh" + depends_on: + UpstreamNode: + condition: "process_started" + availability: + restart: "always" + + SSOnNode0: + is_elevated: true + command: | + ip netns exec leios-experiment:node0 bash -c "export WORKING_DIR=${WORKING_DIR}; ${SCRIPTS}/ss-on-node0.sh" + depends_on: + Node0: + condition: "process_started" + availability: + restart: "always" + SSOnDownstreamNode: is_elevated: true command: | @@ -98,9 +118,9 @@ processes: "$PYTHON3" "$ANALYSE_PY" \ "$REF_SLOT" "$ONSET_OF_REF_SLOT" \ "$UPSTREAM_NODE_DIR/schedule.json" \ - "$UPSTREAM_NODE_DIR/log" \ - "$NODE0_DIR/log" \ - "$DOWNSTREAM_NODE_DIR/log" \ + "$WORKING_DIR/upstream-node.log" \ + "$WORKING_DIR/node0.log" \ + "$WORKING_DIR/downstream-node.log" \ "$WORKING_DIR/scatter_plot.png" done; diff --git a/demo/2025-11/scripts/ss-on-node0.sh b/demo/2025-11/scripts/ss-on-node0.sh new file mode 100755 index 000000000..aac352587 --- /dev/null +++ b/demo/2025-11/scripts/ss-on-node0.sh @@ -0,0 +1,5 @@ +set -exuo pipefail; + +set -a && source "$WORKING_DIR/.env" && set +a + +ss_http_exporter "$IP_NODE0" 9100 "( sport = $PORT_NODE0 and dport = $PORT_DOWNSTREAM_NODE ) or ( sport = $PORT_DOWNSTREAM_NODE and dport = $PORT_NODE0 ) or ( sport = $PORT_NODE0 and dport = $PORT_UPSTREAM_NODE ) or ( sport = $PORT_UPSTREAM_NODE and dport = $PORT_NODE0 )" diff --git a/demo/2025-11/scripts/ss-on-upstream.sh b/demo/2025-11/scripts/ss-on-upstream.sh new file mode 100755 index 000000000..9413a452b --- /dev/null +++ b/demo/2025-11/scripts/ss-on-upstream.sh @@ -0,0 +1,5 @@ +set -exuo pipefail; + +set -a && source "$WORKING_DIR/.env" && set +a + +ss_http_exporter "$IP_UPSTREAM_NODE" 9100 "( sport = $PORT_NODE0 and dport = $PORT_UPSTREAM_NODE ) or ( sport = $PORT_UPSTREAM_NODE and dport = $PORT_NODE0 )" From 65bee3bba11f1b14add3420e1dcc0fc13bbeeb02 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Thu, 11 Dec 2025 11:56:48 +0100 Subject: [PATCH 7/9] Silence Resource tracing on Downstream and Node0 --- demo/2025-11/data/downstream-node/config.json | 2 +- demo/2025-11/data/node0/config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/demo/2025-11/data/downstream-node/config.json b/demo/2025-11/data/downstream-node/config.json index e9fbc8be7..d7d6d23d3 100644 --- a/demo/2025-11/data/downstream-node/config.json +++ b/demo/2025-11/data/downstream-node/config.json @@ -236,7 +236,7 @@ "severity": "Notice" }, "Resources": { - "severity": "Debug" + "severity": "Silence" }, "Shutdown": { "severity": "Notice" diff --git a/demo/2025-11/data/node0/config.json b/demo/2025-11/data/node0/config.json index d5085048d..5b6e8feb8 100644 --- a/demo/2025-11/data/node0/config.json +++ b/demo/2025-11/data/node0/config.json @@ -236,7 +236,7 @@ "severity": "Notice" }, "Resources": { - "severity": "Debug" + "severity": "Silence" }, "Shutdown": { "severity": "Notice" From 176eb6fefb42bed5898c6b900e81eeb38685cff6 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Thu, 11 Dec 2025 14:16:38 +0100 Subject: [PATCH 8/9] Clean up logs filtering in Demo Alloy --- demo/extras/x_ray/alloy | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/demo/extras/x_ray/alloy b/demo/extras/x_ray/alloy index d2e71fa18..ade9b3607 100644 --- a/demo/extras/x_ray/alloy +++ b/demo/extras/x_ray/alloy @@ -73,8 +73,8 @@ prometheus.scrape "cardano_node_exporter" { loki.write "loki" { endpoint { - url = "http://localhost:3100/loki/api/v1/push" - batch_size = "2MB" + url = "http://localhost:3100/loki/api/v1/push" + batch_size = "2MB" } } @@ -97,6 +97,7 @@ loki.process "extract_process_compose_logs" { replica = "replica", message = "message", } + drop_malformed = true } stage.labels { @@ -135,6 +136,12 @@ loki.process "extract_cardano_node_logs" { ns = "ns", data = "data", } + drop_malformed = true + } + + stage.drop { + source = "process" + value = "Analyze" } stage.timestamp { @@ -181,6 +188,7 @@ loki.process "extract_immdb_server_logs" { prevCount = "prevCount", msg = "msg", } + drop_malformed = true } stage.timestamp { From 6a0134f34805e15d28426599e5ceb91615913ed3 Mon Sep 17 00:00:00 2001 From: Drazen Popovic Date: Fri, 12 Dec 2025 11:18:16 +0100 Subject: [PATCH 9/9] Adds iproute2 to packages and final fixes --- demo/2025-11/README.md | 3 --- demo/2025-11/build.nix | 5 ++++- demo/2025-11/scripts/init-namespaces.sh | 1 - demo/2025-11/scripts/ss-on-downstream.sh | 2 +- demo/2025-11/scripts/ss-on-node0.sh | 2 +- demo/2025-11/scripts/ss-on-upstream.sh | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) diff --git a/demo/2025-11/README.md b/demo/2025-11/README.md index 97e2f0367..efdaabd5b 100644 --- a/demo/2025-11/README.md +++ b/demo/2025-11/README.md @@ -49,7 +49,6 @@ Run the Leios X-Ray (Grafana based observability stack) ```shell export LOG_PATH=".tmp-leios-202511-demo/*.log" -export SS_FILTER="( sport = 3001 and dport = 3002 ) or ( sport = 3002 and dport = 3001 ) or ( sport = 3002 and dport = 3003 ) or ( sport = 3003 and dport = 3002 )" nix run github:input-output-hk/ouroboros-leios#x_ray ``` @@ -71,7 +70,6 @@ SECONDS_UNTIL_REF_SLOT=5 LEIOS_MANIFEST=manifest.json ANALYSE_PY=analyse.py PYTHON3=python -CARDANO_NODE=cardano-node RATE_UP_TO_N0="100Mbps"; DELAY_UP_TO_N0="20ms"; RATE_N0_TO_UP="100Mbps"; @@ -79,7 +77,6 @@ DELAY_N0_TO_UP="20ms"; RATE_N0_TO_DOWN="100Mbps"; DELAY_N0_TO_DOWN="20ms"; RATE_DOWN_TO_N0="100Mbps"; -DMMDB_SERVER=immdb-server ``` To clean up just delete the working directories diff --git a/demo/2025-11/build.nix b/demo/2025-11/build.nix index 15471bca3..ae8b44c00 100644 --- a/demo/2025-11/build.nix +++ b/demo/2025-11/build.nix @@ -29,7 +29,10 @@ runtimeInputs = config.devShells.dev-demo-2025-11.nativeBuildInputs ++ config.devShells.dev-demo-2025-11.buildInputs - ++ [ pkgs.sqlite ]; + ++ [ + pkgs.iproute2 + pkgs.sqlite + ]; runtimeEnv = { # Non configurable WORKING_DIR = ".tmp-leios-202511-demo"; diff --git a/demo/2025-11/scripts/init-namespaces.sh b/demo/2025-11/scripts/init-namespaces.sh index f5a5d2a85..6409aeac6 100755 --- a/demo/2025-11/scripts/init-namespaces.sh +++ b/demo/2025-11/scripts/init-namespaces.sh @@ -114,4 +114,3 @@ ip addr add "$IP_HOST" dev "host->down" ip route add "$IP_DOWNSTREAM_NODE" dev "host->down" ip netns exec "$NS_DOWNSTREAM" ip addr add "$IP_DOWNSTREAM_NODE" dev "down->host" ip netns exec "$NS_DOWNSTREAM" ip route add "$IP_HOST" dev "down->host" - diff --git a/demo/2025-11/scripts/ss-on-downstream.sh b/demo/2025-11/scripts/ss-on-downstream.sh index 997c3a5f8..26c8bbf4d 100755 --- a/demo/2025-11/scripts/ss-on-downstream.sh +++ b/demo/2025-11/scripts/ss-on-downstream.sh @@ -1,4 +1,4 @@ -set -exuo pipefail; +set -exuo pipefail set -a && source "$WORKING_DIR/.env" && set +a diff --git a/demo/2025-11/scripts/ss-on-node0.sh b/demo/2025-11/scripts/ss-on-node0.sh index aac352587..101d8d4dc 100755 --- a/demo/2025-11/scripts/ss-on-node0.sh +++ b/demo/2025-11/scripts/ss-on-node0.sh @@ -1,4 +1,4 @@ -set -exuo pipefail; +set -exuo pipefail set -a && source "$WORKING_DIR/.env" && set +a diff --git a/demo/2025-11/scripts/ss-on-upstream.sh b/demo/2025-11/scripts/ss-on-upstream.sh index 9413a452b..f4e22c313 100755 --- a/demo/2025-11/scripts/ss-on-upstream.sh +++ b/demo/2025-11/scripts/ss-on-upstream.sh @@ -1,4 +1,4 @@ -set -exuo pipefail; +set -exuo pipefail set -a && source "$WORKING_DIR/.env" && set +a