Files
fission-src/test/test_utils.sh
T
soharab-icandGitHub 36f318186b Add podSpec to generated environment manifest (#3033)
* Use builder and container names when creating environment K8s object instead of keeping it empty.
Add skeleton for podSpec field to give user an idea of how to use podSpec field.
* Add a positive test for env podSpec
* Add the test to CI tests
* Remove duplicate wait_for_builder function
* Fix CI tests failure
* Fix CI tests failure
* Add a negative test for env podSpec
* Fix issues with negative test
* Removing negative test as it may break executor which will affect other tests
* Rebase with main as executor issue is fixed.
Add the negative test.
* Fix negative test


---------

Signed-off-by: Md Soharab Ansari <soharab.ansari@infracloud.io>
2024-10-09 11:11:19 +05:30

629 lines
18 KiB
Bash
Executable File

#!/bin/bash
#
# Test runner. Shell scripts that build fission CLI and server, push a
# docker image to GCR, deploy it on a cluster, and run tests against
# that deployment.
#
set -euo pipefail
ROOT=`realpath $(dirname $0)/..`
travis_fold_start() {
echo -e "travis_fold:start:$1\r\033[33;1m$2\033[0m"
}
travis_fold_end() {
echo -e "travis_fold:end:$1\r"
}
gcloud_login() {
KEY=${HOME}/gcloud-service-key.json
if [ ! -f $KEY ]
then
echo $FISSION_CI_SERVICE_ACCOUNT | base64 -d - > $KEY
fi
gcloud auth activate-service-account --key-file $KEY
}
getVersion() {
echo $(git rev-parse HEAD)
}
getDate() {
echo $(date -u +'%Y-%m-%dT%H:%M:%SZ')
}
getGitCommit() {
echo $(git rev-parse HEAD)
}
setupCIBuildEnv() {
export REPO=gcr.io/$GKE_PROJECT_NAME
export IMAGE=fission-bundle
export FETCHER_IMAGE=$REPO/fetcher
export BUILDER_IMAGE=$REPO/builder
export TAG=test-${TRAVIS_BUILD_ID}
export PRUNE_INTERVAL=1 # this variable controls the interval to run archivePruner. The unit is in minutes.
export ROUTER_SERVICE_TYPE=LoadBalancer
export SERVICE_TYPE=LoadBalancer
export PRE_UPGRADE_CHECK_IMAGE=$REPO/pre-upgrade-checks
}
setupIngressController() {
# set up NGINX ingress controller
kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user $(gcloud config get-value account) || true
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/mandatory.yaml || true
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/provider/cloud-generic.yaml || true
}
removeIngressController() {
# set up NGINX ingress controller
kubectl delete clusterrolebinding cluster-admin-binding || true
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/provider/cloud-generic.yaml || true
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.1/deploy/static/mandatory.yaml || true
}
build_and_push_go_mod_cache_image() {
image_tag=$1
travis_fold_start go_mod_cache_image $image_tag
gcloud_login
if ! gcloud docker -- pull $image_tag >/dev/null 2>&1 ; then
docker build -q -t $image_tag -f $ROOT/cmd/fission-bundle/Dockerfile --target godep --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
else
docker build -q -t $image_tag -f $ROOT/cmd/fission-bundle/Dockerfile --cache-from ${image_tag} --target godep --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
fi
gcloud docker -- push $image_tag &
travis_fold_end go_mod_cache_image
}
build_and_push_pre_upgrade_check_image() {
image_tag=$1
cache_image=$2
travis_fold_start build_and_push_pre_upgrade_check_image $image_tag
docker build -q -t $image_tag -f $ROOT/cmd/preupgradechecks/Dockerfile --cache-from ${cache_image} --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
gcloud_login
gcloud docker -- push $image_tag &
travis_fold_end build_and_push_pre_upgrade_check_image
}
build_and_push_fission_bundle() {
image_tag=$1
cache_image=$2
travis_fold_start build_and_push_fission_bundle $image_tag
docker build -q -t $image_tag -f $ROOT/cmd/fission-bundle/Dockerfile --cache-from ${cache_image} --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
gcloud_login
gcloud docker -- push $image_tag &
travis_fold_end build_and_push_fission_bundle
}
build_and_push_fetcher() {
image_tag=$1
cache_image=$2
travis_fold_start build_and_push_fetcher $image_tag
docker build -q -t $image_tag -f $ROOT/cmd/fetcher/Dockerfile --cache-from ${cache_image} --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
gcloud_login
gcloud docker -- push $image_tag &
travis_fold_end build_and_push_fetcher
}
build_and_push_builder() {
image_tag=$1
cache_image=$2
travis_fold_start build_and_push_builder $image_tag
docker build -q -t $image_tag -f $ROOT/cmd/builder/Dockerfile --cache-from ${cache_image} --build-arg GITCOMMIT=$(getGitCommit) --build-arg BUILDDATE=$(getDate) --build-arg BUILDVERSION=$(getVersion) .
gcloud_login
gcloud docker -- push $image_tag &
travis_fold_end build_and_push_builder
}
build_and_push_env_runtime() {
env=$1
image_tag=$2
variant=$3
travis_fold_start build_and_push_env_runtime.$env $image_tag
dockerfile="Dockerfile"
if [ ! -z ${variant} ]; then
dockerfile=${dockerfile}-${variant}
fi
pushd $ROOT/environments/$env/
docker build -q -t $image_tag . -f ${dockerfile}
gcloud_login
gcloud docker -- push $image_tag &
popd
travis_fold_end build_and_push_env_runtime.$env
}
build_and_push_env_builder() {
env=$1
image_tag=$2
builder_image=$3
variant=$4
travis_fold_start build_and_push_env_builder.$env $image_tag
dockerfile="Dockerfile"
if [ ! -z ${variant} ]; then
dockerfile=${dockerfile}-${variant}
fi
pushd ${ROOT}/environments/${env}/builder
docker build -q -t ${image_tag} --build-arg BUILDER_IMAGE=${builder_image} . -f ${dockerfile}
gcloud_login
gcloud docker -- push ${image_tag} &
popd
travis_fold_end build_and_push_env_builder.$env
}
build_fission_cli() {
travis_fold_start build_fission_cli "fission cli"
pushd $ROOT/cmd/fission-cli
go build -ldflags "-X github.com/fission/fission/pkg/info.GitCommit=$(getGitCommit) -X github.com/fission/fission/pkg/info.BuildDate=$(getDate) -X github.com/fission/fission/pkg/info.Version=$(getVersion)" -o $HOME/tool/fission .
popd
travis_fold_end build_fission_cli
}
clean_crd_resources() {
kubectl --namespace default get crd| grep -v NAME| grep "fission.io"| awk '{print $1}'|xargs -I@ bash -c "kubectl --namespace default delete crd @" || true
}
set_environment() {
id=$1
ns=f-$id
# fission env
export FISSION_URL=http://$(kubectl -n $ns get svc controller -o jsonpath='{...ip}')
export FISSION_ROUTER=$(kubectl -n $ns get svc router -o jsonpath='{...ip}')
# ingress controller env
export INGRESS_CONTROLLER=$(kubectl -n ingress-nginx get svc ingress-nginx -o jsonpath='{...ip}')
}
generate_test_id() {
echo $(((10000 + $RANDOM) % 99999))
}
helm_install_fission() {
id=$1
repo=$2
image=$3
imageTag=$4
fetcherImage=$5
fetcherImageTag=$6
controllerNodeport=$7
routerNodeport=$8
pruneInterval=$9
routerServiceType=${10}
serviceType=${11}
preUpgradeCheckImage=${12}
travis_fold_start helm_install_fission "helm install fission id=$id"
ns=f-$id
fns=f-func-$id
helmVars=repository=$repo,image=$image,imageTag=$imageTag,fetcher.image=$fetcherImage,fetcher.imageTag=$fetcherImageTag,functionNamespace=$fns,controllerPort=$controllerNodeport,routerPort=$routerNodeport,pullPolicy=Always,analytics=false,debugEnv=true,pruneInterval=$pruneInterval,routerServiceType=$routerServiceType,serviceType=$serviceType,preUpgradeChecksImage=$preUpgradeCheckImage,prometheus.server.persistentVolume.enabled=false,prometheus.alertmanager.enabled=false,prometheus.kubeStateMetrics.enabled=false,prometheus.nodeExporter.enabled=false
echo "Deleting old releases"
helm list -q|xargs -I@ bash -c "helm_uninstall_fission @"
# deleting ns does take a while after command is issued
# while kubectl get ns| grep "fission-builder"
# do
# sleep 5
# done
helm dependency update $ROOT/charts/fission-all
echo "Creating namespace $ns"
kubectl create ns $ns
pushd $ROOT/charts/fission-all
echo "Cleaning up stale resources"
helm template . -ndefault| kubectl delete -f - || true
sleep 30
echo "Installing fission"
helm install $id \
--wait \
--timeout 540s \
--set $helmVars \
--namespace $ns \
.
popd
helm list
travis_fold_end helm_install_fission
}
dump_kubernetes_events() {
id=$1
ns=f-$id
fns=f-func-$id
echo "--- kubectl events $fns ---"
kubectl get events -n $fns
echo "--- end kubectl events $fns ---"
echo "--- kubectl events $ns ---"
kubectl get events -n $ns
echo "--- end kubectl events $ns ---"
}
export -f dump_kubernetes_events
dump_tiller_logs() {
echo "--- tiller logs ---"
tiller_pod=`kubectl get pods -n kube-system | grep tiller| tr -s " "| cut -d" " -f1`
kubectl logs $tiller_pod --since=30m -n kube-system
echo "--- end tiller logs ---"
}
export -f dump_tiller_logs
wait_for_service() {
ns=$1
svc=$2
while true
do
ip=$(kubectl -n $ns get svc $svc -o jsonpath='{...ip}')
if [ ! -z $ip ]; then
break
fi
echo Waiting for service $svc...
sleep 1
done
}
export -f wait_for_service
wait_for_services() {
id=$1
ns=f-$id
wait_for_service $ns controller
wait_for_service $ns router
wait_for_service "ingress-nginx" ingress-nginx
echo Waiting for service is routable...
sleep 30
}
export -f wait_for_services
check_gitcommit_version() {
while true
do
# ensure we run tests against with the same git commit version of CLI & server
ip=$(fission version|grep "GitCommit"|tr -d ' '|uniq -c|grep "2 GitCommit")
if [ $? -eq 0 ]; then
break
fi
echo Retrying getting build version from the controller...
sleep 1
done
}
export -f check_gitcommit_version
helm_uninstall_fission() {(set +e
id=$1
if [ ! -z ${FISSION_TEST_SKIP_DELETE:+} ]; then
echo "Fission uninstallation skipped"
return
fi
ns=f-$id
echo "Uninstalling fission"
helm delete $id -n $ns || true
kubectl delete ns f-$id || true
echo "Deleting CRDs"
kubectl get crd | grep "fission.io" | awk '{print $1}' | xargs -n1 kubectl delete crd
)}
export -f helm_uninstall_fission
port_forward_services() {
id=$1
ns=f-$id
svc=$2
port=$3
kubectl get pods -l svc="$svc" -o name --namespace $ns | \
sed 's/^.*\///' | \
xargs -I{} kubectl port-forward {} $port:$port -n $ns &
}
dump_builder_pod_logs() {
bns=$1
builderPods=$(kubectl -n $bns get pod -o name)
for p in $builderPods
do
echo "--- builder pod logs $p ---"
containers=$(kubectl -n $bns get $p -o jsonpath={.spec.containers[*].name} --ignore-not-found)
for c in $containers
do
echo "--- builder pod logs $p: container $c ---"
kubectl -n $bns logs $p $c || true
echo "--- end builder pod logs $p: container $c ---"
done
echo "--- end builder pod logs $p ---"
done
}
dump_function_pod_logs() {
ns=$1
fns=$2
functionPods=$(kubectl -n $fns get pod -o name -l functionName)
for p in $functionPods
do
echo "--- function pod logs $p ---"
containers=$(kubectl -n $fns get $p -o jsonpath={.spec.containers[*].name} --ignore-not-found)
for c in $containers
do
echo "--- function pod logs $p: container $c ---"
kubectl -n $fns logs $p $c || true
echo "--- end function pod logs $p: container $c ---"
done
echo "--- end function pod logs $p ---"
done
}
dump_fission_logs() {
ns=$1
fns=$2
component=$3
echo --- $component logs ---
kubectl -n $ns get pod -o name | grep $component | xargs -n1 kubectl -n $ns logs
echo --- end $component logs ---
}
dump_fission_crd() {
type=$1
echo --- All objects of type $type ---
kubectl --all-namespaces=true get $type -o yaml
echo --- End objects of type $type ---
}
dump_fission_crds() {
dump_fission_crd environments.fission.io
dump_fission_crd functions.fission.io
dump_fission_crd httptriggers.fission.io
dump_fission_crd kuberneteswatchtriggers.fission.io
dump_fission_crd messagequeuetriggers.fission.io
dump_fission_crd packages.fission.io
dump_fission_crd timetriggers.fission.io
}
dump_env_pods() {
fns=$1
echo --- All environment pods ---
kubectl -n $fns get pod -o yaml
echo --- End environment pods ---
}
describe_pods_ns() {
echo "--- describe pods $1---"
kubectl describe pods -n $1
echo "--- End describe pods $1 ---"
}
describe_all_pods() {
id=$1
ns=f-$id
fns=f-func-$id
bns=fission-builder
describe_pods_ns $ns
describe_pods_ns $fns
describe_pods_ns $bns
}
dump_all_fission_resources() {
ns=$1
echo "--- All objects in the fission namespace $ns ---"
kubectl -n $ns get pods -o wide
echo ""
kubectl -n $ns get svc
echo "--- End objects in the fission namespace $ns ---"
}
dump_system_info() {
travis_fold_start dump_system_info "System Info"
go version
docker version
kubectl version
helm version
travis_fold_end dump_system_info
}
dump_logs() {
id=$1
travis_fold_start dump_logs "dump logs $id"
ns=f-$id
fns=f-func-$id
bns=fission-builder
dump_all_fission_resources $ns
dump_env_pods $fns
dump_fission_logs $ns $fns controller
dump_fission_logs $ns $fns router
dump_fission_logs $ns $fns buildermgr
dump_fission_logs $ns $fns executor
dump_fission_logs $ns $fns storagesvc
dump_fission_logs $ns $fns mqtrigger
dump_function_pod_logs $ns $fns
dump_builder_pod_logs $bns
dump_fission_crds
travis_fold_end dump_logs
}
export FAILURES=0
run_all_tests() {
id=$1
imageTag=$2
export FISSION_NAMESPACE=f-$id
export FUNCTION_NAMESPACE=f-func-$id
export PYTHON_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/python-env:${imageTag}
export PYTHON_BUILDER_IMAGE=gcr.io/$GKE_PROJECT_NAME/python-env-builder:${imageTag}
export GO_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/go-env:${imageTag}
export GO_BUILDER_IMAGE=gcr.io/$GKE_PROJECT_NAME/go-env-builder:${imageTag}
export JVM_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/jvm-env:${imageTag}
export JVM_JERSEY_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/jvm-jersey-env:${imageTag}
export JVM_BUILDER_IMAGE=gcr.io/$GKE_PROJECT_NAME/jvm-env-builder:${imageTag}
export NODE_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/node-env:${imageTag}
export NODE_BUILDER_IMAGE=gcr.io/$GKE_PROJECT_NAME/node-env-builder:${imageTag}
export TS_RUNTIME_IMAGE=gcr.io/$GKE_PROJECT_NAME/tensorflow-serving-env:${imageTag}
set +e
export TIMEOUT=900 # 15 minutes per test
# run tests without newdeploy in parallel.
export JOBS=6
$ROOT/test/run_test.sh \
$ROOT/test/tests/test_canary.sh \
$ROOT/test/tests/test_fn_update/test_idle_objects_reaper.sh \
$ROOT/test/tests/test_annotations.sh \
$ROOT/test/tests/test_archive_pruner.sh \
$ROOT/test/tests/test_backend_poolmgr.sh \
$ROOT/test/tests/test_buildermgr.sh \
$ROOT/test/tests/test_env_vars.sh \
$ROOT/test/tests/test_env_podspec.sh \
$ROOT/test/tests/test_environments/test_python_env.sh \
$ROOT/test/tests/test_function_test/test_fn_test.sh \
$ROOT/test/tests/test_function_update.sh \
$ROOT/test/tests/test_ingress.sh \
$ROOT/test/tests/test_internal_routes.sh \
$ROOT/test/tests/test_logging/test_function_logs.sh \
$ROOT/test/tests/test_node_hello_http.sh \
$ROOT/test/tests/test_package_command.sh \
$ROOT/test/tests/test_package_checksum.sh \
$ROOT/test/tests/test_pass.sh \
$ROOT/test/tests/test_specs/test_spec.sh \
$ROOT/test/tests/test_specs/test_spec_multifile.sh \
$ROOT/test/tests/test_specs/test_spec_merge/test_spec_merge.sh \
$ROOT/test/tests/test_specs/test_spec_archive/test_spec_archive.sh \
$ROOT/test/tests/test_environments/test_tensorflow_serving_env.sh \
$ROOT/test/tests/test_environments/test_go_env.sh \
$ROOT/test/tests/test_huge_response/test_huge_response.sh \
$ROOT/test/tests/test_kubectl/test_kubectl.sh
$ROOT/test/tests/websocket/test_ws.sh
FAILURES=$?
export JOBS=3
$ROOT/test/run_test.sh \
$ROOT/test/tests/test_backend_newdeploy.sh \
$ROOT/test/tests/test_environments/test_java_builder.sh \
$ROOT/test/tests/test_environments/test_java_env.sh \
$ROOT/test/tests/test_environments/test_nodejs_env.sh \
$ROOT/test/tests/test_fn_update/test_configmap_update.sh \
$ROOT/test/tests/test_fn_update/test_env_update.sh \
$ROOT/test/tests/test_fn_update/test_nd_pkg_update.sh \
$ROOT/test/tests/test_fn_update/test_poolmgr_nd.sh \
$ROOT/test/tests/test_fn_update/test_resource_change.sh \
$ROOT/test/tests/test_fn_update/test_scale_change.sh \
$ROOT/test/tests/test_fn_update/test_secret_update.sh \
$ROOT/test/tests/test_obj_create_in_diff_ns.sh \
$ROOT/test/tests/test_secret_cfgmap/test_secret_cfgmap.sh
FAILURES=$((FAILURES+$?))
set -e
# dump test logs
# TODO: the idx does not match seq number in recap.
idx=1
log_files=$(find $ROOT/test/logs/ -name '*.log')
for log_file in $log_files; do
test_name=${log_file#$ROOT/test/logs/}
travis_fold_start run_test.$idx $test_name
echo "========== start $test_name =========="
cat $log_file
echo "========== end $test_name =========="
travis_fold_end run_test.$idx
idx=$((idx+1))
done
}
install_and_test() {
repo=$1
image=$2
imageTag=$3
fetcherImage=$4
fetcherImageTag=$5
pruneInterval=$6
routerServiceType=$7
serviceType=$8
preUpgradeCheckImage=$9
controllerPort=31234
routerPort=31235
clean_crd_resources
id=$(generate_test_id)
trap "helm_uninstall_fission $id" EXIT
setupIngressController
helm_install_fission $id $repo $image $imageTag $fetcherImage $fetcherImageTag $controllerPort $routerPort $pruneInterval $routerServiceType $serviceType $preUpgradeCheckImage
if [ $? -ne 0 ]; then
describe_all_pods $id
dump_kubernetes_events $id
exit 1
fi
timeout 150 bash -c "wait_for_services $id"
timeout 120 bash -c "check_gitcommit_version"
set_environment $id
run_all_tests $id $imageTag
dump_logs $id
removeIngressController
if [ $FAILURES -ne 0 ]
then
# Commented out due to Travis-CI log length limit
# describe each pod in fission ns and function namespace
# describe_all_pods $id
exit 1
fi
}
# if [ $# -lt 2 ]
# then
# echo "Usage: test.sh [image] [imageTag]"
# exit 1
# fi
# install_and_test $1 $2