#! /usr/bin/env bash set -euo pipefail EVENTS_TEST_PATH="http://$HOSTNAME:$AEMM_PORT/latest/meta-data/events/maintenance/scheduled" CODE_INST_STOP="instance-stop" STATE_CANCELED="canceled" EXPECTED_NOTBEFORE="1 Jan 2020 01:03:47 GMT" EXPECTED_NOTAFTER="7 Jan 2020 01:03:47 GMT" EXPECTED_NOTBEFORE_DEADLINE="10 Jan 2020 01:03:47 GMT" FLAG_STATE_OVERRIDE=$STATE_CANCELED ENV_CODE_OVERRIDE="instance-reboot" function test_events_paths() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) actual_paths=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://$HOSTNAME:$AEMM_PORT/latest/meta-data) expected_paths=$(cat $SCRIPTPATH/golden/events/latest/meta-data/index.golden) assert_value "$actual_paths" "$expected_paths" "test_events_paths" clean_up $pid } function test_events_subpath() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) actual_paths=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://$HOSTNAME:$AEMM_PORT/latest/meta-data/network/interfaces/macs/0e:49:61:0f:c3:11) expected_paths=$(cat $SCRIPTPATH/golden/events/latest/meta-data/network/interfaces/macs/0e_49_61_0f_c3_11/index.golden) assert_value "$actual_paths" "$expected_paths" "test_events_paths::/network/interfaces/macs/0e:49:61:0f:c3:11" clean_up $pid } function test_events_defaults() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $EVENTS_TEST_PATH) actual_code=$(get_value '"Code"' "$response") actual_state=$(get_value '"State"' "$response") actual_not_before=$(get_value '"NotBefore"' "$response") actual_not_after=$(get_value '"NotAfter"' "$response") actual_not_before_deadline=$(get_value '"NotBeforeDeadline"' "$response") assert_value "$actual_code" $EVENTS_CODE_DEFAULT 'Default events::code' assert_value "$actual_state" $EVENTS_STATE_DEFAULT 'Default events::state' assert_format "$actual_not_before" "$EVENTS_DATE_REGEX" 'Default events::NotBefore' assert_format "$actual_not_after" "$EVENTS_DATE_REGEX" 'Default events::NotAfter' assert_format "$actual_not_before_deadline" "$EVENTS_DATE_REGEX" 'Default events::NotBeforeDeadline' clean_up $pid } function test_events_code_and_state() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $EVENTS_TEST_PATH) actual_code=$(get_value '"Code"' "$response") actual_state=$(get_value '"State"' "$response") assert_value "$actual_code" $CODE_INST_STOP 'Override events::code' assert_value "$actual_state" $STATE_CANCELED 'Override events::state' clean_up $pid } function test_events_time_conversions() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $EVENTS_TEST_PATH) actual_not_before=$(get_value '"NotBefore"' "$response") actual_not_after=$(get_value '"NotAfter"' "$response") actual_not_before_deadline=$(get_value '"NotBeforeDeadline"' "$response") assert_value "$actual_not_before" "$EXPECTED_NOTBEFORE" 'Override events::NotBefore' assert_value "$actual_not_after" "$EXPECTED_NOTAFTER" 'Override events::NotAfter' assert_value "$actual_not_before_deadline" "$EXPECTED_NOTBEFORE_DEADLINE" 'Override events::NotBeforeDeadline' clean_up $pid } function test_events_config_precedence() { pid=$1 tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $EVENTS_TEST_PATH) actual_code=$(get_value '"Code"' "$response") actual_state=$(get_value '"State"' "$response") actual_not_before=$(get_value '"NotBefore"' "$response") actual_not_after=$(get_value '"NotAfter"' "$response") actual_not_before_deadline=$(get_value '"NotBeforeDeadline"' "$response") assert_value "$actual_code" $ENV_CODE_OVERRIDE 'config_precedence events::code' assert_value "$actual_state" $FLAG_STATE_OVERRIDE 'config_precedence events::state' clean_up $pid } function test_events_404() { pid=$1 expected_response=$(cat $SCRIPTPATH/golden/404_response.golden) tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) actual_response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $EVENTS_TEST_PATH) assert_value "$actual_response" "$expected_response" "test_events_404::mock-ip-count" clean_up $pid } function test_events_subcommand_paths_404() { pid=$1 test_url="$2" test_name="$3" expected_response=$(cat $SCRIPTPATH/golden/404_response.golden) tput setaf $YELLOW health_check $EVENTS_TEST_PATH TOKEN=$(get_v2Token $MAX_TOKEN_TTL $AEMM_PORT) actual_response=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" $test_url) assert_value "$actual_response" "$expected_response" "subcommand_paths_404::$test_name" clean_up $pid } tput setaf $YELLOW echo "======================================================================================================" echo "🥑 Starting events integration tests $METADATA_VERSION" echo "======================================================================================================" start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT) $start_cmd & EVENTS_PID=$! test_events_paths $EVENTS_PID start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT) $start_cmd & EVENTS_PID=$! test_events_subpath $EVENTS_PID $start_cmd & EVENTS_PID=$! test_events_defaults $EVENTS_PID start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT --code instance-stop --state canceled) $start_cmd & EVENTS_PID=$! test_events_code_and_state $EVENTS_PID start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT -a 2020-01-07T01:03:47Z -b 2020-01-01T01:03:47Z -l 2020-01-10T01:03:47Z) $start_cmd & EVENTS_PID=$! test_events_time_conversions $EVENTS_PID # validate flag/env precedence; can't override events via config export AEMM_EVENTS_STATE="completed" export AEMM_EVENTS_CODE="instance-reboot" start_cmd=$(create_cmd $METADATA_VERSION se --port $AEMM_PORT --state canceled) $start_cmd & EVENTS_PID=$! test_events_config_precedence $EVENTS_PID unset AEMM_EVENTS_STATE unset AEMM_EVENTS_CODE # paths for other subcommands should be disabled start_cmd=$(create_cmd $METADATA_VERSION se --port $AEMM_PORT) $start_cmd & EVENTS_PID=$! test_events_subcommand_paths_404 $EVENTS_PID "http://$HOSTNAME:$AEMM_PORT/latest/meta-data/spot/instance-action" "spot-instance-action" $start_cmd & EVENTS_PID=$! test_events_subcommand_paths_404 $EVENTS_PID "http://$HOSTNAME:$AEMM_PORT/latest/meta-data/spot/termination-time" "spot-termination-time" # --mock-ip-count feature start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT --mock-ip-count=-1) $start_cmd & EVENTS_PID=$! test_events_defaults $EVENTS_PID start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT --mock-ip-count=0) $start_cmd & EVENTS_PID=$! test_events_404 $EVENTS_PID start_cmd=$(create_cmd $METADATA_VERSION events --port $AEMM_PORT -x=1) $start_cmd & EVENTS_PID=$! test_events_defaults $EVENTS_PID exit $EXIT_CODE_TO_RETURN