...
1
16
17 package resolver
18
19 import (
20 "strings"
21
22 "k8s.io/apimachinery/pkg/api/meta"
23 "k8s.io/apimachinery/pkg/runtime/schema"
24 "k8s.io/client-go/discovery"
25 )
26
27 type ResourceResolver interface {
28 Resolve(gvk schema.GroupVersionKind) (schema.GroupVersionResource, error)
29 }
30
31 type discoveryResourceResolver struct {
32 client discovery.DiscoveryInterface
33 }
34
35 func (d *discoveryResourceResolver) Resolve(gvk schema.GroupVersionKind) (schema.GroupVersionResource, error) {
36 gv := gvk.GroupVersion()
37
38 resources, err := d.client.ServerResourcesForGroupVersion(gv.String())
39 if err != nil {
40 return schema.GroupVersionResource{}, err
41 }
42 for _, resource := range resources.APIResources {
43 if resource.Kind != gvk.Kind {
44
45 continue
46 }
47 if strings.Contains(resource.Name, "/") {
48
49 continue
50 }
51 if resource.Group != "" && resource.Group != gvk.Group {
52
53 continue
54 }
55 if resource.Version != "" && resource.Version != gvk.Version {
56
57 continue
58 }
59 return gv.WithResource(resource.Name), nil
60 }
61 return schema.GroupVersionResource{}, &meta.NoKindMatchError{GroupKind: gvk.GroupKind(), SearchedVersions: []string{gvk.Version}}
62 }
63
64 func NewDiscoveryResourceResolver(client discovery.DiscoveryInterface) (ResourceResolver, error) {
65 return &discoveryResourceResolver{client: client}, nil
66 }
67
68 type ResourceResolverFunc func(gvk schema.GroupVersionKind) (schema.GroupVersionResource, error)
69
70 func (f ResourceResolverFunc) Resolve(gvk schema.GroupVersionKind) (schema.GroupVersionResource, error) {
71 return f(gvk)
72 }
73
View as plain text