k3s/scripts/sonobuoy

162 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
set -xe
cd $(dirname $0)/..
if [ -z "${K3S_IMAGE}" ]; then
echo "K3S_IMAGE environment variable should be defined"
exit 1
fi
# ---
port-used() {
(cat </dev/null >/dev/tcp/127.0.0.1/$1) 2>/dev/null
}
export -f port-used
get-port() {
while
PORT=$((10000 + RANDOM % 50000))
port-used ${PORT}
do continue; done
echo ${PORT}
}
export -f get-port
K3S_PORT=$(timeout --foreground 5s bash -c get-port)
OUTPUT=$(pwd)/sonobuoy-output/${K3S_PORT}
mkdir -p ${OUTPUT}
SECRET=random-$((100000 + RANDOM % 999999))
export K3S_AGENT=sonobuoy-k3s-agent-${K3S_PORT}
export K3S_SERVER=sonobuoy-k3s-server-${K3S_PORT}
export KUBECONFIG=${OUTPUT}/kubeconfig.yaml
# ---
cleanup() {
exit_status=$?
set +e
echo "Cleaning up"
for container in ${K3S_SERVER} ${K3S_AGENT}; do
docker cp ${container}:/var/lib/rancher/k3s/agent/containerd/containerd.log ${OUTPUT}/${container}-containerd.log
docker logs ${container} >${OUTPUT}/${container}.log 2>&1
docker rm -f ${container} 2>/dev/null
if [ ${exit_status} -ne 0 ]; then
cat ${OUTPUT}/${container}-containerd.log
cat ${OUTPUT}/${container}.log
fi
done
rm ${KUBECONFIG}
exit ${exit_status}
}
trap cleanup EXIT
# ---
docker run -d --name ${K3S_SERVER} --privileged \
-p 127.0.0.1:${K3S_PORT}:${K3S_PORT} \
-e K3S_CLUSTER_SECRET=${SECRET} \
${K3S_IMAGE} server --no-deploy=traefik --https-listen-port=${K3S_PORT}
K3S_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${K3S_SERVER})
echo "Started ${K3S_SERVER} @ ${K3S_IP}:${K3S_PORT}"
# ---
fetch-kubeconfig() {
docker cp ${K3S_SERVER}:/etc/rancher/k3s/k3s.yaml ${KUBECONFIG} 2>/dev/null
}
export -f fetch-kubeconfig
wait-for-kubeconfig() {
while ! fetch-kubeconfig; do
echo "Waiting for kubeconfig to become available..."
sleep 5
done
}
export -f wait-for-kubeconfig
timeout --foreground 1m bash -c wait-for-kubeconfig
# ---
docker run -d --name ${K3S_AGENT} --privileged \
-e K3S_CLUSTER_SECRET=${SECRET} \
-e K3S_URL=https://${K3S_IP}:${K3S_PORT} \
${K3S_IMAGE} agent
echo "Started ${K3S_AGENT}"
# ---
count-ready-nodes() {
kubectl get nodes -o json \
| jq '.items[].status.conditions[] | select(.type == "Ready" and .status == "True") | .type' \
| wc -l \
| tr -d '[:space:]'
}
export -f count-ready-nodes
wait-for-nodes() {
while [[ "$(count-ready-nodes)" != "2" ]]; do
echo "Waiting for nodes to be ready..."
sleep 5
done
}
export -f wait-for-nodes
timeout --foreground 1m bash -c wait-for-nodes
# ---
pod-ready() {
kubectl get pods -n kube-system -o json \
| jq ".items[].status.containerStatuses[] | select(.name == \"$1\") | .ready" 2>/dev/null
}
export -f pod-ready
wait-for-services() {
for service in coredns; do
while [[ "$(pod-ready ${service})" != "true" ]]; do
echo "Waiting for service ${service} to be ready..."
sleep 5
done
echo "Service ${service} is ready"
done
}
export -f wait-for-services
timeout --foreground 1m bash -c wait-for-services
# ---
echo "Starting sonobuoy tests"
timeout --foreground 30m sonobuoy run \
--config scripts/sonobuoy-config.json \
--wait \
${@}
sonobuoy status
sonobuoy retrieve ${OUTPUT}
(
cd ${OUTPUT}
tar xzf *_sonobuoy_*.tar.gz
results="./plugins/e2e/results/e2e.log"
[ -s ${results} ] || exit 1
tail -20 ${results}
exit_code=0
status=$(tail -5 ${results} | grep '^SUCCESS!.*| 0 Failed |' >/dev/null && echo passed || echo failed)
[ "${status}" = "failed" ] && exit_code=1
if [ -n "${E2E_LOG_OUTPUT}" ]; then
cp ${results} $(echo ${E2E_LOG_OUTPUT} | sed -e "s/-STATUS-/-${status}-/g")
fi
exit ${exit_code}
)