@@ -67,6 +67,11 @@ type PolicyServerReconciler struct {
6767 // policy-server Deployment, sourced from the controller's own
6868 // --image-pull-secrets flag.
6969 ImagePullSecrets []corev1.LocalObjectReference
70+ // CacheDisabled signals that the controller is running without the
71+ // informer cache (--disable-client-cache). When true, getPolicies uses a
72+ // plain list+filter instead of MatchingFields, which relies on in-memory
73+ // field indexes that only work through the cache.
74+ CacheDisabled bool
7075}
7176
7277// TelemetryConfiguration is a struct that contains the configuration for the
@@ -311,35 +316,34 @@ func (r *PolicyServerReconciler) enqueueClusterAdmissionPolicyGroup(_ context.Co
311316 }
312317}
313318
314- // getPolicies returns all admission policies, cluster admission policy ,
315- // admission policies groups and cluster admission policy groups bound to the
319+ // getPolicies returns all admission policies, cluster admission policies ,
320+ // admission policy groups and cluster admission policy groups bound to the
316321// given policyServer.
322+ // When the informer cache is disabled it falls back to listing all objects and
323+ // filtering client-side, because MatchingFields relies on in-memory field
324+ // indexes that are only populated through the cache.
317325func (r * PolicyServerReconciler ) getPolicies (ctx context.Context , policyServer * policiesv1.PolicyServer ) ([]policiesv1.Policy , error ) {
326+ if r .CacheDisabled {
327+ return r .getPoliciesWithoutCache (ctx , policyServer )
328+ }
329+
318330 var clusterAdmissionPolicies policiesv1.ClusterAdmissionPolicyList
319- err := r .Client .List (ctx , & clusterAdmissionPolicies , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name })
320- if err != nil && apierrors .IsNotFound (err ) {
321- err = fmt .Errorf ("failed obtaining ClusterAdmissionPolicies: %w" , err )
322- return nil , err
331+ if err := r .Client .List (ctx , & clusterAdmissionPolicies , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name }); err != nil {
332+ return nil , fmt .Errorf ("failed obtaining ClusterAdmissionPolicies: %w" , err )
323333 }
324334 var admissionPolicies policiesv1.AdmissionPolicyList
325- err = r .Client .List (ctx , & admissionPolicies , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name })
326- if err != nil && apierrors .IsNotFound (err ) {
327- err = fmt .Errorf ("failed obtaining AdmissionPolicies: %w" , err )
328- return nil , err
335+ if err := r .Client .List (ctx , & admissionPolicies , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name }); err != nil {
336+ return nil , fmt .Errorf ("failed obtaining AdmissionPolicies: %w" , err )
329337 }
330338
331339 var admissionPolicyGroupList policiesv1.AdmissionPolicyGroupList
332- err = r .Client .List (ctx , & admissionPolicyGroupList , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name })
333- if err != nil && apierrors .IsNotFound (err ) {
334- err = fmt .Errorf ("failed obtaining AdmissionPolicyGroups: %w" , err )
335- return nil , err
340+ if err := r .Client .List (ctx , & admissionPolicyGroupList , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name }); err != nil {
341+ return nil , fmt .Errorf ("failed obtaining AdmissionPolicyGroups: %w" , err )
336342 }
337343
338344 var clusterAdmissionPolicyGroupList policiesv1.ClusterAdmissionPolicyGroupList
339- err = r .Client .List (ctx , & clusterAdmissionPolicyGroupList , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name })
340- if err != nil && apierrors .IsNotFound (err ) {
341- err = fmt .Errorf ("failed obtaining ClusterAdmissionPolicyGroups: %w" , err )
342- return nil , err
345+ if err := r .Client .List (ctx , & clusterAdmissionPolicyGroupList , client.MatchingFields {constants .PolicyServerIndexKey : policyServer .Name }); err != nil {
346+ return nil , fmt .Errorf ("failed obtaining ClusterAdmissionPolicyGroups: %w" , err )
343347 }
344348
345349 policies := make ([]policiesv1.Policy , 0 )
@@ -358,6 +362,54 @@ func (r *PolicyServerReconciler) getPolicies(ctx context.Context, policyServer *
358362 return policies , nil
359363}
360364
365+ // getPoliciesWithoutCache lists all policy objects and filters them client-side.
366+ // Used when the informer cache is disabled and MatchingFields would be forwarded
367+ // to the API server as an unsupported CRD field selector.
368+ func (r * PolicyServerReconciler ) getPoliciesWithoutCache (ctx context.Context , policyServer * policiesv1.PolicyServer ) ([]policiesv1.Policy , error ) {
369+ var clusterAdmissionPolicies policiesv1.ClusterAdmissionPolicyList
370+ if err := r .Client .List (ctx , & clusterAdmissionPolicies ); err != nil {
371+ return nil , fmt .Errorf ("failed obtaining ClusterAdmissionPolicies: %w" , err )
372+ }
373+
374+ var admissionPolicies policiesv1.AdmissionPolicyList
375+ if err := r .Client .List (ctx , & admissionPolicies ); err != nil {
376+ return nil , fmt .Errorf ("failed obtaining AdmissionPolicies: %w" , err )
377+ }
378+
379+ var admissionPolicyGroupList policiesv1.AdmissionPolicyGroupList
380+ if err := r .Client .List (ctx , & admissionPolicyGroupList ); err != nil {
381+ return nil , fmt .Errorf ("failed obtaining AdmissionPolicyGroups: %w" , err )
382+ }
383+
384+ var clusterAdmissionPolicyGroupList policiesv1.ClusterAdmissionPolicyGroupList
385+ if err := r .Client .List (ctx , & clusterAdmissionPolicyGroupList ); err != nil {
386+ return nil , fmt .Errorf ("failed obtaining ClusterAdmissionPolicyGroups: %w" , err )
387+ }
388+
389+ policies := make ([]policiesv1.Policy , 0 )
390+ for _ , policy := range clusterAdmissionPolicies .Items {
391+ if policy .Spec .PolicyServer == policyServer .Name {
392+ policies = append (policies , policy .DeepCopy ())
393+ }
394+ }
395+ for _ , policy := range admissionPolicies .Items {
396+ if policy .Spec .PolicyServer == policyServer .Name {
397+ policies = append (policies , policy .DeepCopy ())
398+ }
399+ }
400+ for _ , policy := range admissionPolicyGroupList .Items {
401+ if policy .Spec .PolicyServer == policyServer .Name {
402+ policies = append (policies , policy .DeepCopy ())
403+ }
404+ }
405+ for _ , policy := range clusterAdmissionPolicyGroupList .Items {
406+ if policy .Spec .PolicyServer == policyServer .Name {
407+ policies = append (policies , policy .DeepCopy ())
408+ }
409+ }
410+ return policies , nil
411+ }
412+
361413func (r * PolicyServerReconciler ) reconcileDeletion (ctx context.Context , policyServer * policiesv1.PolicyServer , policies []policiesv1.Policy ) (ctrl.Result , error ) {
362414 if len (policies ) != 0 {
363415 // There are still policies scheduled on the PolicyServer, we have to
0 commit comments