diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8250733e43c40e646ef6ad603590fdc24cebf2c6..a9d6ee29e00cbbdf2e5568720a0c5d32e6097d91 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -42,152 +42,11 @@ before_script:
   services:
     - docker:dind
   before_script:
-    - /usr/bin/python -m pip install -r tests/requirements.txt
-    - mkdir -p /.ssh
-    - mkdir -p $HOME/.ssh
-    - ansible-playbook --version
-    - export PYPATH=$([[ ! "$CI_JOB_NAME" =~ "coreos" ]] && echo /usr/bin/python || echo /opt/bin/python)
-    - echo "CI_JOB_NAME is $CI_JOB_NAME"
-    - echo "PYPATH is $PYPATH"
+    - ./tests/scripts/testcases_prepare.sh
   script:
-    - pwd
-    - ls
-    - echo ${PWD}
-    - echo "${STARTUP_SCRIPT}"
-    # Docker is required on the ansible host for download_run_once and download_localhost
-    - docker info
-    - cd tests && make create-${CI_PLATFORM} -s ; cd -
-
-    # Check out latest tag if testing upgrade
-    - test "${UPGRADE_TEST}" != "false" && git fetch --all && git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
-    # Checkout the CI vars file so it is available
-    - test "${UPGRADE_TEST}" != "false" && git checkout "${CI_BUILD_REF}" tests/files/${CI_JOB_NAME}.yml
-
-    # Create cluster
-    - >
-      ansible-playbook
-      -i ${ANSIBLE_INVENTORY}
-      -b --become-user=root
-      --private-key=${HOME}/.ssh/id_rsa
-      -u $SSH_USER
-      ${SSH_ARGS}
-      ${LOG_LEVEL}
-      -e @${CI_TEST_VARS}
-      -e ansible_ssh_user=${SSH_USER}
-      -e local_release_dir=${PWD}/downloads
-      --limit "all:!fake_hosts"
-      cluster.yml
-
-    # Repeat deployment if testing upgrade
-    - >
-      if [ "${UPGRADE_TEST}" != "false" ]; then
-      test "${UPGRADE_TEST}" == "basic" && PLAYBOOK="cluster.yml";
-      test "${UPGRADE_TEST}" == "graceful" && PLAYBOOK="upgrade-cluster.yml";
-      git checkout "${CI_BUILD_REF}";
-      ansible-playbook
-      -i ${ANSIBLE_INVENTORY}
-      -b --become-user=root
-      --private-key=${HOME}/.ssh/id_rsa
-      -u $SSH_USER
-      ${SSH_ARGS}
-      ${LOG_LEVEL}
-      -e @${CI_TEST_VARS}
-      -e ansible_ssh_user=${SSH_USER}
-      -e local_release_dir=${PWD}/downloads
-      --limit "all:!fake_hosts"
-      $PLAYBOOK;
-      fi
-
-    # Tests Cases
-    ## Test Master API
-    - ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root --limit "all:!fake_hosts" tests/testcases/010_check-apiserver.yml $LOG_LEVEL
-
-    ## Test that all pods are Running
-    - ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root --limit "all:!fake_hosts" tests/testcases/015_check-pods-running.yml $LOG_LEVEL
-
-    ## Ping the between 2 pod
-    - ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root --limit "all:!fake_hosts" tests/testcases/030_check-network.yml $LOG_LEVEL
-
-    ## Advanced DNS checks
-    - ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml $LOG_LEVEL
-
-    ## Idempotency checks 1/5 (repeat deployment)
-    - >
-      if [ "${IDEMPOT_CHECK}" = "true" ]; then
-        ansible-playbook
-        -i ${ANSIBLE_INVENTORY}
-        -b --become-user=root
-        --private-key=${HOME}/.ssh/id_rsa
-        -u $SSH_USER
-        ${SSH_ARGS}
-        ${LOG_LEVEL}
-        -e @${CI_TEST_VARS}
-        -e ansible_python_interpreter=${PYPATH}
-        -e local_release_dir=${PWD}/downloads
-        --limit "all:!fake_hosts"
-        cluster.yml;
-      fi
-
-    ## Idempotency checks 2/5 (Advanced DNS checks)
-    - >
-      if [ "${IDEMPOT_CHECK}" = "true" ]; then
-        ansible-playbook
-        -i ${ANSIBLE_INVENTORY}
-        -b --become-user=root
-        --private-key=${HOME}/.ssh/id_rsa
-        -u $SSH_USER
-        ${SSH_ARGS}
-        ${LOG_LEVEL}
-        -e @${CI_TEST_VARS}
-        --limit "all:!fake_hosts"
-        tests/testcases/040_check-network-adv.yml;
-      fi
-
-    ## Idempotency checks 3/5 (reset deployment)
-    - >
-      if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
-        ansible-playbook
-        -i ${ANSIBLE_INVENTORY}
-        -b --become-user=root
-        --private-key=${HOME}/.ssh/id_rsa
-        -u $SSH_USER
-        ${SSH_ARGS}
-        ${LOG_LEVEL}
-        -e @${CI_TEST_VARS}
-        -e ansible_python_interpreter=${PYPATH}
-        -e reset_confirmation=yes
-        --limit "all:!fake_hosts"
-        reset.yml;
-      fi
-
-    ## Idempotency checks 4/5 (redeploy after reset)
-    - >
-      if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
-        ansible-playbook
-        -i ${ANSIBLE_INVENTORY}
-        -b --become-user=root
-        --private-key=${HOME}/.ssh/id_rsa
-        -u $SSH_USER
-        ${SSH_ARGS}
-        ${LOG_LEVEL}
-        -e @${CI_TEST_VARS}
-        -e ansible_python_interpreter=${PYPATH}
-        -e local_release_dir=${PWD}/downloads
-        --limit "all:!fake_hosts"
-        cluster.yml;
-      fi
-
-    ## Idempotency checks 5/5 (Advanced DNS checks)
-    - >
-      if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
-        ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH}
-        -u $SSH_USER -e ansible_ssh_user=$SSH_USER $SSH_ARGS -b --become-user=root
-        --limit "all:!fake_hosts"
-        tests/testcases/040_check-network-adv.yml $LOG_LEVEL;
-      fi
-
+    - ./tests/scripts/testcases_run.sh
   after_script:
-    - cd tests && make delete-${CI_PLATFORM} -s ; cd -
+    - ./tests/scripts/testcases_cleanup.sh
 
 # For failfast, at least 1 job must be defined in .gitlab-ci.yml
 # Premoderated with manual actions
diff --git a/tests/scripts/testcases_cleanup.sh b/tests/scripts/testcases_cleanup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..0e1d0f27f82a9b810b62604dc70946f68d9654a6
--- /dev/null
+++ b/tests/scripts/testcases_cleanup.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -euxo pipefail
+
+cd tests && make delete-${CI_PLATFORM} -s ; cd -
diff --git a/tests/scripts/testcases_prepare.sh b/tests/scripts/testcases_prepare.sh
new file mode 100755
index 0000000000000000000000000000000000000000..4f5610097f8562e1f8640e92c7f2b4db2bb9012d
--- /dev/null
+++ b/tests/scripts/testcases_prepare.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+set -euxo pipefail
+
+/usr/bin/python -m pip install -r tests/requirements.txt
+mkdir -p /.ssh
+mkdir -p $HOME/.ssh
+ansible-playbook --version
diff --git a/tests/scripts/testcases_run.sh b/tests/scripts/testcases_run.sh
new file mode 100755
index 0000000000000000000000000000000000000000..de5b95745cac7706b2c1566feffff0c71bad1b96
--- /dev/null
+++ b/tests/scripts/testcases_run.sh
@@ -0,0 +1,67 @@
+#!/bin/bash
+set -euxo pipefail
+
+export PYPATH=$([[ ! "$CI_JOB_NAME" =~ "coreos" ]] && echo /usr/bin/python || echo /opt/bin/python)
+echo "CI_JOB_NAME is $CI_JOB_NAME"
+echo "PYPATH is $PYPATH"
+pwd
+ls
+echo ${PWD}
+cd tests && make create-${CI_PLATFORM} -s ; cd -
+
+# Check out latest tag if testing upgrade
+test "${UPGRADE_TEST}" != "false" && git fetch --all && git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
+# Checkout the CI vars file so it is available
+test "${UPGRADE_TEST}" != "false" && git checkout "${CI_BUILD_REF}" tests/files/${CI_JOB_NAME}.yml
+
+# Create cluster
+ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} -e ansible_ssh_user=${SSH_USER} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+
+# Repeat deployment if testing upgrade
+if [ "${UPGRADE_TEST}" != "false" ]; then
+  test "${UPGRADE_TEST}" == "basic" && PLAYBOOK="cluster.yml"
+  test "${UPGRADE_TEST}" == "graceful" && PLAYBOOK="upgrade-cluster.yml"
+  git checkout "${CI_BUILD_REF}"
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} -e ansible_ssh_user=${SSH_USER} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" $PLAYBOOK
+fi
+
+# Tests Cases
+## Test Master API
+ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/010_check-apiserver.yml $LOG_LEVEL
+
+## Test that all pods are Running
+ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/015_check-pods-running.yml $LOG_LEVEL
+
+## Test pod creation
+ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/020_check-create-pod.yml $LOG_LEVEL
+
+## Ping the between 2 pod
+ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/030_check-network.yml $LOG_LEVEL
+
+## Advanced DNS checks
+ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml $LOG_LEVEL
+
+## Idempotency checks 1/5 (repeat deployment)
+if [ "${IDEMPOT_CHECK}" = "true" ]; then
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} -e ansible_python_interpreter=${PYPATH} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+fi
+
+## Idempotency checks 2/5 (Advanced DNS checks)
+if [ "${IDEMPOT_CHECK}" = "true" ]; then
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml
+fi
+
+## Idempotency checks 3/5 (reset deployment)
+if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} -e ansible_python_interpreter=${PYPATH} -e reset_confirmation=yes --limit "all:!fake_hosts" reset.yml
+fi
+
+## Idempotency checks 4/5 (redeploy after reset)
+if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -b --become-user=root --private-key=${HOME}/.ssh/id_rsa -u $SSH_USER ${LOG_LEVEL} -e @${CI_TEST_VARS} -e ansible_python_interpreter=${PYPATH} -e local_release_dir=${PWD}/downloads --limit "all:!fake_hosts" cluster.yml
+fi
+
+## Idempotency checks 5/5 (Advanced DNS checks)
+if [ "${IDEMPOT_CHECK}" = "true" -a "${RESET_CHECK}" = "true" ]; then
+  ansible-playbook -i ${ANSIBLE_INVENTORY} -e ansible_python_interpreter=${PYPATH} -u $SSH_USER -e ansible_ssh_user=$SSH_USER -b --become-user=root --limit "all:!fake_hosts" tests/testcases/040_check-network-adv.yml $LOG_LEVEL
+fi
diff --git a/tests/testcases/030_check-network.yml b/tests/testcases/030_check-network.yml
index 14b4a5564363424d76622cc053690a48c768b25c..fc4eddd0211f82a88be147789312346bc50a4bb8 100644
--- a/tests/testcases/030_check-network.yml
+++ b/tests/testcases/030_check-network.yml
@@ -67,14 +67,14 @@
     with_items: "{{pod_ips}}"
 
   - name: Ping between pods is working
-    shell: "{{bin_dir}}/kubectl exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
+    shell: "{{bin_dir}}/kubectl -n test exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
     when: not item[0] in pods_hostnet and not item[1] in pods_hostnet
     with_nested:
     - "{{pod_names}}"
     - "{{pod_ips}}"
 
   - name: Ping between hostnet pods is working
-    shell: "{{bin_dir}}/kubectl exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
+    shell: "{{bin_dir}}/kubectl -n test exec {{item[0]}} -- ping -c 4 {{ item[1] }}"
     when: item[0] in pods_hostnet and item[1] in pods_hostnet
     with_nested:
     - "{{pod_names}}"