@@ -17,6 +17,7 @@ limitations under the License.
17
17
package apiutil
18
18
19
19
import (
20
+ "sync"
20
21
"time"
21
22
22
23
"golang.org/x/time/rate"
@@ -57,7 +58,10 @@ type dynamicRESTMapper struct {
57
58
client discovery.DiscoveryInterface
58
59
staticMapper meta.RESTMapper
59
60
limiter * dynamicLimiter
60
- lazy bool
61
+
62
+ lazy bool
63
+ // Used for lazy init.
64
+ initOnce sync.Once
61
65
}
62
66
63
67
// WithLimiter sets the RESTMapper's underlying limiter to lim.
@@ -121,6 +125,16 @@ func (drm *dynamicRESTMapper) setStaticMapper() error {
121
125
return nil
122
126
}
123
127
128
+ // init initializes drm only once if drm is lazy.
129
+ func (drm * dynamicRESTMapper ) init () (err error ) {
130
+ drm .initOnce .Do (func () {
131
+ if drm .lazy {
132
+ err = drm .setStaticMapper ()
133
+ }
134
+ })
135
+ return err
136
+ }
137
+
124
138
// reload reloads the static RESTMapper, and will return an error only
125
139
// if a rate limit has been hit.
126
140
func (drm * dynamicRESTMapper ) reload () error {
@@ -134,6 +148,9 @@ func (drm *dynamicRESTMapper) reload() error {
134
148
}
135
149
136
150
func (drm * dynamicRESTMapper ) KindFor (resource schema.GroupVersionResource ) (schema.GroupVersionKind , error ) {
151
+ if err := drm .init (); err != nil {
152
+ return schema.GroupVersionKind {}, err
153
+ }
137
154
gvk , err := drm .staticMapper .KindFor (resource )
138
155
if xerrors .Is (err , & meta.NoKindMatchError {}) {
139
156
if rerr := drm .reload (); rerr != nil {
@@ -145,6 +162,9 @@ func (drm *dynamicRESTMapper) KindFor(resource schema.GroupVersionResource) (sch
145
162
}
146
163
147
164
func (drm * dynamicRESTMapper ) KindsFor (resource schema.GroupVersionResource ) ([]schema.GroupVersionKind , error ) {
165
+ if err := drm .init (); err != nil {
166
+ return nil , err
167
+ }
148
168
gvks , err := drm .staticMapper .KindsFor (resource )
149
169
if xerrors .Is (err , & meta.NoKindMatchError {}) {
150
170
if rerr := drm .reload (); rerr != nil {
@@ -156,6 +176,9 @@ func (drm *dynamicRESTMapper) KindsFor(resource schema.GroupVersionResource) ([]
156
176
}
157
177
158
178
func (drm * dynamicRESTMapper ) ResourceFor (input schema.GroupVersionResource ) (schema.GroupVersionResource , error ) {
179
+ if err := drm .init (); err != nil {
180
+ return schema.GroupVersionResource {}, err
181
+ }
159
182
gvr , err := drm .staticMapper .ResourceFor (input )
160
183
if xerrors .Is (err , & meta.NoKindMatchError {}) {
161
184
if rerr := drm .reload (); rerr != nil {
@@ -167,6 +190,9 @@ func (drm *dynamicRESTMapper) ResourceFor(input schema.GroupVersionResource) (sc
167
190
}
168
191
169
192
func (drm * dynamicRESTMapper ) ResourcesFor (input schema.GroupVersionResource ) ([]schema.GroupVersionResource , error ) {
193
+ if err := drm .init (); err != nil {
194
+ return nil , err
195
+ }
170
196
gvrs , err := drm .staticMapper .ResourcesFor (input )
171
197
if xerrors .Is (err , & meta.NoKindMatchError {}) {
172
198
if rerr := drm .reload (); rerr != nil {
@@ -178,6 +204,9 @@ func (drm *dynamicRESTMapper) ResourcesFor(input schema.GroupVersionResource) ([
178
204
}
179
205
180
206
func (drm * dynamicRESTMapper ) RESTMapping (gk schema.GroupKind , versions ... string ) (* meta.RESTMapping , error ) {
207
+ if err := drm .init (); err != nil {
208
+ return nil , err
209
+ }
181
210
mapping , err := drm .staticMapper .RESTMapping (gk , versions ... )
182
211
if xerrors .Is (err , & meta.NoKindMatchError {}) {
183
212
if rerr := drm .reload (); rerr != nil {
@@ -189,6 +218,9 @@ func (drm *dynamicRESTMapper) RESTMapping(gk schema.GroupKind, versions ...strin
189
218
}
190
219
191
220
func (drm * dynamicRESTMapper ) RESTMappings (gk schema.GroupKind , versions ... string ) ([]* meta.RESTMapping , error ) {
221
+ if err := drm .init (); err != nil {
222
+ return nil , err
223
+ }
192
224
mappings , err := drm .staticMapper .RESTMappings (gk , versions ... )
193
225
if xerrors .Is (err , & meta.NoKindMatchError {}) {
194
226
if rerr := drm .reload (); rerr != nil {
@@ -200,6 +232,9 @@ func (drm *dynamicRESTMapper) RESTMappings(gk schema.GroupKind, versions ...stri
200
232
}
201
233
202
234
func (drm * dynamicRESTMapper ) ResourceSingularizer (resource string ) (string , error ) {
235
+ if err := drm .init (); err != nil {
236
+ return "" , err
237
+ }
203
238
singular , err := drm .staticMapper .ResourceSingularizer (resource )
204
239
if xerrors .Is (err , & meta.NoKindMatchError {}) {
205
240
if rerr := drm .reload (); rerr != nil {
0 commit comments