From 3e8e5052316f832fd398066ba2fbc688caf191f0 Mon Sep 17 00:00:00 2001 From: Zhang Date: Tue, 1 Sep 2020 08:28:23 -0700 Subject: [PATCH 1/3] fix: health status is set to healthy for statefulset with updateStrategy: OnDelete --- pkg/health/health.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/health/health.go b/pkg/health/health.go index f112b9bda..3029167fd 100644 --- a/pkg/health/health.go +++ b/pkg/health/health.go @@ -329,6 +329,12 @@ func getStatefulSetHealth(obj *unstructured.Unstructured) (*HealthStatus, error) Message: fmt.Sprintf("partitioned roll out complete: %d new pods have been updated...", sts.Status.UpdatedReplicas), }, nil } + if sts.Spec.UpdateStrategy.Type == appsv1.OnDeleteStatefulSetStrategyType { + return &HealthStatus{ + Status: HealthStatusHealthy, + Message: fmt.Sprintf("updateStrategy is OnDelete type."), + }, nil + } if sts.Status.UpdateRevision != sts.Status.CurrentRevision { return &HealthStatus{ Status: HealthStatusProgressing, From 2203bc898dc79bb921bd8dc9fb5cd1d6f3b97230 Mon Sep 17 00:00:00 2001 From: Zhang Date: Tue, 1 Sep 2020 09:54:09 -0700 Subject: [PATCH 2/3] fix: updated message --- pkg/health/health.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/health/health.go b/pkg/health/health.go index 3029167fd..24edc666d 100644 --- a/pkg/health/health.go +++ b/pkg/health/health.go @@ -332,7 +332,7 @@ func getStatefulSetHealth(obj *unstructured.Unstructured) (*HealthStatus, error) if sts.Spec.UpdateStrategy.Type == appsv1.OnDeleteStatefulSetStrategyType { return &HealthStatus{ Status: HealthStatusHealthy, - Message: fmt.Sprintf("updateStrategy is OnDelete type."), + Message: fmt.Sprintf("statefulset has %d ready pods", sts.Status.ReadyReplicas), }, nil } if sts.Status.UpdateRevision != sts.Status.CurrentRevision { From f8a4cb407ef717a77b0ceacd8feac2596252fadd Mon Sep 17 00:00:00 2001 From: Zhang Date: Tue, 1 Sep 2020 14:37:28 -0700 Subject: [PATCH 3/3] fix: added test --- pkg/health/health_test.go | 4 + pkg/health/testdata/statefulset-ondelete.yaml | 123 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 pkg/health/testdata/statefulset-ondelete.yaml diff --git a/pkg/health/health_test.go b/pkg/health/health_test.go index 7c8534c96..a9609e3cd 100644 --- a/pkg/health/health_test.go +++ b/pkg/health/health_test.go @@ -41,6 +41,10 @@ func TestStatefulSetHealth(t *testing.T) { assertAppHealth(t, "./testdata/statefulset.yaml", HealthStatusHealthy) } +func TestStatefulSetOnDeleteHealth(t *testing.T) { + assertAppHealth(t, "./testdata/statefulset-ondelete.yaml", HealthStatusHealthy) +} + func TestPVCHealth(t *testing.T) { assertAppHealth(t, "./testdata/pvc-bound.yaml", HealthStatusHealthy) assertAppHealth(t, "./testdata/pvc-pending.yaml", HealthStatusProgressing) diff --git a/pkg/health/testdata/statefulset-ondelete.yaml b/pkg/health/testdata/statefulset-ondelete.yaml new file mode 100644 index 000000000..deb02047f --- /dev/null +++ b/pkg/health/testdata/statefulset-ondelete.yaml @@ -0,0 +1,123 @@ +apiVersion: apps/v1 +kind: StatefulSet +metadata: + annotations: + kubectl.kubernetes.io/last-applied-configuration: | + {"apiVersion":"apps/v1beta2","kind":"StatefulSet","metadata":{"annotations":{},"labels":{"app":"redis","app.kubernetes.io/instance":"redis","chart":"redis-3.6.5","heritage":"Tiller","release":"redis"},"name":"redis-master","namespace":"default"},"spec":{"selector":{"matchLabels":{"app":"redis","release":"redis","role":"master"}},"serviceName":"redis-master","template":{"metadata":{"labels":{"app":"redis","app.kubernetes.io/instance":"redis","release":"redis","role":"master"}},"spec":{"containers":[{"env":[{"name":"REDIS_REPLICATION_MODE","value":"master"},{"name":"REDIS_PASSWORD","valueFrom":{"secretKeyRef":{"key":"redis-password","name":"redis"}}},{"name":"REDIS_DISABLE_COMMANDS","value":"FLUSHDB,FLUSHALL"}],"image":"docker.io/bitnami/redis:4.0.10-debian-9","imagePullPolicy":"Always","livenessProbe":{"exec":{"command":["redis-cli","ping"]},"failureThreshold":5,"initialDelaySeconds":30,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":5},"name":"redis","ports":[{"containerPort":6379,"name":"redis"}],"readinessProbe":{"exec":{"command":["redis-cli","ping"]},"failureThreshold":5,"initialDelaySeconds":5,"periodSeconds":10,"successThreshold":1,"timeoutSeconds":1},"resources":{},"volumeMounts":[{"mountPath":"/bitnami/redis/data","name":"redis-data"}]}],"securityContext":{"fsGroup":1001,"runAsUser":1001},"serviceAccountName":"default"}},"updateStrategy":{"type":"OnDelete"},"volumeClaimTemplates":[{"metadata":{"labels":{"app":"redis","chart":"redis-3.6.5","component":"master","heritage":"Tiller","release":"redis"},"name":"redis-data"},"spec":{"accessModes":["ReadWriteOnce"],"resources":{"requests":{"storage":"8Gi"}}}}]}} + creationTimestamp: 2018-07-20T08:23:04Z + generation: 1 + labels: + app: redis + app.kubernetes.io/instance: redis + chart: redis-3.6.5 + heritage: Tiller + release: redis + name: redis-master + namespace: default + resourceVersion: "514251" + selfLink: /apis/apps/v1/namespaces/default/statefulsets/redis-master + uid: 1f80ab97-8bf6-11e8-aff0-42010a8a0fc6 +spec: + podManagementPolicy: OrderedReady + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app: redis + release: redis + role: master + serviceName: redis-master + updateStrategy: + type: OnDelete + template: + metadata: + creationTimestamp: null + labels: + app: redis + app.kubernetes.io/instance: redis + release: redis + role: master + spec: + containers: + - env: + - name: REDIS_REPLICATION_MODE + value: master + - name: REDIS_PASSWORD + valueFrom: + secretKeyRef: + key: redis-password + name: redis + - name: REDIS_DISABLE_COMMANDS + value: FLUSHDB,FLUSHALL + image: docker.io/bitnami/redis:4.0.10-debian-9 + imagePullPolicy: Always + livenessProbe: + exec: + command: + - redis-cli + - ping + failureThreshold: 5 + initialDelaySeconds: 30 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 5 + name: redis + ports: + - containerPort: 6379 + name: redis + protocol: TCP + readinessProbe: + exec: + command: + - redis-cli + - ping + failureThreshold: 5 + initialDelaySeconds: 5 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: {} + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + volumeMounts: + - mountPath: /bitnami/redis/data + name: redis-data + dnsPolicy: ClusterFirst + restartPolicy: Always + schedulerName: default-scheduler + securityContext: + fsGroup: 1001 + runAsUser: 1001 + serviceAccount: default + serviceAccountName: default + terminationGracePeriodSeconds: 30 + updateStrategy: + type: OnDelete + volumeClaimTemplates: + - kind: PersistentVolumeClaim + apiVersion: v1 + metadata: + creationTimestamp: null + labels: + app: redis + chart: redis-3.6.5 + component: master + heritage: Tiller + release: redis + name: redis-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 8Gi + status: + phase: Pending +status: + collisionCount: 0 + currentReplicas: 1 + currentRevision: redis-master-7b8f75b98 + observedGeneration: 1 + readyReplicas: 1 + replicas: 1 + updateRevision: redis-master-7b8f75b98