@@ -44,6 +44,7 @@ import (
4444 "k8s.io/apimachinery/pkg/api/equality"
4545 apierrors "k8s.io/apimachinery/pkg/api/errors"
4646 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
47+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
4748 "k8s.io/apimachinery/pkg/runtime"
4849 "k8s.io/apimachinery/pkg/types"
4950 kerrors "k8s.io/apimachinery/pkg/util/errors"
@@ -78,6 +79,7 @@ type OpenshiftAssistedControlPlaneReconciler struct {
7879
7980var minVersion = semver .MustParse (minOpenShiftVersion )
8081
82+ // +kubebuilder:rbac:groups=apiextensions.k8s.io,resources=customresourcedefinitions,verbs=get;list;watch
8183// +kubebuilder:rbac:groups=bootstrap.cluster.x-k8s.io,resources=openshiftassistedconfigs,verbs=get;list;watch;create;update;patch;delete
8284// +kubebuilder:rbac:groups=infrastructure.cluster.x-k8s.io,resources=*,verbs=get;list;watch;create;update;patch;delete
8385// +kubebuilder:rbac:groups=cluster.x-k8s.io,resources=machinedeployments,verbs=get;list;watch
@@ -447,8 +449,8 @@ func (r *OpenshiftAssistedControlPlaneReconciler) computeDesiredMachine(oacp *co
447449 desiredMachine .Spec .Deletion = oacp .Spec .MachineTemplate .Deletion
448450 desiredMachine .Spec .FailureDomain = failureDomain
449451
450- // Note: by setting the ownerRef on creation we signal to the Machine controller that this is not a stand-alone Machine.
451- _ = controllerutil .SetOwnerReference (oacp , desiredMachine , r .Scheme )
452+ // Note: by setting the controller ownerRef on creation we signal to the Machine controller that this is not a stand-alone Machine.
453+ _ = controllerutil .SetControllerReference (oacp , desiredMachine , r .Scheme )
452454
453455 // Set the in-place mutable fields.
454456 // When we create a new Machine we will just create the Machine with those fields.
@@ -533,7 +535,6 @@ func (r *OpenshiftAssistedControlPlaneReconciler) reconcileReplicas(ctx context.
533535 numMachines := machines .Len ()
534536 desiredReplicas := int (oacp .Spec .Replicas )
535537 machinesToCreate := desiredReplicas - numMachines
536- var errs []error
537538 if machinesToCreate > 0 {
538539 fd , err := failuredomains .NextFailureDomainForScaleUp (ctx , cluster , machines )
539540 if err != nil {
@@ -560,12 +561,12 @@ func (r *OpenshiftAssistedControlPlaneReconciler) reconcileReplicas(ctx context.
560561 log .V (logutil .DebugLevel ).Info ("updating replica status" , "oacp" , oacp , "machines" , machines )
561562
562563 r .updateReplicaStatus (ctx , oacp , machines )
563- return kerrors . NewAggregate ( errs )
564+ return nil
564565}
565566
566567func (r * OpenshiftAssistedControlPlaneReconciler ) scaleUpControlPlane (ctx context.Context , oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , cluster * clusterv1.Cluster , failureDomain string ) (* clusterv1.Machine , error ) {
567568 name := names .SimpleNameGenerator .GenerateName (oacp .Name + "-" )
568- machine , err := r .generateMachine (ctx , oacp , name , cluster , failureDomain )
569+ machine , infraObj , err := r .generateMachine (ctx , oacp , name , cluster , failureDomain )
569570 if err != nil {
570571 return nil , err
571572 }
@@ -574,6 +575,9 @@ func (r *OpenshiftAssistedControlPlaneReconciler) scaleUpControlPlane(ctx contex
574575 if err := r .Create (ctx , bootstrapConfig ); err != nil {
575576 setConditionFalse (oacp , controlplanev1alpha3 .MachinesCreatedCondition , controlplanev1alpha3 .BootstrapTemplateCloningFailedReason ,
576577 "error creating bootstrap config: %v" , err )
578+ if deleteInfraErr := r .Delete (ctx , infraObj ); deleteInfraErr != nil {
579+ err = errors .Join (err , deleteInfraErr )
580+ }
577581 return nil , err
578582 }
579583 machine .Spec .Bootstrap .ConfigRef = clusterv1.ContractVersionedObjectReference {
@@ -587,9 +591,8 @@ func (r *OpenshiftAssistedControlPlaneReconciler) scaleUpControlPlane(ctx contex
587591 if deleteBootstrapErr := r .Delete (ctx , bootstrapConfig ); deleteBootstrapErr != nil {
588592 err = errors .Join (err , deleteBootstrapErr )
589593 }
590- infraRefKey := & corev1.ObjectReference {Name : machine .Spec .InfrastructureRef .Name , Namespace : machine .Namespace }
591- if deleteInfraRefErr := external .Delete (ctx , r .Client , infraRefKey ); deleteInfraRefErr != nil {
592- err = errors .Join (err , deleteInfraRefErr )
594+ if deleteInfraErr := r .Delete (ctx , infraObj ); deleteInfraErr != nil {
595+ err = errors .Join (err , deleteInfraErr )
593596 }
594597 return nil , err
595598 }
@@ -697,18 +700,17 @@ func (r *OpenshiftAssistedControlPlaneReconciler) updateReplicaStatus(ctx contex
697700 }
698701}
699702
700- func (r * OpenshiftAssistedControlPlaneReconciler ) generateMachine (ctx context.Context , oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , name string , cluster * clusterv1.Cluster , failureDomain string ) (* clusterv1.Machine , error ) {
701- // Compute desired Machine
703+ func (r * OpenshiftAssistedControlPlaneReconciler ) generateMachine (ctx context.Context , oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , name string , cluster * clusterv1.Cluster , failureDomain string ) (* clusterv1.Machine , * unstructured.Unstructured , error ) {
702704 machine := r .computeDesiredMachine (oacp , name , cluster , failureDomain )
703- infraRef , err := r .computeInfraRef (ctx , oacp , machine .Name , cluster .Name )
705+ infraObj , infraRef , err := r .createInfraMachine (ctx , oacp , machine .Name , cluster .Name )
704706 if err != nil {
705- return nil , err
707+ return nil , nil , err
706708 }
707709 machine .Spec .InfrastructureRef = infraRef
708- return machine , nil
710+ return machine , infraObj , nil
709711}
710712
711- func (r * OpenshiftAssistedControlPlaneReconciler ) computeInfraRef (ctx context.Context , oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , machineName , clusterName string ) (clusterv1.ContractVersionedObjectReference , error ) {
713+ func (r * OpenshiftAssistedControlPlaneReconciler ) createInfraMachine (ctx context.Context , oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , machineName , clusterName string ) (* unstructured. Unstructured , clusterv1.ContractVersionedObjectReference , error ) {
712714 // Since the cloned resource should eventually have a controller ref for the Machine, we create an
713715 // OwnerReference here without the Controller field set
714716 infraCloneOwner := & metav1.OwnerReference {
@@ -718,13 +720,24 @@ func (r *OpenshiftAssistedControlPlaneReconciler) computeInfraRef(ctx context.Co
718720 UID : oacp .UID ,
719721 }
720722
721- // Convert ContractVersionedObjectReference to corev1.ObjectReference for external.CreateFromTemplate
722- // The external package expects corev1.ObjectReference with APIVersion
723- templateRef := contractVersionedRefToObjectRef (& oacp .Spec .MachineTemplate .InfrastructureRef , oacp .Namespace )
723+ // Fetch the infrastructure template using contract-based API version resolution
724+ // instead of hardcoding an API version
725+ template , err := external .GetObjectFromContractVersionedRef (ctx , r .Client , oacp .Spec .MachineTemplate .InfrastructureRef , oacp .Namespace )
726+ if err != nil {
727+ setConditionFalse (oacp , controlplanev1alpha3 .MachinesCreatedCondition , controlplanev1alpha3 .InfrastructureTemplateCloningFailedReason ,
728+ "error fetching infrastructure template: %v" , err )
729+ return nil , clusterv1.ContractVersionedObjectReference {}, err
730+ }
731+
732+ templateRef := & corev1.ObjectReference {
733+ APIVersion : template .GetAPIVersion (),
734+ Kind : template .GetKind (),
735+ Name : template .GetName (),
736+ Namespace : template .GetNamespace (),
737+ }
724738
725- // Clone the infrastructure template
726- _ , infraRef , err := external .CreateFromTemplate (ctx , & external.CreateFromTemplateInput {
727- Client : r .Client ,
739+ infraMachine , err := external .GenerateTemplate (& external.GenerateTemplateInput {
740+ Template : template ,
728741 TemplateRef : templateRef ,
729742 Namespace : oacp .Namespace ,
730743 Name : machineName ,
@@ -734,12 +747,22 @@ func (r *OpenshiftAssistedControlPlaneReconciler) computeInfraRef(ctx context.Co
734747 Annotations : oacp .Spec .MachineTemplate .ObjectMeta .Annotations ,
735748 })
736749 if err != nil {
737- // Safe to return early here since no resources have been created yet.
738750 setConditionFalse (oacp , controlplanev1alpha3 .MachinesCreatedCondition , controlplanev1alpha3 .InfrastructureTemplateCloningFailedReason ,
739- "error creating infraenv: %v" , err )
740- return clusterv1.ContractVersionedObjectReference {}, err
751+ "error generating infrastructure clone: %v" , err )
752+ return nil , clusterv1.ContractVersionedObjectReference {}, err
753+ }
754+
755+ if err := r .Create (ctx , infraMachine ); err != nil {
756+ setConditionFalse (oacp , controlplanev1alpha3 .MachinesCreatedCondition , controlplanev1alpha3 .InfrastructureTemplateCloningFailedReason ,
757+ "error creating infrastructure clone: %v" , err )
758+ return nil , clusterv1.ContractVersionedObjectReference {}, err
741759 }
742- return infraRef , nil
760+
761+ return infraMachine , clusterv1.ContractVersionedObjectReference {
762+ APIGroup : infraMachine .GroupVersionKind ().Group ,
763+ Kind : infraMachine .GetKind (),
764+ Name : infraMachine .GetName (),
765+ }, nil
743766}
744767
745768func (r * OpenshiftAssistedControlPlaneReconciler ) generateOpenshiftAssistedConfig (oacp * controlplanev1alpha3.OpenshiftAssistedControlPlane , clusterName string , name string ) * bootstrapv1alpha2.OpenshiftAssistedConfig {
@@ -828,24 +851,6 @@ func selectMachineForScaleDown(eligibleMachines collections.Machines, failureDom
828851 return machineToScaleDown , nil
829852}
830853
831- // contractVersionedRefToObjectRef converts ContractVersionedObjectReference (with APIGroup)
832- // to corev1.ObjectReference (with APIVersion) for use with external.CreateFromTemplate.
833- // Since ContractVersionedObjectReference only has APIGroup, we use the contract version convention
834- // and default to v1beta1 for infrastructure providers.
835- func contractVersionedRefToObjectRef (in * clusterv1.ContractVersionedObjectReference , namespace string ) * corev1.ObjectReference {
836- apiVersion := ""
837- if in .APIGroup != "" {
838- // Default to v1beta1 for infrastructure group, as that's the common convention
839- apiVersion = in .APIGroup + "/v1beta1"
840- }
841- return & corev1.ObjectReference {
842- Kind : in .Kind ,
843- Name : in .Name ,
844- Namespace : namespace ,
845- APIVersion : apiVersion ,
846- }
847- }
848-
849854// Condition helper functions for setting metav1.Condition (new format).
850855
851856// setConditionTrue sets a condition to True.
0 commit comments