@@ -27,6 +27,9 @@ import (
2727 corev1 "k8s.io/api/core/v1"
2828 apierrors "k8s.io/apimachinery/pkg/api/errors"
2929 "k8s.io/apimachinery/pkg/api/resource"
30+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
31+ "k8s.io/apimachinery/pkg/runtime/schema"
32+ "k8s.io/utils/ptr"
3033 ctrl "sigs.k8s.io/controller-runtime"
3134 "sigs.k8s.io/controller-runtime/pkg/client"
3235 "sigs.k8s.io/controller-runtime/pkg/controller"
@@ -359,24 +362,28 @@ func (r *AWSMachineTemplateReconciler) getNodeInfoFromAMI(ctx context.Context, e
359362// getKubernetesVersion attempts to find the Kubernetes version by querying MachineDeployments
360363// or KubeadmControlPlanes that reference this AWSMachineTemplate.
361364func (r * AWSMachineTemplateReconciler ) getKubernetesVersion (ctx context.Context , template * infrav1.AWSMachineTemplate ) (string , error ) {
365+ listOpts , err := getParentListOptions (template .ObjectMeta )
366+ if err != nil {
367+ return "" , errors .Wrap (err , "failed to get parent list options" )
368+ }
369+
362370 // Try to find version from MachineDeployment first
363371 machineDeploymentList := & clusterv1.MachineDeploymentList {}
364- if err := r .List (ctx , machineDeploymentList , client . InNamespace ( template . Namespace ) ); err != nil {
372+ if err := r .List (ctx , machineDeploymentList , listOpts ... ); err != nil {
365373 return "" , errors .Wrap (err , "failed to list MachineDeployments" )
366374 }
367375
368376 // Find MachineDeployments that reference this AWSMachineTemplate
369377 for _ , md := range machineDeploymentList .Items {
370- if md .Spec .Template .Spec .InfrastructureRef .Kind == "AWSMachineTemplate" &&
371- md .Spec .Template .Spec .InfrastructureRef .Name == template .Name &&
372- md .Spec .Template .Spec .Version != nil {
373- return * md .Spec .Template .Spec .Version , nil
378+ if version := ptr .Deref (md .Spec .Template .Spec .Version , "" ); md .Spec .Template .Spec .InfrastructureRef .Kind == "AWSMachineTemplate" &&
379+ md .Spec .Template .Spec .InfrastructureRef .Name == template .Name && version != "" {
380+ return version , nil
374381 }
375382 }
376383
377384 // If not found in MachineDeployment, try KubeadmControlPlane
378385 kcpList := & controlplanev1.KubeadmControlPlaneList {}
379- if err := r .List (ctx , kcpList , client . InNamespace ( template . Namespace ) ); err != nil {
386+ if err := r .List (ctx , kcpList , listOpts ... ); err != nil {
380387 return "" , errors .Wrap (err , "failed to list KubeadmControlPlanes" )
381388 }
382389
@@ -391,3 +398,26 @@ func (r *AWSMachineTemplateReconciler) getKubernetesVersion(ctx context.Context,
391398
392399 return "" , errors .New ("no MachineDeployment or KubeadmControlPlane found referencing this AWSMachineTemplate with a version" )
393400}
401+
402+ func getParentListOptions (obj metav1.ObjectMeta ) ([]client.ListOption , error ) {
403+ listOpts := []client.ListOption {
404+ client .InNamespace (obj .Namespace ),
405+ }
406+
407+ for _ , ref := range obj .GetOwnerReferences () {
408+ if ref .Kind != "Cluster" {
409+ continue
410+ }
411+ gv , err := schema .ParseGroupVersion (ref .APIVersion )
412+ if err != nil {
413+ return nil , errors .WithStack (err )
414+ }
415+ if gv .Group == clusterv1 .GroupVersion .Group {
416+ listOpts = append (listOpts , client.MatchingLabels {
417+ clusterv1 .ClusterNameLabel : ref .Name ,
418+ })
419+ break
420+ }
421+ }
422+ return listOpts , nil
423+ }
0 commit comments