From 72413a4640e458690cf65f445bc10f28886f4e8f Mon Sep 17 00:00:00 2001 From: Thomas Duval Date: Mon, 22 Jan 2018 15:51:03 +0100 Subject: Functional tests development Change-Id: I641522d813f171a4eed0e6b39b2f25cc470c76d1 --- moon_forming/Dockerfile | 6 +- moon_forming/README.md | 7 +- moon_forming/config_moon.sh | 39 +++++++++++ moon_forming/run.sh | 43 ------------ moon_forming/switch.sh | 19 ++++++ moon_manager/tests/functional_pod/conftest.py | 12 ++++ .../tests/functional_pod/run_functional_tests.sh | 11 +-- moon_manager/tests/functional_pod/test_manager.py | 77 +++++++++++++++++++++ moon_manager/tests/functional_pod/test_models.py | 78 ++++++++++++++++++++++ tests/functional/run_tests.sh | 10 +++ tests/functional/run_tests_for_component.sh | 27 ++++++++ .../templates/moon_forming_functest.yaml | 30 +++++++++ 12 files changed, 302 insertions(+), 57 deletions(-) create mode 100644 moon_forming/config_moon.sh delete mode 100644 moon_forming/run.sh create mode 100644 moon_forming/switch.sh create mode 100644 moon_manager/tests/functional_pod/conftest.py create mode 100644 moon_manager/tests/functional_pod/test_manager.py create mode 100644 moon_manager/tests/functional_pod/test_models.py create mode 100644 tests/functional/run_tests_for_component.sh create mode 100644 tools/moon_kubernetes/templates/moon_forming_functest.yaml diff --git a/moon_forming/Dockerfile b/moon_forming/Dockerfile index ca0eba76..74616c89 100644 --- a/moon_forming/Dockerfile +++ b/moon_forming/Dockerfile @@ -1,11 +1,11 @@ FROM python:3 WORKDIR /usr/src/app -RUN pip install --no-cache-dir --upgrade requests pyyaml python_moonutilities python_moondb python_moonclient +RUN pip install --no-cache-dir --upgrade requests pytest pyyaml python_moonutilities python_moondb python_moonclient -ENV POPULATE_ARGS "-v" +ENV COMMAND "config" ADD . /root WORKDIR /root -CMD sh /root/run.sh ${POPULATE_ARGS} \ No newline at end of file +CMD /bin/bash /root/switch.sh ${COMMAND} diff --git a/moon_forming/README.md b/moon_forming/README.md index cc08f676..9b755d96 100644 --- a/moon_forming/README.md +++ b/moon_forming/README.md @@ -39,6 +39,9 @@ kubectl delete -f $MOON_HOME/tools/moon_kubernetes/templates/moon_forming.yaml kubectl create -f $MOON_HOME/tools/moon_kubernetes/templates/moon_forming.yaml ``` +## Functional tests - - +```bash +cd $MOON_HOME/moon_manager +bash ../tests/functional/run_tests_for_component.sh +``` diff --git a/moon_forming/config_moon.sh b/moon_forming/config_moon.sh new file mode 100644 index 00000000..0a55898f --- /dev/null +++ b/moon_forming/config_moon.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +populate_args=$* + +echo "Waiting for Consul (http://consul:8500)" +while ! python -c "import requests; req = requests.get('http://consul:8500')" 2>/dev/null ; do + sleep 5 ; + echo -n "." +done +echo "." +echo "Consul (http://consul:8500) is up." + +python3 /root/conf2consul.py /etc/moon/moon.conf + +echo "Waiting for DB (tcp://db:3306)" +while ! python -c "import socket, sys; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.connect(('db', 3306)); sys.exit(0)" 2>/dev/null ; do + sleep 5 ; + echo -n "." +done +echo "." +echo "Database (http://db:3306) is up." + +moon_db_manager upgrade + +echo "Waiting for Keystone (http://keystone:5000)" +while ! python -c "import requests; req = requests.get('http://keystone:5000')" 2>/dev/null ; do + sleep 5 ; + echo -n "." +done +echo "." +echo "Keystone (http://keystone:5000) is up." + +echo "Waiting for Manager (http://manager:8082)" +while ! python -c "import requests; req = requests.get('http://manager:8082')" 2>/dev/null ; do + sleep 5 ; + echo -n "." +done +echo "." +echo "Manager (http://manager:8082) is up." diff --git a/moon_forming/run.sh b/moon_forming/run.sh deleted file mode 100644 index d731cb17..00000000 --- a/moon_forming/run.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash - -populate_args=$* - -echo "Waiting for Consul (http://consul:8500)" -while ! python -c "import requests; req = requests.get('http://consul:8500')" 2>/dev/null ; do - sleep 5 ; - echo -n "." -done -echo "." -echo "Consul (http://consul:8500) is up." - -python3 /root/conf2consul.py /etc/moon/moon.conf - -echo "Waiting for DB (tcp://db:3306)" -while ! python -c "import socket, sys; s = socket.socket(socket.AF_INET, socket.SOCK_STREAM); s.connect(('db', 3306)); sys.exit(0)" 2>/dev/null ; do - sleep 5 ; - echo -n "." -done -echo "." -echo "Database (http://db:3306) is up." - -moon_db_manager upgrade - -echo "Waiting for Keystone (http://keystone:5000)" -while ! python -c "import requests; req = requests.get('http://keystone:5000')" 2>/dev/null ; do - sleep 5 ; - echo -n "." -done -echo "." -echo "Keystone (http://keystone:5000) is up." - -echo "Waiting for Manager (http://manager:8082)" -while ! python -c "import requests; req = requests.get('http://manager:8082')" 2>/dev/null ; do - sleep 5 ; - echo -n "." -done -echo "." -echo "Manager (http://manager:8082) is up." - -#for i in /data/*.py ; do -# moon_populate_values $populate_args --consul-host=consul --consul-port=8500 $i -#done diff --git a/moon_forming/switch.sh b/moon_forming/switch.sh new file mode 100644 index 00000000..adb1ebe9 --- /dev/null +++ b/moon_forming/switch.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash + +CMD=$1 + +echo "COMMAND IS ${CMD}" + +if [ "${CMD}" = "functest" ]; then + echo "FUNCTIONAL TESTS" + ls -l /data + ls -l /data/tests + sh /data/tests/functional_pod/run_functional_tests.sh +#elif [ $CMD == "unittest" ]; then +# sh /data/tests/functional_pod/run_functional_tests.sh +else + echo "CONFIGURATION" + bash config_moon.sh +fi + +echo "" \ No newline at end of file diff --git a/moon_manager/tests/functional_pod/conftest.py b/moon_manager/tests/functional_pod/conftest.py new file mode 100644 index 00000000..b5811755 --- /dev/null +++ b/moon_manager/tests/functional_pod/conftest.py @@ -0,0 +1,12 @@ +import pytest + +print("ANALYSING CONFTEST") + + +@pytest.fixture +def context(): + print("CREATING CONTEXT") + yield { + "hostname": "manager", + "port": 8082, + } diff --git a/moon_manager/tests/functional_pod/run_functional_tests.sh b/moon_manager/tests/functional_pod/run_functional_tests.sh index c80bf15d..7a95a491 100644 --- a/moon_manager/tests/functional_pod/run_functional_tests.sh +++ b/moon_manager/tests/functional_pod/run_functional_tests.sh @@ -1,11 +1,4 @@ #!/usr/bin/env bash -set -x - -kubectl create -n moon -f tools/moon_kubernetes/templates/moon_forming.yaml - -echo Waiting for jobs forming -sleep 5 -kubectl get jobs -n moon -kubectl logs -n moon jobs/forming - +cd /data/tests/functional_pod +pytest . diff --git a/moon_manager/tests/functional_pod/test_manager.py b/moon_manager/tests/functional_pod/test_manager.py new file mode 100644 index 00000000..aab5fba4 --- /dev/null +++ b/moon_manager/tests/functional_pod/test_manager.py @@ -0,0 +1,77 @@ +import json +import requests + + +def get_json(data): + return json.loads(data.decode("utf-8")) + + +def get_pdp(context): + req = requests.get("http://{}:{}/pdp".format( + context.get("hostname"), + context.get("port")), + timeout=3) + pdp = req.json() + return req, pdp + + +def add_pdp(context, data): + req = requests.post("http://{}:{}/pdp".format( + context.get("hostname"), + context.get("port")), + data=json.dumps(data), + headers={'Content-Type': 'application/json'}, + timeout=3) + pdp = req.json() + return req, pdp + + +def delete_pdp(context, key): + req = requests.delete("http://{}:{}/pdp/{}".format( + context.get("hostname"), + context.get("port"), key), + timeout=3) + return req + + +def delete_pdp_without_id(context): + req = requests.delete("http://{}:{}/pdp/{}".format( + context.get("hostname"), + context.get("port"), ""), + timeout=3) + return req + + +def test_get_pdp(context): + req, pdp = get_pdp(context) + assert req.status_code == 200 + assert isinstance(pdp, dict) + assert "pdps" in pdp + + +def test_add_pdp(context): + data = { + "name": "testuser", + "security_pipeline": ["policy_id_1", "policy_id_2"], + "keystone_project_id": "keystone_project_id", + "description": "description of testuser" + } + req, pdp = add_pdp(context, data) + assert req.status_code == 200 + assert isinstance(pdp, dict) + value = list(pdp["pdps"].values())[0] + assert "pdps" in pdp + assert value['name'] == "testuser" + assert value["description"] == "description of {}".format("testuser") + assert value["keystone_project_id"] == "keystone_project_id" + + +def test_delete_pdp(context): + request, pdp = get_pdp(context) + success_req = None + for key, value in pdp['pdps'].items(): + if value['name'] == "testuser": + success_req = delete_pdp(context, key) + break + assert success_req + assert success_req.status_code == 200 diff --git a/moon_manager/tests/functional_pod/test_models.py b/moon_manager/tests/functional_pod/test_models.py new file mode 100644 index 00000000..dcda9f32 --- /dev/null +++ b/moon_manager/tests/functional_pod/test_models.py @@ -0,0 +1,78 @@ +import json +import requests + + +def get_models(context): + req = requests.get("http://{}:{}/models".format( + context.get("hostname"), + context.get("port")), + timeout=3) + models = req.json() + return req, models + + +def add_models(context, name): + data = { + "name": name, + "description": "description of {}".format(name), + "meta_rules": ["meta_rule_id1", "meta_rule_id2"] + } + req = requests.post("http://{}:{}/models".format( + context.get("hostname"), + context.get("port")), + data=json.dumps(data), + headers={'Content-Type': 'application/json'}, + timeout=3) + models = req.json() + return req, models + + +def delete_models(context, name): + _, models = get_models(context) + request = None + for key, value in models['models'].items(): + if value['name'] == name: + request = requests.delete("http://{}:{}/models/{}".format(key, + context.get("hostname"), + context.get("port")), + timeout=3) + break + return request + + +def delete_models_without_id(context): + req = requests.delete("http://{}:{}/models/{}".format( + context.get("hostname"), + context.get("port"), + ""), + timeout=3) + return req + + +def test_get_models(context): + req, models = get_models(context) + assert req.status_code == 200 + assert isinstance(models, dict) + assert "models" in models + + +def test_add_models(context): + req, models = add_models(context, "testuser") + assert req.status_code == 200 + assert isinstance(models, dict) + value = list(models["models"].values())[0] + assert "models" in models + assert value['name'] == "testuser" + assert value["description"] == "description of {}".format("testuser") + assert value["meta_rules"][0] == "meta_rule_id1" + + +def test_delete_models(context): + req = delete_models(context, "testuser") + assert req.status_code == 200 + + +def test_delete_models_without_id(context): + req = delete_models_without_id(context) + assert req.status_code == 500 + diff --git a/tests/functional/run_tests.sh b/tests/functional/run_tests.sh index ced0f9f7..c5cbabbb 100644 --- a/tests/functional/run_tests.sh +++ b/tests/functional/run_tests.sh @@ -1,3 +1,13 @@ #!/usr/bin/env bash echo "starting Moon Functional Tests" + +COMPONENTS="moon_authz, moon_interface, moon_manager, moon_orchestrator, moon_wrapper" + +for dir in ${COMPONENTS}; do + echo "Testing component ${dir}" + cd ${MOON_HOME}/${dir} + docker run --rm --volume $(pwd):/data wukongsun/moon_forming:latest /bin/bash /root/switch.sh functest +done + +# TODO: download tests results diff --git a/tests/functional/run_tests_for_component.sh b/tests/functional/run_tests_for_component.sh new file mode 100644 index 00000000..fd9ab7fa --- /dev/null +++ b/tests/functional/run_tests_for_component.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +CUR_PWD=$(pwd) +INPUT_FILE=../tools/moon_kubernetes/templates/moon_forming_functest.yaml +OUTPUT_FILE=tests/functional_pod/moon_forming_functest.yaml + +echo current working directory: ${CUR_PWD} + +cat ${INPUT_FILE} | sed "s|{{PATH}}|${CUR_PWD}|" > ${OUTPUT_FILE} + +kubectl create -f ${OUTPUT_FILE} + +sleep 5 +kubectl get -n moon jobs +echo OUTPUT is $? +if [ "$?" -ne 0 ] +then + sleep 5 + kubectl get -n moon jobs +fi + +echo "waiting for FuncTests (it may takes time)..." +echo -e "\033[35m" +sed '//q' <(kubectl logs -n moon jobs/functest -f) +echo -e "\033[m" + +kubectl delete -f ${OUTPUT_FILE} diff --git a/tools/moon_kubernetes/templates/moon_forming_functest.yaml b/tools/moon_kubernetes/templates/moon_forming_functest.yaml new file mode 100644 index 00000000..4cb2c3a0 --- /dev/null +++ b/tools/moon_kubernetes/templates/moon_forming_functest.yaml @@ -0,0 +1,30 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: functest + namespace: moon +spec: + template: + metadata: + name: functest + spec: + containers: + - name: functest + image: wukongsun/moon_forming:dev + env: + - name: COMMAND + value: "functest" + volumeMounts: + - name: config-volume + mountPath: /etc/moon + - name: tests-volume + mountPath: /data + volumes: + - name: config-volume + configMap: + name: moon-config + - name: tests-volume + hostPath: + path: "{{PATH}}" + restartPolicy: Never + #backoffLimit: 4 \ No newline at end of file -- cgit 1.2.3-korg