@@ -1857,3 +1857,51 @@ func tinkWorker(clusterName string, opts ...workerOpt) *tinkerbell.Workers {
18571857 }
18581858 return w
18591859}
1860+
1861+ func TestReconcilerValidateHardwareWorkerRollingUpdateMaxSurgeRespected (t * testing.T ) {
1862+ tt := newReconcilerTest (t )
1863+
1864+ tt .eksaSupportObjs = append (tt .eksaSupportObjs , tt .kcp )
1865+
1866+ // Create existing MachineDeployment with a DIFFERENT InfrastructureRef name
1867+ // to simulate a template change (e.g., from a previous version)
1868+ worker := tinkWorker (tt .cluster .Name , func (w * tinkerbell.Workers ) {
1869+ w .Groups [0 ].MachineDeployment .Name = "workload-cluster-md-0"
1870+ w .Groups [0 ].MachineDeployment .Spec .Template .Spec .InfrastructureRef .Name = "workload-cluster-md-0-0"
1871+ w .Groups [0 ].ProviderMachineTemplate .Name = "workload-cluster-md-0-0"
1872+ })
1873+ tt .eksaSupportObjs = append (tt .eksaSupportObjs , worker .Groups [0 ].MachineDeployment )
1874+ tt .eksaSupportObjs = append (tt .eksaSupportObjs , worker .Groups [0 ].ProviderMachineTemplate )
1875+
1876+ tt .eksaSupportObjs = append (tt .eksaSupportObjs , tinkHardware ("hw1" , "worker" ))
1877+ tt .eksaSupportObjs = append (tt .eksaSupportObjs , tinkHardware ("hw-cp" , "cp" ))
1878+
1879+ tt .withFakeClient ()
1880+
1881+ logger := test .NewNullLogger ()
1882+ scope := tt .buildScope ()
1883+
1884+ scope .ClusterSpec .Config .Cluster .Spec .WorkerNodeGroupConfigurations [0 ].UpgradeRolloutStrategy = & anywherev1.WorkerNodesUpgradeRolloutStrategy {
1885+ Type : anywherev1 .RollingUpdateStrategyType ,
1886+ RollingUpdate : & anywherev1.WorkerNodesRollingUpdateParams {
1887+ MaxSurge : 3 ,
1888+ MaxUnavailable : 0 ,
1889+ },
1890+ }
1891+
1892+ wngRef := scope .ClusterSpec .Config .Cluster .Spec .WorkerNodeGroupConfigurations [0 ].MachineGroupRef .Name
1893+ scope .ClusterSpec .Config .TinkerbellMachineConfigs [wngRef ].Spec .OSImageURL = "new-os-image"
1894+
1895+ _ , err := tt .reconciler ().GenerateSpec (tt .ctx , logger , scope )
1896+ tt .Expect (err ).NotTo (HaveOccurred ())
1897+
1898+ _ , err = tt .reconciler ().DetectOperation (tt .ctx , logger , scope )
1899+ tt .Expect (err ).NotTo (HaveOccurred ())
1900+
1901+ result , err := tt .reconciler ().ValidateHardware (tt .ctx , logger , scope )
1902+
1903+ tt .Expect (err ).ToNot (BeNil ())
1904+ tt .Expect (result ).To (Equal (controller.Result {}))
1905+ tt .Expect (* tt .cluster .Status .FailureMessage ).To (ContainSubstring ("minimum hardware count not met for selector" ))
1906+ tt .Expect (tt .cluster .Status .FailureReason ).To (HaveValue (Equal (anywherev1 .HardwareInvalidReason )))
1907+ }
0 commit comments