1
0
mirror of https://github.com/tektoncd/catalog.git synced 2024-11-26 06:23:37 +00:00
catalog/test/e2e-common.sh
Chmouel Boudjnah b9383b4936 Add support for REST services testing
Add support for REST services testing, if we have a directory in the tests
directory called `fixtures` with a yaml file that contains a responder
rules (see github-add-comments task example) it will add a sidecar task from
https://github.com/chmouel/go-rest-api-test/ so the test can point to it.

Signed-off-by: Chmouel Boudjnah <chmouel@redhat.com>
2020-10-06 17:03:54 +01:00

200 lines
7.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright 2018 The Tekton 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.
# Helper functions for E2E tests.
# Check if we have a specific RELEASE_YAML global environment variable to use
# instead of detecting the latest released one from tektoncd/pipeline releases
RELEASE_YAML=${RELEASE_YAML:-}
source $(dirname $0)/../vendor/github.com/tektoncd/plumbing/scripts/e2e-tests.sh
# Add an internal registry as sidecar to a task so we can upload it directly
# from our tests withouth having to go to an external registry.
function add_sidecar_registry() {
cp ${1} ${TMPF}.read
cat ${TMPF}.read | python3 -c 'import yaml;f=open(0, encoding="utf-8"); data=yaml.load(f.read(), Loader=yaml.FullLoader);data["spec"]["sidecars"]=[{"image":"registry", "name": "registry"}];print(yaml.dump(data, default_flow_style=False));' > ${TMPF}
rm -f ${TMPF}.read
}
# Add the git_clone task
function add_git_clone_task() {
kubectl -n ${tns} apply -f ./task/git-clone/0.1/git-clone.yaml
}
function install_pipeline_crd() {
local latestreleaseyaml
echo ">> Deploying Tekton Pipelines"
if [[ -n ${RELEASE_YAML} ]];then
latestreleaseyaml=${RELEASE_YAML}
else
latestreleaseyaml="https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml"
fi
[[ -z ${latestreleaseyaml} ]] && fail_test "Could not get latest released release.yaml"
kubectl apply -f ${latestreleaseyaml} ||
fail_test "Build pipeline installation failed"
# Make sure thateveything is cleaned up in the current namespace.
for res in pipelineresources tasks pipelines taskruns pipelineruns; do
kubectl delete --ignore-not-found=true ${res}.tekton.dev --all
done
# Wait for pods to be running in the namespaces we are deploying to
wait_until_pods_running tekton-pipelines || fail_test "Tekton Pipeline did not come up"
}
function test_yaml_can_install() {
# Validate that all the Task CRDs in this repo are valid by creating them in a NS.
readonly ns="task-ns"
kubectl create ns "${ns}" || true
for runtest in $(find ${REPO_ROOT_DIR}/task -maxdepth 3 -name '*.yaml'); do
skipit=
for ignore in ${TEST_YAML_IGNORES};do
[[ ${ignore} == $(basename $(echo ${runtest%.yaml})) ]] && skipit=True
done
[[ -n ${skipit} ]] && break
echo "Checking ${runtest}"
kubectl -n ${ns} apply -f <(sed "s/namespace:.*/namespace: task-ns/" "${runtest}")
done
}
function show_failure() {
local testname=$1 tns=$2
echo "FAILED: ${testname} task has failed to comeback properly" ;
echo "--- Task Dump"
kubectl get -n ${tns} task -o yaml
echo "--- Pipeline Dump"
kubectl get -n ${tns} pipeline -o yaml
echo "--- PipelineRun Dump"
kubectl get -n ${tns} pipelinerun -o yaml
echo "--- TaskRun Dump"
kubectl get -n ${tns} taskrun -o yaml
echo "--- Container Logs"
for pod in $(kubectl get pod -o name -n ${tns}); do
kubectl logs --all-containers -n ${tns} ${pod} || true
done
exit 1
}
function test_task_creation() {
for runtest in ${@};do
# remove task/ from beginning
local runtestdir=${runtest#*/}
# remove /0.1/tests from end
local testname=${runtestdir%%/*}
# get version of the task
local version=$(basename $(basename $(dirname $runtest)))
# check version is in given format
[[ ${version} =~ ^[0-9]+\.[0-9]+$ ]] || { echo "ERROR: version of the task is not set properly"; exit 1;}
# replace . with - in version as not supported in namespace name
version="$( echo $version | tr '.' '-' )"
local tns="${testname}-${version}"
local skipit=
local maxloop=60 # 10 minutes max
for ignore in ${TEST_TASKRUN_IGNORES};do
[[ ${ignore} == ${testname} ]] && skipit=True
done
# remove /tests from end
local taskdir=${runtest%/*}
ls ${taskdir}/*.yaml 2>/dev/null >/dev/null || skipit=True
[[ -n ${skipit} ]] && continue
kubectl create namespace ${tns}
# Install the task itself first
for yaml in ${taskdir}/*.yaml;do
cp ${yaml} ${TMPF}
[[ -f ${taskdir}/tests/pre-apply-task-hook.sh ]] && source ${taskdir}/tests/pre-apply-task-hook.sh
function_exists pre-apply-task-hook && pre-apply-task-hook
[[ -d ${taskdir}/tests/fixtures ]] && {
cat <<EOF>>${TMPF}
sidecars:
- image: quay.io/chmouel/go-rest-api-test
name: go-rest-api
env:
- name: CONFIG
value: |
$(cat ${taskdir}/tests/fixtures/*.yaml|sed 's/^/ /')
EOF
}
kubectl -n ${tns} create -f ${TMPF}
done
# Install resource and run
for yaml in ${runtest}/*.yaml;do
cp ${yaml} ${TMPF}
[[ -f ${taskdir}/tests/pre-apply-taskrun-hook.sh ]] && source ${taskdir}/tests/pre-apply-taskrun-hook.sh
function_exists pre-apply-taskrun-hook && pre-apply-taskrun-hook
kubectl -n ${tns} create -f ${TMPF}
done
local cnt=0
local all_status=''
local reason=''
while true;do
[[ ${cnt} == ${maxloop} ]] && show_failure ${testname} ${tns}
# sometimes we don't get all_status and reason in one go so
# wait until we get the reason and all_status for 5 iterations
for _ in {1..5}; do
all_status=$(kubectl get -n ${tns} pipelinerun --output=jsonpath='{.items[*].status.conditions[*].status}')
reason=$(kubectl get -n ${tns} pipelinerun --output=jsonpath='{.items[*].status.conditions[*].reason}')
[[ ! -z ${all_status} ]] && [[ ! -z ${reason} ]] && break
done
if [[ -z ${all_status} && -z ${reason} ]];then
for _ in {1..5}; do
all_status=$(kubectl get -n ${tns} taskrun --output=jsonpath='{.items[*].status.conditions[*].status}')
reason=$(kubectl get -n ${tns} taskrun --output=jsonpath='{.items[*].status.conditions[*].reason}')
[[ ! -z ${all_status} ]] && [[ ! -z ${reason} ]] && break
done
fi
if [[ -z ${all_status} || -z ${reason} ]];then
echo -n "Could not find a created taskrun or pipelinerun in ${tns}"
fi
breakit=True
for status in ${all_status};do
[[ ${status} == *ERROR || ${reason} == *Fail* || ${reason} == Couldnt* ]] && show_failure ${testname} ${tns}
if [[ ${status} != True ]];then
breakit=
fi
done
if [[ ${breakit} == True ]];then
echo -n "SUCCESS: ${testname} pipelinerun has successfully executed" ;
break
fi
sleep 10
cnt=$((cnt+1))
done
kubectl delete ns ${tns}
done
}