Files
fission-src/test/tests/test_env_podspec.sh
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

212 lines
5.4 KiB
Bash
Executable File

#!/bin/bash
set -euo pipefail
source $(dirname $0)/../utils.sh
# test_env_podspec.sh - tests whether a user is able to add sidecar containers to a Fission environment deployment
TEST_ID=$(generate_test_id)
echo "TEST_ID = $TEST_ID"
tmp_dir="/tmp/test-$TEST_ID"
mkdir -p $tmp_dir
ENV=python-${TEST_ID}
RESOURCE_NS=default # Change to test-specific namespace once we support namespaced CRDs
FUNCTION_NS=${FUNCTION_NAMESPACE:-fission-function}
BUILDER_NS=${BUILDER_NAMESPACE:-fission-builder}
PYTHON_BUILDER_IMAGE=ghcr.io/fission/python-builder
PYTHON_RUNTIME_IMAGE=ghcr.io/fission/python-env
# fs
ENV_SPEC_FILE=${tmp_dir}/${ENV}.yaml
log_exec() {
cmd=$@
echo "> ${cmd}"
${cmd}
}
cleanup() {
echo "previous response" $?
log "Cleaning up..."
clean_resource_by_id $TEST_ID
rm -rf $tmp_dir
}
if [ -z "${TEST_NOCLEANUP:-}" ]; then
trap cleanup EXIT
else
log "TEST_NOCLEANUP is set; not cleaning up test artifacts afterwards."
fi
# retry function adapted from:
# https://unix.stackexchange.com/questions/82598/how-do-i-write-a-retry-logic-in-script-to-keep-retrying-to-run-it-upto-5-times/82610
function retry {
local n=1
local max=10
local delay=10 # pods take time to get ready
while true; do
"$@" && break || {
if [[ ${n} -lt ${max} ]]; then
((n++))
echo "Command '$@' failed. Attempt $n/$max:"
sleep ${delay};
else
>&2 echo "The command has failed after $n attempts."
exit 1;
fi
}
done
}
# Deploy environment (using kubectl because the Fission cli does not support the podSpec arguments)
# Positive test
echo "Writing environment config to $ENV_SPEC_FILE"
cat > $ENV_SPEC_FILE <<- EOM
apiVersion: fission.io/v1
kind: Environment
metadata:
name: ${ENV}
namespace: ${RESOURCE_NS}
spec:
builder:
command: build
container:
name: builder
image: ${PYTHON_BUILDER_IMAGE}
podspec:
containers:
- name: builder
initContainers:
- name: init
image: alpine
command:
- "sleep"
- "1"
runtime:
container:
name: ${ENV}
resources: {}
image: ${PYTHON_RUNTIME_IMAGE}
podspec:
containers:
- name: ${ENV}
initContainers:
- name: init
image: alpine
command:
- "sleep"
- "1"
version: 3
poolsize: 1
EOM
log_exec kubectl -n ${RESOURCE_NS} apply -f ${ENV_SPEC_FILE}
timeout 90 bash -c "wait_for_builder $ENV"
log "environment is ready"
# Check if the initContainer status is completed in the builder env
status=0
if kubectl --namespace ${BUILDER_NS} get po -l envName=${ENV} -ojsonpath='{range .items[0]}{@.status.initContainerStatuses[0].state.terminated.reason}{end}' | grep Completed ; then
log "InitContainer's status is correct."
else
log "InitContainer's status is not correct"
echo "--- Builder Env ---"
kubectl --namespace ${BUILDER_NS} get deploy -l envName=go -ojson
echo "--- End Builder Env ---"
status=5
fi
# Check if the initContainer status is completed in the runtime env
if kubectl --namespace ${FUNCTION_NS} get po -l environmentName=${ENV} -ojsonpath='{range .items[0]}{@.status.initContainerStatuses[0].state.terminated.reason}{end}' | grep Completed ; then
log "InitContainer's status is correct."
else
log "InitContainer's status is not correct"
echo "--- Runtime Env ---"
kubectl --namespace ${FUNCTION_NS} get deploy -l environmentName=go -ojson
echo "--- End Runtime Env ---"
status=5
fi
if [ ${status} -eq 5 ] ; then
exit ${status}
fi
# Deploy environment (using kubectl because the Fission cli does not support the podSpec arguments)
# Negative test
#
# Valid builder and runtime container names are `builder` and `envName` respectively. If any other name
# is used for them either in podSpec or container spec or both specs then `builder` and `runtime`
# deployments will not be created
NEW_ENV=python-new-${TEST_ID}
echo "Writing environment config to $ENV_SPEC_FILE"
cat > $ENV_SPEC_FILE <<- EOM
apiVersion: fission.io/v1
kind: Environment
metadata:
name: ${NEW_ENV}
namespace: ${RESOURCE_NS}
spec:
builder:
command: build
container:
name: builder
image: ${PYTHON_BUILDER_IMAGE}
podspec:
containers:
- name: builder-test
initContainers:
- name: init
image: alpine
command:
- "sleep"
- "1"
runtime:
container:
name: ${NEW_ENV}
resources: {}
image: ${PYTHON_RUNTIME_IMAGE}
podspec:
containers:
- name: runtime-test
initContainers:
- name: init
image: alpine
command:
- "sleep"
- "1"
version: 3
poolsize: 1
EOM
log_exec kubectl -n ${RESOURCE_NS} apply -f ${ENV_SPEC_FILE}
sleep 15
log "environment is created"
# Verify that no builder pod exists
status=0
if kubectl --namespace ${BUILDER_NS} get po -l envName=${NEW_ENV} | wc -l | grep 0 ; then
log "Builder pod does not exist"
else
log "Builder pod exists"
echo "--- Builder Env ---"
kubectl --namespace ${BUILDER_NS} get pod -l envName=${NEW_ENV} -ojson
echo "--- End Builder Env ---"
status=5
fi
# Verify that no runtime pod exists
if kubectl --namespace ${FUNCTION_NS} get po -l environmentName=${NEW_ENV} | wc -l | grep 0 ; then
log "Runtime pod does not exist"
else
log "Runtime pod exist"
echo "--- Runtime Env ---"
kubectl --namespace ${FUNCTION_NS} get po -l environmentName==${NEW_ENV} -ojson
echo "--- End Runtime Env ---"
status=5
fi
exit ${status}