mirror of
https://github.com/status-im/consul.git
synced 2025-02-13 14:16:35 +00:00
* Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Adding explicit MPL license for sub-package This directory and its subdirectories (packages) contain files licensed with the MPLv2 `LICENSE` file in this directory and are intentionally licensed separately from the BSL `LICENSE` file at the root of this repository. * Updating the license from MPL to Business Source License Going forward, this project will be licensed under the Business Source License v1.1. Please see our blog post for more details at <Blog URL>, FAQ at www.hashicorp.com/licensing-faq, and details of the license at www.hashicorp.com/bsl. * add missing license headers * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 * Update copyright file headers to BUSL-1.1 --------- Co-authored-by: hashicorp-copywrite[bot] <110428419+hashicorp-copywrite[bot]@users.noreply.github.com>
912 lines
25 KiB
Bash
912 lines
25 KiB
Bash
#!/usr/bin/env bash
|
||
# Copyright (c) HashiCorp, Inc.
|
||
# SPDX-License-Identifier: BUSL-1.1
|
||
|
||
|
||
if [ $2 != "false" ]
|
||
then
|
||
export $2
|
||
fi
|
||
|
||
readonly self_name="$0"
|
||
|
||
readonly HASHICORP_DOCKER_PROXY="docker.mirror.hashicorp.services"
|
||
|
||
readonly SINGLE_CONTAINER_BASE_NAME=envoy_consul
|
||
|
||
# DEBUG=1 enables set -x for this script so echos every command run
|
||
DEBUG=${DEBUG:-}
|
||
|
||
XDS_TARGET=${XDS_TARGET:-server}
|
||
|
||
# ENVOY_VERSION to run each test against
|
||
ENVOY_VERSION=${ENVOY_VERSION:-"1.23.1"}
|
||
export ENVOY_VERSION
|
||
|
||
export DOCKER_BUILDKIT=0
|
||
|
||
if [ ! -z "$DEBUG" ] ; then
|
||
set -x
|
||
fi
|
||
|
||
source helpers.windows.bash
|
||
|
||
function command_error {
|
||
echo "ERR: command exited with status $1" 1>&2
|
||
echo " command: $2" 1>&2
|
||
echo " line: $3" 1>&2
|
||
echo " function: $4" 1>&2
|
||
echo " called at: $5" 1>&2
|
||
# printf '%s\n' "${FUNCNAME[@]}"
|
||
# printf '%s\n' "${BASH_SOURCE[@]}"
|
||
# printf '%s\n' "${BASH_LINENO[@]}"
|
||
}
|
||
|
||
trap 'command_error $? "${BASH_COMMAND}" "${LINENO}" "${FUNCNAME[0]:-main}" "${BASH_SOURCE[0]}:${BASH_LINENO[0]}"' ERR
|
||
|
||
readonly WORKDIR_SNIPPET="-v envoy_workdir:C:\workdir"
|
||
|
||
function network_snippet {
|
||
local DC="$1"
|
||
echo "--net=envoy-tests"
|
||
}
|
||
|
||
function aws_snippet {
|
||
LAMBDA_TESTS_ENABLED=${LAMBDA_TESTS_ENABLED:-false}
|
||
if [ "$LAMBDA_TESTS_ENABLED" != false ]; then
|
||
local snippet=""
|
||
|
||
# The Lambda integration cases assume that a Lambda function exists in $AWS_REGION with an ARN of $AWS_LAMBDA_ARN.
|
||
# The AWS credentials must have permission to invoke the Lambda function.
|
||
[ -n "$(set | grep '^AWS_ACCESS_KEY_ID=')" ] && snippet="${snippet} -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID"
|
||
[ -n "$(set | grep '^AWS_SECRET_ACCESS_KEY=')" ] && snippet="${snippet} -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY"
|
||
[ -n "$(set | grep '^AWS_SESSION_TOKEN=')" ] && snippet="${snippet} -e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN"
|
||
[ -n "$(set | grep '^AWS_LAMBDA_REGION=')" ] && snippet="${snippet} -e AWS_LAMBDA_REGION=$AWS_LAMBDA_REGION"
|
||
[ -n "$(set | grep '^AWS_LAMBDA_ARN=')" ] && snippet="${snippet} -e AWS_LAMBDA_ARN=$AWS_LAMBDA_ARN"
|
||
|
||
echo "$snippet"
|
||
fi
|
||
}
|
||
|
||
function init_workdir {
|
||
local CLUSTER="$1"
|
||
|
||
if test -z "$CLUSTER"
|
||
then
|
||
CLUSTER=primary
|
||
fi
|
||
|
||
# Note, we use explicit set of dirs so we don't delete .gitignore. Also,
|
||
# don't wipe logs between runs as they are already split and we need them to
|
||
# upload as artifacts later.
|
||
rm -rf workdir/${CLUSTER}
|
||
rm -rf workdir/logs
|
||
mkdir -p workdir/${CLUSTER}/{consul,consul-server,register,envoy,bats,statsd,data}
|
||
|
||
# Reload consul config from defaults
|
||
cp consul-base-cfg/*.hcl workdir/${CLUSTER}/consul/
|
||
|
||
# Add any overrides if there are any (no op if not)
|
||
find ${CASE_DIR} -maxdepth 1 -name '*.hcl' -type f -exec cp -f {} workdir/${CLUSTER}/consul \;
|
||
|
||
# Copy all the test files
|
||
find ${CASE_DIR} -maxdepth 1 -name '*.bats' -type f -exec cp -f {} workdir/${CLUSTER}/bats \;
|
||
# Copy CLUSTER specific bats
|
||
cp helpers.windows.bash workdir/${CLUSTER}/bats/helpers.bash
|
||
|
||
# Add any CLUSTER overrides
|
||
if test -d "${CASE_DIR}/${CLUSTER}"
|
||
then
|
||
find ${CASE_DIR}/${CLUSTER} -type f -name '*.hcl' -exec cp -f {} workdir/${CLUSTER}/consul \;
|
||
find ${CASE_DIR}/${CLUSTER} -type f -name '*.bats' -exec cp -f {} workdir/${CLUSTER}/bats \;
|
||
fi
|
||
|
||
# move all of the registration files OUT of the consul config dir now
|
||
find workdir/${CLUSTER}/consul -type f -name 'service_*.hcl' -exec mv -f {} workdir/${CLUSTER}/register \;
|
||
|
||
# move the server.hcl out of the consul dir so that it doesn't get picked up
|
||
# by the client agent (if we're running with XDS_TARGET=client).
|
||
if test -f "workdir/${CLUSTER}/consul/server.hcl"
|
||
then
|
||
mv workdir/${CLUSTER}/consul/server.hcl workdir/${CLUSTER}/consul-server/server.hcl
|
||
fi
|
||
|
||
# copy the ca-certs for SDS so we can verify the right ones are served
|
||
mkdir -p workdir/test-sds-server/certs
|
||
cp test-sds-server/certs/ca-root.crt workdir/test-sds-server/certs/ca-root.crt
|
||
|
||
if test -d "${CASE_DIR}/data"
|
||
then
|
||
cp -r ${CASE_DIR}/data/* workdir/${CLUSTER}/data
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
function docker_kill_rm {
|
||
local name
|
||
local todo=()
|
||
for name in "$@"; do
|
||
name="envoy_${name}_1"
|
||
if docker.exe container inspect $name &>/dev/null; then
|
||
if [[ "$name" == envoy_tcpdump-* ]]; then
|
||
echo -n "Gracefully stopping $name..."
|
||
docker.exe stop $name &> /dev/null
|
||
echo "done"
|
||
fi
|
||
todo+=($name)
|
||
fi
|
||
done
|
||
|
||
if [[ ${#todo[@]} -eq 0 ]]; then
|
||
return 0
|
||
fi
|
||
|
||
echo -n "Killing and removing: ${todo[@]}..."
|
||
docker.exe rm -v -f ${todo[@]} &> /dev/null
|
||
echo "done"
|
||
}
|
||
|
||
function start_consul {
|
||
local DC=${1:-primary}
|
||
|
||
# 8500/8502 are for consul
|
||
# 9411 is for zipkin which shares the network with consul
|
||
# 16686 is for jaeger ui which also shares the network with consul
|
||
ports=(
|
||
'-p=8500:8500'
|
||
'-p=8502:8502'
|
||
'-p=9411:9411'
|
||
'-p=16686:16686'
|
||
)
|
||
case "$DC" in
|
||
secondary)
|
||
ports=(
|
||
'-p=9500:8500'
|
||
'-p=9502:8502'
|
||
)
|
||
;;
|
||
alpha)
|
||
ports=(
|
||
'-p=9510:8500'
|
||
'-p=9512:8502'
|
||
)
|
||
;;
|
||
esac
|
||
|
||
license="${CONSUL_LICENSE:-}"
|
||
# load the consul license so we can pass it into the consul
|
||
# containers as an env var in the case that this is a consul
|
||
# enterprise test
|
||
if test -z "$license" -a -n "${CONSUL_LICENSE_PATH:-}"
|
||
then
|
||
license=$(cat $CONSUL_LICENSE_PATH)
|
||
fi
|
||
|
||
# We currently run these integration tests in two modes: one in which Envoy's
|
||
# xDS sessions are served directly by a Consul server, and another in which it
|
||
# goes through a client agent.
|
||
#
|
||
# This is necessary because servers and clients source configuration data in
|
||
# different ways (client agents use an RPC-backed cache and servers use their
|
||
# own local data) and we want to catch regressions in both.
|
||
#
|
||
# In the future we should also expand these tests to register services to the
|
||
# catalog directly (agentless) rather than relying on the server also being
|
||
# an agent.
|
||
#
|
||
# When XDS_TARGET=client we'll start a Consul server with its gRPC port
|
||
# disabled (but only if REQUIRE_PEERS is not set), and a client agent with
|
||
# its gRPC port enabled.
|
||
#
|
||
# When XDS_TARGET=server (or anything else) we'll run a single Consul server
|
||
# with its gRPC port enabled.
|
||
#
|
||
# In either case, the hostname `consul-${DC}-server` should be used as a
|
||
# server address (e.g. for WAN joining) and `consul-${DC}-client` should be
|
||
# used as a client address (e.g. for interacting with the HTTP API).
|
||
#
|
||
# Both hostnames work in both modes because we set network aliases on the
|
||
# containers such that both hostnames will resolve to the same container when
|
||
# XDS_TARGET=server.
|
||
#
|
||
# We also join containers to the network `container:consul-${DC}_1` in many
|
||
# places (see: network_snippet) so that we can curl localhost etc. In both
|
||
# modes, you can assume that this name refers to the client's container.
|
||
#
|
||
# Any .hcl files in the case/cluster directory will be given to both clients
|
||
# and servers (via the -config-dir flag) *except for* server.hcl which will
|
||
# only be applied to the server (and service registrations which will be made
|
||
# against the client).
|
||
if [[ "$XDS_TARGET" == "client" ]]
|
||
then
|
||
docker_kill_rm consul-${DC}-server
|
||
docker_kill_rm consul-${DC}
|
||
|
||
server_grpc_port="-1"
|
||
if is_set $REQUIRE_PEERS; then
|
||
server_grpc_port="8502"
|
||
fi
|
||
|
||
docker.exe run -d --name envoy_consul-${DC}-server_1 \
|
||
--net=envoy-tests \
|
||
$WORKDIR_SNIPPET \
|
||
--hostname "consul-${DC}-server" \
|
||
--network-alias "consul-${DC}-server" \
|
||
-e "CONSUL_LICENSE=$license" \
|
||
windows/consul:local \
|
||
agent -dev -datacenter "${DC}" \
|
||
-config-dir "C:\\workdir\\${DC}\\consul" \
|
||
-config-dir "C:\\workdir\\${DC}\\consul-server" \
|
||
-grpc-port $server_grpc_port \
|
||
-client "0.0.0.0" \
|
||
-bind "0.0.0.0" >/dev/null
|
||
|
||
docker.exe run -d --name envoy_consul-${DC}_1 \
|
||
--net=envoy-tests \
|
||
$WORKDIR_SNIPPET \
|
||
--hostname "consul-${DC}-client" \
|
||
--network-alias "consul-${DC}-client" \
|
||
-e "CONSUL_LICENSE=$license" \
|
||
${ports[@]} \
|
||
windows/consul:local \
|
||
agent -datacenter "${DC}" \
|
||
-config-dir "C:\\workdir\\${DC}\\consul" \
|
||
-data-dir "/tmp/consul" \
|
||
-client "0.0.0.0" \
|
||
-grpc-port 8502 \
|
||
-datacenter "${DC}" \
|
||
-retry-join "consul-${DC}-server" >/dev/null
|
||
else
|
||
docker_kill_rm consul-${DC}
|
||
|
||
docker.exe run -d --name envoy_consul-${DC}_1 \
|
||
--net=envoy-tests \
|
||
$WORKDIR_SNIPPET \
|
||
--memory 4096m \
|
||
--cpus 2 \
|
||
--hostname "consul-${DC}" \
|
||
--network-alias "consul-${DC}-client" \
|
||
--network-alias "consul-${DC}-server" \
|
||
-e "CONSUL_LICENSE=$license" \
|
||
${ports[@]} \
|
||
windows/consul:local \
|
||
agent -dev -datacenter "${DC}" \
|
||
-config-dir "C:\\workdir\\${DC}\\consul" \
|
||
-config-dir "C:\\workdir\\${DC}\\consul-server" \
|
||
-client "0.0.0.0" >/dev/null
|
||
fi
|
||
}
|
||
|
||
function start_partitioned_client {
|
||
local PARTITION=${1:-ap1}
|
||
|
||
# Start consul now as setup script needs it up
|
||
docker_kill_rm consul-${PARTITION}
|
||
|
||
license="${CONSUL_LICENSE:-}"
|
||
# load the consul license so we can pass it into the consul
|
||
# containers as an env var in the case that this is a consul
|
||
# enterprise test
|
||
if test -z "$license" -a -n "${CONSUL_LICENSE_PATH:-}"
|
||
then
|
||
license=$(cat $CONSUL_LICENSE_PATH)
|
||
fi
|
||
|
||
sh -c "rm -rf /workdir/${PARTITION}/data"
|
||
|
||
# Run consul and expose some ports to the host to make debugging locally a
|
||
# bit easier.
|
||
#
|
||
docker.exe run -d --name envoy_consul-${PARTITION}_1 \
|
||
--net=envoy-tests \
|
||
$WORKDIR_SNIPPET \
|
||
--hostname "consul-${PARTITION}-client" \
|
||
--network-alias "consul-${PARTITION}-client" \
|
||
-e "CONSUL_LICENSE=$license" \
|
||
windows/consul:local agent \
|
||
-datacenter "primary" \
|
||
-retry-join "consul-primary-server" \
|
||
-grpc-port 8502 \
|
||
-data-dir "/tmp/consul" \
|
||
-config-dir "C:\\workdir\\${PARTITION}/consul" \
|
||
-client "0.0.0.0" >/dev/null
|
||
}
|
||
|
||
function pre_service_setup {
|
||
local CLUSTER=${1:-primary}
|
||
|
||
# Run test case setup (e.g. generating Envoy bootstrap, starting containers)
|
||
if [ -f "${CASE_DIR}/${CLUSTER}/setup.sh" ]
|
||
then
|
||
source ${CASE_DIR}/${CLUSTER}/setup.sh
|
||
else
|
||
source ${CASE_DIR}/setup.sh
|
||
fi
|
||
}
|
||
|
||
function start_services {
|
||
# Start containers required
|
||
if [ ! -z "$REQUIRED_SERVICES" ] ; then
|
||
docker_kill_rm $REQUIRED_SERVICES
|
||
run_containers $REQUIRED_SERVICES
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
function verify {
|
||
local CLUSTER="$1"
|
||
if test -z "$CLUSTER"; then
|
||
CLUSTER="primary"
|
||
fi
|
||
|
||
# Execute tests
|
||
res=0
|
||
|
||
# Nuke any previous case's verify container.
|
||
docker_kill_rm verify-${CLUSTER}
|
||
|
||
echo "Running ${CLUSTER} verification step for ${CASE_DIR}..."
|
||
|
||
# need to tell the PID 1 inside of the container that it won't be actual PID
|
||
# 1 because we're using --pid=host so we use TINI_SUBREAPER
|
||
if docker.exe exec -i ${SINGLE_CONTAINER_BASE_NAME}-${CLUSTER}_1 bash \
|
||
-c "TINI_SUBREAPER=1 \
|
||
ENVOY_VERSION=${ENVOY_VERSION} \
|
||
XDS_TARGET=${XDS_TARGET} \
|
||
/c/bats/bin/bats \
|
||
--pretty /c/workdir/${CLUSTER}/bats" ; then
|
||
echo "✓ PASS"
|
||
else
|
||
echo "⨯ FAIL"
|
||
res=1
|
||
fi
|
||
|
||
return $res
|
||
}
|
||
|
||
function capture_logs {
|
||
local LOG_DIR="workdir/logs/${CASE_DIR}/${ENVOY_VERSION}"
|
||
|
||
init_vars
|
||
|
||
echo "Capturing Logs"
|
||
mkdir -p "$LOG_DIR"
|
||
|
||
services="$REQUIRED_SERVICES consul-primary"
|
||
if [[ "$XDS_TARGET" == "client" ]]
|
||
then
|
||
services="$services consul-primary-server"
|
||
fi
|
||
|
||
if is_set $REQUIRE_SECONDARY
|
||
then
|
||
services="$services consul-secondary"
|
||
|
||
if [[ "$XDS_TARGET" == "client" ]]
|
||
then
|
||
services="$services consul-secondary-server"
|
||
fi
|
||
fi
|
||
|
||
if is_set $REQUIRE_PARTITIONS
|
||
then
|
||
services="$services consul-ap1"
|
||
fi
|
||
if is_set $REQUIRE_PEERS
|
||
then
|
||
services="$services consul-alpha"
|
||
|
||
if [[ "$XDS_TARGET" == "client" ]]
|
||
then
|
||
services="$services consul-alpha-server"
|
||
fi
|
||
fi
|
||
|
||
if [ -f "${CASE_DIR}/capture.sh" ]
|
||
then
|
||
echo "Executing ${CASE_DIR}/capture.sh"
|
||
source ${CASE_DIR}/capture.sh || true
|
||
fi
|
||
|
||
for cont in $services; do
|
||
echo "Capturing log for $cont"
|
||
docker.exe logs "envoy_${cont}_1" &> "${LOG_DIR}/${cont}.log" || {
|
||
echo "EXIT CODE $?" > "${LOG_DIR}/${cont}.log"
|
||
}
|
||
done
|
||
}
|
||
|
||
function stop_services {
|
||
# Teardown
|
||
docker_kill_rm $REQUIRED_SERVICES
|
||
|
||
docker_kill_rm consul-primary consul-primary-server consul-secondary consul-secondary-server consul-ap1 consul-alpha consul-alpha-server
|
||
}
|
||
|
||
function init_vars {
|
||
source "defaults.sh"
|
||
if [ -f "${CASE_DIR}/vars.sh" ] ; then
|
||
source "${CASE_DIR}/vars.sh"
|
||
fi
|
||
}
|
||
|
||
function global_setup {
|
||
if [ -f "${CASE_DIR}/global-setup-windows.sh" ] ; then
|
||
source "${CASE_DIR}/global-setup-windows.sh"
|
||
fi
|
||
}
|
||
|
||
function wipe_volumes {
|
||
docker.exe exec -w "C:\workdir" envoy_workdir_1 cmd /c "rd /s /q . 2>nul"
|
||
}
|
||
|
||
# Windows containers does not allow cp command while running.
|
||
function stop_and_copy_files {
|
||
# Create CMD file to execute within the container
|
||
echo "icacls C:\workdir /grant:r Everyone:(OI)(CI)F /T" > copy.cmd
|
||
echo "XCOPY C:\workdir_bak C:\workdir /e /h /c /i /y" > copy.cmd
|
||
# Stop dummy container to copy local workdir to container's workdir_bak
|
||
docker.exe stop envoy_workdir_1 > /dev/null
|
||
docker.exe cp workdir/. envoy_workdir_1:/workdir_bak
|
||
# Copy CMD file into container
|
||
docker.exe cp copy.cmd envoy_workdir_1:/
|
||
# Start dummy container and execute the CMD file
|
||
docker.exe start envoy_workdir_1 > /dev/null
|
||
docker.exe exec envoy_workdir_1 copy.cmd
|
||
# Delete local CMD file after execution
|
||
rm copy.cmd
|
||
}
|
||
|
||
function run_tests {
|
||
CASE_DIR="${CASE_DIR?CASE_DIR must be set to the path of the test case}"
|
||
CASE_NAME=$( basename $CASE_DIR | cut -c6- )
|
||
export CASE_NAME
|
||
export SKIP_CASE=""
|
||
|
||
init_vars
|
||
|
||
# Initialize the workdir
|
||
init_workdir primary
|
||
|
||
if is_set $REQUIRE_SECONDARY
|
||
then
|
||
init_workdir secondary
|
||
fi
|
||
if is_set $REQUIRE_PARTITIONS
|
||
then
|
||
init_workdir ap1
|
||
fi
|
||
if is_set $REQUIRE_PEERS
|
||
then
|
||
init_workdir alpha
|
||
fi
|
||
|
||
global_setup
|
||
|
||
# Allow vars.sh to set a reason to skip this test case based on the ENV
|
||
if [ "$SKIP_CASE" != "" ] ; then
|
||
echo "SKIPPING CASE: $SKIP_CASE"
|
||
return 0
|
||
fi
|
||
|
||
# Wipe state
|
||
wipe_volumes
|
||
|
||
# Copying base files to shared volume
|
||
stop_and_copy_files
|
||
|
||
# Starting Consul primary cluster
|
||
start_consul primary
|
||
|
||
if is_set $REQUIRE_SECONDARY; then
|
||
start_consul secondary
|
||
fi
|
||
if is_set $REQUIRE_PARTITIONS; then
|
||
docker_consul "primary" consul partition create -name ap1 > /dev/null
|
||
start_partitioned_client ap1
|
||
fi
|
||
if is_set $REQUIRE_PEERS; then
|
||
start_consul alpha
|
||
fi
|
||
|
||
echo "Setting up the primary datacenter"
|
||
pre_service_setup primary
|
||
|
||
if is_set $REQUIRE_SECONDARY; then
|
||
echo "Setting up the secondary datacenter"
|
||
pre_service_setup secondary
|
||
fi
|
||
if is_set $REQUIRE_PARTITIONS; then
|
||
echo "Setting up the non-default partition"
|
||
pre_service_setup ap1
|
||
fi
|
||
if is_set $REQUIRE_PEERS; then
|
||
echo "Setting up the alpha peer"
|
||
pre_service_setup alpha
|
||
fi
|
||
|
||
echo "Starting services"
|
||
start_services
|
||
|
||
# Run the verify container and report on the output
|
||
echo "Verifying the primary datacenter"
|
||
verify primary
|
||
|
||
if is_set $REQUIRE_SECONDARY; then
|
||
echo "Verifying the secondary datacenter"
|
||
verify secondary
|
||
fi
|
||
if is_set $REQUIRE_PEERS; then
|
||
echo "Verifying the alpha peer"
|
||
verify alpha
|
||
fi
|
||
}
|
||
|
||
function test_teardown {
|
||
init_vars
|
||
|
||
stop_services
|
||
}
|
||
|
||
function workdir_cleanup {
|
||
docker_kill_rm workdir
|
||
docker.exe volume rm -f envoy_workdir &>/dev/null || true
|
||
}
|
||
|
||
|
||
function suite_setup {
|
||
# Cleanup from any previous unclean runs.
|
||
suite_teardown
|
||
|
||
docker.exe network create -d "nat" envoy-tests &>/dev/null
|
||
|
||
# Start the volume container
|
||
#
|
||
# This is a dummy container that we use to create volume and keep it
|
||
# accessible while other containers are down.
|
||
docker.exe volume create envoy_workdir &>/dev/null
|
||
docker.exe run -d --name envoy_workdir_1 \
|
||
$WORKDIR_SNIPPET \
|
||
--user ContainerAdministrator \
|
||
--net=none \
|
||
"${HASHICORP_DOCKER_PROXY}/windows/kubernetes/pause" &>/dev/null
|
||
|
||
# pre-build the consul+envoy container
|
||
echo "Rebuilding 'windows/consul:local' image with envoy $ENVOY_VERSION..."
|
||
retry_default docker.exe build -t windows/consul:local \
|
||
--build-arg ENVOY_VERSION=${ENVOY_VERSION} \
|
||
-f Dockerfile-consul-envoy-windows .
|
||
|
||
|
||
local CONSUL_VERSION=$(docker image inspect --format='{{.ContainerConfig.Labels.version}}' \
|
||
windows/consul:local)
|
||
echo "Running Tests with Consul=$CONSUL_VERSION - Envoy=$ENVOY_VERSION - XDS_TARGET=$XDS_TARGET"
|
||
}
|
||
|
||
function suite_teardown {
|
||
docker_kill_rm verify-primary verify-secondary verify-alpha
|
||
|
||
# this is some hilarious magic
|
||
docker_kill_rm $(grep "^function run_container_" $self_name | \
|
||
sed 's/^function run_container_\(.*\) {/\1/g')
|
||
|
||
docker_kill_rm consul-primary consul-primary-server consul-secondary consul-secondary-server consul-ap1 consul-alpha consul-alpha-server
|
||
|
||
if docker.exe network inspect envoy-tests &>/dev/null ; then
|
||
echo -n "Deleting network 'envoy-tests'..."
|
||
docker.exe network rm envoy-tests
|
||
echo "done"
|
||
fi
|
||
|
||
workdir_cleanup
|
||
}
|
||
|
||
function run_containers {
|
||
for name in $@ ; do
|
||
run_container $name
|
||
done
|
||
}
|
||
|
||
function run_container {
|
||
docker_kill_rm "$1"
|
||
"run_container_$1"
|
||
}
|
||
|
||
function common_run_container_service {
|
||
local service="$1"
|
||
local CLUSTER="$2"
|
||
local httpPort="$3"
|
||
local grpcPort="$4"
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$CLUSTER"_1
|
||
|
||
docker.exe exec -d $CONTAINER_NAME bash \
|
||
-c "FORTIO_NAME=${service} \
|
||
fortio.exe server \
|
||
-http-port ":$httpPort" \
|
||
-grpc-port ":$grpcPort" \
|
||
-redirect-port disabled"
|
||
}
|
||
|
||
function run_container_s1 {
|
||
common_run_container_service s1 primary 8080 8079
|
||
}
|
||
|
||
function run_container_s1-ap1 {
|
||
common_run_container_service s1 ap1 8080 8079
|
||
}
|
||
|
||
function run_container_s2 {
|
||
common_run_container_service s2 primary 8181 8179
|
||
}
|
||
function run_container_s2-v1 {
|
||
common_run_container_service s2-v1 primary 8182 8178
|
||
}
|
||
function run_container_s2-v2 {
|
||
common_run_container_service s2-v2 primary 8183 8177
|
||
}
|
||
|
||
function run_container_s3 {
|
||
common_run_container_service s3 primary 8282 8279
|
||
}
|
||
function run_container_s3-v1 {
|
||
common_run_container_service s3-v1 primary 8283 8278
|
||
}
|
||
function run_container_s3-v2 {
|
||
common_run_container_service s3-v2 primary 8284 8277
|
||
}
|
||
function run_container_s3-alt {
|
||
common_run_container_service s3-alt primary 8286 8280
|
||
}
|
||
|
||
function run_container_s4 {
|
||
common_run_container_service s4 primary 8382 8281
|
||
}
|
||
|
||
function run_container_s1-secondary {
|
||
common_run_container_service s1-secondary secondary 8080 8079
|
||
}
|
||
|
||
function run_container_s2-secondary {
|
||
common_run_container_service s2-secondary secondary 8181 8179
|
||
}
|
||
|
||
function run_container_s2-ap1 {
|
||
common_run_container_service s2 ap1 8480 8479
|
||
}
|
||
|
||
function run_container_s3-ap1 {
|
||
common_run_container_service s3 ap1 8580 8579
|
||
}
|
||
|
||
function run_container_s1-alpha {
|
||
common_run_container_service s1-alpha alpha 8080 8079
|
||
}
|
||
|
||
function run_container_s2-alpha {
|
||
common_run_container_service s2-alpha alpha 8181 8179
|
||
}
|
||
|
||
function run_container_s3-alpha {
|
||
common_run_container_service s3-alpha alpha 8282 8279
|
||
}
|
||
|
||
function common_run_container_sidecar_proxy {
|
||
local service="$1"
|
||
local CLUSTER="$2"
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$CLUSTER"_1
|
||
|
||
# Hot restart breaks since both envoys seem to interact with each other
|
||
# despite separate containers that don't share IPC namespace. Not quite
|
||
# sure how this happens but may be due to unix socket being in some shared
|
||
# location?
|
||
docker.exe exec -d $CONTAINER_NAME bash \
|
||
-c "envoy.exe \
|
||
-c /c/workdir/${CLUSTER}/envoy/${service}-bootstrap.json \
|
||
-l trace \
|
||
--disable-hot-restart \
|
||
--drain-time-s 1 >/dev/null"
|
||
}
|
||
|
||
function run_container_s1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s1 primary
|
||
}
|
||
|
||
function run_container_s1-ap1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s1 ap1
|
||
}
|
||
|
||
function run_container_s1-sidecar-proxy-consul-exec {
|
||
local CLUSTER="primary"
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$CLUSTER"_1
|
||
local ADMIN_HOST="127.0.0.1"
|
||
local ADMIN_PORT="19000"
|
||
|
||
docker.exe exec -d $CONTAINER_NAME bash \
|
||
-c "consul connect envoy -sidecar-for s1 \
|
||
-http-addr $CONTAINER_NAME:8500 \
|
||
-grpc-addr $CONTAINER_NAME:8502 \
|
||
-admin-bind $ADMIN_HOST:$ADMIN_PORT \
|
||
-envoy-version ${ENVOY_VERSION} \
|
||
-- \
|
||
-l trace >/dev/null"
|
||
}
|
||
|
||
function run_container_s2-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s2 primary
|
||
}
|
||
function run_container_s2-v1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s2-v1 primary
|
||
}
|
||
function run_container_s2-v2-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s2-v2 primary
|
||
}
|
||
|
||
function run_container_s3-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s3 primary
|
||
}
|
||
function run_container_s3-v1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s3-v1 primary
|
||
}
|
||
function run_container_s3-v2-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s3-v2 primary
|
||
}
|
||
|
||
function run_container_s3-alt-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s3-alt primary
|
||
}
|
||
|
||
function run_container_s1-sidecar-proxy-secondary {
|
||
common_run_container_sidecar_proxy s1 secondary
|
||
}
|
||
function run_container_s2-sidecar-proxy-secondary {
|
||
common_run_container_sidecar_proxy s2 secondary
|
||
}
|
||
|
||
function run_container_s2-ap1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s2 ap1
|
||
}
|
||
|
||
function run_container_s3-ap1-sidecar-proxy {
|
||
common_run_container_sidecar_proxy s3 ap1
|
||
}
|
||
|
||
function run_container_s1-sidecar-proxy-alpha {
|
||
common_run_container_sidecar_proxy s1 alpha
|
||
}
|
||
function run_container_s2-sidecar-proxy-alpha {
|
||
common_run_container_sidecar_proxy s2 alpha
|
||
}
|
||
function run_container_s3-sidecar-proxy-alpha {
|
||
common_run_container_sidecar_proxy s3 alpha
|
||
}
|
||
|
||
function common_run_container_gateway {
|
||
local name="$1"
|
||
local DC="$2"
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$DC"_1
|
||
|
||
# Hot restart breaks since both envoys seem to interact with each other
|
||
# despite separate containers that don't share IPC namespace. Not quite
|
||
# sure how this happens but may be due to unix socket being in some shared
|
||
# location?
|
||
docker.exe exec -d $CONTAINER_NAME bash \
|
||
-c "envoy.exe \
|
||
-c /c/workdir/${DC}/envoy/${name}-bootstrap.json \
|
||
-l trace \
|
||
--disable-hot-restart \
|
||
--drain-time-s 1 >/dev/null"
|
||
}
|
||
|
||
function run_container_gateway-primary {
|
||
common_run_container_gateway mesh-gateway primary
|
||
}
|
||
function run_container_gateway-secondary {
|
||
common_run_container_gateway mesh-gateway secondary
|
||
}
|
||
function run_container_gateway-alpha {
|
||
common_run_container_gateway mesh-gateway alpha
|
||
}
|
||
|
||
function run_container_ingress-gateway-primary {
|
||
common_run_container_gateway ingress-gateway primary
|
||
}
|
||
|
||
function run_container_api-gateway-primary {
|
||
common_run_container_gateway api-gateway primary
|
||
}
|
||
|
||
function run_container_terminating-gateway-primary {
|
||
common_run_container_gateway terminating-gateway primary
|
||
}
|
||
|
||
function run_container_fake-statsd {
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"primary"_1
|
||
# This magic SYSTEM incantation is needed since Envoy doesn't add newlines and so
|
||
# we need each packet to be passed to echo to add a new line before
|
||
# appending. But it does not work on Windows.
|
||
docker.exe exec -d $CONTAINER_NAME bash -c "socat -u UDP-RECVFROM:8125,fork,reuseaddr OPEN:/workdir/primary/statsd/statsd.log,create,append"
|
||
}
|
||
|
||
function run_container_zipkin {
|
||
docker.exe run -d --name $(container_name) \
|
||
$WORKDIR_SNIPPET \
|
||
$(network_snippet primary) \
|
||
"${HASHICORP_DOCKER_PROXY}/windows/openzipkin"
|
||
}
|
||
|
||
function run_container_jaeger {
|
||
echo "Starting Jaeger service..."
|
||
|
||
local DC=${1:-primary}
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$DC"_1
|
||
|
||
docker.exe exec -d $CONTAINER_NAME bash -c "jaeger-all-in-one.exe \
|
||
--collector.zipkin.http-port=9411"
|
||
}
|
||
|
||
function run_container_test-sds-server {
|
||
echo "Starting test-sds-server"
|
||
|
||
local DC=${1:-primary}
|
||
local CONTAINER_NAME="$SINGLE_CONTAINER_BASE_NAME"-"$DC"_1
|
||
|
||
docker.exe exec -d $CONTAINER_NAME bash -c "cd /c/test-sds-server &&
|
||
./test-sds-server.exe"
|
||
}
|
||
|
||
function container_name {
|
||
echo "envoy_${FUNCNAME[1]/#run_container_/}_1"
|
||
}
|
||
function container_name_prev {
|
||
echo "envoy_${FUNCNAME[2]/#run_container_/}_1"
|
||
}
|
||
|
||
# This is a debugging tool. Run via 'bash run-tests.sh debug_dump_volumes' on Powershell
|
||
function debug_dump_volumes {
|
||
local LINUX_PATH=$(pwd)
|
||
local WIN_PATH=$( echo "$LINUX_PATH" | sed 's/^\/mnt//' | sed -e 's/^\///' -e 's/\//\\/g' -e 's/^./\0:/' )
|
||
docker.exe run -it \
|
||
$WORKDIR_SNIPPET \
|
||
-v "$WIN_PATH":"C:\\cwd" \
|
||
--net=none \
|
||
"${HASHICORP_DOCKER_PROXY}/windows/nanoserver:1809" \
|
||
cmd /c "xcopy \workdir \cwd\workdir /E /H /C /I /Y"
|
||
}
|
||
|
||
function run_container_tcpdump-primary {
|
||
# To use add "tcpdump-primary" to REQUIRED_SERVICES
|
||
common_run_container_tcpdump primary
|
||
}
|
||
function run_container_tcpdump-secondary {
|
||
# To use add "tcpdump-secondary" to REQUIRED_SERVICES
|
||
common_run_container_tcpdump secondary
|
||
}
|
||
function run_container_tcpdump-alpha {
|
||
# To use add "tcpdump-alpha" to REQUIRED_SERVICES
|
||
common_run_container_tcpdump alpha
|
||
}
|
||
|
||
function common_run_container_tcpdump {
|
||
local DC="$1"
|
||
|
||
# we cant run this in circle but its only here to temporarily enable.
|
||
|
||
# docker.exe build --rm=false -t envoy-tcpdump -f Dockerfile-tcpdump-windows .
|
||
|
||
docker.exe run -d --name $(container_name_prev) \
|
||
$(network_snippet $DC) \
|
||
envoy-tcpdump \
|
||
-v -i any \
|
||
-w "/data/${DC}.pcap"
|
||
}
|
||
|
||
case "${1-}" in
|
||
"")
|
||
echo "command required"
|
||
exit 1 ;;
|
||
*)
|
||
"$@" ;;
|
||
esac
|