@@ -17,142 +17,32 @@ limitations under the License.
17
17
package restmapper
18
18
19
19
import (
20
- "sync"
21
-
22
20
"k8s.io/apimachinery/pkg/api/meta"
23
21
"k8s.io/apimachinery/pkg/runtime/schema"
24
22
"k8s.io/client-go/discovery"
25
23
"k8s.io/client-go/rest"
26
24
"k8s.io/client-go/restmapper"
27
25
)
28
26
29
- // GetGroupVersionResource is a helper to map GVK(schema.GroupVersionKind) to GVR(schema.GroupVersionResource).
30
- func GetGroupVersionResource (restMapper meta.RESTMapper , gvk schema.GroupVersionKind ) (schema.GroupVersionResource , error ) {
31
- restMapping , err := restMapper .RESTMapping (gvk .GroupKind (), gvk .Version )
27
+ func GetRESTMapper (restConfig * rest.Config ) (meta.RESTMapper , error ) {
28
+ dc , err := discovery .NewDiscoveryClientForConfig (restConfig )
32
29
if err != nil {
33
- return schema.GroupVersionResource {}, err
34
- }
35
- return restMapping .Resource , nil
36
- }
37
-
38
- // cachedRESTMapper caches the previous result to accelerate subsequent queries.
39
- type cachedRESTMapper struct {
40
- restMapper meta.RESTMapper
41
- discoveryClient discovery.DiscoveryInterface
42
- gvkToGVR sync.Map
43
- // mu is used to provide thread-safe mapper reloading.
44
- mu sync.RWMutex
45
- }
46
-
47
- func (g * cachedRESTMapper ) KindFor (resource schema.GroupVersionResource ) (schema.GroupVersionKind , error ) {
48
- return g .getMapper ().KindFor (resource )
49
- }
50
-
51
- func (g * cachedRESTMapper ) KindsFor (resource schema.GroupVersionResource ) ([]schema.GroupVersionKind , error ) {
52
- return g .getMapper ().KindsFor (resource )
53
- }
54
-
55
- func (g * cachedRESTMapper ) ResourceFor (input schema.GroupVersionResource ) (schema.GroupVersionResource , error ) {
56
- return g .getMapper ().ResourceFor (input )
57
- }
58
-
59
- func (g * cachedRESTMapper ) ResourcesFor (input schema.GroupVersionResource ) ([]schema.GroupVersionResource , error ) {
60
- return g .getMapper ().ResourcesFor (input )
61
- }
62
-
63
- func (g * cachedRESTMapper ) RESTMappings (gk schema.GroupKind , versions ... string ) ([]* meta.RESTMapping , error ) {
64
- return g .getMapper ().RESTMappings (gk , versions ... )
65
- }
66
-
67
- func (g * cachedRESTMapper ) ResourceSingularizer (resource string ) (singular string , err error ) {
68
- return g .getMapper ().ResourceSingularizer (resource )
69
- }
70
-
71
- func (g * cachedRESTMapper ) RESTMapping (gk schema.GroupKind , versions ... string ) (* meta.RESTMapping , error ) {
72
- // in case of multi-versions or no versions, cachedRESTMapper don't know which is the preferred version,
73
- // so just bypass the cache and consult the underlying mapper.
74
- if len (versions ) != 1 {
75
- return g .getMapper ().RESTMapping (gk , versions ... )
76
- }
77
-
78
- gvk := gk .WithVersion (versions [0 ])
79
- value , ok := g .gvkToGVR .Load (gvk )
80
- if ok { // hit cache, just return
81
- return value .(* meta.RESTMapping ), nil
82
- }
83
-
84
- // consult underlying mapper and then update cache
85
- restMapping , err := g .getMapper ().RESTMapping (gk , versions ... )
86
- if meta .IsNoMatchError (err ) {
87
- // hit here means a resource might be missing from the current rest mapper,
88
- // probably because a new resource(CRD) has been added, we have to reload
89
- // resource and rebuild the rest mapper.
90
-
91
- var groupResources []* restmapper.APIGroupResources
92
- groupResources , err = restmapper .GetAPIGroupResources (g .discoveryClient )
93
- if err != nil {
94
- return nil , err
95
- }
96
-
97
- newMapper := restmapper .NewDiscoveryRESTMapper (groupResources )
98
- restMapping , err = newMapper .RESTMapping (gk , versions ... )
99
- if err == nil {
100
- // hit here means after reloading, the new rest mapper can recognize
101
- // the resource, we have to replace the mapper and clear cache.
102
- g .mu .Lock ()
103
- g .restMapper = newMapper
104
- g .mu .Unlock ()
105
- g .gvkToGVR .Range (func (key , value any ) bool {
106
- g .gvkToGVR .Delete (key )
107
- return true
108
- })
109
- }
30
+ panic (err .Error ())
110
31
}
111
32
33
+ grl , err := restmapper .GetAPIGroupResources (dc )
112
34
if err != nil {
113
- return restMapping , err
35
+ panic ( err . Error ())
114
36
}
115
- g .gvkToGVR .Store (gvk , restMapping )
116
37
117
- return restMapping , nil
38
+ return restmapper . NewDiscoveryRESTMapper ( grl ) , nil
118
39
}
119
40
120
- func (g * cachedRESTMapper ) getMapper () meta.RESTMapper {
121
- g .mu .RLock ()
122
- defer g .mu .RUnlock ()
123
- return g .restMapper
124
- }
125
-
126
- // NewCachedRESTMapper builds a cachedRESTMapper with a customized underlyingMapper.
127
- // If underlyingMapper is nil, defaults to DiscoveryRESTMapper.
128
- func NewCachedRESTMapper (cfg * rest.Config , underlyingMapper meta.RESTMapper ) (meta.RESTMapper , error ) {
129
- cachedMapper := cachedRESTMapper {}
130
-
131
- // short path, build with customized underlying mapper.
132
- if underlyingMapper != nil {
133
- cachedMapper .restMapper = underlyingMapper
134
- return & cachedMapper , nil
135
- }
136
-
137
- client , err := discovery .NewDiscoveryClientForConfig (cfg )
138
- if err != nil {
139
- return nil , err
140
- }
141
-
142
- // loading current resources for building a base rest mapper.
143
- groupResources , err := restmapper .GetAPIGroupResources (client )
41
+ // ConvertGVKToGVR convert GVK to GVR
42
+ func ConvertGVKToGVR (restMapper meta.RESTMapper , gvk schema.GroupVersionKind ) (schema.GroupVersionResource , error ) {
43
+ restMapping , err := restMapper .RESTMapping (gvk .GroupKind (), gvk .Version )
144
44
if err != nil {
145
- return nil , err
45
+ return schema. GroupVersionResource {} , err
146
46
}
147
-
148
- cachedMapper .restMapper = restmapper .NewDiscoveryRESTMapper (groupResources )
149
- cachedMapper .discoveryClient = client
150
-
151
- return & cachedMapper , nil
152
- }
153
-
154
- // MapperProvider is a wrapper of cachedRESTMapper which is typically used
155
- // to generate customized RESTMapper for controller-runtime framework.
156
- func MapperProvider (c * rest.Config ) (meta.RESTMapper , error ) {
157
- return NewCachedRESTMapper (c , nil )
47
+ return restMapping .Resource , nil
158
48
}
0 commit comments