@@ -19,6 +19,7 @@ package controllers
1919import (
2020 "context"
2121 "fmt"
22+ "reflect"
2223 "slices"
2324 "sort"
2425 "strings"
@@ -1575,11 +1576,6 @@ func (r *KubeadmControlPlaneReconciler) adoptMachines(ctx context.Context, kcp *
15751576
15761577 kcpRef := * metav1 .NewControllerRef (kcp , controlplanev1 .GroupVersion .WithKind (kubeadmControlPlaneKind ))
15771578 for _ , m := range machines {
1578- // No op if OwnerReferences is set and up to date.
1579- if util .HasExactOwnerRef (m .OwnerReferences , kcpRef ) {
1580- continue
1581- }
1582-
15831579 ref := m .Spec .Bootstrap .ConfigRef
15841580 cfg := & bootstrapv1.KubeadmConfig {}
15851581
@@ -1591,6 +1587,11 @@ func (r *KubeadmControlPlaneReconciler) adoptMachines(ctx context.Context, kcp *
15911587 return err
15921588 }
15931589
1590+ // No op if OwnerReferences is set and up to date.
1591+ if util .HasExactOwnerRef (m .OwnerReferences , kcpRef ) {
1592+ continue
1593+ }
1594+
15941595 original := m .DeepCopy ()
15951596 m .SetOwnerReferences (util .EnsureOwnerRef (m .GetOwnerReferences (), kcpRef ))
15961597
@@ -1642,23 +1643,28 @@ func (r *KubeadmControlPlaneReconciler) ensureCertificatesOwnerRef(ctx context.C
16421643 continue
16431644 }
16441645
1645- // If the Type doesn't match the type used for secrets created by core components continue without altering the owner reference further.
1646- if c .Secret .Type != clusterv1 .ClusterSecretType {
1647- continue
1646+ original := c .Secret .DeepCopy ()
1647+ controller := metav1 .GetControllerOf (c .Secret )
1648+ // If the current controller is KCP, ensure the owner reference is up to date.
1649+ // Note: This ensures secrets created prior to v1alpha4 are updated to have the correct owner reference apiVersion.
1650+ if controller != nil && controller .Kind == kubeadmControlPlaneKind {
1651+ c .Secret .SetOwnerReferences (util .EnsureOwnerRef (c .Secret .GetOwnerReferences (), owner ))
16481652 }
16491653
1650- // No op if the owner ref is already there
1651- if util .HasExactOwnerRef (c .Secret .OwnerReferences , owner ) {
1652- continue
1654+ // If the Type doesn't match the type used for secrets created by core components continue without altering the owner reference further.
1655+ // Note: This ensures that control plane related secrets created by KubeadmConfig are eventually owned by KCP.
1656+ // TODO: Remove this logic once standalone control plane machines are no longer allowed.
1657+ if c .Secret .Type == clusterv1 .ClusterSecretType {
1658+ // Remove the current controller if one exists.
1659+ if controller != nil {
1660+ c .Secret .SetOwnerReferences (util .RemoveOwnerRef (c .Secret .GetOwnerReferences (), * controller ))
1661+ }
1662+ c .Secret .SetOwnerReferences (util .EnsureOwnerRef (c .Secret .GetOwnerReferences (), owner ))
16531663 }
16541664
1655- original := c .Secret .DeepCopy ()
1656-
1657- // Remove the current controller if one exists.
1658- if controller := metav1 .GetControllerOf (c .Secret ); controller != nil && controller .Kind != kubeadmControlPlaneKind {
1659- c .Secret .SetOwnerReferences (util .RemoveOwnerRef (c .Secret .GetOwnerReferences (), * controller ))
1665+ if reflect .DeepEqual (original .GetOwnerReferences (), c .Secret .GetOwnerReferences ()) {
1666+ continue
16601667 }
1661- c .Secret .SetOwnerReferences (util .EnsureOwnerRef (c .Secret .GetOwnerReferences (), owner ))
16621668
16631669 if err := r .Client .Patch (ctx , c .Secret , client .MergeFrom (original )); err != nil {
16641670 return errors .Wrapf (err , "failed to set ownerReference" )
0 commit comments