Skip to content

Commit

Permalink
jupyter tests
Browse files Browse the repository at this point in the history
  • Loading branch information
deusebio committed Jan 31, 2024
1 parent d934433 commit c417c76
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 45 deletions.
10 changes: 7 additions & 3 deletions .github/workflows/integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,13 @@ jobs:
# Import artifact into microk8s to be used in integration tests
sudo make import TARGET=microk8s PREFIX=test- REPOSITORY=ghcr.io/canonical/ \
-o $(find .make_cache -name "*.tag")
sg microk8s -c "make tests"
- name: Run tests (Jupyter)
run: |
# Import artifact into docker with new tag
sudo make jupyter TARGET=docker REPOSITORY=ghcr.io/canonical/ PREFIX=test- \
sudo make import FLAVOUR=jupyter TARGET=microk8s REPOSITORY=ghcr.io/canonical/ PREFIX=test- \
-o $(find .make_cache -name "*.tag")
sg microk8s -c "make tests"
sg microk8s -c "make tests FLAVOUR=jupyter"
65 changes: 36 additions & 29 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ REPOSITORY :=
PREFIX :=
TARGET := docker
PLATFORM := amd64
FLAVOUR := "base"

# ======================
# INTERNAL VARIABLES
Expand All @@ -35,15 +36,21 @@ BASE_NAME=$(IMAGE_NAME)_$(VERSION)_$(PLATFORM).tar
_ROCK_OCI=$(IMAGE_NAME)_$(VERSION)_$(PLATFORM).rock

_TMP_OCI_NAME := stage-$(IMAGE_NAME)
_TMP_OCI_TAG := $(_MAKE_DIR)/$(_TMP_OCI_NAME)/$(TAG).tag
_TMP_OCI_TAG := $(_MAKE_DIR)/$(_TMP_OCI_NAME)/$(TAG)

CHARMED_OCI_FULL_NAME=$(REPOSITORY)$(PREFIX)$(IMAGE_NAME)
CHARMED_OCI_TAG := $(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)/$(TAG).tag
CHARMED_OCI_TAG := $(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)/$(TAG)

CHARMED_OCI_JUPYTER=$(CHARMED_OCI_FULL_NAME)-jupyterlab
CHARMED_OCI_JUPYTER_TAG := $(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)/$(TAG).tag

SCOPE := "base"
CHARMED_OCI_JUPYTER_TAG := $(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)/$(TAG)

ifeq ($(FLAVOUR), jupyter)
NAME=$(CHARMED_OCI_JUPYTER)
FTAG=$(CHARMED_OCI_JUPYTER_TAG)
else
NAME=$(CHARMED_OCI_FULL_NAME)
FTAG=$(CHARMED_OCI_TAG)
endif

help:
@echo "---------------HELP-----------------"
Expand All @@ -69,18 +76,13 @@ $(_ROCK_OCI): rockcraft.yaml
@echo "=== Building Charmed Image ==="
rockcraft pack

$(_TMP_OCI_TAG): $(_ROCK_OCI)
$(_TMP_OCI_TAG).tag: $(_ROCK_OCI)
skopeo --insecure-policy \
copy \
oci-archive:"$(_ROCK_OCI)" \
docker-daemon:"$(_TMP_OCI_NAME):$(TAG)"
if [ ! -d "$(_MAKE_DIR)/$(_TMP_OCI_NAME)" ]; then mkdir -p "$(_MAKE_DIR)/$(_TMP_OCI_NAME)"; fi
touch $(_TMP_OCI_TAG)

$(CHARMED_OCI_TAG): $(_TMP_OCI_TAG) build/Dockerfile
docker build -t "$(CHARMED_OCI_FULL_NAME):$(TAG)" --build-arg BASE_IMAGE="$(_TMP_OCI_NAME):$(TAG)" -f build/Dockerfile .
if [ ! -d "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)" ]; then mkdir -p "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)"; fi
touch $(CHARMED_OCI_TAG)
touch $(_TMP_OCI_TAG).tag

$(K8S_TAG):
@echo "=== Setting up and configure local Microk8s cluster ==="
Expand All @@ -90,42 +92,47 @@ $(K8S_TAG):

microk8s: $(K8S_TAG)

$(_MAKE_DIR)/%/$(TAG).tar: $(_MAKE_DIR)/%/$(TAG).tag
docker save $*:$(TAG) > $(_MAKE_DIR)/$*/$(TAG).tar
$(CHARMED_OCI_TAG).tag: $(_TMP_OCI_TAG).tag build/Dockerfile
docker build -t "$(CHARMED_OCI_FULL_NAME):$(TAG)" --build-arg BASE_IMAGE="$(_TMP_OCI_NAME):$(TAG)" -f build/Dockerfile .
if [ ! -d "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)" ]; then mkdir -p "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)"; fi
touch $(CHARMED_OCI_TAG).tag

$(CHARMED_OCI_JUPYTER_TAG): $(CHARMED_OCI_TAG) build/Dockerfile.jupyter files/jupyter
$(CHARMED_OCI_JUPYTER_TAG).tag: $(CHARMED_OCI_TAG).tag build/Dockerfile.jupyter files/jupyter
docker build -t "$(CHARMED_OCI_JUPYTER):$(TAG)" --build-arg BASE_IMAGE="$(CHARMED_OCI_FULL_NAME):$(TAG)" -f build/Dockerfile.jupyter .
if [ ! -d "$(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)" ]; then mkdir -p "$(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)"; fi
touch $(CHARMED_OCI_JUPYTER_TAG)
touch $(CHARMED_OCI_JUPYTER_TAG).tag

$(BASE_NAME): $(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)/$(TAG).tar
@echo "=== Creating $(BASE_NAME) OCI archive ==="
cp $(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)/$(TAG).tar $(BASE_NAME)
$(_MAKE_DIR)/%/$(TAG).tar: $(_MAKE_DIR)/%/$(TAG).tag
docker save $*:$(TAG) > $(_MAKE_DIR)/$*/$(TAG).tar

build: $(BASE_NAME)
$(BASE_NAME): $(FTAG).tar
@echo "=== Creating $(BASE_NAME) OCI archive (flavour: $(FLAVOUR)) ==="
cp $(FTAG).tar $(BASE_NAME)

jupyter: $(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)/$(TAG).tar
@echo "=== Creating $(BASE_NAME) OCI jupyter archive ==="
cp $(_MAKE_DIR)/$(CHARMED_OCI_JUPYTER)/$(TAG).tar $(IMAGE_NAME)-jupyter_$(VERSION)_$(PLATFORM).tar
build: $(BASE_NAME)

ifeq ($(TARGET), docker)
import: build
@echo "=== Importing image $(CHARMED_OCI_FULL_NAME):$(TAG) into docker ==="
@echo "=== Importing image $(NAME):$(TAG) into docker ==="
$(eval IMAGE := $(shell docker load -i $(BASE_NAME)))
docker tag $(lastword $(IMAGE)) $(CHARMED_OCI_FULL_NAME):$(TAG)
if [ ! -d "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)" ]; then mkdir -p "$(_MAKE_DIR)/$(CHARMED_OCI_FULL_NAME)"; fi
touch $(CHARMED_OCI_TAG)
docker tag $(lastword $(IMAGE)) $(NAME):$(TAG)
if [ ! -d "$(_MAKE_DIR)/$(NAME)" ]; then mkdir -p "$(_MAKE_DIR)/$(NAME)"; fi
touch $(FTAG).tag
endif

ifeq ($(TARGET), microk8s)
import: $(K8S_TAG) build
@echo "=== Importing image $(CHARMED_OCI_FULL_NAME):$(TAG) into Microk8s container registry ==="
microk8s ctr images import --base-name $(CHARMED_OCI_FULL_NAME):$(TAG) $(BASE_NAME)
@echo "=== Importing image $(NAME):$(TAG) into Microk8s container registry ==="
microk8s ctr images import --base-name $(NAME):$(TAG) $(BASE_NAME)
endif

tests:
@echo "=== Running Integration Tests ==="
ifeq ($(FLAVOUR), jupyter)
/bin/bash ./tests/integration/integration-tests-jupyter.sh
else
/bin/bash ./tests/integration/integration-tests.sh
endif

clean:
@echo "=== Cleaning environment ==="
Expand Down
62 changes: 49 additions & 13 deletions tests/integration/integration-tests-jupyter.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ get_spark_version(){
}

spark_image(){
echo "ghcr.io/canonical/test-charmed-spark:$(get_spark_version)"
echo "ghcr.io/canonical/test-charmed-spark-jupyterlab:$(get_spark_version)"
}

setup_jupyter() {
Expand All @@ -32,22 +32,28 @@ setup_jupyter() {
kubectl -n $NAMESPACE exec testpod-admin -- env UU="$USERNAME" NN="$NAMESPACE" \
/bin/bash -c 'spark-client.service-account-registry create --username $UU --namespace $NN'

IMAGE=$(spark_image)
echo $IMAGE

# Create the pod with the Spark service account
kubectl -n tests apply -f ./tests/integration/resources/jupyter.yaml
sed -e "s%<IMAGE>%${IMAGE}%g" \
-e "s/<SERVICE_ACCOUNT>/${USERNAME}/g" \
-e "s/<NAMESPACE>/${NAMESPACE}/g" \
./tests/integration/resources/jupyter.yaml | \
kubectl -n tests apply -f -

wait_for_pod testpod $NAMESPACE
}
wait_for_pod charmed-spark-jupyter $NAMESPACE

setup_user_context() {
setup_user spark $NAMESPACE
# WAIT FOR SERVER TO BE UP AND RUNNING
sleep 10
}

cleanup_user() {
EXIT_CODE=$1
USERNAME=$2
NAMESPACE=$3

kubectl -n $NAMESPACE delete pod testpod --wait=true
kubectl -n $NAMESPACE delete pod charmed-spark-jupyter --wait=true

kubectl -n $NAMESPACE exec testpod-admin -- env UU="$USERNAME" NN="$NAMESPACE" \
/bin/bash -c 'spark-client.service-account-registry delete --username $UU --namespace $NN'
Expand All @@ -61,6 +67,7 @@ cleanup_user() {
fi

if [ "${EXIT_CODE}" -ne "0" ]; then
kubectl delete ns $NAMESPACE
exit 1
fi
}
Expand Down Expand Up @@ -120,15 +127,44 @@ setup_admin_test_pod() {
}

teardown_test_pod() {
kubectl -n $NAMESPACE delete pod testpod
kubectl -n $NAMESPACE delete pod testpod-admin

kubectl delete namespace $NAMESPACE
}

cleanup_user_failure_in_pod() {
teardown_test_pod
cleanup_user_failure
get_status_code() {
URL=$1

STATUS_CODE=$(curl -X GET -o /dev/null --silent --head --write-out '%{http_code}\n' "${URL}")

echo $STATUS_CODE
}

test_connection(){
SERVICE_IP=$(kubectl get svc jupyter-service -n $NAMESPACE -o yaml | yq .spec.clusterIP)

echo "Jupyter service IP: ${SERVICE_IP}"

STATUS_CODE=$(get_status_code "http://${SERVICE_IP}:8888/jupyter-test/lab")

if [[ "${STATUS_CODE}" -ne "200" ]]; then
echo "200 exit code NOT returned"
exit 1
fi

STATUS_CODE=$(get_status_code "http://${SERVICE_IP}:8888/jupyter-test")

if [[ "${STATUS_CODE}" -ne "302" ]]; then
echo "302 exit code NOT returned"
exit 1
fi

STATUS_CODE=$(get_status_code "http://${SERVICE_IP}:8888")

if [[ "${STATUS_CODE}" -ne "404" ]]; then
echo "404 exit code NOT returned"
exit 1
fi

}

echo -e "##################################"
Expand All @@ -141,7 +177,7 @@ echo -e "##################################"
echo -e "START JUPYTER SERVICE"
echo -e "##################################"

(setup_user_context && test_example_job_in_pod && cleanup_user_success) || cleanup_user_failure_in_pod
(setup_jupyter spark tests && test_connection && cleanup_user_success) || cleanup_user_failure

echo -e "##################################"
echo -e "TEARDOWN ADMIN POD"
Expand Down

0 comments on commit c417c76

Please sign in to comment.