diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f720a92a007503b76775732355ff4db9bf1483a1..3c31df376ab8d6ee54c994fa6c64612e3b34b584 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -170,7 +170,7 @@ stages: - base-helm-release - install-apps - apps-helm-release - - apps-ready + - apps-deployment - certs - health-test - integration-test @@ -555,13 +555,13 @@ wordpress-helm-release: # # Tests apps for readiness state -.apps-ready: - stage: apps-ready +.apps-deployment: + stage: apps-deployment script: - *debug_information - cd ansible/ - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml" - - pytest -v -s -m 'apps_running' --resource="$RESOURCE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 + - pytest -v -s -m 'deployment' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 extends: - .ssh_setup interruptible: true @@ -569,111 +569,122 @@ wordpress-helm-release: cert-manager-ready: variables: RESOURCE: "cert-manager" + NAMESPACE: "cert-manager" needs: - job: cert-manager-helm-release - job: setup-openappstack # Needs makes sure the artifacts from that job are downloaded extends: - - .apps-ready + - .apps-deployment - .cert_manager_rules eventrouter-ready: variables: RESOURCE: "eventrouter" + NAMESPACE: "oas" needs: - job: eventrouter-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .eventrouter_rules local-path-provisioner-ready: variables: RESOURCE: "local-path-provisioner" + NAMESPACE: "kube-system" needs: - job: local-path-provisioner-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .local_path_provisioner_rules loki-ready: variables: RESOURCE: "loki" + NAMESPACE: "oas" needs: - job: loki-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .loki_rules promtail-ready: variables: RESOURCE: "promtail" + NAMESPACE: "oas" needs: - job: promtail-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .promtail_rules nextcloud-ready: variables: RESOURCE: "nextcloud" + NAMESPACE: "oas-apps" needs: - job: nextcloud-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .nextcloud_rules kube-prometheus-stack-ready: variables: RESOURCE: "kube-prometheus-stack" + NAMESPACE: "oas" needs: - job: kube-prometheus-stack-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .kube_prometheus_stack_rules rocketchat-ready: variables: RESOURCE: "rocketchat" + NAMESPACE: "oas-apps" needs: - job: rocketchat-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .rocketchat_rules single-sign-on-ready: variables: RESOURCE: "single-sign-on" + NAMESPACE: "oas" needs: - job: single-sign-on-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .single_sign_on_rules wekan-ready: variables: RESOURCE: "wekan" + NAMESPACE: "oas-apps" needs: - job: wekan-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .wekan_rules wordpress-ready: variables: RESOURCE: "wordpress" + NAMESPACE: "oas-apps" needs: - job: wordpress-helm-release - job: setup-openappstack extends: - - .apps-ready + - .apps-deployment - .wordpress_rules # Stage: certs diff --git a/test/pytest/test_resources.py b/test/pytest/test_resources.py index f7467d415ac49f9b3e03d0b0cacb1289070b615d..0072298b92d6da5e1b950d3de3e2cc3ca7052ca2 100644 --- a/test/pytest/test_resources.py +++ b/test/pytest/test_resources.py @@ -17,10 +17,12 @@ import pytest # Helper functions -def check_resource(api, api_group, api_version, plural, name, namespace='flux-system'): +def check_resource(api, api_group, api_version, plural, name, namespace): """Returns status contition for resource in given namespace""" - print(f'Resource {name} in namespace {namespace} ' - f'api version: {api_group}/{api_version}): ', end='') + if not namespace: + namespace='flux-system' + print(f'Resource "{name}" in namespace "{namespace}" ' + f'(api version: {api_group}/{api_version}): ', end='') try: resource = api.get_namespaced_custom_object( group=api_group, @@ -54,7 +56,6 @@ def check_custom_objects(api, api_group, api_version, plural, name, namespace='f failed = 0 failed_resources = [] - print('\n') if name != 'all': status = check_resource( @@ -91,50 +92,7 @@ def check_custom_objects(api, api_group, api_version, plural, name, namespace='f if status != 'True': failed += 1 failed_resources.append(resource_name) - assert failed == 0, f"Error: {failed} kustomizations not ready ({failed_resources})!" - -def check_objects(api, api_group, api_version, plural, name, namespace='flux-system'): - """ - Checks if all resoures of a given object are ready. - """ - - failed = 0 - failed_resources = [] - print('\n') - - if name != 'all': - status = check_resource( - api=api, - api_group=api_group, - api_version=api_version, - plural=plural, - name=name, - namespace=namespace) - if status != 'True': - failed += 1 - failed_resources.append(name) - else: - objects = api.list_namespaced_custom_object( - group=api_group, - version=api_version, - plural=plural, - namespace=namespace_name, - watch=False - ) - for custom_object in custom_objects['items']: - resource_name = custom_object['metadata']['name'] - status = check_resource( - api=api, - api_group=api_group, - api_version=api_version, - plural=plural, - name=resource_name, - namespace=namespace_name) - if status != 'True': - failed += 1 - failed_resources.append(resource_name) - assert failed == 0, f"Error: {failed} kustomizations not ready ({failed_resources})!" - + assert failed == 0, f"Error: {failed} resources not ready ({failed_resources})!" def check_all_pods_running(pods): """ @@ -146,7 +104,7 @@ def check_all_pods_running(pods): """ ret = True for pod in pods: - print("- {}: {}".format(pod.metadata.name, pod.status.phase)) + print(f"- {pod.metadata.name}: {pod.status.phase}") if pod.status.phase != "Running": ret = False return ret @@ -205,15 +163,27 @@ def test_helmreleases(resource, namespace): @pytest.mark.deployments def test_deployments(resource, namespace): """ - Checks if all the pods related to releases in EXPECTED_RELEASES are - ready + Check if deployments are ready """ - api = client.CoreV1Api() - check_custom_objects( - api=api, - api_group='', - api_version='', - plural='deployments', - name=resource, - namespace=namespace) + failed = 0 + failed_resources = [] + api = client.AppsV1Api() + + if resource != 'all': + status = api.read_namespaced_deployment_status(resource, namespace) + ready = status.status.conditions[0].status + print(f'Deployment "{resource}" in namespace "{namespace}": {ready}') + else: + deployments = api.list_deployment_for_all_namespaces() + for deployment in deployments.items: + resource = deployment.metadata.name + namespace = deployment.metadata.namespace + status = api.read_namespaced_deployment_status(resource, namespace) + ready = status.status.conditions[0].status + print(f'Deployment "{resource}" in namespace "{namespace}": {ready}') + if ready != 'True': + failed += 1 + failed_resources.append(resource) + + assert failed == 0, f"Error: {failed} resources not ready ({failed_resources})!"