diff --git a/charts/redpanda/chart_test.go b/charts/redpanda/chart_test.go index a18c9e994..34391247d 100644 --- a/charts/redpanda/chart_test.go +++ b/charts/redpanda/chart_test.go @@ -107,7 +107,7 @@ func TestIntegrationChart(t *testing.T) { }), }) - pods, err := kube.List[corev1.PodList](ctx, env.Ctl(), client.MatchingLabels{ + pods, err := kube.List[corev1.PodList](ctx, env.Ctl(), release.Namespace, client.MatchingLabels{ "app.kubernetes.io/instance": release.Name, "app.kubernetes.io/component": release.Chart + "-statefulset", }) @@ -372,7 +372,7 @@ func TestIntegrationChart(t *testing.T) { }), }) - pods, err := kube.List[corev1.PodList](ctx, env.Ctl(), client.MatchingLabels{ + pods, err := kube.List[corev1.PodList](ctx, env.Ctl(), release.Namespace, client.MatchingLabels{ "app.kubernetes.io/instance": release.Name, "app.kubernetes.io/component": release.Chart + "-statefulset", }) diff --git a/charts/redpanda/client/client.go b/charts/redpanda/client/client.go index e75db0aec..977be8791 100644 --- a/charts/redpanda/client/client.go +++ b/charts/redpanda/client/client.go @@ -28,7 +28,6 @@ import ( "github.com/twmb/franz-go/pkg/sasl/scram" "github.com/twmb/franz-go/pkg/sr" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/redpanda-data/redpanda-operator/charts/redpanda/v5" @@ -482,9 +481,9 @@ func srvLookup(dot *helmette.Dot, dialer DialContextFunc, service string) ([]*ne // Querying for k8s-app=kube-dns is a generally accepted / safe // way of finding the kube DNS. We could alternatively find the // kube-dns service and use its label selector. - pods, err := kube.List[corev1.PodList](ctx, ctl, client.MatchingLabels{ + pods, err := kube.List[corev1.PodList](ctx, ctl, kube.NamespaceSystem, client.MatchingLabels{ "k8s-app": "kube-dns", - }, client.InNamespace(metav1.NamespaceSystem)) + }) if err != nil { return nil, err } diff --git a/pkg/kube/ctl.go b/pkg/kube/ctl.go index f5cf8eb99..ee0854ee6 100644 --- a/pkg/kube/ctl.go +++ b/pkg/kube/ctl.go @@ -19,6 +19,7 @@ import ( "github.com/cockroachdb/errors" corev1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/scheme" @@ -35,8 +36,11 @@ type ( Object = client.Object ObjectList = client.ObjectList ObjectKey = client.ObjectKey +) - InNamespace = client.InNamespace +const ( + NamespaceAll = metav1.NamespaceAll + NamespaceSystem = metav1.NamespaceSystem ) type Option interface { @@ -149,11 +153,17 @@ func (c *Ctl) GetAndWait(ctx context.Context, key ObjectKey, obj Object, cond Co } // List fetches a list of objects into `objs` from Kubernetes. +// +// Cluster scoped resources should pass `""` as namespace. +// // Usage: // // var pods corev1.PodList // ctl.List(ctx, &pods) -func (c *Ctl) List(ctx context.Context, objs client.ObjectList, opts ...client.ListOption) error { +func (c *Ctl) List(ctx context.Context, namespace string, objs ObjectList, opts ...client.ListOption) error { + // Top level namespace parameter takes precedence over anything specified + // in opts. The other way around is less straightforward. + opts = append(opts, client.InNamespace(namespace)) if err := c.client.List(ctx, objs, opts...); err != nil { return errors.WithStack(err) } diff --git a/pkg/kube/ctl_test.go b/pkg/kube/ctl_test.go index 13b44cb21..62a9d9599 100644 --- a/pkg/kube/ctl_test.go +++ b/pkg/kube/ctl_test.go @@ -51,7 +51,7 @@ func TestCtl(t *testing.T) { )) require.Equal(t, []string{"cm-0", "cm-1", "cm-2"}, seen) - cms, err := kube.List[corev1.ConfigMapList](ctx, ctl, kube.InNamespace("hello-world")) + cms, err := kube.List[corev1.ConfigMapList](ctx, ctl, "hello-world") require.NoError(t, err) require.Len(t, cms.Items, 3) } diff --git a/pkg/kube/generics.go b/pkg/kube/generics.go index d8fd74034..d7bb64342 100644 --- a/pkg/kube/generics.go +++ b/pkg/kube/generics.go @@ -60,9 +60,9 @@ func ApplyAndWait[T any, PT AddrOfObject[T]](ctx context.Context, ctl *Ctl, obj } // List is a generic equivalent of [Ctl.List]. -func List[T any, L AddrOfObjectList[T]](ctx context.Context, ctl *Ctl, opts ...client.ListOption) (*T, error) { +func List[T any, L AddrOfObjectList[T]](ctx context.Context, ctl *Ctl, namespace string, opts ...client.ListOption) (*T, error) { var list T - if err := ctl.List(ctx, L(&list), opts...); err != nil { + if err := ctl.List(ctx, namespace, L(&list), opts...); err != nil { return nil, err } return &list, nil