| #!/usr/bin/env bash |
| ################################################################################ |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| ################################################################################ |
| |
| source "${END_TO_END_DIR}"/test-scripts/common.sh |
| |
| export FLINK_VERSION=$(MVN_RUN_VERBOSE=false run_mvn --file ${END_TO_END_DIR}/pom.xml org.apache.maven.plugins:maven-help-plugin:3.1.0:evaluate -Dexpression=project.version -q -DforceStdout) |
| |
| ####################################### |
| # Prints the given description, runs the given test and prints how long the execution took. |
| # Arguments: |
| # $1: description of the test |
| # $2: command to execute |
| # $3: check logs action |
| # $4: the command to check the log, if $3 is "custom_check_exceptions" |
| ####################################### |
| function run_test { |
| local description="$1" |
| local command="$2" |
| local check_logs_action=${3:-} |
| local custom_check_logs_command=${4:-} |
| |
| printf "\n==============================================================================\n" |
| printf "Running '${description}'\n" |
| printf "==============================================================================\n" |
| |
| # used to randomize created directories |
| export TEST_DATA_DIR=$TEST_INFRA_DIR/temp-test-directory-$(date +%S%N) |
| echo "TEST_DATA_DIR: $TEST_DATA_DIR" |
| |
| backup_flink_dir |
| start_timer |
| |
| function test_error() { |
| echo "[FAIL] Test script contains errors." |
| post_test_validation 1 "$description" "$check_logs_action" "$custom_check_logs_command" |
| } |
| # set a trap to catch a test execution error |
| trap 'test_error' ERR |
| |
| # Always enable unaligned checkpoint |
| set_config_key "execution.checkpointing.unaligned.enabled" "true" |
| |
| ${command} |
| exit_code="$?" |
| # remove trap for test execution |
| trap - ERR |
| post_test_validation ${exit_code} "$description" "$check_logs_action" "$custom_check_logs_command" |
| } |
| |
| # Validates the test result and exit code after its execution. |
| function post_test_validation { |
| local exit_code="$1" |
| local description="$2" |
| local check_logs_action="$3" |
| local custom_check_logs_command="$4" |
| |
| local time_elapsed=$(end_timer) |
| |
| if [[ "${check_logs_action}" == "skip_check_exceptions" ]]; then |
| echo "Checking of logs skipped." |
| elif [[ "${check_logs_action}" == "custom_check_exceptions" ]]; then |
| echo "Custom exception checking of logs." |
| ${custom_check_logs_command} |
| EXIT_CODE="$?" |
| else |
| check_logs_for_errors |
| check_logs_for_exceptions |
| check_logs_for_non_empty_out_files |
| fi |
| |
| # Investigate exit_code for failures of test executable as well as EXIT_CODE for failures of the test. |
| # Do not clean up if either fails. |
| if [[ ${exit_code} == 0 ]]; then |
| if [[ ${EXIT_CODE} != 0 ]]; then |
| printf "\n[FAIL] '${description}' failed after ${time_elapsed}! Test exited with exit code 0 but the logs contained errors, exceptions or non-empty .out files\n\n" |
| exit_code=1 |
| else |
| printf "\n[PASS] '${description}' passed after ${time_elapsed}! Test exited with exit code 0.\n\n" |
| fi |
| else |
| if [[ ${EXIT_CODE} != 0 ]]; then |
| printf "\n[FAIL] '${description}' failed after ${time_elapsed}! Test exited with exit code ${exit_code} and the logs contained errors, exceptions or non-empty .out files\n\n" |
| else |
| printf "\n[FAIL] '${description}' failed after ${time_elapsed}! Test exited with exit code ${exit_code}\n\n" |
| fi |
| fi |
| |
| if [[ ${exit_code} == 0 ]]; then |
| cleanup |
| log_environment_info |
| else |
| log_environment_info |
| exit "${exit_code}" |
| fi |
| } |
| |
| function log_environment_info { |
| echo "##[group]Environment Information" |
| echo "Jps" |
| jps |
| |
| echo "Disk information" |
| df -h |
| |
| echo "##[group]Top 15 biggest directories in terms of used disk space" |
| local pipefail_config |
| pipefail_config="$(get_current_set_option pipefail)" |
| |
| # GitHub Actions runs with pipefail enabled which makes |
| # the piped command fail (because head will exit with 141) |
| set +o pipefail |
| |
| du -ah --exclude="proc" -t100M . | sort -h -r | head -n 15 |
| |
| eval "set ${pipefail_config}o pipefail" |
| |
| if sudo -n true 2>/dev/null; then |
| echo "Allocated ports" |
| sudo netstat -tulpn |
| else |
| echo "Could not retrieve allocated ports because no sudo rights." |
| fi |
| |
| echo "Running docker containers" |
| docker ps -a |
| echo "##[endgroup]" |
| } |
| |
| # The echo'd character can be used to reset the config parameter |
| # to it's initial state again, e.g.: |
| # sign="$(get_current_set_option pipefail) |
| # set -o pipefail |
| # set ${sign}o pipefail |
| function get_current_set_option { |
| if [ $# -eq 0 ]; then |
| echo "[ERROR] No parameter was specified for get_current_set_option." |
| exit 1 |
| elif [ "$(set -o | grep "$1" | grep -c "on$")" -eq 1 ]; then |
| # set -o |
| echo "-" |
| else |
| echo "+" |
| fi |
| } |
| |
| # Shuts down cluster and reverts changes to cluster configs |
| function cleanup_proc { |
| shutdown_all |
| revert_flink_dir |
| } |
| |
| # Cleans up all temporary folders and files |
| function cleanup_tmp_files { |
| rm -f $FLINK_LOG_DIR/* |
| echo "Deleted all files under $FLINK_LOG_DIR/" |
| |
| rm -rf ${TEST_DATA_DIR} 2> /dev/null |
| echo "Deleted ${TEST_DATA_DIR}" |
| } |
| |
| # Shuts down the cluster and cleans up all temporary folders and files. |
| function cleanup { |
| cleanup_proc |
| cleanup_tmp_files |
| } |
| |
| trap cleanup SIGINT |
| on_exit cleanup_proc |