-
Notifications
You must be signed in to change notification settings - Fork 461
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Flood comparision tool #6337
Merged
Merged
Flood comparision tool #6337
Changes from 204 commits
Commits
Show all changes
205 commits
Select commit
Hold shift + click to select a range
363e653
Use better processing timer for logging (#5843)
benaadams 10be6f6
Don't use DarkGray (#5849)
benaadams 0e4300a
Bump to 1.20.0-rc
kamilchodola d16ab35
Update DotNetty feed
rubo a9e742c
Update DotNetty package
rubo 78e5ec6
minor fixes
marcindsobczak a293ae9
Update version to 1.20.0
kamilchodola 0e3b7cb
Bump to 1.20.1
kamilchodola 4ea37b2
Add workflow to compare rpcs
0a06493
Trigger workflow?
piwonskp c80d9f3
Fix run-a-single-node-from-branch.yml
piwonskp 9c127cc
Update branch name
piwonskp b8d275c
Wait for the node to sync
06937bd
Add a separate job to wait for node sync
0877822
Fix missing checkout
352bf64
Use validator mode and set Pruning to None
4a833a7
Increase timeout of wait to sync to 10 hours
6c85ab9
Change step timeout as well
8377d34
Wait 5.5h before running `wait_for_node_to_sync`
c8a360b
Fix needs
piwonskp 13d9a28
Wait another 5.5h
476a16d
Fix indentation
piwonskp 21bab0c
Remove sleep2
3278641
Remove debug info
53f3717
Change approach to multi nodes
kamilchodola 863d9e8
Fix desc
kamilchodola 15c83ae
Fix branch name for trigger
kamilchodola d4e1c7e
Merge branch 'rpc-comparision-1.23.0' of https://github.com/Nethermin…
kamilchodola ba1f35a
Add logs
kamilchodola 9025c58
Add hardcoded value
kamilchodola 889de1f
Fix matrix
kamilchodola 5b5c76e
Change matrix approach
kamilchodola 102b4c5
Fix json creation
kamilchodola 803ff36
Fix path
kamilchodola 75d4eae
Select branch
kamilchodola 3103037
Absolut path
kamilchodola cc6a6f6
revert path
kamilchodola b3a51fd
static path
kamilchodola 33a1c7d
Remove ref
kamilchodola bd71f87
bump checkout
kamilchodola 074a6e9
add logs
kamilchodola c1a7fe7
Add fethc depth
kamilchodola 024770c
change debug log
kamilchodola eaf6f60
More logs
kamilchodola 8c2cf2f
Change logs
kamilchodola d4986fe
Change back to old version of run0single-node
kamilchodola dfce406
revert changes
kamilchodola 0797b08
Change job
kamilchodola 8eca9d1
Add matrix to path
kamilchodola 723bf80
Adjust ref
kamilchodola bf37e3d
fix allowed_ips
kamilchodola 7c99e16
missing needs
kamilchodola c20781b
Fix trigger job
kamilchodola 4911983
Use better processing timer for logging (#5843)
benaadams 54c8ccb
Don't use DarkGray (#5849)
benaadams f69ff70
Bump to 1.20.0-rc
kamilchodola 71f964f
Update DotNetty feed
rubo 3228792
Update DotNetty package
rubo c409761
minor fixes
marcindsobczak e96d1c8
Update version to 1.20.0
kamilchodola b7d39a4
Bump to 1.20.1
kamilchodola c137daf
Add workflow to compare rpcs
631aee3
Trigger workflow?
piwonskp a6576b1
Fix run-a-single-node-from-branch.yml
piwonskp ffc0c53
Update branch name
piwonskp e4d6f92
Wait for the node to sync
488df0a
Add a separate job to wait for node sync
e2057f8
Fix missing checkout
507ecd7
Use validator mode and set Pruning to None
84222b7
Increase timeout of wait to sync to 10 hours
70e5963
Change step timeout as well
4d996bf
Wait 5.5h before running `wait_for_node_to_sync`
4ca6c94
Fix needs
piwonskp 37f2aa4
Wait another 5.5h
4dece62
Fix indentation
piwonskp 538bf3e
Remove sleep2
b1595c1
Remove debug info
6a25987
Change approach to multi nodes
kamilchodola f2c0ea5
Fix branch name for trigger
kamilchodola 8f7bbe9
Fix desc
kamilchodola 9cb1f6d
Add logs
kamilchodola 52d173c
Add hardcoded value
kamilchodola 11065a4
Fix matrix
kamilchodola 92fa043
Change matrix approach
kamilchodola a8b7da3
Fix json creation
kamilchodola 8b7a5d2
Fix path
kamilchodola a9ec148
Select branch
kamilchodola 48bb8a6
Absolut path
kamilchodola 83cf2c4
revert path
kamilchodola 6ec1812
static path
kamilchodola dfc7efc
Remove ref
kamilchodola cc6dbaf
bump checkout
kamilchodola 1dc34ee
add logs
kamilchodola 3d18635
Add fethc depth
kamilchodola 82c383a
change debug log
kamilchodola f2b9e73
More logs
kamilchodola 79cc8d2
Change logs
kamilchodola 5411ac6
Change back to old version of run0single-node
kamilchodola 0325b48
revert changes
kamilchodola 90ae1af
Change job
kamilchodola c805dde
Add matrix to path
kamilchodola 36a9394
Adjust ref
kamilchodola d66e343
fix allowed_ips
kamilchodola c4b5a2b
missing needs
kamilchodola c045d47
Fix trigger job
kamilchodola c29e0c2
Merge branch 'rpc-comparision-1.23.0' of https://github.com/Nethermin…
kamilchodola b19cced
Revert bad rebase changes
kamilchodola 98d219e
Fixed workflow for testing
kamilchodola c88998e
Fix needs
kamilchodola 3f5b171
Fix outputs
kamilchodola 161768d
add missing $
kamilchodola 6732fd7
Add more logs
kamilchodola 352b646
Change rpc_urls
kamilchodola 124f2ac
Change approach of node creation
kamilchodola deeb0de
Comment out
kamilchodola b9594ff
Fix needs
kamilchodola 2479cd4
Change a way of applying artifacts and rpc_urls
kamilchodola 165e8be
Adjust needs
kamilchodola ed216a9
Adjust
kamilchodola e9ad1a0
Add missing variables
kamilchodola 60719cf
Fix invalid file read
kamilchodola 2febe0f
Fix temp infura value
kamilchodola f365556
Fix to much '
kamilchodola 4d109d2
Fix artifact save
kamilchodola 9240dd5
Fix branches fetching
kamilchodola 8126cfb
Temp remove needs
kamilchodola fcebf0f
Switch to first job needs
kamilchodola cfa3c67
Fix list fill
kamilchodola 2a75265
Invalid path
kamilchodola 52da7af
Add verbose logging
kamilchodola f225eb4
Adjust
kamilchodola 09d6323
add missing repo
kamilchodola 30848e9
Rollback run_id
kamilchodola 43b43f6
Fix needs
kamilchodola d113bb4
Trigger
kamilchodola fb16952
Fix needs
kamilchodola 97fa930
Change apprioach of downloading artifacts
kamilchodola 023d4a8
Add more params to artifact download
kamilchodola 0ac2dd1
Download all from current run
kamilchodola fe3eb41
Change the runid
kamilchodola 1cf5023
Add search
kamilchodola e63c877
Fix typo
kamilchodola 7baf5a3
Change way of downlaoding artifacts
kamilchodola b9742cd
Test a different run-id
kamilchodola 5b53e8f
Change approach
kamilchodola 1536cdb
Add mising custom id
kamilchodola 3241a34
Change approach to only 1 branch compare
kamilchodola 6dd7c29
Fix
kamilchodola 01ad1b4
Fix2
kamilchodola 8fc7714
add if commented
kamilchodola 07a807e
Fetch only most recent run for selected ref
kamilchodola b510ab8
Change name of job
kamilchodola d3c81a7
Fix a ref_name displayed
kamilchodola adb199c
Fix ref name
kamilchodola f770410
Cleanup
kamilchodola 7110600
Fix typo
kamilchodola afc0e0b
Clean refs
kamilchodola bc2e998
Change artifacts download path
kamilchodola 294a5d0
Change action temporarily
kamilchodola 38a1249
Add path param
kamilchodola 49c795b
Switch to david action type
kamilchodola c8fd4a1
Trigger new nodes
kamilchodola d639b3d
Rollback needs
kamilchodola 943bfb2
Fix if check for docker build creation
kamilchodola 3840637
Rolback to classic artifacts downoad
kamilchodola b914ac9
Add better docker image check
kamilchodola eb5a81c
Add missing if condition
kamilchodola 7a24bd9
Fix paths and add temp sepolia
kamilchodola 44c86aa
Change delimiter
kamilchodola 1803f06
Adjust waiting for node
kamilchodola 09f6dba
Fix wrong output
kamilchodola 0a67a58
Mock and test
kamilchodola 2f7bc95
Fix issue
kamilchodola 73b5f54
Fix issue2
kamilchodola e4fbe66
Fix issue
kamilchodola fe2373d
Remove deps
kamilchodola fe9b95b
Fix invalid "
kamilchodola 5979880
Revert comments back
kamilchodola e340e67
Test on existing infra
kamilchodola 14f1515
Fix bad replace
kamilchodola 2e253ce
Change aproach of running
kamilchodola 0c4e9d1
Fix failure
kamilchodola 371c906
Add a better order of artifacts on a rpc_list
kamilchodola 8e5f93f
Adjust
kamilchodola 5102b13
Fix
kamilchodola 124607e
Rollback to env
kamilchodola 1597f1e
Adjust flood script
kamilchodola ae552ae
Fix rpc_urls creation
kamilchodola 115c745
Hardcode urls for test
kamilchodola 288db72
Comment out needs
kamilchodola 359fdf1
Add missing equality tests
kamilchodola f06f051
Change to kch flood fork
kamilchodola 665bed5
Rollback to official flood
kamilchodola e796222
Generate new nodes
kamilchodola 1bf351d
Add misiing extension
kamilchodola 05d48e6
adjist script and add logs
kamilchodola 747684a
Fix typo
kamilchodola 99f714d
Test
kamilchodola 4db31b8
Change approach slightly
kamilchodola f3bcb11
One mroe adjustment
kamilchodola c3d8290
Adjust to mainnet and add missing envs
kamilchodola 331ffa8
Bump timeout to something higher to fit tests
kamilchodola c8bdf04
Clean Up
kamilchodola c70e31b
Add missing changes
kamilchodola 38808f5
merge master
kamilchodola File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,261 @@ | ||
name: '[JSON-RPC] Compare Nethermind between clients and versions' | ||
|
||
on: | ||
workflow_dispatch: | ||
inputs: | ||
allowed_ips: | ||
type: string | ||
description: "A comma-separated list of ips allowed to connect to the node" | ||
default: '' | ||
required: false | ||
branch_to_compare: | ||
type: string | ||
description: "A space-separated list of branches. If empty, then selected branch will be used. If multiple specified, those will be compared to themselves." | ||
default: "" | ||
required: false | ||
compare_with: | ||
type: string | ||
description: "A space-separated list of additional comparers. If empty, then nothing else will be added to comparision. Possible options: 'INFURA_ENDPOINT', 'NETHERMIND_ARCHIVE_ENDPOINT'" | ||
default: "" | ||
required: false | ||
|
||
jobs: | ||
create_main_node: | ||
name: Create node from current branch | ||
uses: ./.github/workflows/run-a-single-node-from-branch.yml | ||
secrets: inherit | ||
with: | ||
additional_options: '{"timeout":"12", "default_dockerfile":"Dockerfile", "default_dockerfile_build_type":"release", "ssh_keys":"", "allowed_ips":"${{ inputs.allowed_ips }}"}' | ||
non_validator_mode: false | ||
additional_nethermind_flags: Pruning.Mode=None JsonRpc.EnabledModules=[Eth,Subscribe,Trace,TxPool,Web3,Personal,Proof,Net,Parity,Health,Rpc,Debug,Admin] | ||
nethermind_repo_ref: ${{ github.ref }} | ||
custom_run_id: ${{ github.run_id }} | ||
|
||
create_compare_node: | ||
name: Create node from branch to compare | ||
uses: ./.github/workflows/run-a-single-node-from-branch.yml | ||
if: inputs.branch_to_compare != '' | ||
secrets: inherit | ||
with: | ||
additional_options: '{"timeout":"12", "default_dockerfile":"Dockerfile", "default_dockerfile_build_type":"release", "ssh_keys":"", "allowed_ips":"${{ inputs.allowed_ips }}"}' | ||
non_validator_mode: false | ||
additional_nethermind_flags: Pruning.Mode=None JsonRpc.EnabledModules=[Eth,Subscribe,Trace,TxPool,Web3,Personal,Proof,Net,Parity,Health,Rpc,Debug,Admin] | ||
nethermind_repo_ref: ${{ inputs.branch_to_compare }} | ||
custom_run_id: ${{ github.run_id }} | ||
|
||
aggregate_rpcs: | ||
name: Collect all RPC Urls and pass it further | ||
runs-on: ubuntu-latest | ||
needs: [create_main_node, create_compare_node] | ||
outputs: | ||
rpc_urls: ${{ steps.process_artifacts.outputs.rpc_urls }} | ||
steps: | ||
|
||
- name: Prepare clean main ref | ||
id: prepare_main_ref | ||
run: | | ||
REF_NAME=${{ github.ref }} | ||
CLEAN_REF=$(echo "${REF_NAME/refs\/heads\//}" | sed 's/[^a-zA-Z0-9._-]/-/g') | ||
echo "CLEAN_MAIN_REF=$CLEAN_REF" >> $GITHUB_ENV | ||
|
||
- name: Prepare clean compare ref | ||
id: prepare_compare_ref | ||
if: inputs.branch_to_compare != '' | ||
run: | | ||
REF_NAME=${{ inputs.nethermind_repo_ref }} | ||
CLEAN_REF=$(echo "${REF_NAME/refs\/heads\//}" | sed 's/[^a-zA-Z0-9._-]/-/g') | ||
echo "CLEAN_COMPARE_REF=$CLEAN_REF" >> $GITHUB_ENV | ||
|
||
- name: Download RPC Artifact for current branch | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: rpc-url___${{ env.CLEAN_MAIN_REF }}___${{ github.run_id }} | ||
path: artifacts | ||
|
||
- name: Download RPC Artifact for branch to compare | ||
if: inputs.branch_to_compare != '' | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: rpc-url___${{ env.CLEAN_COMPARE_REF }}___${{ github.run_id }} | ||
path: artifacts | ||
|
||
- name: Process Artifacts Content | ||
id: process_artifacts | ||
run: | | ||
rpc_urls="" | ||
main_branch_file="rpc_url%${{ env.CLEAN_MAIN_REF }}%${{ github.run_id }}.txt" | ||
compare_branch_file="rpc_url%${{ env.CLEAN_COMPARE_REF }}%${{ github.run_id }}" | ||
|
||
ls artifacts | ||
# Check and add the main branch file | ||
if [ -f "artifacts/$main_branch_file" ]; then | ||
url_content=$(cat "artifacts/$main_branch_file") | ||
echo $url_content | ||
rpc_urls+="${{ env.CLEAN_MAIN_REF }}::$url_content," | ||
fi | ||
|
||
# Check and add the compare branch file | ||
if [ -f "artifacts/$compare_branch_file" ]; then | ||
url_content=$(cat "artifacts/$compare_branch_file") | ||
echo $url_content | ||
rpc_urls+="${{ env.CLEAN_COMPARE_REF }}::$url_content," | ||
fi | ||
|
||
rpc_urls=${rpc_urls%,} | ||
echo $rpc_urls | ||
echo "rpc_urls=$rpc_urls" >> $GITHUB_OUTPUT | ||
|
||
wait_for_node_to_sync: | ||
name: Wait for the nodes to sync | ||
runs-on: ubuntu-latest | ||
needs: [aggregate_rpcs] | ||
timeout-minutes: 600 | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- name: Install WireGuard | ||
run: | | ||
sudo apt update | ||
sudo apt install -y wireguard resolvconf | ||
sudo mkdir -p /etc/wireguard | ||
envsubst < scripts/wireguard.conf.template > wg0.conf | ||
sudo wg-quick up ./wg0.conf | ||
env: | ||
WIREGUARD_PRIVKEY: '${{ secrets.WIREGUARD_PRIVKEY }}' | ||
WIREGUARD_ADDRESS: '${{ secrets.WIREGUARD_ADDRESS }}' | ||
WIREGUARD_DNS: '${{ secrets.WIREGUARD_DNS }}' | ||
WIREGUARD_PUBKEY: '${{ secrets.WIREGUARD_PUBKEY }}' | ||
WIREGUARD_PRESHAREDKEY: '${{ secrets.WIREGUARD_PRESHAREDKEY }}' | ||
WIREGUARD_ALLOWED_IPS: '${{ secrets.WIREGUARD_ALLOWED_IPS }}' | ||
WIREGUARD_SERVER_IP: '${{ secrets.WIREGUARD_SERVER_IP }}' | ||
WIREGUARD_SERVER_PORT: '${{ secrets.WIREGUARD_SERVER_PORT }}' | ||
|
||
- name: Wait for the nodes to sync | ||
timeout-minutes: 600 | ||
run: | | ||
# Assuming rpc_urls_str is a comma-separated string of URLs | ||
rpc_urls_str="${{ needs.aggregate_rpcs.outputs.rpc_urls }}" | ||
IFS=',' read -r -a rpc_urls_array <<< "$rpc_urls_str" | ||
|
||
# Loop through the array and strip the branch prefix | ||
processed_rpc_urls=() | ||
for url_entry in "${rpc_urls_array[@]}"; do | ||
processed_url="${url_entry#*::}" # Remove everything up to and including "::" | ||
processed_rpc_urls+=("$processed_url") | ||
done | ||
|
||
sync_complete_flag=0 | ||
|
||
check_sync() { | ||
rpc_url=$1 | ||
while curl -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' "$rpc_url" | jq -e '.result'; do | ||
echo "Still waiting for node to be synced at RPC: $rpc_url." | ||
sleep 60 | ||
done | ||
echo "Node at $rpc_url synced." | ||
sync_complete_flag=$((sync_complete_flag+1)) | ||
} | ||
|
||
# Just an RPC warmup - to make sure no faulty info reached a check | ||
sleep 60 | ||
|
||
# Iterate over the processed array of URLs | ||
for url in "${processed_rpc_urls[@]}"; do | ||
check_sync "$url" | ||
done | ||
|
||
|
||
compare: | ||
name: Compare JSON-RPC responses between clients and versions | ||
runs-on: ubuntu-latest | ||
needs: [wait_for_node_to_sync, aggregate_rpcs] | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- name: Install flood | ||
run: pip install git+https://github.com/piwonskp/flood.git | ||
|
||
- name: Install WireGuard | ||
run: | | ||
sudo apt update | ||
sudo apt install -y wireguard resolvconf | ||
sudo mkdir -p /etc/wireguard | ||
envsubst < scripts/wireguard.conf.template > wg0.conf | ||
sudo wg-quick up ./wg0.conf | ||
env: | ||
WIREGUARD_PRIVKEY: '${{ secrets.WIREGUARD_PRIVKEY }}' | ||
WIREGUARD_ADDRESS: '${{ secrets.WIREGUARD_ADDRESS }}' | ||
WIREGUARD_DNS: '${{ secrets.WIREGUARD_DNS }}' | ||
WIREGUARD_PUBKEY: '${{ secrets.WIREGUARD_PUBKEY }}' | ||
WIREGUARD_PRESHAREDKEY: '${{ secrets.WIREGUARD_PRESHAREDKEY }}' | ||
WIREGUARD_ALLOWED_IPS: '${{ secrets.WIREGUARD_ALLOWED_IPS }}' | ||
WIREGUARD_SERVER_IP: '${{ secrets.WIREGUARD_SERVER_IP }}' | ||
WIREGUARD_SERVER_PORT: '${{ secrets.WIREGUARD_SERVER_PORT }}' | ||
|
||
- name: Prepare Comparison Flags | ||
id: prep_comparison | ||
env: | ||
INFURA_ENDPOINT: '${{ secrets.INFURA_ENDPOINT }}' | ||
NETHERMIND_ARCHIVE_ENDPOINT: '${{ secrets.NETHERMIND_ARCHIVE_ENDPOINT }}' | ||
run: | | ||
others_str="${{ github.event.inputs.compare_with }}" | ||
rpc_urls_str="${{ needs.aggregate_rpcs.outputs.rpc_urls }}" | ||
|
||
IFS=',' read -r -a rpc_urls_array <<< "$rpc_urls_str" | ||
unset IFS | ||
IFS=' ' read -r -a others_str_array <<< "$others_str" | ||
unset IFS | ||
|
||
# Construct nethermind_urls_str as an array | ||
nethermind_urls_str=() | ||
for url_entry in "${rpc_urls_array[@]}"; do | ||
branch="${url_entry%%::*}" # Extract the branch part | ||
url="${url_entry#*::}" # Extract the URL part | ||
nethermind_urls_str+=("nethermind_$branch=$url") | ||
done | ||
|
||
# Construct others_prepared_str as an array | ||
others_prepared_str=() | ||
for other in "${others_str_array[@]}"; do | ||
if [[ "$other" == "INFURA_ENDPOINT" ]]; then | ||
others_prepared_str+=("$other=${INFURA_ENDPOINT}") | ||
elif [[ "$other" == "NETHERMIND_ARCHIVE_ENDPOINT" ]]; then | ||
others_prepared_str+=("$other=${NETHERMIND_ARCHIVE_ENDPOINT}") | ||
fi | ||
done | ||
|
||
# Flag for comparing to other branch | ||
if [ ${#nethermind_urls_str[@]} -gt 1 ]; then | ||
echo "compare_to_other_branch=true" >> $GITHUB_ENV | ||
echo "compare_to_other_branch_params=${nethermind_urls_str[0]} ${nethermind_urls_str[1]}" >> $GITHUB_ENV | ||
else | ||
echo "compare_to_other_branch=false" >> $GITHUB_ENV | ||
fi | ||
|
||
# Flags for comparing to INFURA and ARCHIVE endpoints | ||
compare_to_infura=false | ||
compare_to_archive=false | ||
for (( j = 0; j < ${#others_prepared_str[@]}; j++ )); do | ||
if [[ "${others_prepared_str[j]}" == "INFURA_ENDPOINT=${INFURA_ENDPOINT}" ]]; then | ||
compare_to_infura=true | ||
echo "compare_to_infura_params=${nethermind_urls_str[0]} ${others_prepared_str[j]}" >> $GITHUB_ENV | ||
elif [[ "${others_prepared_str[j]}" == "NETHERMIND_ARCHIVE_ENDPOINT=${NETHERMIND_ARCHIVE_ENDPOINT}" ]]; then | ||
compare_to_archive=true | ||
echo "compare_to_archive_params=${nethermind_urls_str[0]} ${others_prepared_str[j]}" >> $GITHUB_ENV | ||
fi | ||
done | ||
echo "compare_to_infura=$compare_to_infura" >> $GITHUB_ENV | ||
echo "compare_to_archive=$compare_to_archive" >> $GITHUB_ENV | ||
|
||
- name: Compare to Other Branch | ||
if: env.compare_to_other_branch == 'true' | ||
run: | | ||
flood all ${compare_to_other_branch_params} --equality | ||
|
||
- name: Compare to INFURA Endpoint | ||
if: env.compare_to_infura == 'true' | ||
run: | | ||
flood all ${compare_to_infura_params} --equality | ||
|
||
- name: Compare to Nethermind Archive Endpoint | ||
if: env.compare_to_archive == 'true' | ||
run: | | ||
flood all ${compare_to_archive_params} --equality |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
a leftover from testing?