Make services e2e test more debuggable

This commit is contained in:
Tim Hockin 2015-06-02 18:23:16 -07:00
parent 393368f6e5
commit e6a7f85d70

View File

@ -22,11 +22,13 @@ set -o pipefail
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../.. KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../..
: ${NAMESPACE:="services-test-${RANDOM}"}
: ${KUBE_VERSION_ROOT:=${KUBE_ROOT}} : ${KUBE_VERSION_ROOT:=${KUBE_ROOT}}
: ${KUBECTL:="${KUBE_VERSION_ROOT}/cluster/kubectl.sh"} : ${RAW_KUBECTL:="${KUBE_VERSION_ROOT}/cluster/kubectl.sh"}
: ${KUBECTL:="${RAW_KUBECTL} --namespace=${NAMESPACE}"}
: ${KUBE_CONFIG_FILE:="config-test.sh"} : ${KUBE_CONFIG_FILE:="config-test.sh"}
export KUBECTL KUBE_CONFIG_FILE export NAMESPACE RAW_KUBECTL KUBECTL KUBE_CONFIG_FILE
source "${KUBE_ROOT}/cluster/kube-env.sh" source "${KUBE_ROOT}/cluster/kube-env.sh"
source "${KUBE_VERSION_ROOT}/cluster/${KUBERNETES_PROVIDER}/util.sh" source "${KUBE_VERSION_ROOT}/cluster/${KUBERNETES_PROVIDER}/util.sh"
@ -39,7 +41,9 @@ function error() {
} }
function sort_args() { function sort_args() {
printf "%s\n" "$@" | sort -n | tr '\n\r' ' ' | sed 's/ */ /g' [ $# == 0 ] && return
a=($(printf "%s\n" "$@" | sort -n))
echo "${a[*]}"
} }
# Join args $2... with $1 between them. # Join args $2... with $1 between them.
@ -58,10 +62,20 @@ function join() {
svcs_to_clean=() svcs_to_clean=()
function do_teardown() { function do_teardown() {
local svc ${RAW_KUBECTL} delete namespace "${NAMESPACE}"
for svc in "${svcs_to_clean[@]:+${svcs_to_clean[@]}}"; do }
stop_service "${svc}"
done function make_namespace() {
echo "Making namespace '${NAMESPACE}'"
${RAW_KUBECTL} create -f - << __EOF__
{
"kind": "Namespace",
"apiVersion": "v1beta3",
"metadata": {
"name": "${NAMESPACE}"
}
}
__EOF__
} }
# Args: # Args:
@ -70,7 +84,7 @@ function do_teardown() {
# $3: service replica count # $3: service replica count
# $4: public IPs (optional, string e.g. "1.2.3.4 5.6.7.8") # $4: public IPs (optional, string e.g. "1.2.3.4 5.6.7.8")
function start_service() { function start_service() {
echo "Starting service '$1' on port $2 with $3 replicas" echo "Starting service '${NAMESPACE}/$1' on port $2 with $3 replicas"
svcs_to_clean+=("$1") svcs_to_clean+=("$1")
${KUBECTL} create -f - << __EOF__ ${KUBECTL} create -f - << __EOF__
{ {
@ -78,7 +92,7 @@ function start_service() {
"apiVersion": "v1beta3", "apiVersion": "v1beta3",
"metadata": { "metadata": {
"name": "$1", "name": "$1",
"namespace": "default", "namespace": "${NAMESPACE}",
"labels": { "labels": {
"name": "$1" "name": "$1"
} }
@ -124,7 +138,7 @@ __EOF__
"apiVersion": "v1beta3", "apiVersion": "v1beta3",
"metadata": { "metadata": {
"name": "$1", "name": "$1",
"namespace": "default", "namespace": "${NAMESPACE}",
"labels": { "labels": {
"name": "$1" "name": "$1"
} }
@ -218,30 +232,28 @@ function wait_for_pods() {
# $2: service IP # $2: service IP
# $3: service port # $3: service port
# $4: pod count # $4: pod count
# $5: pod IDs # $5: pod IDs (sorted)
function wait_for_service_up() { function wait_for_service_up() {
local i local i
local found_pods local found_pods
for i in $(seq 1 20); do echo "waiting for $1 at $2:$3"
for i in $(seq 1 5); do
results=($(ssh-to-node "${test_node}" " results=($(ssh-to-node "${test_node}" "
set -e; set -e;
for i in $(seq -s' ' 1 $4); do for i in $(seq -s' ' 1 $(($4*3))); do
curl -s --connect-timeout 1 http://$2:$3; curl -s --connect-timeout 1 http://$2:$3;
echo; echo;
done | sort | uniq done | sort -n | uniq
")) "))
found_pods=$(sort_args "${results[@]:+${results[@]}}") found_pods=$(sort_args "${results[@]:+${results[@]}}")
echo "Checking if ${found_pods} == ${5}"
if [[ "${found_pods}" == "$5" ]]; then if [[ "${found_pods}" == "$5" ]]; then
break return
fi fi
echo "Waiting for endpoints to propagate" echo "expected '$5', got '${found_pods}': will try again"
sleep 3 sleep 3 # wait for endpoints to propagate
done done
if [[ "${found_pods}" != "$5" ]]; then error "$1: failed to verify portal from host"
error "Endpoints did not propagate in time"
fi
} }
# Args: # Args:
@ -264,35 +276,26 @@ function wait_for_service_down() {
# $2: service IP # $2: service IP
# $3: service port # $3: service port
# $4: pod count # $4: pod count
# $5: pod IDs # $5: pod IDs (sorted)
function verify_from_container() { function verify_from_container() {
echo "waiting for $1 at $2:$3"
results=($(ssh-to-node "${test_node}" " results=($(ssh-to-node "${test_node}" "
set -e; set -e;
sudo docker pull busybox >/dev/null; sudo docker pull busybox >/dev/null;
sudo docker run busybox sh -c ' sudo docker run busybox sh -c '
for i in $(seq -s' ' 1 $4); do for i in $(seq -s' ' 1 $(($4*3))); do
ok=false if wget -q -T 3 -O - http://$2:$3; then
for j in $(seq -s' ' 1 10); do echo
if wget -q -T 5 -O - http://$2:$3; then else
echo
ok=true
break
fi
sleep 1
done
if [[ \${ok} == false ]]; then
exit 1 exit 1
fi fi
done done
'")) \ '" | sort -r -n | uniq)) \
|| error "testing $1 VIP from container failed" || error "testing $1 VIP from container failed"
found_pods=$(sort_args "${results[@]}") found_pods=$(sort_args "${results[@]}")
if [[ "${found_pods}" != "$5" ]]; then if [[ "${found_pods}" != "$5" ]]; then
error -e "$1 VIP failed from container, expected:\n echo "expected '$5', got '${found_pods}'"
$(printf '\t%s\n' $5)\n error "$1: failed to verify VIP from container"
got:\n
$(printf '\t%s\n' ${found_pods})
"
fi fi
} }
@ -303,14 +306,17 @@ detect-minions
test_node="${MINION_NAMES[0]}" test_node="${MINION_NAMES[0]}"
master="${MASTER_NAME}" master="${MASTER_NAME}"
# Make our namespace
make_namespace
# Launch some pods and services. # Launch some pods and services.
svc1_name="service-${RANDOM}" svc1_name="service1"
svc1_port=80 svc1_port=80
svc1_count=3 svc1_count=3
svc1_publics="192.168.1.1 192.168.1.2" svc1_publics="192.168.1.1 192.168.1.2"
start_service "${svc1_name}" "${svc1_port}" "${svc1_count}" "${svc1_publics}" start_service "${svc1_name}" "${svc1_port}" "${svc1_count}" "${svc1_publics}"
svc2_name="service-${RANDOM}" svc2_name="service2"
svc2_port=80 svc2_port=80
svc2_count=3 svc2_count=3
start_service "${svc2_name}" "${svc2_port}" "${svc2_count}" start_service "${svc2_name}" "${svc2_port}" "${svc2_count}"
@ -414,7 +420,6 @@ echo "Manually removing iptables rules"
# Remove both the new and old style chains, in case we're testing on an old kubelet # Remove both the new and old style chains, in case we're testing on an old kubelet
ssh-to-node "${test_node}" "sudo iptables -t nat -F KUBE-PORTALS-HOST || true" ssh-to-node "${test_node}" "sudo iptables -t nat -F KUBE-PORTALS-HOST || true"
ssh-to-node "${test_node}" "sudo iptables -t nat -F KUBE-PORTALS-CONTAINER || true" ssh-to-node "${test_node}" "sudo iptables -t nat -F KUBE-PORTALS-CONTAINER || true"
ssh-to-node "${test_node}" "sudo iptables -t nat -F KUBE-PROXY || true"
echo "Verifying the VIPs from the host" echo "Verifying the VIPs from the host"
wait_for_service_up "${svc3_name}" "${svc3_ip}" "${svc3_port}" \ wait_for_service_up "${svc3_name}" "${svc3_ip}" "${svc3_port}" \
"${svc3_count}" "${svc3_pods}" "${svc3_count}" "${svc3_pods}"