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 3f3c577cf..5c8d73723 100644 --- a/demo/.shellcheckrc +++ b/demo/.shellcheckrc @@ -1 +1 @@ -disable=SC2148,SC1090,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/.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..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,8 +70,13 @@ SECONDS_UNTIL_REF_SLOT=5 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"; ``` To clean up just delete the working directories diff --git a/demo/2025-11/build.nix b/demo/2025-11/build.nix index 63450b97b..ae8b44c00 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; }; }; @@ -24,13 +29,20 @@ 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"; - 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; @@ -47,6 +59,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/downstream-node/config.json b/demo/2025-11/data/downstream-node/config.json index deb7dd43f..d7d6d23d3 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" @@ -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 c36172a23..5b6e8feb8 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" @@ -236,7 +236,7 @@ "severity": "Notice" }, "Resources": { - "severity": "Debug" + "severity": "Silence" }, "Shutdown": { "severity": "Notice" 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/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 c837d5155..cad07a1f2 100644 --- a/demo/2025-11/process-compose.yaml +++ b/demo/2025-11/process-compose.yaml @@ -1,103 +1,35 @@ 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)); - log_location: "${WORKING_DIR}/upstream-node/log" + 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: condition: process_completed_successfully @@ -105,43 +37,20 @@ processes: restart: "always" PrepareNode0: + is_elevated: true 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"; - log_location: "${WORKING_DIR}/node0/log" + 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: condition: process_completed_successfully @@ -149,49 +58,56 @@ processes: restart: "always" PrepareDownstreamNode: + is_elevated: true 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"; - - log_location: "${WORKING_DIR}/downstream-node/log" + 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: 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: | + 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; @@ -202,16 +118,20 @@ 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; 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..a6ee10616 --- /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 "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 new file mode 100755 index 000000000..6409aeac6 --- /dev/null +++ b/demo/2025-11/scripts/init-namespaces.sh @@ -0,0 +1,116 @@ +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" || 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" + +# 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 + +# 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 +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" "$RATE_UP_TO_N0" +delay "$NS_UPSTREAM" "up->n0" "$DELAY_UP_TO_N0" + +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" "$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_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" + +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/init.sh b/demo/2025-11/scripts/init.sh new file mode 100755 index 000000000..c6711655d --- /dev/null +++ b/demo/2025-11/scripts/init.sh @@ -0,0 +1,55 @@ +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" + 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 + +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..e5e0d311e --- /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 0.0.0.0 --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/ss-on-downstream.sh b/demo/2025-11/scripts/ss-on-downstream.sh new file mode 100755 index 000000000..26c8bbf4d --- /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/2025-11/scripts/ss-on-node0.sh b/demo/2025-11/scripts/ss-on-node0.sh new file mode 100755 index 000000000..101d8d4dc --- /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..f4e22c313 --- /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 )" diff --git a/demo/2025-11/scripts/upstream-node.sh b/demo/2025-11/scripts/upstream-node.sh new file mode 100755 index 000000000..dd67ae77f --- /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/extras/x_ray/alloy b/demo/extras/x_ray/alloy index 5eafe8492..ade9b3607 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", @@ -57,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" } } @@ -81,6 +97,7 @@ loki.process "extract_process_compose_logs" { replica = "replica", message = "message", } + drop_malformed = true } stage.labels { @@ -119,6 +136,12 @@ loki.process "extract_cardano_node_logs" { ns = "ns", data = "data", } + drop_malformed = true + } + + stage.drop { + source = "process" + value = "Analyze" } stage.timestamp { @@ -165,6 +188,7 @@ loki.process "extract_immdb_server_logs" { prevCount = "prevCount", msg = "msg", } + drop_malformed = true } stage.timestamp { 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 4fc4aa06c..9a0e9eb2f 100644 --- a/demo/pre-commit-hooks.nix +++ b/demo/pre-commit-hooks.nix @@ -12,6 +12,8 @@ # Shell shellcheck.enable = true; + shfmt.enable = true; + shfmt.settings.simplify = false; # Python black.enable = true;