blob: 1ae4dd98485f8ded2c9bf0869af3ebb3c35e3da7 [file] [log] [blame]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source "${SCRIPT_DIR}/../../smoketest/testlib.sh"
retry() {
local -i n=0
local -i attempts=${RETRY_ATTEMPTS:-100}
until [ $n -ge $attempts ]
do
"$@" && break
n=$[$n+1]
echo "$n '$@' is failed..."
sleep ${RETRY_SLEEP:-3}
done
if [ $n -eq $attempts ]; then
return 255
fi
}
grep_log() {
CONTAINER="$1"
PATTERN="$2"
kubectl logs "$1" | grep "$PATTERN"
}
wait_for_startup(){
print_phase "Waiting until the k8s cluster is running"
if retry all_pods_are_running \
&& retry grep_log scm-0 "SCM exiting safe mode." \
&& retry grep_log om-0 "HTTP server of ozoneManager listening"; then
print_phase "Cluster is up and running"
else
return 1
fi
}
all_pods_are_running() {
local -i running=$(kubectl get pod --field-selector status.phase=Running | grep -v 'STATUS' | wc -l)
local -i all=$(kubectl get pod | grep -v 'STATUS' | wc -l)
if [ "$running" -lt "3" ]; then
echo "$running pods are running. Waiting for more."
return 1
elif [ "$running" -ne "$all" ]; then
echo "$running / $all pods are running"
return 2
else
STARTED=true
return 0
fi
}
pre_run_setup() {
rm -fr logs result
regenerate_resources
reset_k8s_env
start_k8s_env
wait_for_startup
}
reset_k8s_env() {
print_phase "Deleting existing k8s resources"
#reset environment
kubectl delete statefulset --all
kubectl delete daemonset --all
kubectl delete deployment --all
kubectl delete service --all
kubectl delete configmap --all
kubectl delete pod --all
kubectl delete pvc --all
kubectl delete pv --all
}
start_k8s_env() {
print_phase "Applying k8s resources from $(basename $(pwd))"
kubectl apply -k .
trap post_run EXIT HUP INT TERM
}
post_run() {
set +e
combine_reports
get_logs
stop_k8s_env
revert_resources
set -e
}
get_logs() {
print_phase "Collecting container logs"
mkdir -p logs
for pod in $(kubectl get pods -o custom-columns=NAME:.metadata.name | tail -n +2); do
for initContainer in $(kubectl get pod -o jsonpath='{.spec.initContainers[*].name}' "${pod}"); do
kubectl logs "${pod}" "${initContainer}" > logs/"pod-${pod}-${initContainer}.log"
done
kubectl logs "${pod}" > logs/"pod-${pod}.log"
done
}
stop_k8s_env() {
if [ "${KEEP_RUNNING:-false}" != "true" ]; then
print_phase "Deleting k8s resources"
kubectl delete -k .
fi
}
regenerate_resources() {
print_phase "Modifying Kubernetes resources file for test"
echo " (mounting current Ozone directory to the containers, scheduling containers to one node, ...)"
echo ""
echo "WARNING: this test can be executed only with local Kubernetes cluster"
echo " (source dir should be available from K8s nodes)"
echo ""
PARENT_OF_PARENT=$(realpath ../..)
if [ $(basename $PARENT_OF_PARENT) == "k8s" ]; then
#running from src dir
local version
version=$(cd ../../../../.. && mvn help:evaluate -Dexpression=ozone.version -q -DforceStdout -Dscan=false)
OZONE_ROOT=$(realpath ../../../../../target/ozone-${version})
else
#running from dist
OZONE_ROOT=$(realpath ../../..)
fi
local default_version=${docker.ozone-runner.version} # set at build-time from Maven property
local runner_version=${OZONE_RUNNER_VERSION:-${default_version}} # may be specified by user running the test
local runner_image="${OZONE_RUNNER_IMAGE:-apache/ozone-runner}" # may be specified by user running the test
flekszible generate -t mount:hostPath="$OZONE_ROOT",path=/opt/hadoop -t image:image="${runner_image}:${runner_version}" -t ozone/onenode
}
revert_resources() {
print_phase "Regenerating original Kubernetes resource files"
flekszible generate
}
execute_robot_test() {
print_phase "Executing robot tests $@"
mkdir -p result
CONTAINER="$1"
shift 1 #Remove first argument which was the container name
# shellcheck disable=SC2206
ARGUMENTS=($@)
kubectl exec -it "${CONTAINER}" -- bash -c 'rm -rf /tmp/report'
kubectl exec -it "${CONTAINER}" -- bash -c 'mkdir -p /tmp/report'
kubectl exec -it "${CONTAINER}" -- robot --nostatusrc -d /tmp/report ${ARGUMENTS[@]} || true
kubectl cp "${CONTAINER}":/tmp/report/output.xml "result/$CONTAINER-$RANDOM.xml" || true
}
combine_reports() {
if [[ -d result ]]; then
rm -f result/output.xml
run_rebot result result "-o output.xml -N '$(basename $(pwd))' *.xml"
fi
}
print_phase() {
echo ""
echo "**** $1 ****"
echo ""
}