diff --git a/changelogs/fragments/579-k8s_scale-fix-issue-with-scaling-statefulsets.yml b/changelogs/fragments/579-k8s_scale-fix-issue-with-scaling-statefulsets.yml new file mode 100644 index 00000000..8639fd30 --- /dev/null +++ b/changelogs/fragments/579-k8s_scale-fix-issue-with-scaling-statefulsets.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - k8s_scale - fix issue when scaling StatefulSets with updateStrategy=OnDelete (https://github.com/ansible-collections/kubernetes.core/issues/579). diff --git a/plugins/module_utils/k8s/waiter.py b/plugins/module_utils/k8s/waiter.py index 653e1708..55afd801 100644 --- a/plugins/module_utils/k8s/waiter.py +++ b/plugins/module_utils/k8s/waiter.py @@ -61,6 +61,13 @@ def daemonset_ready(daemonset: ResourceInstance) -> bool: def statefulset_ready(statefulset: ResourceInstance) -> bool: + if statefulset.spec.updateStrategy.type == "OnDelete": + return bool( + statefulset.status + and statefulset.status.observedGeneration + == (statefulset.metadata.generation or 0) + and statefulset.status.replicas == statefulset.spec.replicas + ) # These may be None updated_replicas = statefulset.status.updatedReplicas or 0 ready_replicas = statefulset.status.readyReplicas or 0 diff --git a/tests/integration/targets/k8s_scale/tasks/main.yml b/tests/integration/targets/k8s_scale/tasks/main.yml index eb2107d3..f5c79df5 100644 --- a/tests/integration/targets/k8s_scale/tasks/main.yml +++ b/tests/integration/targets/k8s_scale/tasks/main.yml @@ -389,6 +389,71 @@ that: - output.result.status.replicas == 0 + - name: Create a StatefulSet with updateStrategy=OnDelete + kubernetes.core.k8s: + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" + definition: + apiVersion: apps/v1 + kind: StatefulSet + metadata: + namespace: "{{ scale_namespace }}" + name: scale-set-ondelete + spec: + replicas: 2 + updateStrategy: + type: OnDelete + selector: + matchLabels: + app: foo + template: + metadata: + labels: + app: foo + spec: + terminationGracePeriodSeconds: 10 + containers: + - image: busybox + name: busybox + command: + - sleep + - "600" + register: output + + - assert: + that: + - output.result.status.replicas == 2 + + - name: Wait for StatefulSet to scale down to 0 + kubernetes.core.k8s_scale: + kind: StatefulSet + api_version: apps/v1 + name: scale-set-ondelete + namespace: "{{ scale_namespace }}" + replicas: 0 + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" + register: output + + - assert: + that: + - output.result.status.replicas == 0 + + - name: Wait for StatefulSet to scale up to 2 + kubernetes.core.k8s_scale: + kind: StatefulSet + api_version: apps/v1 + name: scale-set-ondelete + namespace: "{{ scale_namespace }}" + replicas: 2 + wait: yes + wait_timeout: "{{ k8s_wait_timeout | default(omit) }}" + register: output + + - assert: + that: + - output.result.status.replicas == 2 + always: - name: Remove namespace k8s: