@@ -11,13 +11,17 @@ import (
11
11
kerrors "k8s.io/apimachinery/pkg/api/errors"
12
12
"k8s.io/apimachinery/pkg/api/meta"
13
13
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
14
15
"k8s.io/apimachinery/pkg/runtime"
15
16
"k8s.io/apimachinery/pkg/runtime/schema"
16
17
kerrs "k8s.io/apimachinery/pkg/util/errors"
17
18
utilerrors "k8s.io/apimachinery/pkg/util/errors"
18
19
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
19
20
"k8s.io/apimachinery/pkg/util/wait"
20
21
"k8s.io/apiserver/pkg/authentication/user"
22
+ "k8s.io/client-go/discovery"
23
+ cacheddiscovery "k8s.io/client-go/discovery/cached"
24
+ "k8s.io/client-go/dynamic"
21
25
"k8s.io/client-go/rest"
22
26
"k8s.io/client-go/tools/cache"
23
27
"k8s.io/client-go/util/workqueue"
@@ -51,9 +55,11 @@ const readinessTimeout = time.Hour
51
55
// using its own service account, first verifying that the requester also has
52
56
// permissions to instantiate.
53
57
type TemplateInstanceController struct {
54
- restmapper meta.RESTMapper
55
- config * rest.Config
56
- templateClient templateclient.Interface
58
+ restmapper meta.RESTMapper
59
+ dynamicRestMapper * discovery.DeferredDiscoveryRESTMapper
60
+ config * rest.Config
61
+ jsonConfig * rest.Config
62
+ templateClient templateclient.Interface
57
63
58
64
// FIXME: Remove then cient when the build configs are able to report the
59
65
// status of the last build.
@@ -97,6 +103,13 @@ func NewTemplateInstanceController(config *rest.Config, kc kclientsetinternal.In
97
103
},
98
104
})
99
105
106
+ discoveryClient := cacheddiscovery .NewMemCacheClient (c .kc .Discovery ())
107
+ c .dynamicRestMapper = discovery .NewDeferredDiscoveryRESTMapper (discoveryClient , meta .InterfacesForUnstructured )
108
+ c .dynamicRestMapper .Reset ()
109
+
110
+ c .jsonConfig = rest .CopyConfig (c .config )
111
+ c .jsonConfig .ContentConfig = dynamic .ContentConfig ()
112
+
100
113
prometheus .MustRegister (c )
101
114
102
115
return c
@@ -284,6 +297,8 @@ func (c *TemplateInstanceController) Run(workers int, stopCh <-chan struct{}) {
284
297
go wait .Until (c .runWorker , time .Second , stopCh )
285
298
}
286
299
300
+ go wait .Until (c .dynamicRestMapper .Reset , 30 * time .Second , stopCh )
301
+
287
302
<- stopCh
288
303
}
289
304
@@ -407,7 +422,7 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
407
422
return err
408
423
}
409
424
410
- errs := runtime .DecodeList (template .Objects , legacyscheme .Codecs .UniversalDecoder () )
425
+ errs := runtime .DecodeList (template .Objects , legacyscheme .Codecs .LegacyCodec (schema. GroupVersion { Group : "" , Version : "v1" }), unstructured . UnstructuredJSONScheme )
411
426
if len (errs ) > 0 {
412
427
return kerrs .NewAggregate (errs )
413
428
}
@@ -424,7 +439,10 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
424
439
}
425
440
426
441
for _ , obj := range template .Objects {
427
- meta , _ := meta .Accessor (obj )
442
+ meta , err := meta .Accessor (obj )
443
+ if err != nil {
444
+ return err
445
+ }
428
446
ref := meta .GetOwnerReferences ()
429
447
ref = append (ref , templateInstanceOwnerRef )
430
448
meta .SetOwnerReferences (ref )
@@ -436,7 +454,14 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
436
454
ObjectTyper : legacyscheme .Scheme ,
437
455
ClientMapper : bulk .ClientMapperFromConfig (c .config ),
438
456
},
457
+ DynamicMapper : & resource.Mapper {
458
+ RESTMapper : c .dynamicRestMapper ,
459
+ ObjectTyper : legacyscheme .Scheme ,
460
+ ClientMapper : bulk .ClientMapperFromConfig (c .jsonConfig ),
461
+ },
462
+
439
463
Op : func (info * resource.Info , namespace string , obj runtime.Object ) (runtime.Object , error ) {
464
+
440
465
if len (info .Namespace ) > 0 {
441
466
namespace = info .Namespace
442
467
}
0 commit comments