xds-interop-tests: add cross branch testing to the script (#31569)

Co-authored-by: Sergii Tkachenko <hi@sergii.org>
pull/32394/head
sanjaypujare 2 years ago committed by GitHub
parent 811510145c
commit 9dd4b7757d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 105
      tools/internal_ci/linux/grpc_xds_k8s_run_xtest.sh
  2. 26
      tools/internal_ci/linux/grpc_xds_k8s_xbranch.cfg
  3. 112
      tools/internal_ci/linux/grpc_xds_k8s_xbranch.sh
  4. 2
      tools/internal_ci/linux/grpc_xds_k8s_xlang.cfg
  5. 76
      tools/internal_ci/linux/grpc_xds_k8s_xlang.sh

@ -0,0 +1,105 @@
#!/usr/bin/env bash
# Copyright 2022 gRPC authors.
#
# Licensed 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.
## xDS test server/client Docker images
readonly IMAGE_REPO="gcr.io/grpc-testing/xds-interop"
find_latest() {
gcloud container images list-tags --filter='tags~v1\.\d+\.x' "${IMAGE_REPO}/${1}-${2}" --flatten='tags[]' --format='value(tags)' | sort --version-sort | tail -n 1
}
find_latest_branch() {
local latest_branch=$1
if [ "${latest_branch}" == "" ]; then
cpp_server=$(find_latest cpp server)
cpp_client=$(find_latest cpp client)
go_server=$(find_latest go server)
go_client=$(find_latest go client)
java_server=$(find_latest java server)
java_client=$(find_latest java client)
latest_branch=$( (printf "%s\n" "${cpp_server}" "${cpp_client}" "${go_server}" "${go_client}" "${java_server}" "${java_client}") | sort --version-sort | head -1)
fi
echo ${latest_branch}
}
find_oldest_branch() {
local oldest_branch=$1
local latest_branch=$2
if [ "${oldest_branch}" == "" ]; then
major_branch=$( echo "${latest_branch}" | cut -f 2 -d.)
oldest_branch="v1.$(( major_branch - 9)).x"
fi
echo ${oldest_branch}
}
#######################################
# Executes the test case
# Globals:
# TEST_DRIVER_FLAGFILE: Relative path to test driver flagfile
# KUBE_CONTEXT: The name of kubectl context with GKE cluster access
# TEST_XML_OUTPUT_DIR: Output directory for the test xUnit XML report
# SERVER_IMAGE_NAME: Test server Docker image name
# CLIENT_IMAGE_NAME: Test client Docker image name
# GIT_COMMIT: SHA-1 of git commit being built
# TESTING_VERSION: version branch under test: used by the framework to determine the supported PSM
# features.
# Arguments:
# Test case name
# Outputs:
# Writes the output of test execution to stdout, stderr
# Test xUnit report to ${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml
#######################################
run_test() {
if [ "$#" -ne 4 ]; then
echo "Usage: run_test client_lang client_branch server_lang server_branch" >&2
exit 1
fi
# Test driver usage:
# https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver#basic-usage
local client_lang="$1"
local client_branch="$2"
local server_lang="$3"
local server_branch="$4"
local server_image_name="${IMAGE_REPO}/${server_lang}-server"
local client_image_name="${IMAGE_REPO}/${client_lang}-client"
# Check if images exist
server_tags="$(gcloud_gcr_list_image_tags "${server_image_name}" "${server_branch}")"
echo "${server_tags:?Server image not found}"
client_tags="$(gcloud_gcr_list_image_tags "${client_image_name}" "${client_branch}")"
echo "${client_tags:?Client image not found}"
local server_image_name_tag="${server_image_name}:${server_branch}"
local client_image_name_tag="${client_image_name}:${client_branch}"
local out_dir="${TEST_XML_OUTPUT_DIR}/${client_branch}-${server_branch}/${client_lang}-${server_lang}"
mkdir -pv "${out_dir}"
set -x
python -m "tests.security_test" \
--flagfile="${TEST_DRIVER_FLAGFILE}" \
--kube_context="${KUBE_CONTEXT}" \
--server_image="${server_image_name_tag}" \
--client_image="${client_image_name_tag}" \
--testing_version="${TESTING_VERSION}" \
--nocheck_local_certs \
--force_cleanup \
--collect_app_logs \
--log_dir="${out_dir}" \
--xml_output_file="${out_dir}/sponge_log.xml" \
|& tee "${out_dir}/sponge_log.log"
}

@ -0,0 +1,26 @@
# Copyright 2022 gRPC authors.
#
# Licensed 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.
# Config file for the internal CI (in protobuf text format)
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_xds_k8s_xbranch.sh"
timeout_mins: 900
action {
define_artifacts {
regex: "artifacts/**/*sponge_log.xml"
regex: "artifacts/**/*.log"
strip_prefix: "artifacts"
}
}

@ -0,0 +1,112 @@
#!/usr/bin/env bash
# Copyright 2022 gRPC authors.
#
# Licensed 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.
set -eo pipefail
# Constants
readonly GITHUB_REPOSITORY_NAME="grpc"
readonly TEST_DRIVER_INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/${TEST_DRIVER_REPO_OWNER:-grpc}/grpc/${TEST_DRIVER_BRANCH:-master}/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh"
readonly LANGS="cpp go java"
readonly MAIN_BRANCH="${MAIN_BRANCH:-master}"
#######################################
# Main function: provision software necessary to execute tests, and run them
# Globals:
# KOKORO_ARTIFACTS_DIR
# GITHUB_REPOSITORY_NAME
# SRC_DIR: Populated with absolute path to the source repo
# TEST_DRIVER_REPO_DIR: Populated with the path to the repo containing
# the test driver
# TEST_DRIVER_FULL_DIR: Populated with the path to the test driver source code
# TEST_DRIVER_FLAGFILE: Populated with relative path to test driver flagfile
# TEST_XML_OUTPUT_DIR: Populated with the path to test xUnit XML report
# GIT_ORIGIN_URL: Populated with the origin URL of git repo used for the build
# GIT_COMMIT: Populated with the SHA-1 of git commit being built
# GIT_COMMIT_SHORT: Populated with the short SHA-1 of git commit being built
# KUBE_CONTEXT: Populated with name of kubectl context with GKE cluster access
# Arguments:
# None
# Outputs:
# Writes the output of test execution to stdout, stderr
#######################################
main() {
local script_dir
script_dir="$(dirname "$0")"
# Source the test driver from the master branch.
echo "Sourcing test driver install script from: ${TEST_DRIVER_INSTALL_SCRIPT_URL}"
source /dev/stdin <<< "$(curl -s "${TEST_DRIVER_INSTALL_SCRIPT_URL}")"
if [ "${TESTING_VERSION}" != "master" ]; then
echo "Skipping cross lang cross branch testing for non-master branch ${TESTING_VERSION}"
exit 0
fi
activate_gke_cluster GKE_CLUSTER_PSM_SECURITY
set -x
if [[ -n "${KOKORO_ARTIFACTS_DIR}" ]]; then
kokoro_setup_test_driver "${GITHUB_REPOSITORY_NAME}"
cd "${TEST_DRIVER_FULL_DIR}"
else
local_setup_test_driver "${script_dir}"
cd "${SRC_DIR}/${TEST_DRIVER_PATH}"
fi
source ${script_dir}/grpc_xds_k8s_run_xtest.sh
local failed_tests=0
local successful_string
local failed_string
LATEST_BRANCH=$(find_latest_branch "${LATEST_BRANCH}")
OLDEST_BRANCH=$(find_oldest_branch "${OLDEST_BRANCH}" "${LATEST_BRANCH}")
# Run cross branch tests per language: master x latest and master x oldest
for LANG in ${LANGS}
do
if run_test "${LANG}" "${MAIN_BRANCH}" "${LANG}" "${LATEST_BRANCH}"; then
successful_string="${successful_string} ${MAIN_BRANCH}-${LATEST_BRANCH}/${LANG}"
else
failed_tests=$((failed_tests + 1))
failed_string="${failed_string} ${MAIN_BRANCH}-${LATEST_BRANCH}/${LANG}"
fi
if run_test "${LANG}" "${LATEST_BRANCH}" "${LANG}" "${MAIN_BRANCH}"; then
successful_string="${successful_string} ${LATEST_BRANCH}-${MAIN_BRANCH}/${LANG}"
else
failed_tests=$((failed_tests + 1))
failed_string="${failed_string} ${LATEST_BRANCH}-${MAIN_BRANCH}/${LANG}"
fi
if run_test "${LANG}" "${MAIN_BRANCH}" "${LANG}" "${OLDEST_BRANCH}"; then
successful_string="${successful_string} ${MAIN_BRANCH}-${OLDEST_BRANCH}/${LANG}"
else
failed_tests=$((failed_tests + 1))
failed_string="${failed_string} ${MAIN_BRANCH}-${OLDEST_BRANCH}/${LANG}"
fi
if run_test "${LANG}" "${OLDEST_BRANCH}" "${LANG}" "${MAIN_BRANCH}"; then
successful_string="${successful_string} ${OLDEST_BRANCH}-${MAIN_BRANCH}/${LANG}"
else
failed_tests=$((failed_tests + 1))
failed_string="${failed_string} ${OLDEST_BRANCH}-${MAIN_BRANCH}/${LANG}"
fi
done
set +x
echo "Failed test suites list: ${failed_string}"
echo "Successful test suites list: ${successful_string}"
if (( failed_tests > 0 )); then
exit 1
fi
}
main "$@"

@ -16,7 +16,7 @@
# Location of the continuous shell script in repository. # Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/linux/grpc_xds_k8s_xlang.sh" build_file: "grpc/tools/internal_ci/linux/grpc_xds_k8s_xlang.sh"
timeout_mins: 540 timeout_mins: 1260
action { action {
define_artifacts { define_artifacts {
regex: "artifacts/**/*sponge_log.xml" regex: "artifacts/**/*sponge_log.xml"

@ -19,53 +19,9 @@ set -eo pipefail
readonly GITHUB_REPOSITORY_NAME="grpc" readonly GITHUB_REPOSITORY_NAME="grpc"
readonly TEST_DRIVER_INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/${TEST_DRIVER_REPO_OWNER:-grpc}/grpc/${TEST_DRIVER_BRANCH:-master}/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh" readonly TEST_DRIVER_INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/${TEST_DRIVER_REPO_OWNER:-grpc}/grpc/${TEST_DRIVER_BRANCH:-master}/tools/internal_ci/linux/grpc_xds_k8s_install_test_driver.sh"
## xDS test server/client Docker images ## xDS test server/client Docker images
readonly IMAGE_REPO="gcr.io/grpc-testing/xds-interop" readonly SERVER_LANGS="cpp go java"
readonly SERVER_LANG="cpp go java" readonly CLIENT_LANGS="cpp go java"
readonly CLIENT_LANG="cpp go java" readonly MAIN_BRANCH="${MAIN_BRANCH:-master}"
readonly VERSION_TAG="master v1.50.x"
#######################################
# Executes the test case
# Globals:
# TEST_DRIVER_FLAGFILE: Relative path to test driver flagfile
# KUBE_CONTEXT: The name of kubectl context with GKE cluster access
# TEST_XML_OUTPUT_DIR: Output directory for the test xUnit XML report
# SERVER_IMAGE_NAME: Test server Docker image name
# CLIENT_IMAGE_NAME: Test client Docker image name
# GIT_COMMIT: SHA-1 of git commit being built
# TESTING_VERSION: version branch under test: used by the framework to determine the supported PSM
# features.
# Arguments:
# Test case name
# Outputs:
# Writes the output of test execution to stdout, stderr
# Test xUnit report to ${TEST_XML_OUTPUT_DIR}/${test_name}/sponge_log.xml
#######################################
run_test() {
# Test driver usage:
# https://github.com/grpc/grpc/tree/master/tools/run_tests/xds_k8s_test_driver#basic-usage
local tag="${1:?Usage: run_test tag server_lang client_lang}"
local slang="${2:?Usage: run_test tag server_lang client_lang}"
local clang="${3:?Usage: run_test tag server_lang client_lang}"
local server_image_name="${IMAGE_REPO}/${slang}-server:${tag}"
local client_image_name="${IMAGE_REPO}/${clang}-client:${tag}"
# TODO(sanjaypujare): skip test if image not found (by using gcloud_gcr_list_image_tags)
local out_dir="${TEST_XML_OUTPUT_DIR}/${tag}/${clang}-${slang}"
mkdir -pv "${out_dir}"
set -x
python -m "tests.security_test" \
--flagfile="${TEST_DRIVER_FLAGFILE}" \
--kube_context="${KUBE_CONTEXT}" \
--server_image="${server_image_name}" \
--client_image="${client_image_name}" \
--testing_version="${TESTING_VERSION}" \
--nocheck_local_certs \
--force_cleanup \
--collect_app_logs \
--log_dir="${out_dir}" \
--xml_output_file="${out_dir}/sponge_log.xml" \
|& tee "${out_dir}/sponge_log.log"
}
####################################### #######################################
# Main function: provision software necessary to execute tests, and run them # Main function: provision software necessary to execute tests, and run them
@ -95,6 +51,11 @@ main() {
echo "Sourcing test driver install script from: ${TEST_DRIVER_INSTALL_SCRIPT_URL}" echo "Sourcing test driver install script from: ${TEST_DRIVER_INSTALL_SCRIPT_URL}"
source /dev/stdin <<< "$(curl -s "${TEST_DRIVER_INSTALL_SCRIPT_URL}")" source /dev/stdin <<< "$(curl -s "${TEST_DRIVER_INSTALL_SCRIPT_URL}")"
if [ "${TESTING_VERSION}" != "master" ]; then
echo "Skipping cross lang cross branch testing for non-master branch ${TESTING_VERSION}"
exit 0
fi
activate_gke_cluster GKE_CLUSTER_PSM_SECURITY activate_gke_cluster GKE_CLUSTER_PSM_SECURITY
set -x set -x
@ -106,22 +67,27 @@ main() {
cd "${SRC_DIR}/${TEST_DRIVER_PATH}" cd "${SRC_DIR}/${TEST_DRIVER_PATH}"
fi fi
source "${script_dir}/grpc_xds_k8s_run_xtest.sh"
local failed_tests=0 local failed_tests=0
local successful_string local successful_string
local failed_string local failed_string
# Run tests LATEST_BRANCH=$(find_latest_branch "${LATEST_BRANCH}")
for TAG in ${VERSION_TAG} OLDEST_BRANCH=$(find_oldest_branch "${OLDEST_BRANCH}" "${LATEST_BRANCH}")
# Run cross lang tests: for given cross lang versions
XLANG_VERSIONS="${MAIN_BRANCH} ${LATEST_BRANCH} ${OLDEST_BRANCH}"
for VERSION in ${XLANG_VERSIONS}
do do
for CLANG in ${CLIENT_LANG} for CLIENT_LANG in ${CLIENT_LANGS}
do do
for SLANG in ${SERVER_LANG} for SERVER_LANG in ${SERVER_LANGS}
do do
if [ "${CLANG}" != "${SLANG}" ]; then if [ "${CLIENT_LANG}" != "${SERVER_LANG}" ]; then
if run_test "${TAG}" "${SLANG}" "${CLANG}"; then if run_test "${CLIENT_LANG}" "${VERSION}" "${SERVER_LANG}" "${VERSION}"; then
successful_string="${successful_string} ${TAG}/${CLANG}-${SLANG}" successful_string="${successful_string} ${VERSION}/${CLIENT_LANG}-${SERVER_LANG}"
else else
failed_tests=$((failed_tests+1)) failed_tests=$((failed_tests+1))
failed_string="${failed_string} ${TAG}/${CLANG}-${SLANG}" failed_string="${failed_string} ${VERSION}/${CLIENT_LANG}-${SERVER_LANG}"
fi fi
fi fi
done done

Loading…
Cancel
Save