pkg icon indicating copy to clipboard operation
pkg copied to clipboard

`duck.TypedInformerFactory` does not honor namespace scope

Open antoineco opened this issue 2 years ago • 0 comments

/kind bug (I'm fine if we want to consider this a feature request, but to me it rather seems like this was overlooked in https://github.com/knative/pkg/pull/626)

Expected Behavior

duck.TypedInformerFactory honors the namespace scope set via injection.WithNamespaceScope(), like injected informer factories do.

Actual Behavior

It doesn't, which results in permission errors when a namespace-scoped controller makes use of a duck informer factory, either directly or indirectly.

A common example is the resolver.URIResolver, which is backed by a duck.TypedInformerFactory for the duckv1.Addressable duck type.

Could not resolve sink URI: failed to get lister for serving.knative.dev/v1, Resource=services: services.serving.knative.dev is forbidden: User "system:serviceaccount:my-namespace:my-controller" cannot list resource "services" in API group "serving.knative.dev" at the cluster scope

Steps to Reproduce the Problem

  1. Shared main:

    // import "knative.dev/pkg/signals"
    // import "knative.dev/pkg/injection"
    // import "myrepo/pkg/reconciler/sample"
    
    ctx := signals.NewContext()
    ctx = injection.WithNamespaceScope(ctx, "my-namespace")
    
    sharedmain.MainWithContext(ctx, "my-controller",
        sample.NewController,
    )
    
  2. Controller constructor:

    // import context
    // import corev1 "k8s.io/api/core/v1"
    // import "knative.dev/pkg/configmap"
    // import "knative.dev/pkg/controller"
    // import "knative.dev/pkg/resolver"
    // import reconcilerv1 "myrepo/pkg/client/generated/injection/reconciler/mygroup/v1/mykind"
    
    func NewController(ctx context.Context, _ configmap.Watcher) *controller.Impl {
        r := &Reconciler{
                uriResolver *resolver.URIResolver
        }
    
        // just to reproduce the issue
        dst := duckv1.Destination{/* omitted fields */}
        parent := &corev1.Pod{/* omitted fields */}
        _, err := r.uriResolver.URIFromDestinationV1(ctx, dst, parent)
        if err != nil {
            panic(err)
        }
    
        return reconcilerv1.NewImpl(ctx, r)
    }
    

Additional Info

Relevant code locations:

https://github.com/knative/pkg/blob/f907b31046d3c69a29b13d6d6ad2907767faac1e/apis/duck/typed.go#L61-L63

vs.

https://github.com/knative/pkg/blob/6484377731032712280dd71d88eae5287f33aa54/client/injection/kube/informers/factory/fake/fake.go#L39-L44

antoineco avatar May 20 '22 09:05 antoineco