Skip to content

Commit e6f9340

Browse files
committed
Merge branch 'main' into A0-1635-jolmen
2 parents 5d5574e + 83c63fe commit e6f9340

File tree

5 files changed

+278
-70
lines changed

5 files changed

+278
-70
lines changed

docker/Dockerfile.network_tests

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FROM aleph-node:latest
2+
3+
RUN apt update && \
4+
apt install curl iproute2 iputils-ping net-tools netwox tcpdump gdb gdbserver -y && \
5+
apt clean
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
services:
2+
Node0:
3+
image: aleph-node:network_tests
4+
networks:
5+
- main
6+
environment:
7+
- PURGE_BEFORE_START=false
8+
cap_add:
9+
- NET_ADMIN
10+
- SYS_PTRACE
11+
12+
Node1:
13+
image: aleph-node:network_tests
14+
networks:
15+
- main
16+
environment:
17+
- PURGE_BEFORE_START=false
18+
cap_add:
19+
- NET_ADMIN
20+
- SYS_PTRACE
21+
22+
Node2:
23+
image: aleph-node:network_tests
24+
networks:
25+
- main
26+
environment:
27+
- PURGE_BEFORE_START=false
28+
cap_add:
29+
- NET_ADMIN
30+
- SYS_PTRACE
31+
32+
Node3:
33+
image: aleph-node:network_tests
34+
networks:
35+
- main
36+
environment:
37+
- PURGE_BEFORE_START=false
38+
cap_add:
39+
- NET_ADMIN
40+
- SYS_PTRACE
41+
42+
Node4:
43+
image: aleph-node:network_tests
44+
networks:
45+
- main
46+
environment:
47+
- PURGE_BEFORE_START=false
48+
cap_add:
49+
- NET_ADMIN
50+
- SYS_PTRACE

scripts/catchup_version_upgrade_test.sh

Lines changed: 1 addition & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,42 +14,12 @@ ALL_NODES_PORTS=${ALL_NODES_PORTS:-"9933:9934:9935:9936:9937"}
1414
WAIT_BLOCKS=${WAIT_BLOCKS:-30}
1515
EXT_STATUS=${EXT_STATUS:-"in-block"}
1616

17-
function log() {
18-
echo $1 1>&2
19-
}
20-
21-
function into_array() {
22-
result=()
23-
local tmp=$IFS
24-
IFS=:
25-
for e in $1; do
26-
result+=($e)
27-
done
28-
IFS=$tmp
29-
}
17+
source ./scripts/common.sh
3018

3119
function initialize {
3220
wait_for_finalized_block $1 $2 $3
3321
}
3422

35-
function wait_for_finalized_block() {
36-
local block_to_be_finalized=$1
37-
local node=$2
38-
local port=$3
39-
40-
while [[ $(get_best_finalized $node $port) -le $block_to_be_finalized ]]; do
41-
sleep 3
42-
done
43-
}
44-
45-
function get_best_finalized {
46-
local validator=$1
47-
local rpc_port=$2
48-
49-
local best_finalized=$(VALIDATOR=$validator RPC_HOST="127.0.0.1" RPC_PORT=$rpc_port ./.github/scripts/check_finalization.sh | sed 's/Last finalized block number: "\(.*\)"/\1/')
50-
printf "%d" $best_finalized
51-
}
52-
5323
function set_upgrade_session {
5424
local session=$1
5525
local version=$2
@@ -110,45 +80,6 @@ function disconnect_nodes {
11080
done
11181
}
11282

113-
function wait_for_block {
114-
local block=$1
115-
local validator=$2
116-
local rpc_port=$3
117-
118-
local last_block=""
119-
while [[ -z "$last_block" ]]; do
120-
last_block=$(docker run --rm --network container:$validator appropriate/curl:latest \
121-
-H "Content-Type: application/json" \
122-
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlockHash", "params": '$block'}' http://127.0.0.1:$rpc_port | jq '.result')
123-
done
124-
}
125-
126-
function get_last_block {
127-
local validator=$1
128-
local rpc_port=$2
129-
130-
local last_block_number=$(docker run --rm --network container:$validator appropriate/curl:latest \
131-
-H "Content-Type: application/json" \
132-
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock"}' http://127.0.0.1:$rpc_port | jq '.result.block.header.number')
133-
printf "%d" $last_block_number
134-
}
135-
136-
function check_finalization {
137-
local block_to_check=$1
138-
local -n nodes=$2
139-
local -n ports=$3
140-
141-
log "checking finalization for block $block_to_check"
142-
143-
for i in "${!nodes[@]}"; do
144-
local node=${nodes[$i]}
145-
local rpc_port=${ports[$i]}
146-
147-
log "checking finalization at node $node"
148-
wait_for_finalized_block $block_to_check $node $rpc_port
149-
done
150-
}
151-
15283
into_array $NODES
15384
NODES=(${result[@]})
15485

scripts/common.sh

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#!/bin/env bash
2+
3+
function log() {
4+
echo $1 1>&2
5+
}
6+
7+
function into_array() {
8+
result=()
9+
local tmp=$IFS
10+
IFS=:
11+
for e in $1; do
12+
result+=($e)
13+
done
14+
IFS=$tmp
15+
}
16+
17+
function check_finalization() {
18+
local block_to_check=$1
19+
local -n nodes=$2
20+
local -n ports=$3
21+
22+
log "checking finalization for block $block_to_check"
23+
24+
for i in "${!nodes[@]}"; do
25+
local node=${nodes[$i]}
26+
local rpc_port=${ports[$i]}
27+
28+
log "checking finalization at node $node"
29+
wait_for_finalized_block $block_to_check $node $rpc_port
30+
done
31+
}
32+
33+
function check_relative_finalization_at_node() {
34+
local node=$1
35+
local rpc_port=$2
36+
local awaited_blocks=$3
37+
38+
local last_block=$(get_last_block $node $rpc_port)
39+
local awaited_finalized=$(($last_block+$awaited_blocks))
40+
41+
log "Last block seen at node $node was $last_block, awaiting block $awaited_finalized to be finalized"
42+
43+
wait_for_finalized_block $awaited_finalized $node $rpc_port
44+
}
45+
46+
function check_relative_finalization() {
47+
local awaited_blocks=$1
48+
local -n nodes=$2
49+
local -n ports=$3
50+
51+
log "checking finalization for $awaited_blocks block(s) in the future"
52+
53+
for i in "${!nodes[@]}"; do
54+
local node=${nodes[$i]}
55+
local rpc_port=${ports[$i]}
56+
57+
log "checking finalization at node $node (${node}:$rpc_port)"
58+
check_relative_finalization_at_node $node $rpc_port $awaited_blocks
59+
done
60+
}
61+
62+
function get_best_finalized() {
63+
local validator=$1
64+
local rpc_port=$2
65+
66+
local best_finalized=$(VALIDATOR=$validator RPC_HOST="127.0.0.1" RPC_PORT=$rpc_port ./.github/scripts/check_finalization.sh | sed 's/Last finalized block number: "\(.*\)"/\1/')
67+
printf "%d" $best_finalized
68+
}
69+
70+
function wait_for_finalized_block() {
71+
local block_to_be_finalized=$1
72+
local node=$2
73+
local port=$3
74+
75+
while [[ $(get_best_finalized $node $port) -le $block_to_be_finalized ]]; do
76+
sleep 3
77+
done
78+
}
79+
80+
function wait_for_block() {
81+
local block=$1
82+
local validator=$2
83+
local rpc_port=$3
84+
85+
local last_block=""
86+
while [[ -z "$last_block" ]]; do
87+
last_block=$(docker run --rm --network container:$validator appropriate/curl:latest \
88+
-H "Content-Type: application/json" \
89+
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlockHash", "params": '$block'}' http://127.0.0.1:$rpc_port | jq '.result')
90+
done
91+
}
92+
93+
function retrieve_last_block() {
94+
local validator=$1
95+
local rpc_port=$2
96+
97+
docker run --rm --network container:$validator appropriate/curl:latest \
98+
-H "Content-Type: application/json" \
99+
-d '{"id":1, "jsonrpc":"2.0", "method": "chain_getBlock"}' http://127.0.0.1:$rpc_port | jq '.result.block.header.number'
100+
}
101+
102+
function get_last_block() {
103+
local validator=$1
104+
local rpc_port=$2
105+
106+
local last_block=0
107+
while [[ -z "$last_block" ]]; do
108+
last_block=$(retrieve_last_block $validator $rpc_port)
109+
sleep 1
110+
done
111+
printf "%d" $last_block
112+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#!/bin/env bash
2+
3+
set -euo pipefail
4+
5+
source ./scripts/common.sh
6+
7+
function usage(){
8+
cat << EOF
9+
Usage:
10+
$0
11+
--network-delays "500:300"
12+
list of delays for each node in ms; default="500:500:500:500:500"
13+
--no-build-image
14+
skip docker image build
15+
--nodes "Node0:9933:Node1:9934"
16+
list of pairs node:rpc_port; default="Node0:9933:Node1:9934:Node2:9935:Node3:9936:Node4:9937"
17+
--check-block number
18+
check finalization for a given block number, 0 means no-check; default=42
19+
EOF
20+
exit 0
21+
}
22+
23+
function build_test_image() {
24+
docker build -t aleph-node:network_tests -f docker/Dockerfile.network_tests .
25+
}
26+
27+
function set_network_delay() {
28+
local node=$1
29+
local delay=$2
30+
31+
log "setting network delay for node $node"
32+
docker exec $node tc qdisc add dev eth1 root netem delay ${delay}ms
33+
}
34+
35+
while [[ $# -gt 0 ]]; do
36+
case $1 in
37+
--network-delays)
38+
NETWORK_DELAYS="$2"
39+
shift;shift
40+
;;
41+
--no-build-image)
42+
BUILD_IMAGE=false
43+
shift
44+
;;
45+
--nodes)
46+
NODES="$2"
47+
shift;shift
48+
;;
49+
--check-block)
50+
CHECK_BLOCK_FINALIZATION="$2"
51+
shift;shift
52+
;;
53+
--help)
54+
usage
55+
shift
56+
;;
57+
*)
58+
error "Unrecognized argument $1!"
59+
;;
60+
esac
61+
done
62+
63+
NETWORK_DELAYS=${NETWORK_DELAYS:-"500:500:500:500:500"}
64+
BUILD_IMAGE=${BUILD_IMAGE:-true}
65+
NODE_PAIRS=${NODES:-"Node0:9933:Node1:9934:Node2:9935:Node3:9936:Node4:9937"}
66+
NODES_PORTS=${NODES_PORTS:-"9933:9934:9935:9936:9937"}
67+
CHECK_BLOCK_FINALIZATION=${CHECK_BLOCK_FINALIZATION:-44}
68+
69+
into_array $NETWORK_DELAYS
70+
NETWORK_DELAYS=(${result[@]})
71+
72+
into_array $NODE_PAIRS
73+
NODE_PAIRS=(${result[@]})
74+
NODES=()
75+
NODES_PORTS=()
76+
for ((i=0; i<${#NODE_PAIRS[@]}; i+=2)); do
77+
node=${NODE_PAIRS[$i]}
78+
port=${NODE_PAIRS[(($i + 1))]}
79+
80+
NODES+=($node)
81+
NODES_PORTS+=($port)
82+
done
83+
84+
85+
if [[ "$BUILD_IMAGE" = true ]]; then
86+
log "building custom docker image for network tests"
87+
build_test_image
88+
fi
89+
90+
log "starting network"
91+
OVERRIDE_DOCKER_COMPOSE=./docker/docker-compose.network_tests.yml DOCKER_COMPOSE=./docker/docker-compose.bridged.yml ./.github/scripts/run_consensus.sh 1>&2
92+
log "network started"
93+
94+
for i in "${!NODES[@]}"; do
95+
node=${NODES[$i]}
96+
delay=${NETWORK_DELAYS[$i]}
97+
log "setting network delay for node $node to ${delay}ms"
98+
99+
set_network_delay $node $delay
100+
done
101+
102+
if [[ $CHECK_BLOCK_FINALIZATION -gt 0 ]]; then
103+
log "checking finalization"
104+
check_relative_finalization $CHECK_BLOCK_FINALIZATION NODES NODES_PORTS
105+
log "finalization checked"
106+
fi
107+
108+
log "done"
109+
110+
exit 0

0 commit comments

Comments
 (0)