From bf8a47831014fb9878619242e8347368b143ebf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Charles-Edouard=20Br=C3=A9t=C3=A9ch=C3=A9?= Date: Mon, 20 Mar 2023 06:08:31 +0100 Subject: [PATCH] fix: use GVR in reports resource controller (#6612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Charles-Edouard Brétéché --- pkg/controllers/report/resource/controller.go | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/pkg/controllers/report/resource/controller.go b/pkg/controllers/report/resource/controller.go index 574ec3322a..506476ee21 100644 --- a/pkg/controllers/report/resource/controller.go +++ b/pkg/controllers/report/resource/controller.go @@ -221,27 +221,31 @@ func (c *controller) updateDynamicWatchers(ctx context.Context) error { return err } kinds := utils.BuildKindSet(logger, utils.RemoveNonValidationPolicies(append(clusterPolicies, policies...)...)...) - gvrs := map[schema.GroupVersionKind]schema.GroupVersionResource{} - for _, kind := range sets.List(kinds) { - apiVersion, kind := kubeutils.GetKindFromGVK(kind) - apiResource, _, gvr, err := c.client.Discovery().FindResource(apiVersion, kind) + gvkToGvr := map[schema.GroupVersionKind]schema.GroupVersionResource{} + for _, policyKind := range sets.List(kinds) { + group, version, kind, subresource := kubeutils.ParseKindSelector(policyKind) + gvrss, err := c.client.Discovery().FindResources(group, version, kind, subresource) if err != nil { logger.Error(err, "failed to get gvr from kind", "kind", kind) } else { - gvk := schema.GroupVersionKind{Group: apiResource.Group, Version: apiResource.Version, Kind: apiResource.Kind} - if !reportutils.IsGvkSupported(gvk) { - logger.Info("kind is not supported", "gvk", gvk) - } else { - if slices.Contains(apiResource.Verbs, "list") && slices.Contains(apiResource.Verbs, "watch") { - gvrs[gvk] = gvr - } else { - logger.Info("list/watch not supported for kind", "kind", kind) + for gvrs, api := range gvrss { + if gvrs.SubResource == "" { + gvk := schema.GroupVersionKind{Group: gvrs.Group, Version: gvrs.Version, Kind: policyKind} + if !reportutils.IsGvkSupported(gvk) { + logger.Info("kind is not supported", "gvk", gvk) + } else { + if slices.Contains(api.Verbs, "list") && slices.Contains(api.Verbs, "watch") { + gvkToGvr[gvk] = gvrs.GroupVersionResource + } else { + logger.Info("list/watch not supported for kind", "kind", kind) + } + } } } } } dynamicWatchers := map[schema.GroupVersionResource]*watcher{} - for gvk, gvr := range gvrs { + for gvk, gvr := range gvkToGvr { logger := logger.WithValues("gvr", gvr, "gvk", gvk) // if we already have one, transfer it to the new map if c.dynamicWatchers[gvr] != nil {