From aeea055fa41d327252aa323086d4835ed8c64df1 Mon Sep 17 00:00:00 2001 From: Derek Frank Date: Thu, 9 Jul 2026 21:17:58 +0000 Subject: [PATCH] test: assert Ready metric still emits for generic objects that define one MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to #212. That PR stopped the GenericObjectController from fabricating a phantom Ready=Unknown metric for objects without a Ready condition, and tested the absent-Ready case. This adds the complementary case: an object that carries a real, persisted Ready condition (e.g. corev1.Node) must still emit its Ready metric — confirming the observed-only change filters only fabricated conditions, not present ones. --- status/controller_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/status/controller_test.go b/status/controller_test.go index 1a15d87..577c7ef 100644 --- a/status/controller_test.go +++ b/status/controller_test.go @@ -1186,6 +1186,25 @@ var _ = Describe("Generic Controller", func() { Expect(GetMetric("operator_testgenericobject_status_condition_count", conditionLabels(status.ConditionReady, metav1.ConditionUnknown))).To(BeNil()) Expect(GetMetric("operator_testgenericobject_status_condition_current_status_seconds", conditionLabels(status.ConditionReady, metav1.ConditionUnknown))).To(BeNil()) }) + It("should emit a Ready condition metric for objects that define one", func() { + // Objects like corev1.Node carry a real, persisted Ready condition. Skipping + // initialization of absent conditions must not stop us from reporting a Ready + // that is actually present on the object. + testObject := test.Object(&TestGenericObject{}) + gvk := object.GVK(testObject) + testObject.Status = TestGenericStatus{ + Conditions: []metav1.Condition{ + {Type: status.ConditionReady, Status: metav1.ConditionTrue}, + }, + } + + ExpectApplied(ctx, kubeClient, testObject) + ExpectReconciled(ctx, genericController, testObject) + + Expect(GetMetric("operator_status_condition_count", conditionLabelsWithGroupKind(gvk, status.ConditionReady, metav1.ConditionTrue)).GetGauge().GetValue()).To(BeEquivalentTo(1)) + Expect(GetMetric("operator_status_condition_current_status_seconds", conditionLabelsWithGroupKind(gvk, status.ConditionReady, metav1.ConditionTrue)).GetGauge().GetValue()).ToNot(BeZero()) + Expect(GetMetric("operator_testgenericobject_status_condition_count", conditionLabels(status.ConditionReady, metav1.ConditionTrue)).GetGauge().GetValue()).To(BeEquivalentTo(1)) + }) It("should emit transition total metrics for abnormal conditions", func() { testObject := test.Object(&TestGenericObject{}) gvk := object.GVK(testObject)