Repository: openshift/api
Pull request #2279: OCPCLOUD-2914: Add MAPI to CAPI migration to TechPreview
Author: login: nrb
Labels: name: lgtm
description: Indicates that a PR is ready to be merged.
name: size/L
description: Denotes a PR that changes 100-499 lines, ignoring generated files.
name: approved
description: Indicates a PR has been approved by an approver from all required OWNERS files.
name: jira/valid-reference
description: Indicates that this PR references a valid Jira ticket of any type.
Created: 2025-04-14T15:30:47Z | Merged: 2025-04-24T10:44:58Z

Enabling the MAPI to CAPI conversion in TechPreview for 4.19.

Required before merging:

* [x] https://github.com/openshift/cluster-capi-operator/pull/268
* [x] https://github.com/openshift/cluster-capi-operator/pull/278
* [x] https://github.com/openshift/cluster-capi-operator/pull/282



Diff:
diff --git a/features.md b/features.md
index d7220f829d0..73a1726b273 100644
--- a/features.md
+++ b/features.md
@@ -2,7 +2,6 @@
 | ------ | --- | --- | --- | --- | --- | ---  |
 | ClusterAPIInstall| | | | | |  |
 | EventedPLEG| | | | | |  |
-| MachineAPIMigration| | | | | |  |
 | MachineAPIOperatorDisableMachineHealthCheckController| | | | | |  |
 | MultiArchInstallAzure| | | | | |  |
 | ClusterVersionOperatorConfiguration| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | |  |
@@ -39,6 +38,7 @@
 | InsightsOnDemandDataGather| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
 | InsightsRuntimeExtractor| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
 | KMSEncryptionProvider| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
+| MachineAPIMigration| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
 | MachineAPIProviderOpenStack| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
 | MachineConfigNodes| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
 | MaxUnavailableStatefulSet| | | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span> | <span style="background-color: #519450">Enabled</span>  |
diff --git a/features/features.go b/features/features.go
index fae134fde06..04157a9cf22 100644
--- a/features/features.go
+++ b/features/features.go
@@ -599,6 +599,7 @@ var (
 					contactPerson("jspeed").
 					productScope(ocpSpecific).
 					enhancementPR(legacyFeatureGateWithoutEnhancement).
+					enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
 					mustRegister()
 
 	FeatureGatePersistentIPsForVirtualization = newFeatureGate("PersistentIPsForVirtualization").
diff --git a/machine/v1/tests/controlplanemachinesets.machine.openshift.io/CPMSMachineNamePrefix.yaml b/machine/v1/tests/controlplanemachinesets.machine.openshift.io/CPMSMachineNamePrefix.yaml
index cde8933ea62..0862c3320ce 100644
--- a/machine/v1/tests/controlplanemachinesets.machine.openshift.io/CPMSMachineNamePrefix.yaml
+++ b/machine/v1/tests/controlplanemachinesets.machine.openshift.io/CPMSMachineNamePrefix.yaml
@@ -3,7 +3,6 @@ name: "ControlPlaneMachineSet (+CPMSMachineNamePrefix)"
 crdName: controlplanemachinesets.machine.openshift.io
 featureGates:
   - CPMSMachineNamePrefix
-  - -MachineAPIMigration
 tests:
   onCreate:
     - name: Should be able to create a minimal ControlPlaneMachineSet
@@ -24,6 +23,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
       expected: |
         apiVersion: machine.openshift.io/v1
@@ -46,6 +46,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
     - name: Should be able to create ControlPlaneMachineSet with machineNamePrefix
       initial: |
@@ -66,6 +67,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
       expected: |
         apiVersion: machine.openshift.io/v1
@@ -89,6 +91,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
     - name: Should reject to create ControlPlaneMachineSet with empty machineNamePrefix
       initial: |
@@ -109,6 +112,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
       expectedError: 'Invalid value: "": spec.machineNamePrefix in body should be at least 1 chars long'
     - name: Should reject to create ControlPlaneMachineSet with invalid machineNamePrefix
@@ -130,6 +134,7 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
       expectedError: 'Invalid value: "string": a lowercase RFC 1123 subdomain must consist of lowercase alphanumeric characters, hyphens (''-''), and periods (''.''). Each block, separated by periods, must start and end with an alphanumeric character. Hyphens are not allowed at the start or end of a block, and consecutive periods are not permitted.'
     - name: Should reject to create ControlPlaneMachineSet with invalid machineNamePrefix - Consecutive periods are not permitted
@@ -151,5 +156,6 @@ tests:
                   machine.openshift.io/cluster-api-machine-type: master
                   machine.openshift.io/cluster-api-cluster: cluster
               spec:
+                authoritativeAPI: MachineAPI
                 providerSpec: {}
       expectedError: 'Invalid value: "string": a lowercase RFC 1123 subdomain must consist of lowercase alphanumeric characters, hyphens (''-''), and periods (''.''). Each block, separated by periods, must start and end with an alphanumeric character. Hyphens are not allowed at the start or end of a block, and consecutive periods are not permitted.'
diff --git a/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml b/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
index 943f8d5c08d..20c2a62b7bb 100644
--- a/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
+++ b/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
@@ -553,6 +553,20 @@ spec:
                           failure domain field. This will be overriden when the Machines
                           are created based on the FailureDomains field.
                         properties:
+                          authoritativeAPI:
+                            default: MachineAPI
+                            description: |-
+                              authoritativeAPI is the API that is authoritative for this resource.
+                              Valid values are MachineAPI and ClusterAPI.
+                              When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                              When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                              Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                              Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                              To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                            enum:
+                            - MachineAPI
+                            - ClusterAPI
+                            type: string
                           lifecycleHooks:
                             description: |-
                               lifecycleHooks allow users to pause operations on the machine at
diff --git a/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml b/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
index a6f673d5683..ad20c3d5d2c 100644
--- a/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
+++ b/machine/v1/zz_generated.crd-manifests/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
@@ -553,6 +553,20 @@ spec:
                           failure domain field. This will be overriden when the Machines
                           are created based on the FailureDomains field.
                         properties:
+                          authoritativeAPI:
+                            default: MachineAPI
+                            description: |-
+                              authoritativeAPI is the API that is authoritative for this resource.
+                              Valid values are MachineAPI and ClusterAPI.
+                              When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                              When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                              Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                              Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                              To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                            enum:
+                            - MachineAPI
+                            - ClusterAPI
+                            type: string
                           lifecycleHooks:
                             description: |-
                               lifecycleHooks allow users to pause operations on the machine at
diff --git a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-DevPreviewNoUpgrade.crd.yaml b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-DevPreviewNoUpgrade.crd.yaml
index 448bfea4395..349398de6d9 100644
--- a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-DevPreviewNoUpgrade.crd.yaml
+++ b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-DevPreviewNoUpgrade.crd.yaml
@@ -81,6 +81,20 @@ spec:
           spec:
             description: MachineSpec defines the desired state of Machine
             properties:
+              authoritativeAPI:
+                default: MachineAPI
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI and ClusterAPI.
+                  When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                  When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                  Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                  Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                  To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                type: string
               lifecycleHooks:
                 description: |-
                   lifecycleHooks allow users to pause operations on the machine at
@@ -364,6 +378,23 @@ spec:
                   type: object
                 type: array
                 x-kubernetes-list-type: atomic
+              authoritativeAPI:
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI, ClusterAPI and Migrating.
+                  This value is updated by the migration controller to reflect the authoritative API.
+                  Machine API and Cluster API controllers use this value to determine whether or not to reconcile the resource.
+                  When set to Migrating, the migration controller is currently performing the handover of authority from one API to the other.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                - Migrating
+                type: string
+                x-kubernetes-validations:
+                - message: The authoritativeAPI field must not transition directly
+                    from MachineAPI to ClusterAPI or vice versa. It must transition
+                    through Migrating.
+                  rule: self == 'Migrating' || self == oldSelf || oldSelf == 'Migrating'
               conditions:
                 description: conditions defines the current state of the Machine
                 items:
@@ -537,7 +568,23 @@ spec:
                   serialized/deserialized from this field.
                 type: object
                 x-kubernetes-preserve-unknown-fields: true
+              synchronizedGeneration:
+                description: |-
+                  synchronizedGeneration is the generation of the authoritative resource that the non-authoritative resource is synchronised with.
+                  This field is set when the authoritative resource is updated and the sync controller has updated the non-authoritative resource to match.
+                format: int64
+                minimum: 0
+                type: integer
             type: object
+            x-kubernetes-validations:
+            - fieldPath: .synchronizedGeneration
+              message: synchronizedGeneration must not decrease unless authoritativeAPI
+                is transitioning from Migrating to another value
+              reason: FieldValueInvalid
+              rule: '!has(oldSelf.synchronizedGeneration) || (has(self.synchronizedGeneration)
+                && self.synchronizedGeneration >= oldSelf.synchronizedGeneration)
+                || (oldSelf.authoritativeAPI == ''Migrating'' && self.authoritativeAPI
+                != ''Migrating'')'
         type: object
     served: true
     storage: true
diff --git a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-TechPreviewNoUpgrade.crd.yaml b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-TechPreviewNoUpgrade.crd.yaml
index c08ecebcaea..c402e33acb6 100644
--- a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-TechPreviewNoUpgrade.crd.yaml
+++ b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machines-TechPreviewNoUpgrade.crd.yaml
@@ -81,6 +81,20 @@ spec:
           spec:
             description: MachineSpec defines the desired state of Machine
             properties:
+              authoritativeAPI:
+                default: MachineAPI
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI and ClusterAPI.
+                  When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                  When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                  Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                  Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                  To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                type: string
               lifecycleHooks:
                 description: |-
                   lifecycleHooks allow users to pause operations on the machine at
@@ -364,6 +378,23 @@ spec:
                   type: object
                 type: array
                 x-kubernetes-list-type: atomic
+              authoritativeAPI:
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI, ClusterAPI and Migrating.
+                  This value is updated by the migration controller to reflect the authoritative API.
+                  Machine API and Cluster API controllers use this value to determine whether or not to reconcile the resource.
+                  When set to Migrating, the migration controller is currently performing the handover of authority from one API to the other.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                - Migrating
+                type: string
+                x-kubernetes-validations:
+                - message: The authoritativeAPI field must not transition directly
+                    from MachineAPI to ClusterAPI or vice versa. It must transition
+                    through Migrating.
+                  rule: self == 'Migrating' || self == oldSelf || oldSelf == 'Migrating'
               conditions:
                 description: conditions defines the current state of the Machine
                 items:
@@ -537,7 +568,23 @@ spec:
                   serialized/deserialized from this field.
                 type: object
                 x-kubernetes-preserve-unknown-fields: true
+              synchronizedGeneration:
+                description: |-
+                  synchronizedGeneration is the generation of the authoritative resource that the non-authoritative resource is synchronised with.
+                  This field is set when the authoritative resource is updated and the sync controller has updated the non-authoritative resource to match.
+                format: int64
+                minimum: 0
+                type: integer
             type: object
+            x-kubernetes-validations:
+            - fieldPath: .synchronizedGeneration
+              message: synchronizedGeneration must not decrease unless authoritativeAPI
+                is transitioning from Migrating to another value
+              reason: FieldValueInvalid
+              rule: '!has(oldSelf.synchronizedGeneration) || (has(self.synchronizedGeneration)
+                && self.synchronizedGeneration >= oldSelf.synchronizedGeneration)
+                || (oldSelf.authoritativeAPI == ''Migrating'' && self.authoritativeAPI
+                != ''Migrating'')'
         type: object
     served: true
     storage: true
diff --git a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-DevPreviewNoUpgrade.crd.yaml b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-DevPreviewNoUpgrade.crd.yaml
index 6da86259ddd..82abfc0411d 100644
--- a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-DevPreviewNoUpgrade.crd.yaml
+++ b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-DevPreviewNoUpgrade.crd.yaml
@@ -66,6 +66,20 @@ spec:
           spec:
             description: MachineSetSpec defines the desired state of MachineSet
             properties:
+              authoritativeAPI:
+                default: MachineAPI
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI and ClusterAPI.
+                  When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                  When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                  Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                  Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                  To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                type: string
               deletePolicy:
                 description: |-
                   deletePolicy defines the policy used to identify nodes to delete when downscaling.
@@ -267,6 +281,20 @@ spec:
                       Specification of the desired behavior of the machine.
                       More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
                     properties:
+                      authoritativeAPI:
+                        default: MachineAPI
+                        description: |-
+                          authoritativeAPI is the API that is authoritative for this resource.
+                          Valid values are MachineAPI and ClusterAPI.
+                          When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                          When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                          Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                          Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                          To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                        enum:
+                        - MachineAPI
+                        - ClusterAPI
+                        type: string
                       lifecycleHooks:
                         description: |-
                           lifecycleHooks allow users to pause operations on the machine at
@@ -535,6 +563,23 @@ spec:
           status:
             description: MachineSetStatus defines the observed state of MachineSet
             properties:
+              authoritativeAPI:
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI, ClusterAPI and Migrating.
+                  This value is updated by the migration controller to reflect the authoritative API.
+                  Machine API and Cluster API controllers use this value to determine whether or not to reconcile the resource.
+                  When set to Migrating, the migration controller is currently performing the handover of authority from one API to the other.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                - Migrating
+                type: string
+                x-kubernetes-validations:
+                - message: The authoritativeAPI field must not transition directly
+                    from MachineAPI to ClusterAPI or vice versa. It must transition
+                    through Migrating.
+                  rule: self == 'Migrating' || self == oldSelf || oldSelf == 'Migrating'
               availableReplicas:
                 description: The number of available replicas (ready for at least
                   minReadySeconds) for this MachineSet.
@@ -630,7 +675,23 @@ spec:
                 description: replicas is the most recently observed number of replicas.
                 format: int32
                 type: integer
+              synchronizedGeneration:
+                description: |-
+                  synchronizedGeneration is the generation of the authoritative resource that the non-authoritative resource is synchronised with.
+                  This field is set when the authoritative resource is updated and the sync controller has updated the non-authoritative resource to match.
+                format: int64
+                minimum: 0
+                type: integer
             type: object
+            x-kubernetes-validations:
+            - fieldPath: .synchronizedGeneration
+              message: synchronizedGeneration must not decrease unless authoritativeAPI
+                is transitioning from Migrating to another value
+              reason: FieldValueInvalid
+              rule: '!has(oldSelf.synchronizedGeneration) || (has(self.synchronizedGeneration)
+                && self.synchronizedGeneration >= oldSelf.synchronizedGeneration)
+                || (oldSelf.authoritativeAPI == ''Migrating'' && self.authoritativeAPI
+                != ''Migrating'')'
         type: object
     served: true
     storage: true
diff --git a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-TechPreviewNoUpgrade.crd.yaml b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-TechPreviewNoUpgrade.crd.yaml
index 51bbf02e04a..c7d512567ed 100644
--- a/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-TechPreviewNoUpgrade.crd.yaml
+++ b/machine/v1beta1/zz_generated.crd-manifests/0000_10_machine-api_01_machinesets-TechPreviewNoUpgrade.crd.yaml
@@ -66,6 +66,20 @@ spec:
           spec:
             description: MachineSetSpec defines the desired state of MachineSet
             properties:
+              authoritativeAPI:
+                default: MachineAPI
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI and ClusterAPI.
+                  When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                  When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                  Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                  Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                  To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                type: string
               deletePolicy:
                 description: |-
                   deletePolicy defines the policy used to identify nodes to delete when downscaling.
@@ -267,6 +281,20 @@ spec:
                       Specification of the desired behavior of the machine.
                       More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
                     properties:
+                      authoritativeAPI:
+                        default: MachineAPI
+                        description: |-
+                          authoritativeAPI is the API that is authoritative for this resource.
+                          Valid values are MachineAPI and ClusterAPI.
+                          When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                          When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                          Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                          Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                          To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                        enum:
+                        - MachineAPI
+                        - ClusterAPI
+                        type: string
                       lifecycleHooks:
                         description: |-
                           lifecycleHooks allow users to pause operations on the machine at
@@ -535,6 +563,23 @@ spec:
           status:
             description: MachineSetStatus defines the observed state of MachineSet
             properties:
+              authoritativeAPI:
+                description: |-
+                  authoritativeAPI is the API that is authoritative for this resource.
+                  Valid values are MachineAPI, ClusterAPI and Migrating.
+                  This value is updated by the migration controller to reflect the authoritative API.
+                  Machine API and Cluster API controllers use this value to determine whether or not to reconcile the resource.
+                  When set to Migrating, the migration controller is currently performing the handover of authority from one API to the other.
+                enum:
+                - MachineAPI
+                - ClusterAPI
+                - Migrating
+                type: string
+                x-kubernetes-validations:
+                - message: The authoritativeAPI field must not transition directly
+                    from MachineAPI to ClusterAPI or vice versa. It must transition
+                    through Migrating.
+                  rule: self == 'Migrating' || self == oldSelf || oldSelf == 'Migrating'
               availableReplicas:
                 description: The number of available replicas (ready for at least
                   minReadySeconds) for this MachineSet.
@@ -630,7 +675,23 @@ spec:
                 description: replicas is the most recently observed number of replicas.
                 format: int32
                 type: integer
+              synchronizedGeneration:
+                description: |-
+                  synchronizedGeneration is the generation of the authoritative resource that the non-authoritative resource is synchronised with.
+                  This field is set when the authoritative resource is updated and the sync controller has updated the non-authoritative resource to match.
+                format: int64
+                minimum: 0
+                type: integer
             type: object
+            x-kubernetes-validations:
+            - fieldPath: .synchronizedGeneration
+              message: synchronizedGeneration must not decrease unless authoritativeAPI
+                is transitioning from Migrating to another value
+              reason: FieldValueInvalid
+              rule: '!has(oldSelf.synchronizedGeneration) || (has(self.synchronizedGeneration)
+                && self.synchronizedGeneration >= oldSelf.synchronizedGeneration)
+                || (oldSelf.authoritativeAPI == ''Migrating'' && self.authoritativeAPI
+                != ''Migrating'')'
         type: object
     served: true
     storage: true
diff --git a/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
index 943f8d5c08d..20c2a62b7bb 100644
--- a/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
+++ b/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-DevPreviewNoUpgrade.crd.yaml
@@ -553,6 +553,20 @@ spec:
                           failure domain field. This will be overriden when the Machines
                           are created based on the FailureDomains field.
                         properties:
+                          authoritativeAPI:
+                            default: MachineAPI
+                            description: |-
+                              authoritativeAPI is the API that is authoritative for this resource.
+                              Valid values are MachineAPI and ClusterAPI.
+                              When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                              When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                              Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                              Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                              To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                            enum:
+                            - MachineAPI
+                            - ClusterAPI
+                            type: string
                           lifecycleHooks:
                             description: |-
                               lifecycleHooks allow users to pause operations on the machine at
diff --git a/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml b/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
index a6f673d5683..ad20c3d5d2c 100644
--- a/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
+++ b/payload-manifests/crds/0000_10_control-plane-machine-set_01_controlplanemachinesets-TechPreviewNoUpgrade.crd.yaml
@@ -553,6 +553,20 @@ spec:
                           failure domain field. This will be overriden when the Machines
                           are created based on the FailureDomains field.
                         properties:
+                          authoritativeAPI:
+                            default: MachineAPI
+                            description: |-
+                              authoritativeAPI is the API that is authoritative for this resource.
+                              Valid values are MachineAPI and ClusterAPI.
+                              When set to MachineAPI, writes to the spec of the machine.openshift.io copy of this resource will be reflected into the cluster.x-k8s.io copy.
+                              When set to ClusterAPI, writes to the spec of the cluster.x-k8s.io copy of this resource will be reflected into the machine.openshift.io copy.
+                              Updates to the status will be reflected in both copies of the resource, based on the controller implementing the functionality of the API.
+                              Currently the authoritative API determines which controller will manage the resource, this will change in a future release.
+                              To ensure the change has been accepted, please verify that the `status.authoritativeAPI` field has been updated to the desired value and that the `Synchronized` condition is present and set to `True`.
+                            enum:
+                            - MachineAPI
+                            - ClusterAPI
+                            type: string
                           lifecycleHooks:
                             description: |-
                               lifecycleHooks allow users to pause operations on the machine at
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
index 03d5464e1b8..e048e7cca50 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-DevPreviewNoUpgrade.yaml
@@ -21,9 +21,6 @@
                     {
                         "name": "EventedPLEG"
                     },
-                    {
-                        "name": "MachineAPIMigration"
-                    },
                     {
                         "name": "MachineAPIOperatorDisableMachineHealthCheckController"
                     },
@@ -167,6 +164,9 @@
                     {
                         "name": "KMSv1"
                     },
+                    {
+                        "name": "MachineAPIMigration"
+                    },
                     {
                         "name": "MachineAPIProviderOpenStack"
                     },
diff --git a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
index c1e5c88294d..3b20aff656b 100644
--- a/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-Hypershift-TechPreviewNoUpgrade.yaml
@@ -27,9 +27,6 @@
                     {
                         "name": "Example2"
                     },
-                    {
-                        "name": "MachineAPIMigration"
-                    },
                     {
                         "name": "MachineAPIOperatorDisableMachineHealthCheckController"
                     },
@@ -179,6 +176,9 @@
                     {
                         "name": "KMSv1"
                     },
+                    {
+                        "name": "MachineAPIMigration"
+                    },
                     {
                         "name": "MachineAPIProviderOpenStack"
                     },
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
index 53ccebbf628..cf6144abf82 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-DevPreviewNoUpgrade.yaml
@@ -21,9 +21,6 @@
                     {
                         "name": "EventedPLEG"
                     },
-                    {
-                        "name": "MachineAPIMigration"
-                    },
                     {
                         "name": "MachineAPIOperatorDisableMachineHealthCheckController"
                     },
@@ -158,6 +155,9 @@
                     {
                         "name": "KMSv1"
                     },
+                    {
+                        "name": "MachineAPIMigration"
+                    },
                     {
                         "name": "MachineAPIProviderOpenStack"
                     },
diff --git a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml b/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
index ac2f2d500c5..a4ddc6a6e56 100644
--- a/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
+++ b/payload-manifests/featuregates/featureGate-SelfManagedHA-TechPreviewNoUpgrade.yaml
@@ -27,9 +27,6 @@
                     {
                         "name": "Example2"
                     },
-                    {
-                        "name": "MachineAPIMigration"
-                    },
                     {
                         "name": "MachineAPIOperatorDisableMachineHealthCheckController"
                     },
@@ -170,6 +167,9 @@
                     {
                         "name": "KMSv1"
                     },
+                    {
+                        "name": "MachineAPIMigration"
+                    },
                     {
                         "name": "MachineAPIProviderOpenStack"
                     },


Reviews:
user: login: JoelSpeed
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T16:05:58Z
user: login: JoelSpeed
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T11:04:28Z
user: login: nrb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T19:58:51Z
user: login: nrb
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-16T20:13:42Z
user: login: damdo
body: /approve
/lgtm 
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-17T20:36:51Z

Review comments:
diff_hunk: @@ -599,6 +599,7 @@ var (
 					contactPerson("jspeed").
 					productScope(ocpSpecific).
 					enhancementPR(legacyFeatureGateWithoutEnhancement).
+					enableIn(configv1.TechPreviewNoUpgrade).
path: features/features.go
user: login: JoelSpeed
body: Anything enabled in TPNU must also be enabled in DPNU
```suggestion
					enableIn(configv1.DevPreviewNoUpgrade, configv1.TechPreviewNoUpgrade).
```
created_at: 2025-04-14T16:05:58Z
author_association: CONTRIBUTOR
path: openapi/generated_openapi/zz_generated.openapi.go
user: login: JoelSpeed
body: These files should not have been removed, seems there's a problem with the generation? 
created_at: 2025-04-16T11:04:28Z
author_association: CONTRIBUTOR
path: openapi/generated_openapi/zz_generated.openapi.go
user: login: nrb
body: Yeah, I'm not sure what's going on here. I run `PROTO_OPTIONAL=1 make update-codegen-crds`.

I'm in my `$GOPATH`, as shown below.

```shell
api on  OCPCLOUD-2914 [!⇣] via 🐹 v1.23.4 took 14s
❯ pwd
/Users/nbrubake/go/1.22.7/src/github.com/openshift/api

api on  OCPCLOUD-2914 [!⇣] via 🐹 v1.23.4
❯ echo $GOPATH
/Users/nbrubake/go/1.22.7
```

protoc should be the right version.

```shell
api on  OCPCLOUD-2914 [!⇣] via 🐹 v1.23.4
❯ protoc --version
libprotoc 23.4
```

Is it my Go version?
created_at: 2025-04-16T19:58:51Z
author_association: CONTRIBUTOR
path: openapi/generated_openapi/zz_generated.openapi.go
user: login: nrb
body: Used `make generate-with-container` and I think it's correct now.
created_at: 2025-04-16T20:13:42Z
author_association: CONTRIBUTOR

PR comments:
user: login: openshift-ci-robot
created_at: 2025-04-14T15:30:52Z
body: @nrb: This pull request references [OCPCLOUD-2914](https://issues.redhat.com//browse/OCPCLOUD-2914) which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.19.0" version, but no target version was set.

<details>

In response to [this](https://github.com/openshift/api/pull/2279):

>Enabling the MAPI to CAPI conversion in TechPreview for 4.19.
>


Instructions for interacting with me using PR comments are available [here](https://prow.ci.openshift.org/command-help?repo=openshift%2Fapi).  If you have questions or suggestions related to my behavior, please file an issue against the [openshift-eng/jira-lifecycle-plugin](https://github.com/openshift-eng/jira-lifecycle-plugin/issues/new) repository.
</details>
author_association: NONE
user: login: openshift-ci[bot]
created_at: 2025-04-14T15:31:04Z
body: Hello @nrb! Some important instructions when contributing to openshift/api:
API design plays an important part in the user experience of OpenShift and as such API PRs are subject to a high level of scrutiny to ensure they follow our best practices. If you haven't already done so, please review the [OpenShift API Conventions](https://github.com/openshift/enhancements/blob/master/dev-guide/api-conventions.md) and ensure that your proposed changes are compliant.  Following these conventions will help expedite the api review process for your PR.

author_association: CONTRIBUTOR
user: login: openshift-ci-robot
created_at: 2025-04-14T15:31:55Z
body: @nrb: This pull request references [OCPCLOUD-2914](https://issues.redhat.com//browse/OCPCLOUD-2914) which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.19.0" version, but no target version was set.

<details>

In response to [this](https://github.com/openshift/api/pull/2279):

>Enabling the MAPI to CAPI conversion in TechPreview for 4.19.
>
>Required before merging:
>
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/268
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/278
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/282
>


Instructions for interacting with me using PR comments are available [here](https://prow.ci.openshift.org/command-help?repo=openshift%2Fapi).  If you have questions or suggestions related to my behavior, please file an issue against the [openshift-eng/jira-lifecycle-plugin](https://github.com/openshift-eng/jira-lifecycle-plugin/issues/new) repository.
</details>
author_association: NONE
user: login: nrb
created_at: 2025-04-14T15:39:06Z
body: /hold
author_association: CONTRIBUTOR
user: login: openshift-ci-robot
created_at: 2025-04-16T19:35:17Z
body: @nrb: This pull request references [OCPCLOUD-2914](https://issues.redhat.com//browse/OCPCLOUD-2914) which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.19.0" version, but no target version was set.

<details>

In response to [this](https://github.com/openshift/api/pull/2279):

>Enabling the MAPI to CAPI conversion in TechPreview for 4.19.
>
>Required before merging:
>
>* [x] https://github.com/openshift/cluster-capi-operator/pull/268
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/278
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/282
>


Instructions for interacting with me using PR comments are available [here](https://prow.ci.openshift.org/command-help?repo=openshift%2Fapi).  If you have questions or suggestions related to my behavior, please file an issue against the [openshift-eng/jira-lifecycle-plugin](https://github.com/openshift-eng/jira-lifecycle-plugin/issues/new) repository.
</details>
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-17T03:32:00Z
body: /retest
author_association: NONE
user: login: openshift-ci-robot
created_at: 2025-04-17T17:30:23Z
body: @nrb: This pull request references [OCPCLOUD-2914](https://issues.redhat.com//browse/OCPCLOUD-2914) which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "4.19.0" version, but no target version was set.

<details>

In response to [this](https://github.com/openshift/api/pull/2279):

>Enabling the MAPI to CAPI conversion in TechPreview for 4.19.
>
>Required before merging:
>
>* [x] https://github.com/openshift/cluster-capi-operator/pull/268
>* [ ] https://github.com/openshift/cluster-capi-operator/pull/278
>* [x] https://github.com/openshift/cluster-capi-operator/pull/282
>


Instructions for interacting with me using PR comments are available [here](https://prow.ci.openshift.org/command-help?repo=openshift%2Fapi).  If you have questions or suggestions related to my behavior, please file an issue against the [openshift-eng/jira-lifecycle-plugin](https://github.com/openshift-eng/jira-lifecycle-plugin/issues/new) repository.
</details>
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-18T01:38:37Z
body: /retest
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-18T04:28:55Z
body: Install failed due to running out of quota.
`level=error msg=failed to fetch Cluster: failed to generate asset "Cluster": failed to create cluster: failed during pre-provisioning: failed to create IAM roles: failed to create IAM master role: failed to create master role: LimitExceeded: Cannot exceed quota for RolesPerAccount: 1000`
author_association: NONE
user: login: damdo
created_at: 2025-04-18T09:32:56Z
body: /retest
author_association: MEMBER
user: login: JoelSpeed
created_at: 2025-04-18T09:47:31Z
body: /lgtm
author_association: CONTRIBUTOR
user: login: openshift-ci[bot]
created_at: 2025-04-18T09:47:46Z
body: [APPROVALNOTIFIER] This PR is **APPROVED**

This pull-request has been approved by: *<a href="https://github.com/openshift/api/pull/2279#pullrequestreview-2776873810" title="LGTM">damdo</a>*, *<a href="https://github.com/openshift/api/pull/2279#issuecomment-2815098275" title="LGTM">JoelSpeed</a>*, *<a href="https://github.com/openshift/api/pull/2279#" title="Author self-approved">nrb</a>*

The full list of commands accepted by this bot can be found [here](https://go.k8s.io/bot-commands?repo=openshift%2Fapi).

The pull request process is described [here](https://git.k8s.io/community/contributors/guide/owners.md#the-code-review-process)

<details >
Needs approval from an approver in each of these files:

- ~~[OWNERS](https://github.com/openshift/api/blob/master/OWNERS)~~ [JoelSpeed]

Approvers can indicate their approval by writing `/approve` in a comment
Approvers can cancel approval by writing `/approve cancel` in a comment
</details>
<!-- META={"approvers":[]} -->
author_association: CONTRIBUTOR
user: login: damdo
created_at: 2025-04-19T09:00:36Z
body: /hold

/retest
author_association: MEMBER
user: login: damdo
created_at: 2025-04-19T10:57:12Z
body: /test ?
author_association: MEMBER
user: login: openshift-ci[bot]
created_at: 2025-04-19T10:57:15Z
body: @damdo: The following commands are available to trigger required jobs:
```
/test build
```
```
/test e2e-aws-ovn
```
```
/test e2e-aws-ovn-hypershift
```
```
/test e2e-aws-ovn-hypershift-conformance
```
```
/test e2e-aws-ovn-techpreview
```
```
/test e2e-aws-serial
```
```
/test e2e-aws-serial-techpreview
```
```
/test e2e-upgrade
```
```
/test e2e-upgrade-out-of-change
```
```
/test images
```
```
/test integration
```
```
/test lint
```
```
/test minor-e2e-upgrade-minor
```
```
/test minor-images
```
```
/test unit
```
```
/test verify
```
```
/test verify-client-go
```
```
/test verify-crd-schema
```
```
/test verify-deps
```
```
/test verify-feature-promotion
```

The following commands are available to trigger optional jobs:
```
/test e2e-azure
```
```
/test e2e-gcp
```
```
/test okd-scos-e2e-aws-ovn
```
```
/test okd-scos-images
```

Use `/test all` to run the following jobs that were automatically triggered:
```
pull-ci-openshift-api-master-build
```
```
pull-ci-openshift-api-master-e2e-aws-ovn
```
```
pull-ci-openshift-api-master-e2e-aws-ovn-hypershift
```
```
pull-ci-openshift-api-master-e2e-aws-ovn-hypershift-conformance
```
```
pull-ci-openshift-api-master-e2e-aws-ovn-techpreview
```
```
pull-ci-openshift-api-master-e2e-aws-serial
```
```
pull-ci-openshift-api-master-e2e-aws-serial-techpreview
```
```
pull-ci-openshift-api-master-e2e-azure
```
```
pull-ci-openshift-api-master-e2e-gcp
```
```
pull-ci-openshift-api-master-e2e-upgrade
```
```
pull-ci-openshift-api-master-e2e-upgrade-out-of-change
```
```
pull-ci-openshift-api-master-images
```
```
pull-ci-openshift-api-master-integration
```
```
pull-ci-openshift-api-master-lint
```
```
pull-ci-openshift-api-master-minor-e2e-upgrade-minor
```
```
pull-ci-openshift-api-master-minor-images
```
```
pull-ci-openshift-api-master-okd-scos-e2e-aws-ovn
```
```
pull-ci-openshift-api-master-unit
```
```
pull-ci-openshift-api-master-verify
```
```
pull-ci-openshift-api-master-verify-client-go
```
```
pull-ci-openshift-api-master-verify-crd-schema
```
```
pull-ci-openshift-api-master-verify-deps
```
```
pull-ci-openshift-api-master-verify-feature-promotion
```



<details>

In response to [this](https://github.com/openshift/api/pull/2279#issuecomment-2816658045):

>/test ?


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository.
</details>
author_association: CONTRIBUTOR
user: login: shellyyang1989
created_at: 2025-04-21T02:56:29Z
body: /test e2e-aws-ovn-techpreview
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-21T03:09:45Z
body: seems like CCO was not working well
```
2025-04-19T11:09:14.136187092Z I0419 11:09:14.136165       1 recorder.go:104] "msg"="error creating aws client: aws credentials secret openshift-machine-api/aws-cloud-credentials: Secret \"aws-cloud-credentials\" not found not found" "logger"="events" "object"={"kind":"MachineSet","namespace":"openshift-machine-api","name":"ci-op-gcz4mxd4-286d2-x69v4-worker-us-west-1b","uid":"78c133a8-1707-445b-8d43-88363111b465","apiVersion":"machine.openshift.io/v1beta1","resourceVersion":"11107"} "reason"="ReconcileError" "type"="Warning"
2025-04-19T11:09:14.145622955Z I0419 11:09:14.145602       1 warning_handler.go:65] "msg"="providerSpec.credentialsSecret: Invalid value: \"aws-cloud-credentials\": not found. Expected CredentialsSecret to exist" "logger"="KubeAPIWarningLogger"
2025-04-19T11:09:14.145829170Z E0419 11:09:14.145813       1 controller.go:341] "msg"="Reconciler error" "error"="error creating aws client: aws credentials secret openshift-machine-api/aws-cloud-credentials: Secret \"aws-cloud-credentials\" not found not found" "MachineSet"={"name":"ci-op-gcz4mxd4-286d2-x69v4-worker-us-west-1b","namespace":"openshift-machine-api"} "controller"="machineset" "controllerGroup"="machine.openshift.io" "controllerKind"="MachineSet" "name"="ci-op-gcz4mxd4-286d2-x69v4-worker-us-west-1b" "namespace"="openshift-machine-api" "reconcileID"="a1bf60c2-1fd3-4821-93d5-0b0509db8c8a"
```
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-21T04:45:29Z
body: [Failed](https://prow.ci.openshift.org/view/gs/test-platform-results/pr-logs/pull/openshift_api/2279/pull-ci-openshift-api-master-e2e-aws-ovn-techpreview/1914151237662543872) again due to dns leaking?
```
level=info msg=Credentials loaded from the "default" profile in file "/var/run/secrets/ci.openshift.io/cluster-profile/.awscred"
level=fatal msg=failed to fetch Cluster Infrastructure Variables: failed to fetch dependency of "Cluster Infrastructure Variables": failed to generate asset "Platform Provisioning Check": baseDomain: Invalid value: "origin-ci-int-aws.dev.rhcloud.com": the zone already has record sets for the domain of the cluster: [api.ci-op-gcz4mxd4-286d2.origin-ci-int-aws.dev.rhcloud.com. (A)]
Installer exit with code 1
```
author_association: NONE
user: login: shellyyang1989
created_at: 2025-04-21T05:04:34Z
body: /test e2e-aws-serial-techpreview
author_association: NONE
user: login: JoelSpeed
created_at: 2025-04-21T12:40:54Z
body: /retest
author_association: CONTRIBUTOR
user: login: nrb
created_at: 2025-04-21T16:28:29Z
body: I believe AWS quota issues are cleared up now.

/retest
author_association: CONTRIBUTOR
user: login: nrb
created_at: 2025-04-22T01:27:08Z
body: /retest-required
author_association: CONTRIBUTOR
user: login: shellyyang1989
created_at: 2025-04-22T05:58:53Z
body: /retest-required
author_association: NONE
user: login: JoelSpeed
created_at: 2025-04-22T09:42:22Z
body: /hold cancel

Pre-requisites appear to have all merged
author_association: CONTRIBUTOR
user: login: openshift-ci-robot
created_at: 2025-04-22T10:20:28Z
body: /retest-required

Remaining retests: 0 against base HEAD f636181788a957668f062ded2e9c732b6ea17285 and 2 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: openshift-ci-robot
created_at: 2025-04-22T12:24:54Z
body: /retest-required

Remaining retests: 0 against base HEAD 8b803ad3d2f52ed09471888a5b68ff456a63bd73 and 1 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: nrb
created_at: 2025-04-22T14:07:19Z
body: /retest-required
author_association: CONTRIBUTOR
user: login: openshift-ci-robot
created_at: 2025-04-22T18:24:55Z
body: /retest-required

Remaining retests: 0 against base HEAD 9aa03e6bc38655953f360285659e83cc628ba58a and 0 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: openshift-ci-robot
created_at: 2025-04-22T19:25:04Z
body: /hold

Revision 153be5c85388dab8ae5ced0b8b577ec2544dcb0a was retested 3 times: holding

author_association: NONE
user: login: JoelSpeed
created_at: 2025-04-23T15:24:02Z
body: /retest

/hold cancel
author_association: CONTRIBUTOR
user: login: openshift-ci-robot
created_at: 2025-04-23T16:33:29Z
body: /retest-required

Remaining retests: 0 against base HEAD 9aa03e6bc38655953f360285659e83cc628ba58a and 2 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: openshift-ci-robot
created_at: 2025-04-23T17:33:12Z
body: /retest-required

Remaining retests: 0 against base HEAD 6bababe9164ea6c78274fd79c94a3f951f8d5ab2 and 1 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: damdo
created_at: 2025-04-23T19:23:34Z
body: /retest
author_association: MEMBER
user: login: openshift-ci-robot
created_at: 2025-04-24T01:22:55Z
body: /retest-required

Remaining retests: 0 against base HEAD 6bababe9164ea6c78274fd79c94a3f951f8d5ab2 and 2 for PR HEAD 153be5c85388dab8ae5ced0b8b577ec2544dcb0a in total

author_association: NONE
user: login: damdo
created_at: 2025-04-24T04:44:34Z
body: /retest-required
author_association: MEMBER
user: login: shellyyang1989
created_at: 2025-04-24T08:24:06Z
body: /retest-required
author_association: NONE
user: login: openshift-ci[bot]
created_at: 2025-04-24T10:40:16Z
body: @nrb: all tests **passed!**


[Full PR test history](https://prow.ci.openshift.org/pr-history?org=openshift&repo=api&pr=2279). [Your PR dashboard](https://prow.ci.openshift.org/pr?query=is:pr+state:open+author:nrb).

<details>

Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes-sigs/prow](https://github.com/kubernetes-sigs/prow/issues/new?title=Prow%20issue:) repository. I understand the commands that are listed [here](https://go.k8s.io/bot-commands).
</details>
<!-- test report -->
author_association: CONTRIBUTOR
user: login: openshift-bot
created_at: 2025-04-24T15:20:16Z
body: **[ART PR BUILD NOTIFIER]**

Distgit: ose-cluster-config-api
This PR has been included in build [ose-cluster-config-api-container-v4.20.0-202504241347.p0.geb41266.assembly.stream.el9](https://brewweb.engineering.redhat.com/brew/buildinfo?buildID=3617920).
All builds following this will include this PR.
author_association: NONE