Skip to content

Commit f1eaefb

Browse files
committed
allow template instance controller to create CRDs
1 parent 229ee35 commit f1eaefb

File tree

3 files changed

+60
-7
lines changed

3 files changed

+60
-7
lines changed

pkg/template/controller/templateinstance_controller.go

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,17 @@ import (
1111
kerrors "k8s.io/apimachinery/pkg/api/errors"
1212
"k8s.io/apimachinery/pkg/api/meta"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/runtime/schema"
1617
kerrs "k8s.io/apimachinery/pkg/util/errors"
1718
utilerrors "k8s.io/apimachinery/pkg/util/errors"
1819
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
1920
"k8s.io/apimachinery/pkg/util/wait"
2021
"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"
2125
"k8s.io/client-go/rest"
2226
"k8s.io/client-go/tools/cache"
2327
"k8s.io/client-go/util/workqueue"
@@ -51,9 +55,11 @@ const readinessTimeout = time.Hour
5155
// using its own service account, first verifying that the requester also has
5256
// permissions to instantiate.
5357
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
5763

5864
// FIXME: Remove then cient when the build configs are able to report the
5965
// status of the last build.
@@ -97,6 +103,13 @@ func NewTemplateInstanceController(config *rest.Config, kc kclientsetinternal.In
97103
},
98104
})
99105

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+
100113
prometheus.MustRegister(c)
101114

102115
return c
@@ -284,6 +297,8 @@ func (c *TemplateInstanceController) Run(workers int, stopCh <-chan struct{}) {
284297
go wait.Until(c.runWorker, time.Second, stopCh)
285298
}
286299

300+
go wait.Until(c.dynamicRestMapper.Reset, 30*time.Second, stopCh)
301+
287302
<-stopCh
288303
}
289304

@@ -407,7 +422,7 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
407422
return err
408423
}
409424

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)
411426
if len(errs) > 0 {
412427
return kerrs.NewAggregate(errs)
413428
}
@@ -424,7 +439,10 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
424439
}
425440

426441
for _, obj := range template.Objects {
427-
meta, _ := meta.Accessor(obj)
442+
meta, err := meta.Accessor(obj)
443+
if err != nil {
444+
return err
445+
}
428446
ref := meta.GetOwnerReferences()
429447
ref = append(ref, templateInstanceOwnerRef)
430448
meta.SetOwnerReferences(ref)
@@ -436,7 +454,14 @@ func (c *TemplateInstanceController) instantiate(templateInstance *templateapi.T
436454
ObjectTyper: legacyscheme.Scheme,
437455
ClientMapper: bulk.ClientMapperFromConfig(c.config),
438456
},
457+
DynamicMapper: &resource.Mapper{
458+
RESTMapper: c.dynamicRestMapper,
459+
ObjectTyper: legacyscheme.Scheme,
460+
ClientMapper: bulk.ClientMapperFromConfig(c.jsonConfig),
461+
},
462+
439463
Op: func(info *resource.Info, namespace string, obj runtime.Object) (runtime.Object, error) {
464+
440465
if len(info.Namespace) > 0 {
441466
namespace = info.Namespace
442467
}

test/extended/testdata/bindata.go

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/extended/testdata/templates/templateservicebroker_bind.yaml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
apiVersion: v1
22
kind: Template
3+
metadata:
4+
name: tsbtemplate
35
objects:
46
- apiVersion: v1
57
kind: Secret
@@ -47,7 +49,7 @@ objects:
4749
ports:
4850
- name: port
4951
port: 1234
50-
- apiVersion: v1
52+
- apiVersion: route.openshift.io/v1
5153
kind: Route
5254
metadata:
5355
annotations:
@@ -59,6 +61,18 @@ objects:
5961
to:
6062
kind: Service
6163
name: service
64+
- apiVersion: v1
65+
kind: Route
66+
metadata:
67+
annotations:
68+
template.openshift.io/expose-route-uri: http://{.spec.host}{.spec.path}
69+
name: legacyroute
70+
spec:
71+
host: host
72+
path: /path
73+
to:
74+
kind: Service
75+
name: service
6276

6377
- apiVersion: template.openshift.io/v1
6478
kind: BrokerTemplateInstance

0 commit comments

Comments
 (0)