@@ -163,6 +163,7 @@ var _ = Describe("[sig-cluster-lifecycle][OCPFeatureGate:MachineAPIMigration] Ma
163163 verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
164164 verifyMAPIMachineSynchronizedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
165165 verifyMachineSynchronizedGeneration (cl , newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
166+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .MachineAPISynchronized )
166167 verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
167168 verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
168169 })
@@ -174,6 +175,7 @@ var _ = Describe("[sig-cluster-lifecycle][OCPFeatureGate:MachineAPIMigration] Ma
174175 verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
175176 verifyMAPIMachineSynchronizedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
176177 verifyMachineSynchronizedGeneration (cl , newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
178+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .ClusterAPISynchronized )
177179 verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
178180 verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
179181 })
@@ -185,6 +187,7 @@ var _ = Describe("[sig-cluster-lifecycle][OCPFeatureGate:MachineAPIMigration] Ma
185187 verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
186188 verifyMAPIMachineSynchronizedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
187189 verifyMachineSynchronizedGeneration (cl , newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
190+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .MachineAPISynchronized )
188191 verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
189192 verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
190193 })
@@ -201,5 +204,86 @@ var _ = Describe("[sig-cluster-lifecycle][OCPFeatureGate:MachineAPIMigration] Ma
201204 })
202205 })
203206 })
207+
208+ var _ = Describe ("Machine Migration Rollback Tests" , Ordered , func () {
209+ var machineRollbackName = "machine-migration-rollback"
210+ var newMapiMachine * mapiv1beta1.Machine
211+ var newCapiMachine * clusterv1beta1.Machine
212+
213+ Context ("MAPI -> Migrating -> MAPI rollback" , func () {
214+ BeforeAll (func () {
215+ By ("Creating a MAPI machine with spec.authoritativeAPI: MachineAPI" )
216+ newMapiMachine = createMAPIMachineWithAuthority (ctx , cl , machineRollbackName , mapiv1beta1 .MachineAuthorityMachineAPI )
217+ verifyMachineRunning (cl , newMapiMachine )
218+
219+ DeferCleanup (func () {
220+ By ("Cleaning up machine resources" )
221+ cleanupMachineResources (
222+ ctx ,
223+ cl ,
224+ []* clusterv1beta1.Machine {newCapiMachine },
225+ []* mapiv1beta1.Machine {newMapiMachine },
226+ )
227+ })
228+ })
229+
230+ It ("should create a CAPI mirror machine and verify initial state" , func () {
231+ newCapiMachine = capiframework .GetMachine (cl , machineRollbackName , capiframework .CAPINamespace )
232+ verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
233+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .MachineAPISynchronized )
234+ verifyMAPIMachineSynchronizedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
235+ verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
236+ verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
237+ })
238+
239+ It ("should rollback to MachineAPI when migration is cancelled during Migrating state" , func () {
240+ By ("Updating spec.authoritativeAPI: ClusterAPI to initiate migration" )
241+ updateMachineAuthoritativeAPI (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
242+
243+ By ("Waiting for the machine to enter Migrating state with SynchronizedAPI showing the source (MachineAPI)" )
244+ verifyMachineMigrating (newMapiMachine , mapiv1beta1 .MachineAPISynchronized )
245+
246+ By ("Cancelling migration by setting spec.authoritativeAPI back to MachineAPI" )
247+ updateMachineAuthoritativeAPI (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
248+
249+ By ("Verifying the machine returns to MachineAPI authority" )
250+ verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
251+
252+ By ("Verifying SynchronizedAPI is preserved as MachineAPI after rollback" )
253+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .MachineAPISynchronized )
254+
255+ By ("Verifying the machine continues to run normally after rollback" )
256+ verifyMachineRunning (cl , newMapiMachine )
257+
258+ By ("Verifying paused conditions are correct after rollback" )
259+ verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
260+ verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityMachineAPI )
261+ })
262+
263+ It ("should complete a full migration to ClusterAPI after a previous rollback" , func () {
264+ By ("Updating spec.authoritativeAPI: ClusterAPI again" )
265+ updateMachineAuthoritativeAPI (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
266+
267+ By ("Verifying migration completes successfully this time" )
268+ verifyMachineRunning (cl , newCapiMachine )
269+ verifyMachineAuthoritative (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
270+ verifyMachineSynchronizedAPI (newMapiMachine , mapiv1beta1 .ClusterAPISynchronized )
271+ verifyMAPIMachineSynchronizedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
272+ verifyMachinePausedCondition (newMapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
273+ verifyMachinePausedCondition (newCapiMachine , mapiv1beta1 .MachineAuthorityClusterAPI )
274+ })
275+
276+ It ("should verify mirror machines are deleted when deleting CAPI machine" , func () {
277+ By ("Deleting CAPI machine" )
278+ capiframework .DeleteMachines (ctx , cl , capiframework .CAPINamespace , newCapiMachine )
279+ verifyResourceRemoved (newMapiMachine )
280+ verifyResourceRemoved (newCapiMachine )
281+ verifyResourceRemoved (& awsv1.AWSMachine {
282+ TypeMeta : metav1.TypeMeta {Kind : "AWSMachine" , APIVersion : awsv1 .GroupVersion .String ()},
283+ ObjectMeta : metav1.ObjectMeta {Name : machineRollbackName , Namespace : capiframework .CAPINamespace },
284+ })
285+ })
286+ })
287+ })
204288 })
205289})
0 commit comments