Skip to content

Commit b07fbd6

Browse files
authored
Fix waiting for daemonset when desired number of pods is 0 (ansible-collections#756)
Fixes ansible-collections#755 SUMMARY Because we don't have any node with non_exisiting_label (see code below) desired number of Pods will be 0. Kubernetes won't create .status.updatedNumberScheduled field (at least on version v1.27), because we still are not going to create any Pods. So that if .status.updatedNumberScheduled doesn't exist we should assume that number is 0 Code to reproduce: - name: Create daemonset kubernetes.core.k8s: state: present wait: true definition: apiVersion: apps/v1 kind: DaemonSet metadata: name: my-daemonset namespace: default spec: selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-container image: nginx nodeSelector: non_exisiting_label: 1 ISSUE TYPE Bugfix Pull Request COMPONENT NAME kubernetes.core.plugins.module_utils.k8s.waiter ADDITIONAL INFORMATION TASK [Create daemonset] ********************************************************************************************************************************** changed: [controlplane] => {"changed": true, "duration": 5, "method": "create", "result": {"apiVersion": "apps/v1", "kind": "DaemonSet", "metadata": {"annotations": {"deprecated.daemonset.template.generation": "1"}, "creationTimestamp": "2024-06-28T08:23:41Z", "generation": 1, "managedFields": [{"apiVersion": "apps/v1", "fieldsType": "FieldsV1", "fieldsV1": {"f:metadata": {"f:annotations": {".": {}, "f:deprecated.daemonset.template.generation": {}}}, "f:spec": {"f:revisionHistoryLimit": {}, "f:selector": {}, "f:template": {"f:metadata": {"f:labels": {".": {}, "f:app": {}}}, "f:spec": {"f:containers": {"k:{\"name\":\"my-container\"}": {".": {}, "f:image": {}, "f:imagePullPolicy": {}, "f:name": {}, "f:resources": {}, "f:terminationMessagePath": {}, "f:terminationMessagePolicy": {}}}, "f:dnsPolicy": {}, "f:nodeSelector": {}, "f:restartPolicy": {}, "f:schedulerName": {}, "f:securityContext": {}, "f:terminationGracePeriodSeconds": {}}}, "f:updateStrategy": {"f:rollingUpdate": {".": {}, "f:maxSurge": {}, "f:maxUnavailable": {}}, "f:type": {}}}}, "manager": "OpenAPI-Generator", "operation": "Update", "time": "2024-06-28T08:23:41Z"}, {"apiVersion": "apps/v1", "fieldsType": "FieldsV1", "fieldsV1": {"f:status": {"f:observedGeneration": {}}}, "manager": "kube-controller-manager", "operation": "Update", "subresource": "status", "time": "2024-06-28T08:23:41Z"}], "name": "my-daemonset", "namespace": "default", "resourceVersion": "1088421", "uid": "faafdbf7-4388-4cec-88d5-84657966312d"}, "spec": {"revisionHistoryLimit": 10, "selector": {"matchLabels": {"app": "my-app"}}, "template": {"metadata": {"creationTimestamp": null, "labels": {"app": "my-app"}}, "spec": {"containers": [{"image": "nginx", "imagePullPolicy": "Always", "name": "my-container", "resources": {}, "terminationMessagePath": "/dev/termination-log", "terminationMessagePolicy": "File"}], "dnsPolicy": "ClusterFirst", "nodeSelector": {"non_exisiting_label": "1"}, "restartPolicy": "Always", "schedulerName": "default-scheduler", "securityContext": {}, "terminationGracePeriodSeconds": 30}}, "updateStrategy": {"rollingUpdate": {"maxSurge": 0, "maxUnavailable": 1}, "type": "RollingUpdate"}}, "status": {"currentNumberScheduled": 0, "desiredNumberScheduled": 0, "numberMisscheduled": 0, "numberReady": 0, "observedGeneration": 1}}} ~$ kubectl get ds NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE my-daemonset 0 0 0 0 0 non_exisiting_label=1 30s Reviewed-by: Mike Graves <[email protected]>
1 parent 44a2fc3 commit b07fbd6

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
bugfixes:
2+
- waiter - Fix waiting for daemonset when desired number of pods is 0. (https://github.com/ansible-collections/kubernetes.core/pull/756).

plugins/module_utils/k8s/waiter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def daemonset_ready(daemonset: ResourceInstance) -> bool:
5151
return bool(
5252
daemonset.status
5353
and daemonset.status.desiredNumberScheduled is not None
54-
and daemonset.status.updatedNumberScheduled
54+
and (daemonset.status.updatedNumberScheduled or 0)
5555
== daemonset.status.desiredNumberScheduled
5656
and daemonset.status.numberReady == daemonset.status.desiredNumberScheduled
5757
and daemonset.status.observedGeneration == daemonset.metadata.generation

tests/integration/targets/k8s_waiter/defaults/main.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ k8s_pod_metadata:
55

66
k8s_pod_spec:
77
serviceAccount: "{{ k8s_pod_service_account }}"
8+
nodeSelector: "{{ k8s_pod_node_selector }}"
89
containers:
910
- image: "{{ k8s_pod_image }}"
1011
imagePullPolicy: Always
@@ -33,6 +34,8 @@ k8s_pod_ports: []
3334

3435
k8s_pod_env: []
3536

37+
k8s_pod_node_selector: {}
38+
3639
k8s_pod_template:
3740
metadata: "{{ k8s_pod_metadata }}"
3841
spec: "{{ k8s_pod_spec }}"

tests/integration/targets/k8s_waiter/tasks/main.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,48 @@
127127
- ds.result.status.currentNumberScheduled == ds.result.status.desiredNumberScheduled
128128
- updated_ds_pods.resources[0].spec.containers[0].image.endswith(":3")
129129

130+
- name: Create daemonset with nodeSelector and not existing label
131+
k8s:
132+
definition:
133+
apiVersion: apps/v1
134+
kind: DaemonSet
135+
metadata:
136+
name: wait-daemonset-not-existing-label
137+
namespace: "{{ wait_namespace }}"
138+
spec:
139+
selector:
140+
matchLabels:
141+
app: "{{ k8s_pod_name }}"
142+
template: "{{ k8s_pod_template }}"
143+
wait: yes
144+
wait_sleep: 5
145+
wait_timeout: "{{ k8s_wait_timeout | default(omit) }}"
146+
vars:
147+
k8s_pod_name: wait-daemonset-not-existing-label
148+
k8s_pod_image: gcr.io/kuar-demo/kuard-amd64:1
149+
k8s_pod_command:
150+
- sleep
151+
- "600"
152+
k8s_pod_node_selector:
153+
nonExisitingLabel: test-not-exiting-label
154+
register: ds_not_existing_label
155+
156+
- name: Get updated pods
157+
k8s_info:
158+
api_version: v1
159+
kind: Pod
160+
namespace: "{{ wait_namespace }}"
161+
label_selectors:
162+
- app=wait-daemonset-not-existing-label
163+
register: updated_ds_pods_not_existing_label
164+
165+
- name: Check that daemonset wait worked (when desired number is 0)
166+
assert:
167+
that:
168+
- ds_not_existing_label.result.status.currentNumberScheduled == ds_not_existing_label.result.status.desiredNumberScheduled
169+
- ds_not_existing_label.result.status.desiredNumberScheduled == 0
170+
- updated_ds_pods_not_existing_label.resources | length == 0
171+
130172
- name: Add a statefulset
131173
k8s:
132174
definition:

0 commit comments

Comments
 (0)