From 1de303e8bd570ca3528b74d2288072f56001ddd2 Mon Sep 17 00:00:00 2001 From: Varac <varac@varac.net> Date: Thu, 29 Jul 2021 19:14:06 +0200 Subject: [PATCH] Properly test kustomizations in CI --- test/pytest/test_app_deployments.py | 70 +++++++++++++++++++---------- 1 file changed, 46 insertions(+), 24 deletions(-) diff --git a/test/pytest/test_app_deployments.py b/test/pytest/test_app_deployments.py index 40e25f52c..5f3816225 100644 --- a/test/pytest/test_app_deployments.py +++ b/test/pytest/test_app_deployments.py @@ -1,9 +1,9 @@ """ This module contains tests for: -- test_helmreleases: if all the helmreleases are ready -- test_apps_running: if all the applications are running without problems - (i.e., condition = Ready for all the related pods) +- test_kustomizations: Test if all kustomizations are ready +- test_helmreleases: Test if all the helmreleases are ready +- test_apps_running: Test if all deployments are ready Documentation for the kubernetes client: * https://github.com/kubernetes-client/python/blob/master/kubernetes/README.md @@ -16,9 +16,9 @@ from kubernetes.client.rest import ApiException import pytest -def get_kustomization_status(name, api, namespace="flux-system"): +def get_kustomization_status(api, name, namespace='flux-system'): """Returns status contition for kustomization `name` in `namespace`""" - print('Testing %s in namespace %s ...' % (name, namespace), end='') + print('Testing kustomization %s in namespace %s ...' % (name, namespace), end='') try: kustomization = api.get_namespaced_custom_object( group="kustomize.toolkit.fluxcd.io", @@ -28,6 +28,7 @@ def get_kustomization_status(name, api, namespace="flux-system"): namespace=namespace ) ks_status = kustomization['status']['conditions'][0]['status'] + print(ks_status) except ApiException as ex: if ex.status == 404: ks_status = 'Not found' @@ -40,7 +41,7 @@ def get_kustomization_status(name, api, namespace="flux-system"): print(kustomization) return ks_status -def get_release_status(name, namespace, api): +def get_release_status(api, name, namespace): """Returns release status for release `name` in `namespace`""" print('Testing helmrelease %s in namespace %s ...' % (name, namespace), end='') try: @@ -95,33 +96,54 @@ def run_around_tests(): @pytest.mark.app @pytest.mark.kustomizations -def test_kustomizations(app): +def test_kustomizations(app, namespace): """ - Checks if all desired Kustomizations installed by weave flux are in + Checks if all kustomizations installed by weave flux are in 'Ready' state. """ - if app == 'base': - kustomizations = EXPECTED_KUSTOMIZATIONS_BASE - else: - kustomizations = [app] custom_objects = client.CustomObjectsApi() - failed = 0 + failed_apps = [] print('\n') - for kustomization in kustomizations: - ks_status = get_kustomization_status(kustomization, custom_objects) - if ks_status != 'True': + if app != 'all': + print(f"Testing single kustomization: {app}") + release_status = get_kustomization_status( + custom_objects, app, namespace) + if release_status != 'True': failed += 1 + failed_apps.append(app) + else: + # we can't get a list of custom objects from all namespaces, + # so we have to iterate over all namespaces. See + # https://github.com/kubernetes-client/python/issues/1377 + core_api = client.CoreV1Api() + namespaces = core_api.list_namespace(watch=False) + for namespace_object in namespaces.items: + namespace_name = namespace_object.metadata.name + kustomizations = custom_objects.list_namespaced_custom_object( + group="kustomize.toolkit.fluxcd.io", + version="v1beta1", + plural="kustomizations", + namespace=namespace_name, + watch=False + ) + for kustomization_object in kustomizations['items']: + kustomization_name = kustomization_object['metadata']['name'] + kustomization_status = get_kustomization_status( + custom_objects, kustomization_name, namespace_name) + if kustomization_status != 'True': + failed += 1 + failed_apps.append(kustomization_name) + assert failed == 0, f"Error: {failed} kustomizations not ready ({failed_apps})!" - assert failed == 0, f"Error: {failed} kustomizations not 'ready'!" @pytest.mark.app @pytest.mark.helmreleases def test_helmreleases(app, namespace): """ - Checks if all desired HelmReleases installed by weave flux are in + Checks if all HelmReleases installed by weave flux are in 'Ready' state. """ @@ -132,7 +154,7 @@ def test_helmreleases(app, namespace): if app != 'all': release_status = get_release_status( - app, namespace, custom_objects) + custom_objects, app, namespace) if release_status != 'True': failed += 1 failed_apps.append(app) @@ -142,8 +164,8 @@ def test_helmreleases(app, namespace): # https://github.com/kubernetes-client/python/issues/1377 core_api = client.CoreV1Api() namespaces = core_api.list_namespace(watch=False) - for namespace in namespaces.items: - namespace_name = namespace.metadata.name + for namespace_object in namespaces.items: + namespace_name = namespace_object.metadata.name releases = custom_objects.list_namespaced_custom_object( group="helm.toolkit.fluxcd.io", version="v2beta1", @@ -151,10 +173,10 @@ def test_helmreleases(app, namespace): namespace=namespace_name, watch=False ) - for release in releases['items']: - release_name = release['metadata']['name'] + for release_object in releases['items']: + release_name = release_object['metadata']['name'] release_status = get_release_status( - release_name, namespace_name, custom_objects) + custom_objects, release_name, namespace_name) if release_status != 'True': failed += 1 failed_apps.append(release_name) -- GitLab