Skip to content

Commit eed81f1

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

File tree

4 files changed

+91
-7
lines changed

4 files changed

+91
-7
lines changed

pkg/cmd/server/bootstrappolicy/controller_policy.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ func init() {
163163
rbac.NewRule("create").Groups(kAuthzGroup).Resources("subjectaccessreviews").RuleOrDie(),
164164
rbac.NewRule("update").Groups(templateGroup).Resources("templateinstances/status").RuleOrDie(),
165165
rbac.NewRule("update").Groups(templateGroup).Resources("templateinstances/finalizers").RuleOrDie(),
166+
// template instance controller needs to be able to create and get any resource the user is allowed to create.
167+
rbac.NewRule("create").Groups(rbac.APIGroupAll).Resources(rbac.ResourceAll).RuleOrDie(),
168+
rbac.NewRule("get").Groups(rbac.APIGroupAll).Resources(rbac.ResourceAll).RuleOrDie(),
169+
// delete needed to be able to set ownerrefs on objects
170+
rbac.NewRule("delete").Groups(rbac.APIGroupAll).Resources(rbac.ResourceAll).RuleOrDie(),
166171
},
167172
})
168173

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: 28 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: 28 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,31 @@ objects:
5961
to:
6062
kind: Service
6163
name: service
64+
- apiVersion: apiextensions.k8s.io/v1beta1
65+
kind: CustomResourceDefinition
66+
metadata:
67+
name: testcrds.testcrdgroup.io
68+
spec:
69+
group: testcrdgroup.io
70+
version: v1
71+
scope: Namespaced
72+
names:
73+
plural: testcrds
74+
singular: testcrd
75+
kind: TestCRD
76+
validation:
77+
openAPIV3Schema:
78+
properties:
79+
state:
80+
type: string
81+
podName:
82+
type: string
83+
method:
84+
type: string
85+
error:
86+
type: string
87+
description:
88+
type: string
6289

6390
- apiVersion: template.openshift.io/v1
6491
kind: BrokerTemplateInstance

0 commit comments

Comments
 (0)