Skip to content

Commit 52dff2b

Browse files
authored
Merge pull request #13002 from fabriziopandini/improve-topology-reconciled-condition
🌱 Improve topology reconciled condition
2 parents 8847017 + 33e9f88 commit 52dff2b

File tree

2 files changed

+69
-13
lines changed

2 files changed

+69
-13
lines changed

internal/controllers/topology/cluster/conditions.go

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
201201
reason := clusterv1.ClusterTopologyReconciledClusterUpgradingReason
202202
v1Beta1Reason := clusterv1.TopologyReconciledClusterUpgradingV1Beta1Reason
203203

204-
cpVersion, err := contract.ControlPlane().Version().Get(s.Current.ControlPlane.Object)
204+
cpVersion, err := contract.ControlPlane().Version().Get(s.Desired.ControlPlane.Object)
205205
if err != nil {
206206
return errors.Wrap(err, "failed to get control plane spec version")
207207
}
@@ -213,21 +213,15 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
213213

214214
// If control plane is upgrading surface it, otherwise surface the pending upgrade plan.
215215
if s.UpgradeTracker.ControlPlane.IsStartingUpgrade || s.UpgradeTracker.ControlPlane.IsUpgrading {
216-
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", s.Current.ControlPlane.Object.GetKind(), *cpVersion)
217-
if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
218-
fmt.Fprintf(msgBuilder, " (%s pending)", strings.Join(s.UpgradeTracker.ControlPlane.UpgradePlan, ", "))
219-
}
216+
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s%s", s.Current.ControlPlane.Object.GetKind(), *cpVersion, pendingVersions(s.UpgradeTracker.ControlPlane.UpgradePlan, *cpVersion))
220217
} else if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
221218
fmt.Fprintf(msgBuilder, "\n * %s pending upgrade to version %s", s.Current.ControlPlane.Object.GetKind(), strings.Join(s.UpgradeTracker.ControlPlane.UpgradePlan, ", "))
222219
}
223220

224221
// If MachineDeployments are upgrading surface it, if MachineDeployments are pending upgrades then surface the upgrade plans.
225222
upgradingMachineDeploymentNames, pendingMachineDeploymentNames, deferredMachineDeploymentNames := dedupNames(s.UpgradeTracker.MachineDeployments)
226223
if len(upgradingMachineDeploymentNames) > 0 {
227-
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachineDeployment", "MachineDeployments", upgradingMachineDeploymentNames), *cpVersion)
228-
if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
229-
fmt.Fprintf(msgBuilder, " (%s pending)", strings.Join(s.UpgradeTracker.MachineDeployments.UpgradePlan, ", "))
230-
}
224+
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s%s", nameList("MachineDeployment", "MachineDeployments", upgradingMachineDeploymentNames), *cpVersion, pendingVersions(s.UpgradeTracker.MachineDeployments.UpgradePlan, *cpVersion))
231225
}
232226

233227
if len(pendingMachineDeploymentNames) > 0 && len(s.UpgradeTracker.MachineDeployments.UpgradePlan) > 0 {
@@ -255,10 +249,7 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
255249
// If MachinePools are upgrading surface it, if MachinePools are pending upgrades then surface the upgrade plans.
256250
upgradingMachinePoolNames, pendingMachinePoolNames, deferredMachinePoolNames := dedupNames(s.UpgradeTracker.MachinePools)
257251
if len(upgradingMachinePoolNames) > 0 {
258-
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s", nameList("MachinePool", "MachinePools", upgradingMachinePoolNames), *cpVersion)
259-
if len(s.UpgradeTracker.ControlPlane.UpgradePlan) > 0 {
260-
fmt.Fprintf(msgBuilder, " (%s pending)", strings.Join(s.UpgradeTracker.MachinePools.UpgradePlan, ", "))
261-
}
252+
fmt.Fprintf(msgBuilder, "\n * %s upgrading to version %s%s", nameList("MachinePool", "MachinePools", upgradingMachinePoolNames), *cpVersion, pendingVersions(s.UpgradeTracker.MachinePools.UpgradePlan, *cpVersion))
262253
}
263254

264255
if len(pendingMachinePoolNames) > 0 && len(s.UpgradeTracker.MachinePools.UpgradePlan) > 0 {
@@ -315,6 +306,21 @@ func (r *Reconciler) reconcileTopologyReconciledCondition(s *scope.Scope, cluste
315306
return nil
316307
}
317308

309+
// pendingVersion return a message with pending version in the upgrad plan.
310+
func pendingVersions(plan []string, version string) string {
311+
// clone the plan to avoid side effects on the original object.
312+
planWithoutVersion := []string{}
313+
for _, v := range plan {
314+
if v != version {
315+
planWithoutVersion = append(planWithoutVersion, v)
316+
}
317+
}
318+
if len(planWithoutVersion) > 0 {
319+
return fmt.Sprintf(" (%s pending)", strings.Join(planWithoutVersion, ", "))
320+
}
321+
return ""
322+
}
323+
318324
// dedupNames take care of names that might exist in multiple lists.
319325
func dedupNames(t scope.WorkerUpgradeTracker) ([]string, []string, []string) {
320326
// upgrading names are preserved

internal/controllers/topology/cluster/conditions_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,50 @@ func TestReconcileTopologyReconciledCondition(t *testing.T) {
966966
" * Following hooks are blocking upgrade: AfterClusterUpgrade: msg",
967967
},
968968

969+
// Message edge cases
970+
971+
{
972+
name: "Should drop fist version from pending upgrade",
973+
reconcileErr: nil,
974+
s: &scope.Scope{
975+
Current: &scope.ClusterState{
976+
Cluster: &clusterv1.Cluster{
977+
Spec: clusterv1.ClusterSpec{
978+
ControlPlaneRef: clusterv1.ContractVersionedObjectReference{Name: "controlplane1"},
979+
InfrastructureRef: clusterv1.ContractVersionedObjectReference{Name: "infra1"},
980+
Topology: clusterv1.Topology{
981+
Version: "v1.23.0",
982+
},
983+
},
984+
},
985+
ControlPlane: &scope.ControlPlaneState{
986+
Object: builder.ControlPlane("ns1", "controlplane1").WithVersion("v1.22.0").Build(),
987+
},
988+
},
989+
UpgradeTracker: func() *scope.UpgradeTracker {
990+
ut := scope.NewUpgradeTracker()
991+
ut.ControlPlane.UpgradePlan = []string{}
992+
ut.MachineDeployments.UpgradePlan = []string{"v1.22.0", "v1.23.0"}
993+
ut.MachineDeployments.MarkUpgrading("md1")
994+
ut.MachineDeployments.MarkPendingUpgrade("md2")
995+
ut.MachineDeployments.MarkPendingUpgrade("md3")
996+
ut.MachineDeployments.MarkPendingUpgrade("md4")
997+
return ut
998+
}(),
999+
HookResponseTracker: scope.NewHookResponseTracker(),
1000+
},
1001+
wantV1Beta1ConditionStatus: corev1.ConditionFalse,
1002+
wantV1Beta1ConditionReason: clusterv1.TopologyReconciledClusterUpgradingV1Beta1Reason,
1003+
wantV1Beta1ConditionMessage: "Cluster is upgrading to v1.23.0\n" +
1004+
" * MachineDeployment md1 upgrading to version v1.22.0 (v1.23.0 pending)\n" + // v1.22.0 dropped from the pending list
1005+
" * MachineDeployments md2, md3, md4 pending upgrade to version v1.22.0, v1.23.0",
1006+
wantConditionStatus: metav1.ConditionFalse,
1007+
wantConditionReason: clusterv1.ClusterTopologyReconciledClusterUpgradingReason,
1008+
wantConditionMessage: "Cluster is upgrading to v1.23.0\n" +
1009+
" * MachineDeployment md1 upgrading to version v1.22.0 (v1.23.0 pending)\n" + // v1.22.0 dropped from the pending list
1010+
" * MachineDeployments md2, md3, md4 pending upgrade to version v1.22.0, v1.23.0",
1011+
},
1012+
9691013
// Hold & defer upgrade
9701014

9711015
{
@@ -1129,6 +1173,12 @@ func TestReconcileTopologyReconciledCondition(t *testing.T) {
11291173

11301174
objs := []client.Object{}
11311175
if tt.s != nil && tt.s.Current != nil {
1176+
tt.s.Desired = &scope.ClusterState{}
1177+
tt.s.Desired.Cluster = tt.s.Current.Cluster.DeepCopy()
1178+
if tt.s.Current.ControlPlane != nil {
1179+
tt.s.Desired.ControlPlane = &scope.ControlPlaneState{}
1180+
tt.s.Desired.ControlPlane.Object = tt.s.Current.ControlPlane.Object.DeepCopy()
1181+
}
11321182
for _, md := range tt.s.Current.MachineDeployments {
11331183
objs = append(objs, md.Object)
11341184
}

0 commit comments

Comments
 (0)