This is an automated email from the ASF dual-hosted git repository.
astefanutti pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-k.git
The following commit(s) were added to refs/heads/main by this push:
new f216a03 fix: Integration readiness status should account for updated
replicas
f216a03 is described below
commit f216a03c3670b1d165ee9a9857332ef276e2be07
Author: Antonin Stefanutti <[email protected]>
AuthorDate: Wed Oct 13 14:42:42 2021 +0200
fix: Integration readiness status should account for updated replicas
---
pkg/controller/integration/monitor.go | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/pkg/controller/integration/monitor.go
b/pkg/controller/integration/monitor.go
index cd5300d..2967f82 100644
--- a/pkg/controller/integration/monitor.go
+++ b/pkg/controller/integration/monitor.go
@@ -26,6 +26,7 @@ import (
batchv1 "k8s.io/api/batch/v1"
batchv1beta1 "k8s.io/api/batch/v1beta1"
corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/equality"
"k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/selection"
@@ -300,12 +301,30 @@ func (action *monitorAction)
updateIntegrationPhaseAndReadyCondition(ctx context
if r := integration.Spec.Replicas; r != nil {
replicas = *r
}
- if c.Status.UpdatedReplicas == replicas &&
c.Status.ReadyReplicas == replicas {
+ // The Deployment status reports updated and ready replicas
separately,
+ // so that the number of ready replicas also accounts for older
versions.
+ // We compare the Integration PodSpec to that of the Pod in
order to make
+ // sure we account for up-to-date version.
+ var readyPods []corev1.Pod
+ for _, pod := range runningPods {
+ if ready := kubernetes.GetPodCondition(pod,
corev1.PodReady); ready == nil || ready.Status != corev1.ConditionTrue {
+ continue
+ }
+ if
equality.Semantic.DeepDerivative(c.Spec.Template.Spec, pod.Spec) {
+ readyPods = append(readyPods, pod)
+ }
+ }
+ readyReplicas := int32(len(readyPods))
+ // The Integration is considered ready when the number of
replicas
+ // reported to be ready is larger than or equal to the
specified number
+ // of replicas. This avoids reporting a falsy readiness
condition
+ // when the Integration is being down-scaled.
+ if readyReplicas >= replicas {
setReadyCondition(integration, corev1.ConditionTrue,
v1.IntegrationConditionDeploymentReadyReason, fmt.Sprintf("%d/%d ready
replicas", c.Status.ReadyReplicas, replicas))
} else if c.Status.UpdatedReplicas < replicas {
setReadyCondition(integration, corev1.ConditionFalse,
v1.IntegrationConditionDeploymentProgressingReason, fmt.Sprintf("%d/%d updated
replicas", c.Status.UpdatedReplicas, replicas))
} else {
- setReadyCondition(integration, corev1.ConditionFalse,
v1.IntegrationConditionDeploymentProgressingReason, fmt.Sprintf("%d/%d ready
replicas", c.Status.ReadyReplicas, replicas))
+ setReadyCondition(integration, corev1.ConditionFalse,
v1.IntegrationConditionDeploymentProgressingReason, fmt.Sprintf("%d/%d ready
replicas", readyReplicas, replicas))
}
case *servingv1.Service: