Feat: Consolidate Health & Status and Pass Status Context Data (#6860)

Signed-off-by: Brian Kane <briankane1@gmail.com>
This commit is contained in:
Brian Kane
2025-08-23 19:30:06 +01:00
committed by GitHub
parent af1fb9a0fd
commit 56bc3b02e9
12 changed files with 528 additions and 82 deletions

View File

@@ -506,13 +506,25 @@ var _ = Describe("Application Normal tests", func() {
By("Checking the initial application status")
Expect(app.Status.Services).ShouldNot(BeEmpty())
Expect(app.Status.Services[0].Healthy).Should(BeFalse())
Expect(app.Status.Services[0].Message).Should(BeEmpty())
Expect(app.Status.Services[0].Message).Should(Equal(fmt.Sprintf("Unhealthy - 0 / %d replicas are ready", compReplicas)))
Expect(app.Status.Services[0].Details["readyReplicas"]).Should(Equal("0"))
Expect(app.Status.Services[0].Details["deploymentReady"]).Should(Equal("false"))
verifyWorkloadRunningExpected(ctx, namespaceName, compDef.Name, int32(compReplicas), compImage)
verifyWorkloadRunningExpected(ctx, namespaceName, traitDef.Name, int32(traitReplicas), traitImage)
By("Triggering application reconciliation to ensure status is updated (to avoid flakiness)")
Eventually(func() error {
if err := k8sClient.Get(ctx, client.ObjectKey{Namespace: app.Namespace, Name: app.Name}, app); err != nil {
return err
}
if app.Annotations == nil {
app.Annotations = make(map[string]string)
}
app.Annotations["force.reconcile"] = fmt.Sprintf("%d", time.Now().Unix())
return k8sClient.Update(ctx, app)
}, 10*time.Second, 500*time.Millisecond).Should(Succeed())
By("Waiting for the app to turn healthy")
Eventually(func() bool {
err := k8sClient.Get(ctx, client.ObjectKey{
@@ -530,13 +542,13 @@ var _ = Describe("Application Normal tests", func() {
By("Checking the component status matches expectations")
Expect(app.Status.Services[0].Healthy).Should(BeTrue())
Expect(app.Status.Services[0].Message).Should(Equal(fmt.Sprintf("%v / %v replicas are ready", compReplicas, compReplicas)))
Expect(app.Status.Services[0].Message).Should(Equal(fmt.Sprintf("Healthy - %v / %v replicas are ready", compReplicas, compReplicas)))
Expect(app.Status.Services[0].Details["readyReplicas"]).Should(Equal(fmt.Sprintf("%v", compReplicas)))
Expect(app.Status.Services[0].Details["deploymentReady"]).Should(Equal("true"))
By("Checking the trait status matches expectations")
Expect(app.Status.Services[0].Traits[0].Healthy).Should(BeTrue())
Expect(app.Status.Services[0].Traits[0].Message).Should(Equal(fmt.Sprintf("%v / %v replicas are ready", traitReplicas, traitReplicas)))
Expect(app.Status.Services[0].Traits[0].Message).Should(Equal(fmt.Sprintf("Healthy - %v / %v replicas are ready", traitReplicas, traitReplicas)))
Expect(app.Status.Services[0].Traits[0].Details["allReplicasReady"]).Should(Equal("true"))
})
})

View File

@@ -40,13 +40,19 @@ spec:
}
}
status:
customStatus: |
message: "\(context.output.status.readyReplicas) / \(context.output.status.replicas) replicas are ready"
healthPolicy: |
isHealth: context.output.status.replicas == context.output.status.readyReplicas
details: |
deploymentReady: *(context.output.status.replicas == context.output.status.readyReplicas) | false
$expectedReplicas: context.output.spec.replicas
readyReplicas: *context.output.status.readyReplicas | 0
healthPolicy: |
isHealth: context.status.details.readyReplicas == context.status.details.$expectedReplicas
customStatus: |
if context.status.healthy {
message: "Healthy - \(context.status.details.readyReplicas) / \(context.status.details.$expectedReplicas) replicas are ready"
}
if !context.status.healthy {
message: "Unhealthy - \(context.status.details.readyReplicas) / \(context.status.details.$expectedReplicas) replicas are ready"
}
workload:
definition:
apiVersion: apps/v1

View File

@@ -45,10 +45,18 @@ spec:
}
}
status:
customStatus: |
message: "\(context.outputs.deployment.status.readyReplicas) / \(context.outputs.deployment.status.replicas) replicas are ready"
healthPolicy: |
isHealth: context.outputs.deployment.status.replicas == context.outputs.deployment.status.readyReplicas
details: |
allReplicasReady: *(context.outputs.deployment.status.replicas == context.outputs.deployment.status.readyReplicas) | false
deploymentReady: *(context.outputs.deployment.status.replicas == context.outputs.deployment.status.readyReplicas) | false
$expectedReplicas: context.outputs.deployment.spec.replicas
readyReplicas: *context.outputs.deployment.status.readyReplicas | 0
allReplicasReady: readyReplicas == $expectedReplicas
healthPolicy: |
isHealth: context.status.details.readyReplicas == context.status.details.$expectedReplicas
customStatus: |
if context.status.healthy {
message: "Healthy - \(context.status.details.readyReplicas) / \(context.status.details.$expectedReplicas) replicas are ready"
}
if !context.status.healthy {
message: "Unhealthy - \(context.status.details.readyReplicas) / \(context.status.details.$expectedReplicas) replicas are ready"
}
workloadRefPath: ""