diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 081150576c883dc02c58791debe86a6cd33721e0..4e69161fa503a01552855408ba55852faff44010 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,6 +6,7 @@ stages: - create-vps - setup-cluster - install-apps + - wait-for-deployments - health-test - integration-test - cleanup @@ -114,6 +115,21 @@ install: - clusters/$HOSTNAME/** key: ${CI_COMMIT_REF_SLUG} +helmreleases: + stage: wait-for-deployments + script: + - cd ansible/ + - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/secrets/kube_config_cluster.yml" + - pytest -v -s -m 'helmreleases' --connection=ansible --ansible-inventory=../clusters/${HOSTNAME}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 + only: + changes: + - .gitlab-ci.yml + - ansible/**/* + - helmfiles/**/* + - test/**/* + - openappstack/**/* + extends: .ssh_setup + testinfra: stage: health-test script: @@ -242,4 +258,3 @@ gitlab-merge-workaround: stage: cleanup script: - echo "That went well" - diff --git a/requirements.txt b/requirements.txt index 90e189fe79eb878c9fc871a5f6e8306a4c968d2d..0f687aee224465c59e96f3537a93dc975bd4bebd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,6 +9,7 @@ paramiko psutil>=5.5.0 pyopenssl>=19.0.0 pytest>=4.3.0 +pytest-rerunfailures requests>=2.19.1 tabulate>=0.8.3 testinfra>=3.0.0 diff --git a/test/pytest.ini b/test/pytest.ini index 281b543c47df5bbb53f9cb07b703820a3880a5e6..d3dc444a35b02c1c3a48e6f14ea522c6fca17087 100644 --- a/test/pytest.ini +++ b/test/pytest.ini @@ -4,3 +4,8 @@ markers = certs: Run tests related to TLS certificates testinfra: Run testinfra tests (test OS/package versions etc) prometheus: Test prometheus + helmreleases: Test delpoyed helmreleases installed by weave flux + +# https://docs.pytest.org/en/latest/warnings.html +filterwarnings = + ignore::DeprecationWarning diff --git a/test/pytest/test_helmreleases.py b/test/pytest/test_helmreleases.py new file mode 100644 index 0000000000000000000000000000000000000000..058e6cab7168bcb602f45f5a394452d555aa0dec --- /dev/null +++ b/test/pytest/test_helmreleases.py @@ -0,0 +1,52 @@ +import pytest +from kubernetes import client, config + + +def get_release(name, namespace, api): + print('Testing %s in namespace %s ...' % (name, namespace), end='') + try: + release = api.get_namespaced_custom_object( + group="helm.fluxcd.io", + version="v1", + plural="helmreleases", + name=name, + namespace=namespace + ) + release_name = release['status']['releaseName'] + release_status = release['status']['releaseStatus'] + print(release_status) + except Exception as e: + release_name = 'n/a' + release_status = 'n/a' + print("**** NOT DEPLOYED, status: %s *****" % release_status) + print("Exception: %s" % e) + + return(release_name, release_status) + + +@pytest.mark.helmreleases +def test_helmreleases(): + """Checks if all desired HelmReleases installed by weave flux are in + DEPLOYED state. + """ + expected_releases = { + 'oas': ['cert-manager', 'ingress', 'local-storage', 'monitoring'], + 'oas-apps': ['nextcloud'] + } + + config.load_kube_config() + customObjects = client.CustomObjectsApi() + + failed = 0 + # test_release('nextcloud', 'oas-apps') + print('\n') + for namespace in expected_releases: + for app in expected_releases[namespace]: + app_status = get_release(app, namespace, customObjects) + if app_status[1] != 'DEPLOYED': + failed += 1 + assert failed == 0, "Error: %s apps NOT DEPLOYED !" % failed + + +if __name__ == "__main__": + test_helmreleases()