From a03bd3f4f41ac5b465a6c7e686a206c85025d31a Mon Sep 17 00:00:00 2001 From: Vishal Choudhary Date: Thu, 27 Jun 2024 13:51:39 +0530 Subject: [PATCH] fix: add generate name support Signed-off-by: Vishal Choudhary --- pkg/api/cephr.go | 18 +++++++++++------- pkg/api/cpolr.go | 19 +++++++++++-------- pkg/api/ephr.go | 18 +++++++++++------- pkg/api/names.go | 7 +++++++ pkg/api/polr.go | 18 +++++++++++------- pkg/storage/inmemory/client.go | 2 -- pkg/storage/inmemory/cpehr.go | 9 +++++---- pkg/storage/inmemory/cpolr.go | 9 +++++---- pkg/storage/inmemory/ephr.go | 9 +++++---- pkg/storage/inmemory/polr.go | 9 +++++---- pkg/utils/constants.go | 13 +++++++++++++ 11 files changed, 84 insertions(+), 47 deletions(-) create mode 100644 pkg/api/names.go create mode 100644 pkg/utils/constants.go diff --git a/pkg/api/cephr.go b/pkg/api/cephr.go index 5e32fbb..5055727 100644 --- a/pkg/api/cephr.go +++ b/pkg/api/cephr.go @@ -8,6 +8,7 @@ import ( reportsv1 "github.com/kyverno/kyverno/api/reports/v1" "github.com/kyverno/reports-server/pkg/storage" + "github.com/kyverno/reports-server/pkg/utils" errorpkg "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/errors" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" @@ -94,7 +95,7 @@ func (c *cephrStore) Get(ctx context.Context, name string, options *metav1.GetOp klog.Infof("getting cluster ephemeral reports name=%s", name) report, err := c.getCephr(name) if err != nil || report == nil { - return nil, errors.NewNotFound(reportsv1.Resource("clusterephemeralreports"), name) + return nil, errors.NewNotFound(utils.ClusterEphemeralReportsGR, name) } return report, nil } @@ -120,6 +121,12 @@ func (c *cephrStore) Create(ctx context.Context, obj runtime.Object, createValid if !ok { return nil, errors.NewBadRequest("failed to validate cluster ephemeral report") } + if cephr.Name == "" { + if cephr.GenerateName == "" { + return nil, errors.NewConflict(utils.ClusterEphemeralReportsGR, cephr.Name, fmt.Errorf("name and generate name not provided")) + } + cephr.Name = nameGenerator.GenerateName(cephr.GenerateName) + } klog.Infof("creating cluster ephemeral reports name=%s", cephr.Name) if !isDryRun { @@ -154,7 +161,7 @@ func (c *cephrStore) Update(ctx context.Context, name string, objInfo rest.Updat if err != nil { klog.ErrorS(err, "failed to update resource") } - if err := c.broadcaster.Action(watch.Added, r); err != nil { + if err := c.broadcaster.Action(watch.Modified, r); err != nil { klog.ErrorS(err, "failed to broadcast event") } return updatedObject, true, nil @@ -199,7 +206,7 @@ func (c *cephrStore) Delete(ctx context.Context, name string, deleteValidation r cephr, err := c.getCephr(name) if err != nil { klog.ErrorS(err, "Failed to find cephrs", "name", name) - return nil, false, errors.NewNotFound(reportsv1.Resource("clusterephemeralreports"), name) + return nil, false, errors.NewNotFound(utils.ClusterEphemeralReportsGR, name) } err = deleteValidation(ctx, cephr) @@ -239,14 +246,11 @@ func (c *cephrStore) DeleteCollection(ctx context.Context, deleteValidation rest if !isDryRun { for _, cephr := range cephrList.Items { - obj, isDeleted, err := c.Delete(ctx, cephr.GetName(), deleteValidation, options) + _, isDeleted, err := c.Delete(ctx, cephr.GetName(), deleteValidation, options) if !isDeleted { klog.ErrorS(err, "Failed to delete cephr", "name", cephr.GetName()) return nil, errors.NewBadRequest(fmt.Sprintf("Failed to delete cluster ephemral report: %s", cephr.GetName())) } - if err := c.broadcaster.Action(watch.Deleted, obj); err != nil { - klog.ErrorS(err, "failed to broadcast event") - } } } return cephrList, nil diff --git a/pkg/api/cpolr.go b/pkg/api/cpolr.go index 459389e..9ed469d 100644 --- a/pkg/api/cpolr.go +++ b/pkg/api/cpolr.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/kyverno/reports-server/pkg/storage" + "github.com/kyverno/reports-server/pkg/utils" errorpkg "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/errors" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" @@ -41,7 +42,6 @@ func (c *cpolrStore) New() runtime.Object { func (c *cpolrStore) Destroy() { } - func (c *cpolrStore) Kind() string { return "ClusterPolicyReport" } @@ -94,7 +94,7 @@ func (c *cpolrStore) Get(ctx context.Context, name string, options *metav1.GetOp klog.Infof("fetching cluster policy report name=%s", name) report, err := c.getCpolr(name) if err != nil || report == nil { - return nil, errors.NewNotFound(v1alpha2.Resource("clusterpolicyreports"), name) + return nil, errors.NewNotFound(utils.ClusterPolicyReportsGR, name) } return report, nil } @@ -120,6 +120,12 @@ func (c *cpolrStore) Create(ctx context.Context, obj runtime.Object, createValid if !ok { return nil, errors.NewBadRequest("failed to validate cluster policy report") } + if cpolr.Name == "" { + if cpolr.GenerateName == "" { + return nil, errors.NewConflict(utils.ClusterPolicyReportsGR, cpolr.Name, fmt.Errorf("name and generate name not provided")) + } + cpolr.Name = nameGenerator.GenerateName(cpolr.GenerateName) + } klog.Infof("creating cluster policy report name=%s", cpolr.Name) if !isDryRun { @@ -153,7 +159,7 @@ func (c *cpolrStore) Update(ctx context.Context, name string, objInfo rest.Updat if err != nil { klog.ErrorS(err, "failed to update resource") } - if err := c.broadcaster.Action(watch.Added, r); err != nil { + if err := c.broadcaster.Action(watch.Modified, r); err != nil { klog.ErrorS(err, "failed to broadcast event") } return updatedObject, true, nil @@ -198,7 +204,7 @@ func (c *cpolrStore) Delete(ctx context.Context, name string, deleteValidation r cpolr, err := c.getCpolr(name) if err != nil { klog.ErrorS(err, "Failed to find cpolrs", "name", name) - return nil, false, errors.NewNotFound(v1alpha2.Resource("clusterpolicyreports"), name) + return nil, false, errors.NewNotFound(utils.ClusterPolicyReportsGR, name) } err = deleteValidation(ctx, cpolr) @@ -238,14 +244,11 @@ func (c *cpolrStore) DeleteCollection(ctx context.Context, deleteValidation rest if !isDryRun { for _, cpolr := range cpolrList.Items { - obj, isDeleted, err := c.Delete(ctx, cpolr.GetName(), deleteValidation, options) + _, isDeleted, err := c.Delete(ctx, cpolr.GetName(), deleteValidation, options) if !isDeleted { klog.ErrorS(err, "Failed to delete cpolr", "name", cpolr.GetName()) return nil, errors.NewBadRequest(fmt.Sprintf("Failed to delete cluster policy report: %s", cpolr.GetName())) } - if err := c.broadcaster.Action(watch.Deleted, obj); err != nil { - klog.ErrorS(err, "failed to broadcast event") - } } } return cpolrList, nil diff --git a/pkg/api/ephr.go b/pkg/api/ephr.go index 581ea89..cba775b 100644 --- a/pkg/api/ephr.go +++ b/pkg/api/ephr.go @@ -8,6 +8,7 @@ import ( reportsv1 "github.com/kyverno/kyverno/api/reports/v1" "github.com/kyverno/reports-server/pkg/storage" + "github.com/kyverno/reports-server/pkg/utils" errorpkg "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/errors" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" @@ -99,7 +100,7 @@ func (p *ephrStore) Get(ctx context.Context, name string, options *metav1.GetOpt klog.Infof("getting ephemeral reports name=%s namespace=%s", name, namespace) report, err := p.getEphr(name, namespace) if err != nil || report == nil { - return nil, errors.NewNotFound(reportsv1.Resource("ephemeralreports"), name) + return nil, errors.NewNotFound(utils.EphemeralReportsGR, name) } return report, nil } @@ -125,6 +126,12 @@ func (p *ephrStore) Create(ctx context.Context, obj runtime.Object, createValida if !ok { return nil, errors.NewBadRequest("failed to validate ephemeral report") } + if ephr.Name == "" { + if ephr.GenerateName == "" { + return nil, errors.NewConflict(utils.EphemeralReportsGR, ephr.Name, fmt.Errorf("name and generate name not provided")) + } + ephr.Name = nameGenerator.GenerateName(ephr.GenerateName) + } namespace := genericapirequest.NamespaceValue(ctx) @@ -166,7 +173,7 @@ func (p *ephrStore) Update(ctx context.Context, name string, objInfo rest.Update if err != nil { klog.ErrorS(err, "failed to update resource") } - if err := p.broadcaster.Action(watch.Added, r); err != nil { + if err := p.broadcaster.Action(watch.Modified, r); err != nil { klog.ErrorS(err, "failed to broadcast event") } return updatedObject, true, nil @@ -216,7 +223,7 @@ func (p *ephrStore) Delete(ctx context.Context, name string, deleteValidation re ephr, err := p.getEphr(name, namespace) if err != nil { klog.ErrorS(err, "Failed to find ephrs", "name", name, "namespace", klog.KRef("", namespace)) - return nil, false, errors.NewNotFound(reportsv1.Resource("ephemeralreports"), name) + return nil, false, errors.NewNotFound(utils.EphemeralReportsGR, name) } err = deleteValidation(ctx, ephr) @@ -258,14 +265,11 @@ func (p *ephrStore) DeleteCollection(ctx context.Context, deleteValidation rest. if !isDryRun { for _, ephr := range ephrList.Items { - obj, isDeleted, err := p.Delete(ctx, ephr.GetName(), deleteValidation, options) + _, isDeleted, err := p.Delete(ctx, ephr.GetName(), deleteValidation, options) if !isDeleted { klog.ErrorS(err, "Failed to delete ephr", "name", ephr.GetName(), "namespace", klog.KRef("", namespace)) return nil, errors.NewBadRequest(fmt.Sprintf("Failed to delete ephemeral report: %s/%s", ephr.Namespace, ephr.GetName())) } - if err := p.broadcaster.Action(watch.Deleted, obj); err != nil { - klog.ErrorS(err, "failed to broadcast event") - } } } return ephrList, nil diff --git a/pkg/api/names.go b/pkg/api/names.go new file mode 100644 index 0000000..89f6206 --- /dev/null +++ b/pkg/api/names.go @@ -0,0 +1,7 @@ +package api + +import "k8s.io/apiserver/pkg/storage/names" + +var ( + nameGenerator = names.SimpleNameGenerator +) diff --git a/pkg/api/polr.go b/pkg/api/polr.go index f7c8fe5..5b38448 100644 --- a/pkg/api/polr.go +++ b/pkg/api/polr.go @@ -7,6 +7,7 @@ import ( "strconv" "github.com/kyverno/reports-server/pkg/storage" + "github.com/kyverno/reports-server/pkg/utils" errorpkg "github.com/pkg/errors" "k8s.io/apimachinery/pkg/api/errors" metainternalversion "k8s.io/apimachinery/pkg/apis/meta/internalversion" @@ -99,7 +100,7 @@ func (p *polrStore) Get(ctx context.Context, name string, options *metav1.GetOpt klog.Infof("getting policy reports name=%s namespace=%s", name, namespace) report, err := p.getPolr(name, namespace) if err != nil || report == nil { - return nil, errors.NewNotFound(v1alpha2.Resource("policyreports"), name) + return nil, errors.NewNotFound(utils.PolicyReportsGR, name) } return report, nil } @@ -131,6 +132,12 @@ func (p *polrStore) Create(ctx context.Context, obj runtime.Object, createValida if len(polr.Namespace) == 0 { polr.Namespace = namespace } + if polr.Name == "" { + if polr.GenerateName == "" { + return nil, errors.NewConflict(utils.PolicyReportsGR, polr.Name, fmt.Errorf("name and generate name not provided")) + } + polr.Name = nameGenerator.GenerateName(polr.GenerateName) + } klog.Infof("creating policy reports name=%s namespace=%s", polr.Name, polr.Namespace) if !isDryRun { @@ -167,7 +174,7 @@ func (p *polrStore) Update(ctx context.Context, name string, objInfo rest.Update if err != nil { klog.ErrorS(err, "failed to update resource") } - if err := p.broadcaster.Action(watch.Added, r); err != nil { + if err := p.broadcaster.Action(watch.Modified, r); err != nil { klog.ErrorS(err, "failed to broadcast event") } return updatedObject, true, nil @@ -217,7 +224,7 @@ func (p *polrStore) Delete(ctx context.Context, name string, deleteValidation re polr, err := p.getPolr(name, namespace) if err != nil { klog.ErrorS(err, "Failed to find polrs", "name", name, "namespace", klog.KRef("", namespace)) - return nil, false, errors.NewNotFound(v1alpha2.Resource("policyreports"), name) + return nil, false, errors.NewNotFound(utils.PolicyReportsGR, name) } err = deleteValidation(ctx, polr) @@ -259,14 +266,11 @@ func (p *polrStore) DeleteCollection(ctx context.Context, deleteValidation rest. if !isDryRun { for _, polr := range polrList.Items { - obj, isDeleted, err := p.Delete(ctx, polr.GetName(), deleteValidation, options) + _, isDeleted, err := p.Delete(ctx, polr.GetName(), deleteValidation, options) if !isDeleted { klog.ErrorS(err, "Failed to delete polr", "name", polr.GetName(), "namespace", klog.KRef("", namespace)) return nil, errors.NewBadRequest(fmt.Sprintf("Failed to delete policy report: %s/%s", polr.Namespace, polr.GetName())) } - if err := p.broadcaster.Action(watch.Deleted, obj); err != nil { - klog.ErrorS(err, "failed to broadcast event") - } } } return polrList, nil diff --git a/pkg/storage/inmemory/client.go b/pkg/storage/inmemory/client.go index 2772b06..c9c82b8 100644 --- a/pkg/storage/inmemory/client.go +++ b/pkg/storage/inmemory/client.go @@ -9,8 +9,6 @@ import ( "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/api/wgpolicyk8s.io/v1alpha2" ) -var groupResource = v1alpha2.SchemeGroupVersion.WithResource("policyreportsa").GroupResource() - type inMemoryDb struct { sync.Mutex diff --git a/pkg/storage/inmemory/cpehr.go b/pkg/storage/inmemory/cpehr.go index c218701..0a70df8 100644 --- a/pkg/storage/inmemory/cpehr.go +++ b/pkg/storage/inmemory/cpehr.go @@ -6,6 +6,7 @@ import ( "sync" reportsv1 "github.com/kyverno/kyverno/api/reports/v1" + "github.com/kyverno/reports-server/pkg/utils" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/klog/v2" ) @@ -45,7 +46,7 @@ func (c *cephrdb) Get(ctx context.Context, name string) (reportsv1.ClusterEpheme return val, nil } else { klog.Errorf("value not found for key:%s", key) - return reportsv1.ClusterEphemeralReport{}, errors.NewNotFound(groupResource, key) + return reportsv1.ClusterEphemeralReport{}, errors.NewNotFound(utils.ClusterEphemeralReportsGR, key) } } @@ -57,7 +58,7 @@ func (c *cephrdb) Create(ctx context.Context, cephr reportsv1.ClusterEphemeralRe klog.Infof("creating entry for key:%s", key) if _, found := c.db[key]; found { klog.Errorf("entry already exists k:%s", key) - return errors.NewAlreadyExists(groupResource, key) + return errors.NewAlreadyExists(utils.ClusterEphemeralReportsGR, key) } else { c.db[key] = cephr klog.Infof("entry created for key:%s", key) @@ -73,7 +74,7 @@ func (c *cephrdb) Update(ctx context.Context, cephr reportsv1.ClusterEphemeralRe klog.Infof("updating entry for key:%s", key) if _, found := c.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.ClusterEphemeralReportsGR, key) } else { c.db[key] = cephr klog.Infof("entry updated for key:%s", key) @@ -89,7 +90,7 @@ func (c *cephrdb) Delete(ctx context.Context, name string) error { klog.Infof("deleting entry for key:%s", key) if _, found := c.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.ClusterEphemeralReportsGR, key) } else { delete(c.db, key) klog.Infof("entry deleted for key:%s", key) diff --git a/pkg/storage/inmemory/cpolr.go b/pkg/storage/inmemory/cpolr.go index 499d0e8..586181a 100644 --- a/pkg/storage/inmemory/cpolr.go +++ b/pkg/storage/inmemory/cpolr.go @@ -5,6 +5,7 @@ import ( "fmt" "sync" + "github.com/kyverno/reports-server/pkg/utils" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/klog/v2" "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/api/wgpolicyk8s.io/v1alpha2" @@ -45,7 +46,7 @@ func (c *cpolrdb) Get(ctx context.Context, name string) (v1alpha2.ClusterPolicyR return val, nil } else { klog.Errorf("value not found for key:%s", key) - return v1alpha2.ClusterPolicyReport{}, errors.NewNotFound(groupResource, key) + return v1alpha2.ClusterPolicyReport{}, errors.NewNotFound(utils.ClusterPolicyReportsGR, key) } } @@ -57,7 +58,7 @@ func (c *cpolrdb) Create(ctx context.Context, cpolr v1alpha2.ClusterPolicyReport klog.Infof("creating entry for key:%s", key) if _, found := c.db[key]; found { klog.Errorf("entry already exists k:%s", key) - return errors.NewAlreadyExists(groupResource, key) + return errors.NewAlreadyExists(utils.ClusterPolicyReportsGR, key) } else { c.db[key] = cpolr klog.Infof("entry created for key:%s", key) @@ -73,7 +74,7 @@ func (c *cpolrdb) Update(ctx context.Context, cpolr v1alpha2.ClusterPolicyReport klog.Infof("updating entry for key:%s", key) if _, found := c.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.ClusterPolicyReportsGR, key) } else { c.db[key] = cpolr klog.Infof("entry updated for key:%s", key) @@ -89,7 +90,7 @@ func (c *cpolrdb) Delete(ctx context.Context, name string) error { klog.Infof("deleting entry for key:%s", key) if _, found := c.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.ClusterPolicyReportsGR, key) } else { delete(c.db, key) klog.Infof("entry deleted for key:%s", key) diff --git a/pkg/storage/inmemory/ephr.go b/pkg/storage/inmemory/ephr.go index b5fc058..8588bd4 100644 --- a/pkg/storage/inmemory/ephr.go +++ b/pkg/storage/inmemory/ephr.go @@ -7,6 +7,7 @@ import ( "sync" reportsv1 "github.com/kyverno/kyverno/api/reports/v1" + "github.com/kyverno/reports-server/pkg/utils" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/klog/v2" ) @@ -49,7 +50,7 @@ func (e *ephrdb) Get(ctx context.Context, name, namespace string) (reportsv1.Eph return val, nil } else { klog.Errorf("value not found for key:%s", key) - return reportsv1.EphemeralReport{}, errors.NewNotFound(groupResource, key) + return reportsv1.EphemeralReport{}, errors.NewNotFound(utils.EphemeralReportsGR, key) } } @@ -61,7 +62,7 @@ func (e *ephrdb) Create(ctx context.Context, ephr reportsv1.EphemeralReport) err klog.Infof("creating entry for key:%s", key) if _, found := e.db[key]; found { klog.Errorf("entry already exists k:%s", key) - return errors.NewAlreadyExists(groupResource, key) + return errors.NewAlreadyExists(utils.EphemeralReportsGR, key) } else { e.db[key] = ephr klog.Infof("entry created for key:%s", key) @@ -77,7 +78,7 @@ func (e *ephrdb) Update(ctx context.Context, ephr reportsv1.EphemeralReport) err klog.Infof("updating entry for key:%s", key) if _, found := e.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.EphemeralReportsGR, key) } else { e.db[key] = ephr klog.Infof("entry updated for key:%s", key) @@ -93,7 +94,7 @@ func (e *ephrdb) Delete(ctx context.Context, name, namespace string) error { klog.Infof("deleting entry for key:%s", key) if _, found := e.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.EphemeralReportsGR, key) } else { delete(e.db, key) klog.Infof("entry deleted for key:%s", key) diff --git a/pkg/storage/inmemory/polr.go b/pkg/storage/inmemory/polr.go index a052937..f087fa8 100644 --- a/pkg/storage/inmemory/polr.go +++ b/pkg/storage/inmemory/polr.go @@ -6,6 +6,7 @@ import ( "strings" "sync" + "github.com/kyverno/reports-server/pkg/utils" "k8s.io/apimachinery/pkg/api/errors" "k8s.io/klog/v2" "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/api/wgpolicyk8s.io/v1alpha2" @@ -49,7 +50,7 @@ func (p *polrdb) Get(ctx context.Context, name, namespace string) (v1alpha2.Poli return val, nil } else { klog.Errorf("value not found for key:%s", key) - return v1alpha2.PolicyReport{}, errors.NewNotFound(groupResource, key) + return v1alpha2.PolicyReport{}, errors.NewNotFound(utils.PolicyReportsGR, key) } } @@ -61,7 +62,7 @@ func (p *polrdb) Create(ctx context.Context, polr v1alpha2.PolicyReport) error { klog.Infof("creating entry for key:%s", key) if _, found := p.db[key]; found { klog.Errorf("entry already exists k:%s", key) - return errors.NewAlreadyExists(groupResource, key) + return errors.NewAlreadyExists(utils.PolicyReportsGR, key) } else { p.db[key] = polr klog.Infof("entry created for key:%s", key) @@ -77,7 +78,7 @@ func (p *polrdb) Update(ctx context.Context, polr v1alpha2.PolicyReport) error { klog.Infof("updating entry for key:%s", key) if _, found := p.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.PolicyReportsGR, key) } else { p.db[key] = polr klog.Infof("entry updated for key:%s", key) @@ -93,7 +94,7 @@ func (p *polrdb) Delete(ctx context.Context, name, namespace string) error { klog.Infof("deleting entry for key:%s", key) if _, found := p.db[key]; !found { klog.Errorf("entry does not exist k:%s", key) - return errors.NewNotFound(groupResource, key) + return errors.NewNotFound(utils.PolicyReportsGR, key) } else { delete(p.db, key) klog.Infof("entry deleted for key:%s", key) diff --git a/pkg/utils/constants.go b/pkg/utils/constants.go new file mode 100644 index 0000000..624e92f --- /dev/null +++ b/pkg/utils/constants.go @@ -0,0 +1,13 @@ +package utils + +import ( + reportsv1 "github.com/kyverno/kyverno/api/reports/v1" + "k8s.io/api/resource/v1alpha2" +) + +var ( + EphemeralReportsGR = reportsv1.Resource("ephemeralreports") + ClusterEphemeralReportsGR = reportsv1.Resource("clusterephemeralreports") + PolicyReportsGR = v1alpha2.Resource("policyreports") + ClusterPolicyReportsGR = v1alpha2.Resource("clusterephemeralreports") +)