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})!"