@@ -18,12 +18,12 @@ package apiutil
18
18
19
19
import (
20
20
"sync"
21
- "sync/atomic"
22
21
23
22
"golang.org/x/time/rate"
24
23
"k8s.io/apimachinery/pkg/api/meta"
25
24
"k8s.io/apimachinery/pkg/runtime/schema"
26
25
"k8s.io/client-go/discovery"
26
+ "k8s.io/client-go/discovery/cached/memory"
27
27
"k8s.io/client-go/rest"
28
28
"k8s.io/client-go/restmapper"
29
29
)
@@ -37,9 +37,6 @@ type dynamicRESTMapper struct {
37
37
newMapper func () (meta.RESTMapper , error )
38
38
39
39
lazy bool
40
- // Used for lazy init.
41
- inited uint32
42
- initMtx sync.Mutex
43
40
}
44
41
45
42
// DynamicRESTMapperOption is a functional option on the dynamicRESTMapper.
@@ -76,30 +73,43 @@ func WithCustomMapper(newMapper func() (meta.RESTMapper, error)) DynamicRESTMapp
76
73
// RESTMapper dynamically discovers resource types at runtime. opts
77
74
// configure the RESTMapper.
78
75
func NewDynamicRESTMapper (cfg * rest.Config , opts ... DynamicRESTMapperOption ) (meta.RESTMapper , error ) {
79
- client , err := discovery .NewDiscoveryClientForConfig (cfg )
80
- if err != nil {
81
- return nil , err
82
- }
83
76
drm := & dynamicRESTMapper {
84
77
limiter : rate .NewLimiter (rate .Limit (defaultRefillRate ), defaultLimitSize ),
85
- newMapper : func () (meta.RESTMapper , error ) {
86
- groupResources , err := restmapper .GetAPIGroupResources (client )
87
- if err != nil {
88
- return nil , err
89
- }
90
- return restmapper .NewDiscoveryRESTMapper (groupResources ), nil
91
- },
92
78
}
93
79
for _ , opt := range opts {
94
- if err = opt (drm ); err != nil {
80
+ if err : = opt (drm ); err != nil {
95
81
return nil , err
96
82
}
97
83
}
98
- if ! drm .lazy {
99
- if err := drm .setStaticMapper (); err != nil {
84
+
85
+ if drm .newMapper == nil {
86
+ // If custom mapper is not set, we wse NewDeferredDiscoveryRESTMapper for lazy loading
87
+ // or standard NewDiscoveryRESTMapper for other cases.
88
+ client , err := discovery .NewDiscoveryClientForConfig (cfg )
89
+ if err != nil {
100
90
return nil , err
101
91
}
92
+
93
+ if ! drm .lazy {
94
+ drm .newMapper = func () (meta.RESTMapper , error ) {
95
+ groupResources , err := restmapper .GetAPIGroupResources (client )
96
+ if err != nil {
97
+ return nil , err
98
+ }
99
+
100
+ return restmapper .NewDiscoveryRESTMapper (groupResources ), nil
101
+ }
102
+ } else {
103
+ drm .newMapper = func () (meta.RESTMapper , error ) {
104
+ return restmapper .NewDeferredDiscoveryRESTMapper (memory .NewMemCacheClient (client )), nil
105
+ }
106
+ }
107
+ }
108
+
109
+ if err := drm .setStaticMapper (); err != nil {
110
+ return nil , err
102
111
}
112
+
103
113
return drm , nil
104
114
}
105
115
@@ -124,23 +134,6 @@ func (drm *dynamicRESTMapper) setStaticMapper() error {
124
134
return nil
125
135
}
126
136
127
- // init initializes drm only once if drm is lazy.
128
- func (drm * dynamicRESTMapper ) init () (err error ) {
129
- // skip init if drm is not lazy or has initialized
130
- if ! drm .lazy || atomic .LoadUint32 (& drm .inited ) != 0 {
131
- return nil
132
- }
133
-
134
- drm .initMtx .Lock ()
135
- defer drm .initMtx .Unlock ()
136
- if drm .inited == 0 {
137
- if err = drm .setStaticMapper (); err == nil {
138
- atomic .StoreUint32 (& drm .inited , 1 )
139
- }
140
- }
141
- return err
142
- }
143
-
144
137
// checkAndReload attempts to call the given callback, which is assumed to be dependent
145
138
// on the data in the restmapper.
146
139
//
@@ -198,9 +191,6 @@ func (drm *dynamicRESTMapper) checkAndReload(checkNeedsReload func() error) erro
198
191
// TODO: wrap reload errors on NoKindMatchError with go 1.13 errors.
199
192
200
193
func (drm * dynamicRESTMapper ) KindFor (resource schema.GroupVersionResource ) (schema.GroupVersionKind , error ) {
201
- if err := drm .init (); err != nil {
202
- return schema.GroupVersionKind {}, err
203
- }
204
194
var gvk schema.GroupVersionKind
205
195
err := drm .checkAndReload (func () error {
206
196
var err error
@@ -211,9 +201,6 @@ func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (sch
211
201
}
212
202
213
203
func (drm * dynamicRESTMapper ) KindsFor (resource schema.GroupVersionResource ) ([]schema.GroupVersionKind , error ) {
214
- if err := drm .init (); err != nil {
215
- return nil , err
216
- }
217
204
var gvks []schema.GroupVersionKind
218
205
err := drm .checkAndReload (func () error {
219
206
var err error
@@ -224,10 +211,6 @@ func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]
224
211
}
225
212
226
213
func (drm * dynamicRESTMapper ) ResourceFor (input schema.GroupVersionResource ) (schema.GroupVersionResource , error ) {
227
- if err := drm .init (); err != nil {
228
- return schema.GroupVersionResource {}, err
229
- }
230
-
231
214
var gvr schema.GroupVersionResource
232
215
err := drm .checkAndReload (func () error {
233
216
var err error
@@ -238,9 +221,6 @@ func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (sc
238
221
}
239
222
240
223
func (drm * dynamicRESTMapper ) ResourcesFor (input schema.GroupVersionResource ) ([]schema.GroupVersionResource , error ) {
241
- if err := drm .init (); err != nil {
242
- return nil , err
243
- }
244
224
var gvrs []schema.GroupVersionResource
245
225
err := drm .checkAndReload (func () error {
246
226
var err error
@@ -251,9 +231,6 @@ func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([
251
231
}
252
232
253
233
func (drm * dynamicRESTMapper ) RESTMapping (gk schema.GroupKind , versions ... string ) (* meta.RESTMapping , error ) {
254
- if err := drm .init (); err != nil {
255
- return nil , err
256
- }
257
234
var mapping * meta.RESTMapping
258
235
err := drm .checkAndReload (func () error {
259
236
var err error
@@ -264,9 +241,6 @@ func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...strin
264
241
}
265
242
266
243
func (drm * dynamicRESTMapper ) RESTMappings (gk schema.GroupKind , versions ... string ) ([]* meta.RESTMapping , error ) {
267
- if err := drm .init (); err != nil {
268
- return nil , err
269
- }
270
244
var mappings []* meta.RESTMapping
271
245
err := drm .checkAndReload (func () error {
272
246
var err error
@@ -277,9 +251,6 @@ func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...stri
277
251
}
278
252
279
253
func (drm * dynamicRESTMapper ) ResourceSingularizer (resource string ) (string , error ) {
280
- if err := drm .init (); err != nil {
281
- return "" , err
282
- }
283
254
var singular string
284
255
err := drm .checkAndReload (func () error {
285
256
var err error
0 commit comments