Skip to content

Commit 337b3f4

Browse files
committed
HYPERFLEET-1064 - feat: e2e test to use LastKnownReconciled
1 parent 7f2fcdc commit 337b3f4

12 files changed

Lines changed: 61 additions & 39 deletions

e2e/adapter/adapter_failover.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ var _ = ginkgo.Describe("[Suite: adapter-failures][negative] Adapter framework c
121121
g.Expect(hasReconciledFalse).To(BeTrue(),
122122
"initial cluster conditions should have Reconciled=False")
123123

124-
hasAvailableFalse := h.HasResourceCondition(cluster.Status.Conditions,
125-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusFalse)
124+
hasAvailableFalse := h.HasAnyResourceCondition(cluster.Status.Conditions,
125+
openapi.ResourceConditionStatusFalse, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)
126126
g.Expect(hasAvailableFalse).To(BeTrue(),
127-
"initial cluster conditions should have Available=False")
127+
"initial cluster conditions should have Available/LastKnownReconciled=False")
128128
}, h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval).Should(Succeed())
129129

130130
ginkgo.By("Verify adapter execution detects failure and reports error")

e2e/cluster/adapter_failure.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ var _ = ginkgo.Describe("[Suite: cluster][negative] Cluster Can Reflect Adapter
168168
client.ConditionTypeReconciled, openapi.ResourceConditionStatusFalse)).To(BeTrue(),
169169
"cluster Reconciled condition should remain False")
170170

171-
g.Expect(h.HasResourceCondition(cl.Status.Conditions,
172-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusFalse)).To(BeTrue(),
173-
"cluster Available condition should remain False")
171+
g.Expect(h.HasAnyResourceCondition(cl.Status.Conditions,
172+
openapi.ResourceConditionStatusFalse, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)).To(BeTrue(),
173+
"cluster Available/LastKnownReconciled condition should remain False")
174174
}, h.Cfg.Polling.Interval*3, h.Cfg.Polling.Interval).Should(Succeed())
175175

176176
ginkgo.GinkgoWriter.Printf("Verified cluster top-level status: Reconciled=False, Available=False (reflecting adapter failure)\n")

e2e/cluster/concurrent_creation.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,10 @@ var _ = ginkgo.Describe("[Suite: cluster][concurrent] System can process concurr
9393
cluster, err := h.Client.GetCluster(ctx, clusterID)
9494
Expect(err).NotTo(HaveOccurred(), "failed to get cluster %d (%s)", i, clusterID)
9595

96-
hasAvailable := h.HasResourceCondition(cluster.Status.Conditions,
97-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)
96+
hasAvailable := h.HasAnyResourceCondition(cluster.Status.Conditions,
97+
openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)
9898
Expect(hasAvailable).To(BeTrue(),
99-
"cluster %d (%s) should have Available=True", i, clusterID)
99+
"cluster %d (%s) should have Available/LastKnownReconciled=True", i, clusterID)
100100

101101
ginkgo.GinkgoWriter.Printf("Cluster %d (%s) reached Reconciled=True, Available=True\n", i, clusterID)
102102
}

e2e/cluster/crash_recovery.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ func verifyClusterReconciled(ctx context.Context, h *helper.Helper, clusterID st
245245
client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue)).To(BeTrue(),
246246
"cluster Reconciled condition should transition to True")
247247

248-
g.Expect(h.HasResourceCondition(cl.Status.Conditions,
249-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)).To(BeTrue(),
250-
"cluster Available condition should transition to True")
248+
g.Expect(h.HasAnyResourceCondition(cl.Status.Conditions,
249+
openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)).To(BeTrue(),
250+
"cluster Available/LastKnownReconciled condition should transition to True")
251251
}, h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval).Should(Succeed())
252252
}

e2e/cluster/creation.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ var _ = ginkgo.Describe("[Suite: cluster][baseline] Cluster Resource Type Lifecy
122122
client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue)
123123
Expect(hasReconciled).To(BeTrue(), "cluster should have Reconciled=True condition")
124124

125-
hasAvailable := h.HasResourceCondition(finalCluster.Status.Conditions,
126-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)
127-
Expect(hasAvailable).To(BeTrue(), "cluster should have Available=True condition")
125+
hasAvailable := h.HasAnyResourceCondition(finalCluster.Status.Conditions,
126+
openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)
127+
Expect(hasAvailable).To(BeTrue(), "cluster should have Available/LastKnownReconciled=True condition")
128128

129-
// Validate observedGeneration for Reconciled and Available conditions
129+
// Validate observedGeneration for Reconciled and Available/LastKnownReconciled conditions
130130
for _, condition := range finalCluster.Status.Conditions {
131-
if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable {
131+
if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable || condition.Type == client.ConditionTypeLastKnownReconciled {
132132
Expect(condition.ObservedGeneration).To(Equal(int32(1)),
133133
"cluster condition %s should have observed_generation=1 for new creation request", condition.Type)
134134
}

e2e/cluster/update_edge_cases.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ var _ = ginkgo.Describe("[Suite: cluster][update] Labels-Only PATCH",
129129
Eventually(h.PollClusterAdapterStatuses(ctx, clusterID), h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval).
130130
Should(helper.HaveAllAdaptersAtGeneration(h.Cfg.Adapters.Cluster, int32(2)))
131131

132-
ginkgo.By("verifying cluster reaches Reconciled=True and Available=True")
132+
ginkgo.By("verifying cluster reaches Reconciled=True and Available/LastKnownReconciled=True")
133133
Eventually(h.PollCluster(ctx, clusterID), h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval).
134134
Should(helper.HaveResourceCondition(client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue))
135135
Eventually(h.PollCluster(ctx, clusterID), h.Cfg.Timeouts.Cluster.Reconciled, h.Cfg.Polling.Interval).
136-
Should(helper.HaveResourceCondition(client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue))
136+
Should(helper.HaveAnyResourceCondition(openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled))
137137

138138
finalCluster, err := h.Client.GetCluster(ctx, clusterID)
139139
Expect(err).NotTo(HaveOccurred())

e2e/nodepool/concurrent_creation.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,10 @@ var _ = ginkgo.Describe("[Suite: nodepool][concurrent] Multiple nodepools can co
111111
np, err := h.Client.GetNodePool(ctx, clusterID, npID)
112112
Expect(err).NotTo(HaveOccurred(), "failed to get nodepool %d (%s)", i, npID)
113113

114-
hasAvailable := h.HasResourceCondition(np.Status.Conditions,
115-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)
114+
hasAvailable := h.HasAnyResourceCondition(np.Status.Conditions,
115+
openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)
116116
Expect(hasAvailable).To(BeTrue(),
117-
"nodepool %d (%s) should have Available=True", i, npID)
117+
"nodepool %d (%s) should have Available/LastKnownReconciled=True", i, npID)
118118

119119
ginkgo.GinkgoWriter.Printf("Nodepool %d (%s) reached Reconciled=True, Available=True\n", i, npID)
120120
}

e2e/nodepool/creation.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,13 @@ var _ = ginkgo.Describe("[Suite: nodepool][baseline] NodePool Resource Type Life
130130
client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue)
131131
Expect(hasReconciled).To(BeTrue(), "nodepool should have Reconciled=True condition")
132132

133-
hasAvailable := h.HasResourceCondition(finalNodePool.Status.Conditions,
134-
client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue)
135-
Expect(hasAvailable).To(BeTrue(), "nodepool should have Available=True condition")
133+
hasAvailable := h.HasAnyResourceCondition(finalNodePool.Status.Conditions,
134+
openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled)
135+
Expect(hasAvailable).To(BeTrue(), "nodepool should have Available/LastKnownReconciled=True condition")
136136

137-
// Validate observedGeneration for Reconciled and Available conditions
137+
// Validate observedGeneration for Reconciled and Available/LastKnownReconciled conditions
138138
for _, condition := range finalNodePool.Status.Conditions {
139-
if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable {
139+
if condition.Type == client.ConditionTypeReconciled || condition.Type == client.ConditionTypeAvailable || condition.Type == client.ConditionTypeLastKnownReconciled {
140140
Expect(condition.ObservedGeneration).To(Equal(int32(1)),
141141
"nodepool condition %s should have observed_generation=1 for new creation request", condition.Type)
142142
}

e2e/nodepool/update_edge_cases.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ var _ = ginkgo.Describe("[Suite: nodepool][update] Labels-Only PATCH",
6868
Eventually(h.PollNodePoolAdapterStatuses(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.Adapter.Processing, h.Cfg.Polling.Interval).
6969
Should(helper.HaveAllAdaptersAtGeneration(h.Cfg.Adapters.NodePool, int32(2)))
7070

71-
ginkgo.By("verifying nodepool reaches Reconciled=True and Available=True")
71+
ginkgo.By("verifying nodepool reaches Reconciled=True and Available/LastKnownReconciled=True")
7272
Eventually(h.PollNodePool(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.NodePool.Reconciled, h.Cfg.Polling.Interval).
7373
Should(helper.HaveResourceCondition(client.ConditionTypeReconciled, openapi.ResourceConditionStatusTrue))
7474
Eventually(h.PollNodePool(ctx, clusterID, nodepoolID), h.Cfg.Timeouts.NodePool.Reconciled, h.Cfg.Polling.Interval).
75-
Should(helper.HaveResourceCondition(client.ConditionTypeAvailable, openapi.ResourceConditionStatusTrue))
75+
Should(helper.HaveAnyResourceCondition(openapi.ResourceConditionStatusTrue, client.ConditionTypeAvailable, client.ConditionTypeLastKnownReconciled))
7676

7777
finalNP, err := h.Client.GetNodePool(ctx, clusterID, nodepoolID)
7878
Expect(err).NotTo(HaveOccurred())

pkg/client/constants.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ const (
1818

1919
// Condition types used by cluster-level resources (clusters, nodepools)
2020
const (
21-
ConditionTypeReconciled = "Reconciled" // Resource is reconciled
21+
ConditionTypeReconciled = "Reconciled" // Resource is reconciled
22+
ConditionTypeLastKnownReconciled = "LastKnownReconciled" // API-computed aggregated condition (renamed from Available)
2223
)

0 commit comments

Comments
 (0)