From 0b12f461b1a52032321d65ea1c306217afc35992 Mon Sep 17 00:00:00 2001 From: Angel Marin Date: Wed, 13 May 2026 08:39:58 +0200 Subject: [PATCH] HYPERFLEET-1064 - feat: e2e test to use LastKnownReconciled --- e2e/adapter/adapter_failover.go | 4 ++-- e2e/cluster/adapter_failure.go | 4 ++-- e2e/cluster/concurrent_creation.go | 4 ++-- e2e/cluster/crash_recovery.go | 4 ++-- e2e/cluster/creation.go | 8 ++++---- e2e/cluster/update_edge_cases.go | 4 ++-- e2e/nodepool/concurrent_creation.go | 4 ++-- e2e/nodepool/creation.go | 8 ++++---- e2e/nodepool/update_edge_cases.go | 4 ++-- pkg/client/constants.go | 3 ++- 10 files changed, 24 insertions(+), 23 deletions(-) diff --git a/e2e/adapter/adapter_failover.go b/e2e/adapter/adapter_failover.go index 2431c0d..56b13f8 100644 --- a/e2e/adapter/adapter_failover.go +++ b/e2e/adapter/adapter_failover.go @@ -122,9 +122,9 @@ var _ = ginkgo.Describe("[Suite: adapter-failures][negative] Adapter framework c "initial cluster conditions should have Reconciled=False") hasAvailableFalse := h.HasResourceCondition(cluster.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusFalse) + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusFalse) g.Expect(hasAvailableFalse).To(BeTrue(), - "initial cluster conditions should have Available=False") + "initial cluster conditions should have LastKnownReconciled=False") }, h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval).Should(Succeed()) ginkgo.By("Verify adapter execution detects failure and reports error") diff --git a/e2e/cluster/adapter_failure.go b/e2e/cluster/adapter_failure.go index d8a8ade..4354171 100644 --- a/e2e/cluster/adapter_failure.go +++ b/e2e/cluster/adapter_failure.go @@ -169,8 +169,8 @@ var _ = ginkgo.Describe("[Suite: cluster][negative] Cluster Can Reflect Adapter "cluster Reconciled condition should remain False") g.Expect(h.HasResourceCondition(cl.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusFalse)).To(BeTrue(), - "cluster Available condition should remain False") + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusFalse)).To(BeTrue(), + "cluster LastKnownReconciled condition should remain False") }, h.Cfg.Polling.Interval*3, h.Cfg.Polling.Interval).Should(Succeed()) ginkgo.GinkgoWriter.Printf("Verified cluster top-level status: Reconciled=False, Available=False (reflecting adapter failure)\n") diff --git a/e2e/cluster/concurrent_creation.go b/e2e/cluster/concurrent_creation.go index 119a04e..de1cf8d 100644 --- a/e2e/cluster/concurrent_creation.go +++ b/e2e/cluster/concurrent_creation.go @@ -94,9 +94,9 @@ var _ = ginkgo.Describe("[Suite: cluster][concurrent] System can process concurr Expect(err).NotTo(HaveOccurred(), "failed to get cluster %d (%s)", i, clusterID) hasAvailable := h.HasResourceCondition(cluster.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue) + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue) Expect(hasAvailable).To(BeTrue(), - "cluster %d (%s) should have Available=True", i, clusterID) + "cluster %d (%s) should have LastKnownReconciled=True", i, clusterID) ginkgo.GinkgoWriter.Printf("Cluster %d (%s) reached Reconciled=True, Available=True\n", i, clusterID) } diff --git a/e2e/cluster/crash_recovery.go b/e2e/cluster/crash_recovery.go index 000453a..9c45dd4 100644 --- a/e2e/cluster/crash_recovery.go +++ b/e2e/cluster/crash_recovery.go @@ -246,7 +246,7 @@ func verifyClusterReconciled(ctx context.Context, h *helper.Helper, clusterID st "cluster Reconciled condition should transition to True") g.Expect(h.HasResourceCondition(cl.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)).To(BeTrue(), - "cluster Available condition should transition to True") + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue)).To(BeTrue(), + "cluster LastKnownReconciled condition should transition to True") }, h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval).Should(Succeed()) } diff --git a/e2e/cluster/creation.go b/e2e/cluster/creation.go index d87cc30..66a9a91 100644 --- a/e2e/cluster/creation.go +++ b/e2e/cluster/creation.go @@ -123,12 +123,12 @@ var _ = ginkgo.Describe("[Suite: cluster][baseline] Cluster Resource Type Lifecy Expect(hasReconciled).To(BeTrue(), "cluster should have Reconciled=True condition") hasAvailable := h.HasResourceCondition(finalCluster.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue) - Expect(hasAvailable).To(BeTrue(), "cluster should have Available=True condition") + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue) + Expect(hasAvailable).To(BeTrue(), "cluster should have LastKnownReconciled=True condition") - // Validate observedGeneration for Reconciled and Available conditions + // Validate observedGeneration for Reconciled and LastKnownReconciled conditions for _, condition := range finalCluster.Status.Conditions { - if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable { + if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeLastKnownReconciled { Expect(condition.ObservedGeneration).To(Equal(int32(1)), "cluster condition %s should have observed_generation=1 for new creation request", condition.Type) } diff --git a/e2e/cluster/update_edge_cases.go b/e2e/cluster/update_edge_cases.go index 39c9403..d139032 100644 --- a/e2e/cluster/update_edge_cases.go +++ b/e2e/cluster/update_edge_cases.go @@ -129,11 +129,11 @@ var _ = ginkgo.Describe("[Suite: cluster][update] Labels-Only PATCH", Eventually(h.PollClusterAdapterStatuses(ctx, clusterID), h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval). Should(helper.HaveAllAdaptersAtGeneration(h.Cfg.Adapters.Cluster, int32(2))) - ginkgo.By("verifying cluster reaches Reconciled=True and Available=True") + ginkgo.By("verifying cluster reaches Reconciled=True and LastKnownReconciled=True") Eventually(h.PollCluster(ctx, clusterID), h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval). Should(helper.HaveResourceCondition(client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue)) Eventually(h.PollCluster(ctx, clusterID), h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval). - Should(helper.HaveResourceCondition(client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)) + Should(helper.HaveResourceCondition(client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue)) finalCluster, err := h.Client.GetCluster(ctx, clusterID) Expect(err).NotTo(HaveOccurred()) diff --git a/e2e/nodepool/concurrent_creation.go b/e2e/nodepool/concurrent_creation.go index 016345f..bf202bd 100644 --- a/e2e/nodepool/concurrent_creation.go +++ b/e2e/nodepool/concurrent_creation.go @@ -112,9 +112,9 @@ var _ = ginkgo.Describe("[Suite: nodepool][concurrent] Multiple nodepools can co Expect(err).NotTo(HaveOccurred(), "failed to get nodepool %d (%s)", i, npID) hasAvailable := h.HasResourceCondition(np.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue) + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue) Expect(hasAvailable).To(BeTrue(), - "nodepool %d (%s) should have Available=True", i, npID) + "nodepool %d (%s) should have LastKnownReconciled=True", i, npID) ginkgo.GinkgoWriter.Printf("Nodepool %d (%s) reached Reconciled=True, Available=True\n", i, npID) } diff --git a/e2e/nodepool/creation.go b/e2e/nodepool/creation.go index 1c6bb7a..58f997c 100644 --- a/e2e/nodepool/creation.go +++ b/e2e/nodepool/creation.go @@ -131,12 +131,12 @@ var _ = ginkgo.Describe("[Suite: nodepool][baseline] NodePool Resource Type Life Expect(hasReconciled).To(BeTrue(), "nodepool should have Reconciled=True condition") hasAvailable := h.HasResourceCondition(finalNodePool.Status.Conditions, - client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue) - Expect(hasAvailable).To(BeTrue(), "nodepool should have Available=True condition") + client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue) + Expect(hasAvailable).To(BeTrue(), "nodepool should have LastKnownReconciled=True condition") - // Validate observedGeneration for Reconciled and Available conditions + // Validate observedGeneration for Reconciled and LastKnownReconciled conditions for _, condition := range finalNodePool.Status.Conditions { - if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable { + if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeLastKnownReconciled { Expect(condition.ObservedGeneration).To(Equal(int32(1)), "nodepool condition %s should have observed_generation=1 for new creation request", condition.Type) } diff --git a/e2e/nodepool/update_edge_cases.go b/e2e/nodepool/update_edge_cases.go index 7ac0db3..ef33708 100644 --- a/e2e/nodepool/update_edge_cases.go +++ b/e2e/nodepool/update_edge_cases.go @@ -68,11 +68,11 @@ var _ = ginkgo.Describe("[Suite: nodepool][update] Labels-Only PATCH", Eventually(h.PollNodePoolAdapterStatuses(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval). Should(helper.HaveAllAdaptersAtGeneration(h.Cfg.Adapters.NodePool, int32(2))) - ginkgo.By("verifying nodepool reaches Reconciled=True and Available=True") + ginkgo.By("verifying nodepool reaches Reconciled=True and LastKnownReconciled=True") Eventually(h.PollNodePool(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.NodePool.Reconciled, h.Cfg.Polling.Interval). Should(helper.HaveResourceCondition(client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue)) Eventually(h.PollNodePool(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.NodePool.Reconciled, h.Cfg.Polling.Interval). - Should(helper.HaveResourceCondition(client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)) + Should(helper.HaveResourceCondition(client.ConditionTypeLastKnownReconciled, openapi.ResourceConditionStatusTrue)) finalNP, err := h.Client.GetNodePool(ctx, clusterID, nodepoolID) Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/client/constants.go b/pkg/client/constants.go index 045f8ec..6d32549 100644 --- a/pkg/client/constants.go +++ b/pkg/client/constants.go @@ -18,5 +18,6 @@ const ( // Condition types used by cluster-level resources (clusters, nodepools) const ( - ConditionTypeReconciled = "Reconciled" // Resource is reconciled + ConditionTypeReconciled = "Reconciled" // Resource is reconciled + ConditionTypeLastKnownReconciled = "LastKnownReconciled" // API-computed aggregated condition (renamed from Available) )