diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 428e148be7f04c46b935ff72248ae85bf44b09bf..7e913bc355c1ffb20603b1b51dd1fbb6d2ebdc85 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -181,10 +181,8 @@ stages: - create-vps - setup-cluster - kustomization - - base-helm-release - install-apps - - apps-helm-release - - apps-ready + - apps-kustomizations-ready - certs - health-test - integration-test @@ -384,57 +382,6 @@ openappstack-kustomizations-ready: extends: - .kustomization-ready -.helm-release: - script: - - *debug_information - - cd ansible/ - - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml" - - pytest -v -s -m 'helmreleases' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=../${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 20 - extends: - - .ssh_setup - interruptible: true - -# Stage: base-helm-release -# ================== -# -# Checks helmreleases for oas base are ready - -.base-helm-release: - stage: base-helm-release - needs: - - job: core-kustomizations-ready - - job: infrastructure-kustomizations-ready - - job: openappstack-kustomizations-ready - - job: setup-openappstack - - job: test-dns - extends: - - .helm-release - - .general_rules - -cert-manager-helm-release: - variables: - RESOURCE: "cert-manager" - NAMESPACE: "cert-manager" - extends: - - .base-helm-release - - .cert_manager_rules - -local-path-provisioner-helm-release: - variables: - RESOURCE: "local-path-provisioner" - NAMESPACE: "kube-system" - extends: - - .base-helm-release - - .local_path_provisioner_rules - -single-sign-on-helm-release: - variables: - RESOURCE: "single-sign-on" - NAMESPACE: "oas" - extends: - - .base-helm-release - - .single_sign_on_rules - # Stage: install-apps # ================== # @@ -486,266 +433,64 @@ enable-wordpress: - .enable_app_template - .wordpress_rules -# Stage: apps-helm-release -# ==================== -# -# Tests if all helm releases are ready - -.apps-helm-release: - stage: apps-helm-release - extends: - - .helm-release - interruptible: true - -eventrouter-helm-release: - variables: - RESOURCE: "eventrouter" - NAMESPACE: "oas" - extends: - - .apps-helm-release - - .eventrouter_rules - -kube-prometheus-stack-helm-release: - variables: - RESOURCE: "kube-prometheus-stack" - NAMESPACE: "oas" - extends: - - .apps-helm-release - - .kube_prometheus_stack_rules - -loki-helm-release: - variables: - RESOURCE: "loki" - NAMESPACE: "oas" - extends: - - .apps-helm-release - - .loki_rules - -nextcloud-helm-release: - variables: - RESOURCE: "nextcloud" - NAMESPACE: "oas-apps" - needs: - - job: core-kustomizations-ready - - job: infrastructure-kustomizations-ready - - job: openappstack-kustomizations-ready - - job: setup-openappstack - - job: test-dns - - job: enable-nextcloud - extends: - - .apps-helm-release - - .nextcloud_rules - -promtail-helm-release: - variables: - RESOURCE: "promtail" - NAMESPACE: "oas" - extends: - - .apps-helm-release - - .promtail_rules - -rocketchat-helm-release: - variables: - RESOURCE: "rocketchat" - NAMESPACE: "oas-apps" - needs: - - job: core-kustomizations-ready - - job: infrastructure-kustomizations-ready - - job: openappstack-kustomizations-ready - - job: setup-openappstack - - job: test-dns - - job: enable-rocketchat - extends: - - .apps-helm-release - - .rocketchat_rules - -wekan-helm-release: - variables: - RESOURCE: "wekan" - NAMESPACE: "oas-apps" - needs: - - job: core-kustomizations-ready - - job: infrastructure-kustomizations-ready - - job: openappstack-kustomizations-ready - - job: setup-openappstack - - job: test-dns - - job: enable-wekan - extends: - - .apps-helm-release - - .wekan_rules - -wordpress-helm-release: - variables: - RESOURCE: "wordpress" - NAMESPACE: "oas-apps" - needs: - - job: core-kustomizations-ready - - job: infrastructure-kustomizations-ready - - job: openappstack-kustomizations-ready - - job: setup-openappstack - - job: test-dns - - job: enable-wordpress - extends: - - .apps-helm-release - - .wordpress_rules - -# Stage: apps-ready -# ====================== +# Stage: apps-kustomizations-ready +# ================ # -# Tests apps for readiness state - -.apps-deployment: - stage: apps-ready - script: - - *debug_information - - cd ansible/ - - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml" - - pytest -v -s -m 'deployments' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=../${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 - extends: - - .ssh_setup - interruptible: true - -.apps-statefulset: - stage: apps-ready - script: - - *debug_information - - cd ansible/ - - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml" - - pytest -v -s -m 'statefulsets' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=../${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 - extends: - - .ssh_setup - interruptible: true - -.apps-daemonset: - stage: apps-ready - script: - - *debug_information - - cd ansible/ - - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/kube_config_cluster.yml" - - pytest -v -s -m 'daemonsets' --resource="$RESOURCE" --namespace="$NAMESPACE" --connection=ansible --ansible-inventory=../${CLUSTER_DIR}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10 - extends: - - .ssh_setup - interruptible: true - -cert-manager-deployment: - 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-deployment - - .cert_manager_rules +# Check that the kustomizations of all installed apps are ready. -eventrouter-deployment: - variables: - RESOURCE: "eventrouter" - NAMESPACE: "oas" - needs: - - job: eventrouter-helm-release - - job: setup-openappstack +.app-kustomization-ready: + stage: apps-kustomizations-ready extends: - - .apps-deployment - - .eventrouter_rules + - .kustomization-ready -local-path-provisioner-deployment: - variables: - RESOURCE: "local-path-provisioner" - NAMESPACE: "kube-system" +monitoring-kustomization-ready: needs: - - job: local-path-provisioner-helm-release - job: setup-openappstack - extends: - - .apps-deployment - - .local_path_provisioner_rules - -loki-statefulset: + - job: enable-monitoring variables: - RESOURCE: "loki" - NAMESPACE: "oas" - needs: - - job: loki-helm-release - - job: setup-openappstack + RESOURCE: "monitoring" extends: - - .apps-statefulset - - .loki_rules + - .app-kustomization-ready + - .monitoring_rules -promtail-daemonset: - variables: - RESOURCE: "promtail" - NAMESPACE: "oas" +nextcloud-kustomization-ready: needs: - - job: promtail-helm-release - job: setup-openappstack - extends: - - .apps-daemonset - - .promtail_rules - -nextcloud-deployment: + - job: enable-nextcloud variables: RESOURCE: "nextcloud" - NAMESPACE: "oas-apps" - needs: - - job: nextcloud-helm-release - - job: setup-openappstack extends: - - .apps-deployment + - .app-kustomization-ready - .nextcloud_rules -kube-prometheus-stack-deployment: - variables: - RESOURCE: "kube-prometheus-stack" - NAMESPACE: "oas" +rocketchat-kustomization-ready: needs: - - job: kube-prometheus-stack-helm-release - job: setup-openappstack - extends: - - .apps-deployment - - .kube_prometheus_stack_rules - -rocketchat-deployment: + - job: enable-rocketchat variables: RESOURCE: "rocketchat" - NAMESPACE: "oas-apps" - needs: - - job: rocketchat-helm-release - - job: setup-openappstack extends: - - .apps-deployment + - .app-kustomization-ready - .rocketchat_rules -single-sign-on-deployment: - variables: - RESOURCE: "single-sign-on" - NAMESPACE: "oas" +wekan-kustomization-ready: needs: - - job: single-sign-on-helm-release - job: setup-openappstack - extends: - - .apps-deployment - - .single_sign_on_rules - -wekan-deployment: + - job: enable-wekan variables: RESOURCE: "wekan" - NAMESPACE: "oas-apps" - needs: - - job: wekan-helm-release - - job: setup-openappstack extends: - - .apps-deployment + - .app-kustomization-ready - .wekan_rules -wordpress-statefulset: - variables: - RESOURCE: "wordpress" - NAMESPACE: "oas-apps" +wordpress-kustomization-ready: needs: - - job: wordpress-helm-release - job: setup-openappstack + - job: enable-wordpress + variables: + RESOURCE: "wordpress" extends: - - .apps-statefulset + - .app-kustomization-ready - .wordpress_rules # Stage: certs @@ -767,7 +512,7 @@ nextcloud-cert: variables: RESOURCE: "nextcloud" needs: - - job: nextcloud-deployment + - job: enable-nextcloud - job: setup-openappstack extends: - .apps-cert @@ -777,7 +522,7 @@ kube-prometheus-stack-cert: variables: RESOURCE: "kube-prometheus-stack" needs: - - job: kube-prometheus-stack-deployment + - job: enable-monitoring - job: setup-openappstack extends: - .apps-cert @@ -787,7 +532,7 @@ rocketchat-cert: variables: RESOURCE: "rocketchat" needs: - - job: rocketchat-deployment + - job: enable-rocketchat - job: setup-openappstack extends: - .apps-cert @@ -797,7 +542,7 @@ single-sign-on-cert: variables: RESOURCE: "single-sign-on" needs: - - job: single-sign-on-deployment + - job: core-kustomizations-ready - job: setup-openappstack extends: - .apps-cert @@ -807,7 +552,7 @@ wekan-cert: variables: RESOURCE: "wekan" needs: - - job: wekan-deployment + - job: enable-wekan - job: setup-openappstack extends: - .apps-cert @@ -817,7 +562,7 @@ wordpress-cert: variables: RESOURCE: "wordpress" needs: - - job: wordpress-statefulset + - job: enable-wordpress - job: setup-openappstack extends: - .apps-cert @@ -885,6 +630,7 @@ grafana-taiko: needs: - job: kube-prometheus-stack-cert - job: setup-openappstack + - job: monitoring-kustomization-ready extends: - .taiko - .kube_prometheus_stack_rules @@ -895,6 +641,7 @@ nextcloud-taiko: needs: - job: nextcloud-cert - job: setup-openappstack + - job: nextcloud-kustomization-ready extends: - .taiko - .nextcloud_rules @@ -905,6 +652,7 @@ rocketchat-taiko: needs: - job: rocketchat-cert - job: setup-openappstack + - job: rocketchat-kustomization-ready extends: - .taiko - .rocketchat_rules @@ -915,6 +663,7 @@ wekan-taiko: needs: - job: wekan-cert - job: setup-openappstack + - job: wekan-kustomization-ready extends: - .taiko - .wekan_rules @@ -925,6 +674,7 @@ wordpress-taiko: needs: - job: wordpress-cert - job: setup-openappstack + - job: wordpress-kustomization-ready extends: - .taiko - .wordpress_rules diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 096db8e0cb29b80115ab08b3b35f270ebf775ddf..7505363da1011f5aa0f16a0d3c240c7231abbbad 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -15,6 +15,10 @@ repos: hooks: - id: shellcheck - id: shfmt + args: + - "-i" + - "2" + - "-ci" - repo: https://github.com/hadolint/hadolint rev: v1.23.0 hooks: diff --git a/flux2/cluster/base/core.yaml b/flux2/cluster/base/core.yaml index 1ab36950217f0841f2b89a5c8a4015d937eaa154..7a12c2e19de36da067b958951bcab14a9f7ee9a9 100644 --- a/flux2/cluster/base/core.yaml +++ b/flux2/cluster/base/core.yaml @@ -35,3 +35,15 @@ spec: kind: HelmRelease name: single-sign-on namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: single-sign-on-userbackend + namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: single-sign-on-hydra + namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: single-sign-on-login + namespace: oas diff --git a/flux2/cluster/base/infrastructure.yaml b/flux2/cluster/base/infrastructure.yaml index 53c949da1bfd9a140c56c273b6a20f21bbefd3be..51ba9edbe2a45c51ba8c8f4ead5d9b10615200b7 100644 --- a/flux2/cluster/base/infrastructure.yaml +++ b/flux2/cluster/base/infrastructure.yaml @@ -21,3 +21,11 @@ spec: kind: HelmRelease name: local-path-provisioner namespace: kube-system + - apiVersion: apps/v1 + kind: Deployment + name: cert-manager + namespace: cert-manager + - apiVersion: apps/v1 + kind: Deployment + name: local-path-provisioner + namespace: kube-system diff --git a/flux2/cluster/optional/monitoring/monitoring.yaml b/flux2/cluster/optional/monitoring/monitoring.yaml index b8cf3c73dab87926f1e24fa07289c2094732fdc2..91a33049b03ca5ef1beeed9cb9310bb92dba0bc3 100644 --- a/flux2/cluster/optional/monitoring/monitoring.yaml +++ b/flux2/cluster/optional/monitoring/monitoring.yaml @@ -15,11 +15,47 @@ spec: path: ./flux2/apps/monitoring prune: true validation: client - # healthChecks: - # - apiVersion: helm.toolkit.fluxcd.io/v1beta1 - # kind: HelmRelease - # name: podinfo - # namespace: podinfo + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: eventrouter + namespace: oas + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: kube-prometheus-stack + namespace: oas + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: loki + namespace: oas + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: promtail + namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: eventrouter + namespace: oas + - apiVersion: apps/v1 + kind: StatefulSet + name: loki + namespace: oas + - apiVersion: apps/v1 + kind: DaemonSet + name: promtail + namespace: oas + - apiVersion: apps/v1 + kind: StatefulSet + name: prometheus-kube-prometheus-stack-prometheus + namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: kube-prometheus-stack-kube-state-metrics + namespace: oas + - apiVersion: apps/v1 + kind: Deployment + name: kube-prometheus-stack-grafana + namespace: oas postBuild: substituteFrom: - kind: Secret diff --git a/flux2/cluster/optional/nextcloud/nextcloud.yaml b/flux2/cluster/optional/nextcloud/nextcloud.yaml index e09fbd14abbac271ed0ec945566e272a06eeaa38..07fac76dd9473a0ce3c622cf6fb870c898422a01 100644 --- a/flux2/cluster/optional/nextcloud/nextcloud.yaml +++ b/flux2/cluster/optional/nextcloud/nextcloud.yaml @@ -15,11 +15,19 @@ spec: path: ./flux2/apps/nextcloud prune: true validation: client - # healthChecks: - # - apiVersion: helm.toolkit.fluxcd.io/v1beta1 - # kind: HelmRelease - # name: podinfo - # namespace: podinfo + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: nextcloud + namespace: oas-apps + - apiVersion: apps/v1 + kind: Deployment + name: nc-nextcloud + namespace: oas-apps + - apiVersion: apps/v1 + kind: Deployment + name: nc-onlyoffice-documentserver + namespace: oas-apps postBuild: substituteFrom: - kind: Secret diff --git a/flux2/cluster/optional/rocketchat/rocketchat.yaml b/flux2/cluster/optional/rocketchat/rocketchat.yaml index c3cd0c2d68c2443921be4d9f83d7e4b2b20d0dd9..5b597db0af1bfa779e8c4d5a02dfac27ea39f4c5 100644 --- a/flux2/cluster/optional/rocketchat/rocketchat.yaml +++ b/flux2/cluster/optional/rocketchat/rocketchat.yaml @@ -15,11 +15,15 @@ spec: path: ./flux2/apps/rocketchat prune: true validation: client - # healthChecks: - # - apiVersion: helm.toolkit.fluxcd.io/v1beta1 - # kind: HelmRelease - # name: podinfo - # namespace: podinfo + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: rocketchat + namespace: oas-apps + - apiVersion: apps/v1 + kind: Deployment + name: rocketchat-rocketchat + namespace: oas-apps postBuild: substituteFrom: - kind: Secret diff --git a/flux2/cluster/optional/velero/velero.yaml b/flux2/cluster/optional/velero/velero.yaml index ac446403455e881b5c0a447d4c75de06a8801162..2f6364db874369d316fdb29e4387b3db6e2903be 100644 --- a/flux2/cluster/optional/velero/velero.yaml +++ b/flux2/cluster/optional/velero/velero.yaml @@ -15,11 +15,11 @@ spec: path: ./flux2/apps/velero prune: true validation: client - # healthChecks: - # - apiVersion: helm.toolkit.fluxcd.io/v1beta1 - # kind: HelmRelease - # name: podinfo - # namespace: podinfo + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: velero + namespace: velero postBuild: substituteFrom: - kind: Secret diff --git a/flux2/cluster/optional/wekan/wekan.yaml b/flux2/cluster/optional/wekan/wekan.yaml index 0fd42e5644a8c0321deffc4f4aeebfb710e04ad1..92cdf331d8c7284139da05635c7226e500a3947a 100644 --- a/flux2/cluster/optional/wekan/wekan.yaml +++ b/flux2/cluster/optional/wekan/wekan.yaml @@ -15,6 +15,15 @@ spec: path: ./flux2/apps/wekan prune: true validation: client + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: wekan + namespace: oas-apps + - apiVersion: apps/v1 + kind: Deployment + name: wekan + namespace: oas-apps postBuild: substituteFrom: - kind: Secret diff --git a/flux2/cluster/optional/wordpress/wordpress.yaml b/flux2/cluster/optional/wordpress/wordpress.yaml index f6017a0999fb19a4930bbe6d98b921121ee7140e..9bb1cff0b31a25e59dfc69d7f61a3e3b10c19e12 100644 --- a/flux2/cluster/optional/wordpress/wordpress.yaml +++ b/flux2/cluster/optional/wordpress/wordpress.yaml @@ -15,6 +15,15 @@ spec: path: ./flux2/apps/wordpress prune: true validation: client + healthChecks: + - apiVersion: helm.toolkit.fluxcd.io/v1beta1 + kind: HelmRelease + name: wordpress + namespace: oas-apps + - apiVersion: apps/v1 + kind: StatefulSet + name: wordpress + namespace: oas-apps postBuild: substituteFrom: - kind: Secret diff --git a/install/install-app.sh b/install/install-app.sh index bd9d58a7ad03ed01133eded5ba2fdcf3cf55fde7..b7b2000ec9f2ad73e162424415c1f91c30cb63f0 100755 --- a/install/install-app.sh +++ b/install/install-app.sh @@ -9,10 +9,10 @@ app=$1 # Check if the secrets for the app already exist in the cluster, and if not, # generate them and add them to the cluster. -python "$(dirname "$0")/generate_secrets.py" $app +python "$(dirname "$0")/generate_secrets.py" "$app" # This kustomization's only purpose is to add the kustomization that is in the -# flxu2/cluster/optional/$app folder. After this kustomization is applied +# flux2/cluster/optional/$app folder. After this kustomization is applied # an `add-$app` kustomization will be present on the cluster, as well as a # `$app` kustomization that adds the actual app flux create kustomization "add-${app}" \ diff --git a/test/pytest/test_resources.py b/test/pytest/test_resources.py index 4246f8296724b2bd88b568c0f4ff1880f51f8e33..83d29ae2cd6e14947994196bfc353dba280f56c9 100644 --- a/test/pytest/test_resources.py +++ b/test/pytest/test_resources.py @@ -166,164 +166,3 @@ def test_kustomizations(resource, namespace): plural='kustomizations', name=resource, namespace=namespace) - - -@pytest.mark.resource -@pytest.mark.helmreleases -def test_helmreleases(resource, namespace): - """ - Test if a single or all HelmRelease(s) installed by weave flux are in - 'Ready' state. - - If you want to test a single helmrelease please provide both name and - namespace, otherwise all helmreleases from all namespaces are tested. - - :param name: The resource object's name - :type name: str - :param namespace: The resource object's namespace - :type namespace: str - """ - - print('\n') - custom_objects = client.CustomObjectsApi() - check_custom_objects( - api=custom_objects, - api_group='helm.toolkit.fluxcd.io', - api_version='v2beta1', - plural='helmreleases', - name=resource, - namespace=namespace) - - -@pytest.mark.resource -@pytest.mark.deployments -def test_deployments(resource, namespace): - """ - Test if a single or all deployment(s) are ready - - If you want to test a single deployment please provide both name and - namespace, otherwise all deployments from all namespaces are tested. - - :param name: The resource object's name - :type name: str - :param namespace: The resource object's namespace - :type namespace: str - """ - - failed = 0 - failed_resources = [] - api = client.AppsV1Api() - print('\n') - - if resource != 'all': - deployments = api.list_namespaced_deployment( - namespace=namespace, - label_selector=f'helm.toolkit.fluxcd.io/name={resource}') - else: - deployments = api.list_deployment_for_all_namespaces() - - assert deployments.items, 'No deployments found !!' - for deployment in deployments.items: - resource = deployment.metadata.name - namespace = deployment.metadata.namespace - deployment = api.read_namespaced_deployment_status(resource, namespace) - - for condition in deployment.status.conditions: - if condition.type == 'Available': - available = condition.status == 'True' - replicas = deployment.spec.replicas - ready_replicas = deployment.status.ready_replicas - # Check if all replicas from the spec are ready - print(f'Deployment "{resource}" in namespace "{namespace}": ' - f'{available} ({ready_replicas}/{replicas})') - - - if not available or replicas != ready_replicas: - failed += 1 - failed_resources.append(resource) - - assert failed == 0, f"Error: {failed} resources not ready ({failed_resources})!" - -@pytest.mark.resource -@pytest.mark.statefulsets -def test_statefulsets(resource, namespace): - """ - Test if a single or all statefulset(s) are ready - - If you want to test a single statefulset please provide both name and - namespace, otherwise all statefulsets from all namespaces are tested. - - :param name: The resource object's name - :type name: str - :param namespace: The resource object's namespace - :type namespace: str - """ - - failed = 0 - failed_resources = [] - api = client.AppsV1Api() - print('\n') - - if resource != 'all': - statefulsets = api.list_namespaced_stateful_set( - namespace=namespace, - label_selector=f'helm.toolkit.fluxcd.io/name={resource}') - else: - statefulsets = api.list_stateful_set_for_all_namespaces() - - assert statefulsets.items, 'No statefulsets found !!' - for statefulset in statefulsets.items: - resource = statefulset.metadata.name - namespace = statefulset.metadata.namespace - statefulset = api.read_namespaced_stateful_set_status(resource, namespace) - replicas = statefulset.spec.replicas - ready_replicas = statefulset.status.ready_replicas - print(f'statefulset "{resource}" in namespace "{namespace}": ' - f'{ready_replicas}/{replicas}') - if replicas != ready_replicas: - failed += 1 - failed_resources.append(resource) - - assert failed == 0, f"Error: {failed} resources not ready ({failed_resources})!" - -@pytest.mark.resource -@pytest.mark.daemonsets -def test_daemonsets(resource, namespace): - """ - Test if a single or all daemonset(s) are ready - - If you want to test a single daemonset please provide both name and - namespace, otherwise all daemonsets from all namespaces are tested. - - :param name: The resource object's name - :type name: str - :param namespace: The resource object's namespace - :type namespace: str - """ - - failed = 0 - failed_resources = [] - api = client.AppsV1Api() - print('\n') - - if resource != 'all': - daemonsets = api.list_namespaced_daemon_set( - namespace=namespace, - label_selector=f'helm.toolkit.fluxcd.io/name={resource}') - else: - daemonsets = api.list_daemon_set_for_all_namespaces() - - assert daemonsets.items, 'No daemonsets found !!' - for daemonset in daemonsets.items: - resource = daemonset.metadata.name - namespace = daemonset.metadata.namespace - daemonset = api.read_namespaced_daemon_set_status(resource, namespace) - desired_number_scheduled = daemonset.status.desired_number_scheduled - number_ready = daemonset.status.number_ready - print(f'daemonset "{resource}" in namespace "{namespace}": ' - f'{number_ready}/{desired_number_scheduled}') - if desired_number_scheduled != number_ready: - failed += 1 - failed_resources.append(resource) - - assert failed == 0, f"Error: {failed} resources not ready ({failed_resources})!"