Skip to content

Commit 30dbae0

Browse files
authored
Merge pull request #5383 from sbueringer/pr-namespace-clustertoobjectsmapper-list
🌱 ClusterToObjectsMapper: use namespace in client.List for namespaced resources
2 parents e0f4b6f + 556258b commit 30dbae0

File tree

6 files changed

+55
-10
lines changed

6 files changed

+55
-10
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ require (
3838
k8s.io/klog/v2 v2.9.0
3939
k8s.io/kubectl v0.22.2
4040
k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b
41-
sigs.k8s.io/controller-runtime v0.10.2
41+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318
4242
sigs.k8s.io/yaml v1.3.0
4343
)

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,8 +1134,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8
11341134
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
11351135
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
11361136
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
1137-
sigs.k8s.io/controller-runtime v0.10.2 h1:jW8qiY+yMnnPx6O9hu63tgcwaKzd1yLYui+mpvClOOc=
1138-
sigs.k8s.io/controller-runtime v0.10.2/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
1137+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318 h1:MxgxYdJH4JJcEkyzFwYeH2o8WAlRlWE4cuIfsMvqK5g=
1138+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
11391139
sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8=
11401140
sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g=
11411141
sigs.k8s.io/kustomize/cmd/config v0.9.13/go.mod h1:7547FLF8W/lTaDf0BDqFTbZxM9zqwEJqCKN9sSR0xSs=

test/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ require (
2424
k8s.io/klog/v2 v2.9.0
2525
k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b
2626
sigs.k8s.io/cluster-api v0.0.0-00010101000000-000000000000
27-
sigs.k8s.io/controller-runtime v0.10.2
27+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318
2828
sigs.k8s.io/kind v0.11.1
2929
sigs.k8s.io/yaml v1.3.0
3030
)

test/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1477,8 +1477,8 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
14771477
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
14781478
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
14791479
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
1480-
sigs.k8s.io/controller-runtime v0.10.2 h1:jW8qiY+yMnnPx6O9hu63tgcwaKzd1yLYui+mpvClOOc=
1481-
sigs.k8s.io/controller-runtime v0.10.2/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
1480+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318 h1:MxgxYdJH4JJcEkyzFwYeH2o8WAlRlWE4cuIfsMvqK5g=
1481+
sigs.k8s.io/controller-runtime v0.10.3-0.20211011182302-43ea648ec318/go.mod h1:CQp8eyUQZ/Q7PJvnIrB6/hgfTC1kBkGylwsLgOQi1WY=
14821482
sigs.k8s.io/kind v0.11.1 h1:pVzOkhUwMBrCB0Q/WllQDO3v14Y+o2V0tFgjTqIUjwA=
14831483
sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA=
14841484
sigs.k8s.io/kustomize/api v0.8.11/go.mod h1:a77Ls36JdfCWojpUqR6m60pdGY1AYFix4AH83nJtY1g=

util/util.go

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
corev1 "k8s.io/api/core/v1"
3333
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
3434
apierrors "k8s.io/apimachinery/pkg/api/errors"
35+
"k8s.io/apimachinery/pkg/api/meta"
3536
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3637
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3738
"k8s.io/apimachinery/pkg/runtime"
@@ -489,15 +490,30 @@ func ClusterToObjectsMapper(c client.Client, ro client.ObjectList, scheme *runti
489490
return nil, err
490491
}
491492

493+
isNamespaced, err := isAPINamespaced(gvk, c.RESTMapper())
494+
if err != nil {
495+
return nil, err
496+
}
497+
492498
return func(o client.Object) []ctrl.Request {
493499
cluster, ok := o.(*clusterv1.Cluster)
494500
if !ok {
495501
return nil
496502
}
497503

504+
listOpts := []client.ListOption{
505+
client.MatchingLabels{
506+
clusterv1.ClusterLabelName: cluster.Name,
507+
},
508+
}
509+
510+
if isNamespaced {
511+
listOpts = append(listOpts, client.InNamespace(cluster.Namespace))
512+
}
513+
498514
list := &unstructured.UnstructuredList{}
499515
list.SetGroupVersionKind(gvk)
500-
if err := c.List(context.TODO(), list, client.MatchingLabels{clusterv1.ClusterLabelName: cluster.Name}); err != nil {
516+
if err := c.List(context.TODO(), list, listOpts...); err != nil {
501517
return nil
502518
}
503519

@@ -511,6 +527,23 @@ func ClusterToObjectsMapper(c client.Client, ro client.ObjectList, scheme *runti
511527
}, nil
512528
}
513529

530+
// isAPINamespaced detects if a GroupVersionKind is namespaced.
531+
func isAPINamespaced(gk schema.GroupVersionKind, restmapper meta.RESTMapper) (bool, error) {
532+
restMapping, err := restmapper.RESTMapping(schema.GroupKind{Group: gk.Group, Kind: gk.Kind})
533+
if err != nil {
534+
return false, fmt.Errorf("failed to get restmapping: %w", err)
535+
}
536+
537+
switch restMapping.Scope.Name() {
538+
case "":
539+
return false, errors.New("Scope cannot be identified. Empty scope returned")
540+
case meta.RESTScopeNameRoot:
541+
return false, nil
542+
default:
543+
return true, nil
544+
}
545+
}
546+
514547
// ObjectReferenceToUnstructured converts an object reference to an unstructured object.
515548
func ObjectReferenceToUnstructured(in corev1.ObjectReference) *unstructured.Unstructured {
516549
out := &unstructured.Unstructured{}

util/util_test.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,15 @@ import (
2323
"github.com/blang/semver"
2424
. "github.com/onsi/gomega"
2525
corev1 "k8s.io/api/core/v1"
26+
"k8s.io/apimachinery/pkg/api/meta"
2627
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2728
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2829
"k8s.io/apimachinery/pkg/runtime"
2930
"k8s.io/apimachinery/pkg/runtime/schema"
30-
"k8s.io/client-go/kubernetes/scheme"
3131
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
3232
ctrl "sigs.k8s.io/controller-runtime"
3333
"sigs.k8s.io/controller-runtime/pkg/client"
34+
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
3435
"sigs.k8s.io/controller-runtime/pkg/client/fake"
3536
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3637
)
@@ -673,8 +674,19 @@ func TestClusterToObjectsMapper(t *testing.T) {
673674

674675
for _, tc := range table {
675676
tc.objects = append(tc.objects, cluster)
676-
client := fake.NewClientBuilder().WithObjects(tc.objects...).Build()
677-
f, err := ClusterToObjectsMapper(client, tc.input, scheme.Scheme)
677+
678+
scheme := runtime.NewScheme()
679+
_ = clusterv1.AddToScheme(scheme)
680+
681+
restMapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{clusterv1.GroupVersion})
682+
683+
// Add tc.input gvk to the restMapper.
684+
gvk, err := apiutil.GVKForObject(tc.input, scheme)
685+
g.Expect(err).ToNot(HaveOccurred())
686+
restMapper.Add(gvk, meta.RESTScopeNamespace)
687+
688+
client := fake.NewClientBuilder().WithObjects(tc.objects...).WithRESTMapper(restMapper).Build()
689+
f, err := ClusterToObjectsMapper(client, tc.input, scheme)
678690
g.Expect(err != nil, err).To(Equal(tc.expectError))
679691
g.Expect(f(cluster)).To(ConsistOf(tc.output))
680692
}

0 commit comments

Comments
 (0)