Skip to content

Commit 5b7cf3e

Browse files
Improve chained upgrade observability
1 parent 18c34a8 commit 5b7cf3e

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

internal/controllers/topology/cluster/conditions.go

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -238,22 +238,21 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
238238
}
239239

240240
// If MachineDeployments are upgrading surface it, if MachineDeployments are pending upgrades then surface the upgrade plans.
241-
if s.UpgradeTracker.MachineDeployments.IsAnyUpgrading() {
242-
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachineDeployment", "MachineDeployments", s.UpgradeTracker.MachineDeployments.UpgradingNames()), *cpVersion)
241+
upgradingMachineDeploymentNames, pendingMachineDeploymentNames, deferredMachineDeploymentNames := dedupNames(s.UpgradeTracker.MachineDeployments)
242+
if len(upgradingMachineDeploymentNames) > 0 {
243+
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachineDeployment", "MachineDeployments", upgradingMachineDeploymentNames), *cpVersion)
243244
if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
244245
fmt.Fprintf(msgBuilder, " (%s pending)", strings.Join(s.UpgradeTracker.MachineDeployments.UpgradePlan, ", "))
245246
}
246247
}
247248

248-
pendingMachineDeploymentNames := sets.Set[string]{}.Insert(s.UpgradeTracker.MachineDeployments.PendingUpgradeNames()...)
249-
pendingMachineDeploymentNames = pendingMachineDeploymentNames.Difference(sets.Set[string]{}.Insert(s.UpgradeTracker.MachineDeployments.DeferredUpgradeNames()...))
250249
if len(pendingMachineDeploymentNames) > 0 && len(s.UpgradeTracker.MachineDeployments.UpgradePlan) > 0 {
251-
fmt.Fprintf(msgBuilder, "\n * %s pending upgrade to version %s", nameList("MachineDeployment", "MachineDeployments", pendingMachineDeploymentNames.UnsortedList()), strings.Join(s.UpgradeTracker.MachineDeployments.UpgradePlan, ", "))
250+
fmt.Fprintf(msgBuilder, "\n * %s pending upgrade to version %s", nameList("MachineDeployment", "MachineDeployments", pendingMachineDeploymentNames), strings.Join(s.UpgradeTracker.MachineDeployments.UpgradePlan, ", "))
252251
}
253252

254253
// If MachineDeployments has been deferred or put on hold, surface it.
255-
if s.UpgradeTracker.MachineDeployments.IsAnyUpgradeDeferred() {
256-
fmt.Fprintf(msgBuilder, "\n * %s upgrade to version %s deferred using topology.cluster.x-k8s.io/defer-upgrade or hold-upgrade-sequence annotations", nameList("MachineDeployment", "MachineDeployments", s.UpgradeTracker.MachineDeployments.DeferredUpgradeNames()), *cpVersion)
254+
if len(deferredMachineDeploymentNames) > 0 {
255+
fmt.Fprintf(msgBuilder, "\n * %s upgrade to version %s deferred using topology.cluster.x-k8s.io/defer-upgrade or hold-upgrade-sequence annotations", nameList("MachineDeployment", "MachineDeployments", deferredMachineDeploymentNames), *cpVersion)
257256
// If Deferred upgrades are blocking an upgrade, surface it.
258257
// Note: Hook blocking takes the precedence on this signal.
259258
if !s.HookResponseTracker.IsAnyBlocking() &&
@@ -270,22 +269,21 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
270269
}
271270

272271
// If MachinePools are upgrading surface it, if MachinePools are pending upgrades then surface the upgrade plans.
273-
if s.UpgradeTracker.MachinePools.IsAnyUpgrading() {
274-
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachinePool", "MachinePools", s.UpgradeTracker.MachinePools.UpgradingNames()), *cpVersion)
272+
upgradingMachinePoolNames, pendingMachinePoolNames, deferredMachinePoolNames := dedupNames(s.UpgradeTracker.MachinePools)
273+
if len(upgradingMachinePoolNames) > 0 {
274+
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachinePool", "MachinePools", upgradingMachinePoolNames), *cpVersion)
275275
if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
276276
fmt.Fprintf(msgBuilder, " (%s pending)", strings.Join(s.UpgradeTracker.MachinePools.UpgradePlan, ", "))
277277
}
278278
}
279279

280-
pendingMachinePoolNames := sets.Set[string]{}.Insert(s.UpgradeTracker.MachinePools.PendingUpgradeNames()...)
281-
pendingMachinePoolNames = pendingMachinePoolNames.Difference(sets.Set[string]{}.Insert(s.UpgradeTracker.MachinePools.DeferredUpgradeNames()...))
282280
if len(pendingMachinePoolNames) > 0 && len(s.UpgradeTracker.MachinePools.UpgradePlan) > 0 {
283-
fmt.Fprintf(msgBuilder, "\n * %s pending upgrade to version %s", nameList("MachinePool", "MachinePools", pendingMachinePoolNames.UnsortedList()), strings.Join(s.UpgradeTracker.MachinePools.UpgradePlan, ", "))
281+
fmt.Fprintf(msgBuilder, "\n * %s pending upgrade to version %s", nameList("MachinePool", "MachinePools", pendingMachinePoolNames), strings.Join(s.UpgradeTracker.MachinePools.UpgradePlan, ", "))
284282
}
285283

286284
// If MachinePools has been deferred or put on hold, surface it.
287-
if s.UpgradeTracker.MachinePools.IsAnyUpgradeDeferred() {
288-
fmt.Fprintf(msgBuilder, "\n * %s upgrade to version %s deferred using topology.cluster.x-k8s.io/defer-upgrade or hold-upgrade-sequence annotations", nameList("MachinePool", "MachinePools", s.UpgradeTracker.MachinePools.DeferredUpgradeNames()), *cpVersion)
285+
if len(deferredMachinePoolNames) > 0 {
286+
fmt.Fprintf(msgBuilder, "\n * %s upgrade to version %s deferred using topology.cluster.x-k8s.io/defer-upgrade or hold-upgrade-sequence annotations", nameList("MachinePool", "MachinePools", deferredMachinePoolNames), *cpVersion)
289287
// If Deferred upgrades are blocking an upgrade, surface it.
290288
// Note: Hook blocking takes the precedence on this signal.
291289
if !s.HookResponseTracker.IsAnyBlocking() &&
@@ -333,6 +331,17 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
333331
return nil
334332
}
335333

334+
// dedupNames take care of names that might exist in multiple lists.
335+
func dedupNames(t scope.WorkerUpgradeTracker) ([]string, []string, []string) {
336+
// upgrading names are preserved
337+
upgradingSet := sets.Set[string]{}.Insert(t.UpgradingNames()...)
338+
// upgrading names are removed from deferred names (give precedence to the fact that it is upgrading now)
339+
deferredSet := sets.Set[string]{}.Insert(t.DeferredUpgradeNames()...).Difference(upgradingSet)
340+
// upgrading and deferred names are removed from pending names (it is pending if not upgrading or deferred)
341+
pendingSet := sets.Set[string]{}.Insert(t.PendingUpgradeNames()...).Difference(upgradingSet).Difference(deferredSet)
342+
return upgradingSet.UnsortedList(), pendingSet.UnsortedList(), deferredSet.UnsortedList()
343+
}
344+
336345
// computeNameList computes list of names from the given list to be shown in conditions.
337346
// It shortens the list to at most 5 names and adds an ellipsis at the end if the list
338347
// has more than 3 elements.

0 commit comments

Comments
 (0)