* 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>
212 lines
5.4 KiB
Bash
Executable File
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} |