1
0
Fork 0
mirror of https://github.com/kyverno/kyverno.git synced 2025-03-15 12:17:56 +00:00

refactor: discovery client (#6652)

Signed-off-by: Charles-Edouard Brétéché <charles.edouard@nirmata.com>
Co-authored-by: shuting <shuting@nirmata.com>
This commit is contained in:
Charles-Edouard Brétéché 2023-03-23 07:12:44 +01:00 committed by GitHub
parent 68e4b9de12
commit 7cd160a90a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 32 deletions

View file

@ -14,38 +14,37 @@ import (
"k8s.io/client-go/discovery" "k8s.io/client-go/discovery"
) )
// GroupVersionResourceSubresource contains a group/version/resource/subresource reference // TopLevelApiDescription contains a group/version/resource/subresource reference
type GroupVersionResourceSubresource struct { type TopLevelApiDescription struct {
schema.GroupVersion schema.GroupVersion
Kind string Kind string
Resource string Resource string
SubResource string SubResource string
} }
func (gvrs GroupVersionResourceSubresource) GroupVersionResource() schema.GroupVersionResource { func (gvrs TopLevelApiDescription) GroupVersionResource() schema.GroupVersionResource {
return gvrs.WithResource(gvrs.Resource) return gvrs.WithResource(gvrs.Resource)
} }
func (gvrs GroupVersionResourceSubresource) GroupVersionKind() schema.GroupVersionKind { func (gvrs TopLevelApiDescription) GroupVersionKind() schema.GroupVersionKind {
return gvrs.WithKind(gvrs.Kind) return gvrs.WithKind(gvrs.Kind)
} }
func (gvrs GroupVersionResourceSubresource) ResourceSubresource() string { func (gvrs TopLevelApiDescription) ResourceSubresource() string {
if gvrs.SubResource == "" { if gvrs.SubResource == "" {
return gvrs.Resource return gvrs.Resource
} }
return gvrs.Resource + "/" + gvrs.SubResource return gvrs.Resource + "/" + gvrs.SubResource
} }
func (gvrs GroupVersionResourceSubresource) WithSubResource(subresource string) GroupVersionResourceSubresource { func (gvrs TopLevelApiDescription) WithSubResource(subresource string) TopLevelApiDescription {
gvrs.SubResource = subresource gvrs.SubResource = subresource
return gvrs return gvrs
} }
// IDiscovery provides interface to mange Kind and GVR mapping // IDiscovery provides interface to mange Kind and GVR mapping
type IDiscovery interface { type IDiscovery interface {
FindResources(group, version, kind, subresource string) (map[GroupVersionResourceSubresource]metav1.APIResource, error) FindResources(group, version, kind, subresource string) (map[TopLevelApiDescription]metav1.APIResource, error)
FindResource(groupVersion string, kind string) (apiResource, parentAPIResource *metav1.APIResource, gvr schema.GroupVersionResource, err error)
// TODO: there's no mapping from GVK to GVR, this is very error prone // TODO: there's no mapping from GVK to GVR, this is very error prone
GetGVRFromGVK(schema.GroupVersionKind) (schema.GroupVersionResource, error) GetGVRFromGVK(schema.GroupVersionKind) (schema.GroupVersionResource, error)
GetGVKFromGVR(schema.GroupVersionResource) (schema.GroupVersionKind, error) GetGVKFromGVR(schema.GroupVersionResource) (schema.GroupVersionKind, error)
@ -168,7 +167,7 @@ func (c serverResources) FindResource(groupVersion string, kind string) (apiReso
return nil, nil, schema.GroupVersionResource{}, err return nil, nil, schema.GroupVersionResource{}, err
} }
func (c serverResources) FindResources(group, version, kind, subresource string) (map[GroupVersionResourceSubresource]metav1.APIResource, error) { func (c serverResources) FindResources(group, version, kind, subresource string) (map[TopLevelApiDescription]metav1.APIResource, error) {
resources, err := c.findResources(group, version, kind, subresource) resources, err := c.findResources(group, version, kind, subresource)
if err != nil { if err != nil {
if !c.cachedClient.Fresh() { if !c.cachedClient.Fresh() {
@ -179,7 +178,7 @@ func (c serverResources) FindResources(group, version, kind, subresource string)
return resources, err return resources, err
} }
func (c serverResources) findResources(group, version, kind, subresource string) (map[GroupVersionResourceSubresource]metav1.APIResource, error) { func (c serverResources) findResources(group, version, kind, subresource string) (map[TopLevelApiDescription]metav1.APIResource, error) {
_, serverGroupsAndResources, err := c.cachedClient.ServerGroupsAndResources() _, serverGroupsAndResources, err := c.cachedClient.ServerGroupsAndResources()
if err != nil && !strings.Contains(err.Error(), "Got empty response for") { if err != nil && !strings.Contains(err.Error(), "Got empty response for") {
if discovery.IsGroupDiscoveryFailedError(err) { if discovery.IsGroupDiscoveryFailedError(err) {
@ -204,7 +203,7 @@ func (c serverResources) findResources(group, version, kind, subresource string)
Kind: kind, Kind: kind,
} }
} }
resources := map[GroupVersionResourceSubresource]metav1.APIResource{} resources := map[TopLevelApiDescription]metav1.APIResource{}
// first match resouces // first match resouces
for _, list := range serverGroupsAndResources { for _, list := range serverGroupsAndResources {
gv, err := schema.ParseGroupVersion(list.GroupVersion) gv, err := schema.ParseGroupVersion(list.GroupVersion)
@ -215,7 +214,7 @@ func (c serverResources) findResources(group, version, kind, subresource string)
if !strings.Contains(resource.Name, "/") { if !strings.Contains(resource.Name, "/") {
gvk := getGVK(gv, resource.Group, resource.Version, resource.Kind) gvk := getGVK(gv, resource.Group, resource.Version, resource.Kind)
if wildcard.Match(group, gvk.Group) && wildcard.Match(version, gvk.Version) && wildcard.Match(kind, gvk.Kind) { if wildcard.Match(group, gvk.Group) && wildcard.Match(version, gvk.Version) && wildcard.Match(kind, gvk.Kind) {
gvrs := GroupVersionResourceSubresource{ gvrs := TopLevelApiDescription{
GroupVersion: gv, GroupVersion: gv,
Kind: resource.Kind, Kind: resource.Kind,
Resource: resource.Name, Resource: resource.Name,
@ -227,7 +226,7 @@ func (c serverResources) findResources(group, version, kind, subresource string)
} }
} }
// second match subresouces if necessary // second match subresouces if necessary
subresources := map[GroupVersionResourceSubresource]metav1.APIResource{} subresources := map[TopLevelApiDescription]metav1.APIResource{}
if subresource != "" { if subresource != "" {
for _, list := range serverGroupsAndResources { for _, list := range serverGroupsAndResources {
for _, resource := range list.APIResources { for _, resource := range list.APIResources {

View file

@ -77,11 +77,7 @@ func (c *fakeDiscoveryClient) GetGVRFromGVK(gvk schema.GroupVersionKind) (schema
return c.getGVR(resource) return c.getGVR(resource)
} }
func (c *fakeDiscoveryClient) FindResource(groupVersion string, kind string) (apiResource, parentAPIResource *metav1.APIResource, gvr schema.GroupVersionResource, err error) { func (c *fakeDiscoveryClient) FindResources(group, version, kind, subresource string) (map[TopLevelApiDescription]metav1.APIResource, error) {
return nil, nil, schema.GroupVersionResource{}, fmt.Errorf("not implemented")
}
func (c *fakeDiscoveryClient) FindResources(group, version, kind, subresource string) (map[GroupVersionResourceSubresource]metav1.APIResource, error) {
return nil, fmt.Errorf("not implemented") return nil, fmt.Errorf("not implemented")
} }

View file

@ -9,7 +9,7 @@ import (
) )
type ResourceFinder interface { type ResourceFinder interface {
FindResources(group, version, kind, subresource string) (map[dclient.GroupVersionResourceSubresource]metav1.APIResource, error) FindResources(group, version, kind, subresource string) (map[dclient.TopLevelApiDescription]metav1.APIResource, error)
} }
// Cache get method use for to get policy names and mostly use to test cache testcases // Cache get method use for to get policy names and mostly use to test cache testcases

View file

@ -32,8 +32,8 @@ var (
replicationcontrollersGVRS = mapGVR(replicationcontrollersGVR, "ReplicationController") replicationcontrollersGVRS = mapGVR(replicationcontrollersGVR, "ReplicationController")
) )
func mapGVR(gvr schema.GroupVersionResource, kind string) dclient.GroupVersionResourceSubresource { func mapGVR(gvr schema.GroupVersionResource, kind string) dclient.TopLevelApiDescription {
return dclient.GroupVersionResourceSubresource{ return dclient.TopLevelApiDescription{
GroupVersion: gvr.GroupVersion(), GroupVersion: gvr.GroupVersion(),
Kind: kind, Kind: kind,
Resource: gvr.Resource, Resource: gvr.Resource,
@ -42,29 +42,29 @@ func mapGVR(gvr schema.GroupVersionResource, kind string) dclient.GroupVersionRe
type TestResourceFinder struct{} type TestResourceFinder struct{}
func (TestResourceFinder) FindResources(group, version, kind, subresource string) (map[dclient.GroupVersionResourceSubresource]metav1.APIResource, error) { func (TestResourceFinder) FindResources(group, version, kind, subresource string) (map[dclient.TopLevelApiDescription]metav1.APIResource, error) {
var dummy metav1.APIResource var dummy metav1.APIResource
switch kind { switch kind {
case "Pod": case "Pod":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{podsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{podsGVRS: dummy}, nil
case "Namespace": case "Namespace":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{namespacesGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{namespacesGVRS: dummy}, nil
case "ClusterRole": case "ClusterRole":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{clusterrolesGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{clusterrolesGVRS: dummy}, nil
case "Deployment": case "Deployment":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{deploymentsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{deploymentsGVRS: dummy}, nil
case "StatefulSet": case "StatefulSet":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{statefulsetsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{statefulsetsGVRS: dummy}, nil
case "DaemonSet": case "DaemonSet":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{daemonsetsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{daemonsetsGVRS: dummy}, nil
case "ReplicaSet": case "ReplicaSet":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{replicasetsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{replicasetsGVRS: dummy}, nil
case "Job": case "Job":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{jobsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{jobsGVRS: dummy}, nil
case "ReplicationController": case "ReplicationController":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{replicationcontrollersGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{replicationcontrollersGVRS: dummy}, nil
case "CronJob": case "CronJob":
return map[dclient.GroupVersionResourceSubresource]metav1.APIResource{cronjobsGVRS: dummy}, nil return map[dclient.TopLevelApiDescription]metav1.APIResource{cronjobsGVRS: dummy}, nil
} }
return nil, fmt.Errorf("not found: %s", kind) return nil, fmt.Errorf("not found: %s", kind)
} }