From 0ed600c5a643fb030b66e44f7ac3124e6b5e094c Mon Sep 17 00:00:00 2001 From: Ognjen Maric Date: Tue, 4 Apr 2023 18:07:55 +0200 Subject: [PATCH 1/5] test(frontend-canister): Add retries to the curl invocations Add the reverted test back but this time with retries --- e2e/tests-dfx/upgrade_assets_canister.bash | 51 ++++++++++++++++++++++ e2e/utils/releases.bash | 37 ++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 e2e/tests-dfx/upgrade_assets_canister.bash create mode 100644 e2e/utils/releases.bash diff --git a/e2e/tests-dfx/upgrade_assets_canister.bash b/e2e/tests-dfx/upgrade_assets_canister.bash new file mode 100644 index 0000000000..b27c3a77ce --- /dev/null +++ b/e2e/tests-dfx/upgrade_assets_canister.bash @@ -0,0 +1,51 @@ +#!/usr/bin/env bats + +load ../utils/_ +load ../utils/releases + +setup() { + standard_setup + + dfx_new +} + +teardown() { + dfx_stop + + standard_teardown +} + +# The e2e matrix should ensure that this test is not run on ic-ref, as the Wasm does +# heavy computation +@test "asset canister can be upgraded from the latest release version when storing a lot of data" { + # As a starting point for the load, we looked at OpenChat's usage. + # As of 2023-02-10, they had 40MB of assets spread over 135 files. + # We'll use a bigger example (~3x in number of files, ~20x in total size) to add a safety margin. + local -r total_files=400 + local file_size + if [ "$(uname)" == "Darwin" ]; then + file_size="2m" + else + file_size="2M" + fi + + local -r canister_name=e2e_project_frontend + + local -r asset_dir="src/${canister_name}/assets" + for a in $(seq 1 $total_files); do + dd if=/dev/urandom of="${asset_dir}/large-asset-${a}.bin" bs="$file_size" count=1 1>/dev/null + done + + dfx_start + dfx canister create --all + dfx build + + # Install the canister using the Wasm from the latest release + local -r release_asset_wasm_dir=$(mktemp -d) + get_from_latest_release_tarball src/distributed/assetstorage.wasm.gz "$release_asset_wasm_dir" + export DFX_ASSETS_WASM="${release_asset_wasm_dir}/assetstorage.wasm.gz" + assert_command dfx canister install $canister_name + + use_default_asset_wasm + assert_command dfx deploy $canister_name --upgrade-unchanged +} diff --git a/e2e/utils/releases.bash b/e2e/utils/releases.bash new file mode 100644 index 0000000000..ddbded3c36 --- /dev/null +++ b/e2e/utils/releases.bash @@ -0,0 +1,37 @@ +# Usage: with_retries +with_retries() { + local -r nr_retries=$1 + shift + local -r cmd=$@ + for i in $(seq 1 $nr_retries); do + ($cmd) && break; + sleep 2; + done +} + +# Print the latest dfx version available on GitHub releases +get_latest_dfx_version() { + latest_version=$(with_retries 5 (curl -sL "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name")) + echo "$latest_version" +} + +# Extract a particular file from the latest release tarball, and save it to the specified destination +# Usage: get_from_latest_release_tarball +get_from_latest_release_tarball() { + local -r file_path=$1 + local -r destination=$2 + local -r tarball_url=$(with_retries 5 (curl -sL "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url")) + + local -r temp_dir=$(mktemp -d) + with_retries 5 (curl -sL "$tarball_url" -o "${temp_dir}/release.tar.gz") + + if [ "$(uname)" == "Darwin" ]; then + tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" "*/$file_path" + elif [ "$(uname)" == "Linux" ]; then + tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" --wildcards "*/$file_path" + fi + + local -r file_name=$(basename "$file_path") + local -r extracted_file=$(find "$temp_dir" -type f -name "$file_name") + mv "$extracted_file" "$destination" +} From b368f676b0e52c7c27f7863707a28dc4765ff53e Mon Sep 17 00:00:00 2001 From: Ognjen Maric Date: Tue, 4 Apr 2023 18:30:34 +0200 Subject: [PATCH 2/5] Use curl's built-in retry mechanism --- e2e/utils/releases.bash | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/e2e/utils/releases.bash b/e2e/utils/releases.bash index ddbded3c36..f1b760d321 100644 --- a/e2e/utils/releases.bash +++ b/e2e/utils/releases.bash @@ -1,17 +1,6 @@ -# Usage: with_retries -with_retries() { - local -r nr_retries=$1 - shift - local -r cmd=$@ - for i in $(seq 1 $nr_retries); do - ($cmd) && break; - sleep 2; - done -} - # Print the latest dfx version available on GitHub releases get_latest_dfx_version() { - latest_version=$(with_retries 5 (curl -sL "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name")) + latest_version=$(curl -sL --retry 5 "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name") echo "$latest_version" } @@ -20,10 +9,10 @@ get_latest_dfx_version() { get_from_latest_release_tarball() { local -r file_path=$1 local -r destination=$2 - local -r tarball_url=$(with_retries 5 (curl -sL "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url")) + local -r tarball_url=$(curl -sL --retry 5 "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url") local -r temp_dir=$(mktemp -d) - with_retries 5 (curl -sL "$tarball_url" -o "${temp_dir}/release.tar.gz") + curl -sL --retry 5 "$tarball_url" -o "${temp_dir}/release.tar.gz" if [ "$(uname)" == "Darwin" ]; then tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" "*/$file_path" From 77b572c8535fef1c7ef089d78242281005924bee Mon Sep 17 00:00:00 2001 From: Ognjen Maric Date: Wed, 5 Apr 2023 10:50:43 +0200 Subject: [PATCH 3/5] Disable the upgrade test on Darwin curl seems to be failing with "cannot resolve host" when downloading releases, but it only seems to happen on Darwin currently. --- scripts/workflows/e2e-matrix.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/workflows/e2e-matrix.py b/scripts/workflows/e2e-matrix.py index 8c894a6dad..d0c7649e27 100755 --- a/scripts/workflows/e2e-matrix.py +++ b/scripts/workflows/e2e-matrix.py @@ -27,6 +27,8 @@ def test_scripts(prefix): {"backend": "ic-ref", "test": "dfx/new"}, {"backend": "ic-ref", "test": "dfx/print"}, {"backend": "ic-ref", "test": "dfx/signals"}, + {"backend": "ic-ref", "test": "dfx/upgrade_assets_canister"}, + {"backend": "replica", "os": "macos-11", "test": "dfx/upgrade_assets_canister"}, ], } From 7f8feac190fd6b8d348d26016f7eed9377a72fff Mon Sep 17 00:00:00 2001 From: Ognjen Maric Date: Wed, 5 Apr 2023 17:26:22 +0200 Subject: [PATCH 4/5] Curl: retry on all errors and add Mac back in --- e2e/utils/releases.bash | 6 +++--- scripts/workflows/e2e-matrix.py | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/e2e/utils/releases.bash b/e2e/utils/releases.bash index f1b760d321..e9d6787184 100644 --- a/e2e/utils/releases.bash +++ b/e2e/utils/releases.bash @@ -1,6 +1,6 @@ # Print the latest dfx version available on GitHub releases get_latest_dfx_version() { - latest_version=$(curl -sL --retry 5 "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name") + latest_version=$(curl -sL --retry 5 --retry-all-errors "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tag_name") echo "$latest_version" } @@ -9,10 +9,10 @@ get_latest_dfx_version() { get_from_latest_release_tarball() { local -r file_path=$1 local -r destination=$2 - local -r tarball_url=$(curl -sL --retry 5 "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url") + local -r tarball_url=$(curl -sL --retry 5 --retry-all-errors "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url") local -r temp_dir=$(mktemp -d) - curl -sL --retry 5 "$tarball_url" -o "${temp_dir}/release.tar.gz" + curl -sL --retry 5 --retry-all-errors "$tarball_url" -o "${temp_dir}/release.tar.gz" if [ "$(uname)" == "Darwin" ]; then tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" "*/$file_path" diff --git a/scripts/workflows/e2e-matrix.py b/scripts/workflows/e2e-matrix.py index d0c7649e27..5b9becd6d2 100755 --- a/scripts/workflows/e2e-matrix.py +++ b/scripts/workflows/e2e-matrix.py @@ -28,7 +28,6 @@ def test_scripts(prefix): {"backend": "ic-ref", "test": "dfx/print"}, {"backend": "ic-ref", "test": "dfx/signals"}, {"backend": "ic-ref", "test": "dfx/upgrade_assets_canister"}, - {"backend": "replica", "os": "macos-11", "test": "dfx/upgrade_assets_canister"}, ], } From 679cb6c7cdea4d355766500d2650043ac2956df0 Mon Sep 17 00:00:00 2001 From: Ognjen Maric Date: Wed, 5 Apr 2023 18:25:42 +0200 Subject: [PATCH 5/5] Add a diagnostics message when curl fails --- e2e/utils/releases.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/utils/releases.bash b/e2e/utils/releases.bash index e9d6787184..3e93efd781 100644 --- a/e2e/utils/releases.bash +++ b/e2e/utils/releases.bash @@ -12,7 +12,7 @@ get_from_latest_release_tarball() { local -r tarball_url=$(curl -sL --retry 5 --retry-all-errors "https://api.github.com/repos/dfinity/sdk/releases/latest" | jq -r ".tarball_url") local -r temp_dir=$(mktemp -d) - curl -sL --retry 5 --retry-all-errors "$tarball_url" -o "${temp_dir}/release.tar.gz" + curl -sL --retry 5 --retry-all-errors "$tarball_url" -o "${temp_dir}/release.tar.gz" || (echo "It's really curl that failed" && return 1) if [ "$(uname)" == "Darwin" ]; then tar -xzf "$temp_dir/release.tar.gz" -C "$temp_dir" "*/$file_path"