Skip to content

Commit 37c380b

Browse files
authored
Merge pull request #3461 from alvaroaleman/deprecate-scheme
🌱 Deprecate the scheme builder
2 parents 7f576c0 + 5257194 commit 37c380b

File tree

13 files changed

+149
-108
lines changed

13 files changed

+149
-108
lines changed

alias.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,36 @@ type Manager = manager.Manager
4949
type Options = manager.Options
5050

5151
// SchemeBuilder builds a new Scheme for mapping go types to Kubernetes GroupVersionKinds.
52-
type SchemeBuilder = scheme.Builder
52+
//
53+
// Deprecated: This helper is only useful in api packages, but api packages should be
54+
// easy to import and hence have minimal dependencies. Typically, these dependencies
55+
// include only the standard library, k8s.io/apimachinery and other api packages.
56+
//
57+
// Use the apimachinery builder instead:
58+
//
59+
// import (
60+
// metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
61+
// "k8s.io/apimachinery/pkg/runtime"
62+
// "k8s.io/apimachinery/pkg/runtime/schema"
63+
// )
64+
//
65+
// const GroupName = ""
66+
//
67+
// var (
68+
// SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"}
69+
// SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
70+
// AddToScheme = SchemeBuilder.AddToScheme
71+
// )
72+
//
73+
// func addKnownTypes(scheme *runtime.Scheme) error {
74+
// scheme.AddKnownTypes(SchemeGroupVersion,
75+
// &Pod{},
76+
// )
77+
//
78+
// metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
79+
// return nil
80+
// }
81+
type SchemeBuilder = scheme.Builder //nolint:staticcheck // this is the deprecation alias
5382

5483
// GroupVersion contains the "group" and the "version", which uniquely identifies the API.
5584
type GroupVersion = schema.GroupVersion

examples/crd/pkg/groupversion_info.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,27 @@ limitations under the License.
2020
package pkg
2121

2222
import (
23+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
"k8s.io/apimachinery/pkg/runtime"
2325
"k8s.io/apimachinery/pkg/runtime/schema"
24-
"sigs.k8s.io/controller-runtime/pkg/scheme"
2526
)
2627

2728
var (
2829
// SchemeGroupVersion is group version used to register these objects
2930
SchemeGroupVersion = schema.GroupVersion{Group: "chaosapps.metamagical.io", Version: "v1"}
3031

3132
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
32-
SchemeBuilder = &scheme.Builder{GroupVersion: SchemeGroupVersion}
33+
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
3334

3435
// AddToScheme is required by pkg/client/...
3536
AddToScheme = SchemeBuilder.AddToScheme
3637
)
38+
39+
func addKnownTypes(scheme *runtime.Scheme) error {
40+
scheme.AddKnownTypes(SchemeGroupVersion,
41+
&ChaosPod{},
42+
&ChaosPodList{},
43+
)
44+
metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
45+
return nil
46+
}

examples/crd/pkg/resource.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,3 @@ type ChaosPodList struct {
5555
metav1.ListMeta `json:"metadata,omitempty"`
5656
Items []ChaosPod `json:"items"`
5757
}
58-
59-
func init() {
60-
SchemeBuilder.Register(&ChaosPod{}, &ChaosPodList{})
61-
}

pkg/builder/controller_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import (
4444
"sigs.k8s.io/controller-runtime/pkg/manager"
4545
"sigs.k8s.io/controller-runtime/pkg/predicate"
4646
"sigs.k8s.io/controller-runtime/pkg/reconcile"
47-
"sigs.k8s.io/controller-runtime/pkg/scheme"
4847
"sigs.k8s.io/controller-runtime/pkg/source"
4948
)
5049

@@ -377,10 +376,11 @@ var _ = Describe("application", func() {
377376
Expect(err).NotTo(HaveOccurred())
378377

379378
By("registering the type in the Scheme")
380-
builder := scheme.Builder{GroupVersion: testDefaultValidatorGVK.GroupVersion()}
381-
builder.Register(&TestDefaultValidator{}, &TestDefaultValidatorList{})
382-
err = builder.AddToScheme(m.GetScheme())
383-
Expect(err).NotTo(HaveOccurred())
379+
m.GetScheme().AddKnownTypes(testDefaultValidatorGVK.GroupVersion(),
380+
&TestDefaultValidator{},
381+
&TestDefaultValidatorList{},
382+
)
383+
metav1.AddToGroupVersion(m.GetScheme(), testDefaultValidatorGVK.GroupVersion())
384384

385385
By("creating the 1st controller")
386386
ctrl1, err := ControllerManagedBy(m).

pkg/builder/webhook_test.go

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737
logf "sigs.k8s.io/controller-runtime/pkg/log"
3838
"sigs.k8s.io/controller-runtime/pkg/log/zap"
3939
"sigs.k8s.io/controller-runtime/pkg/manager"
40-
"sigs.k8s.io/controller-runtime/pkg/scheme"
4140
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
4241
)
4342

@@ -90,10 +89,7 @@ func runTests(admissionReviewVersion string) {
9089
ExpectWithOffset(1, err).NotTo(HaveOccurred())
9190

9291
By("registering the type in the Scheme")
93-
builder := scheme.Builder{GroupVersion: testDefaulterGVK.GroupVersion()}
94-
builder.Register(&TestDefaulterObject{}, &TestDefaulterList{})
95-
err = builder.AddToScheme(m.GetScheme())
96-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
92+
addToScheme(m.GetScheme())
9793

9894
webhookBuilder := WebhookManagedBy(m, &TestDefaulterObject{})
9995
build(webhookBuilder)
@@ -174,10 +170,7 @@ func runTests(admissionReviewVersion string) {
174170
ExpectWithOffset(1, err).NotTo(HaveOccurred())
175171

176172
By("registering the type in the Scheme")
177-
builder := scheme.Builder{GroupVersion: testDefaulterGVK.GroupVersion()}
178-
builder.Register(&TestDefaulterObject{}, &TestDefaulterList{})
179-
err = builder.AddToScheme(m.GetScheme())
180-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
173+
addToScheme(m.GetScheme())
181174

182175
customPath := "/custom-defaulting-path"
183176
webhookBuilder := WebhookManagedBy(m, &TestDefaulterObject{})
@@ -261,10 +254,7 @@ func runTests(admissionReviewVersion string) {
261254
ExpectWithOffset(1, err).NotTo(HaveOccurred())
262255

263256
By("registering the type in the Scheme")
264-
builder := scheme.Builder{GroupVersion: testDefaulterGVK.GroupVersion()}
265-
builder.Register(&TestDefaulterObject{}, &TestDefaulterList{})
266-
err = builder.AddToScheme(m.GetScheme())
267-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
257+
addToScheme(m.GetScheme())
268258

269259
webhookBuilder := WebhookManagedBy(m, &TestDefaulterObject{})
270260
build(webhookBuilder)
@@ -332,10 +322,7 @@ func runTests(admissionReviewVersion string) {
332322
ExpectWithOffset(1, err).NotTo(HaveOccurred())
333323

334324
By("registering the type in the Scheme")
335-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
336-
builder.Register(&TestValidatorObject{}, &TestValidatorList{})
337-
err = builder.AddToScheme(m.GetScheme())
338-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
325+
addToScheme(m.GetScheme())
339326

340327
webhook := WebhookManagedBy(m, &TestValidatorObject{})
341328
build(webhook)
@@ -457,10 +444,7 @@ func runTests(admissionReviewVersion string) {
457444
ExpectWithOffset(1, err).NotTo(HaveOccurred())
458445

459446
By("registering the type in the Scheme")
460-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
461-
builder.Register(&TestValidatorObject{}, &TestValidatorList{})
462-
err = builder.AddToScheme(m.GetScheme())
463-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
447+
addToScheme(m.GetScheme())
464448

465449
customPath := "/custom-validating-path"
466450
webhookBuilder := WebhookManagedBy(m, &TestValidatorObject{})
@@ -544,10 +528,7 @@ func runTests(admissionReviewVersion string) {
544528
ExpectWithOffset(1, err).NotTo(HaveOccurred())
545529

546530
By("registering the type in the Scheme")
547-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
548-
builder.Register(&TestValidatorObject{}, &TestValidatorList{})
549-
err = builder.AddToScheme(m.GetScheme())
550-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
531+
addToScheme(m.GetScheme())
551532

552533
webhookBuilder := WebhookManagedBy(m, &TestValidatorObject{})
553534
build(webhookBuilder)
@@ -617,10 +598,7 @@ func runTests(admissionReviewVersion string) {
617598
ExpectWithOffset(1, err).NotTo(HaveOccurred())
618599

619600
By("registering the type in the Scheme")
620-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
621-
builder.Register(&TestValidatorObject{}, &TestValidatorList{})
622-
err = builder.AddToScheme(m.GetScheme())
623-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
601+
addToScheme(m.GetScheme())
624602

625603
webhookBuilder := WebhookManagedBy(m, &TestValidatorObject{})
626604
build(webhookBuilder)
@@ -715,10 +693,7 @@ func runTests(admissionReviewVersion string) {
715693
ExpectWithOffset(1, err).NotTo(HaveOccurred())
716694

717695
By("registering the type in the Scheme")
718-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
719-
builder.Register(&TestDefaultValidator{}, &TestDefaultValidatorList{})
720-
err = builder.AddToScheme(m.GetScheme())
721-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
696+
addToScheme(m.GetScheme())
722697

723698
webhookBuilder := WebhookManagedBy(m, &TestDefaultValidator{})
724699
build(webhookBuilder)
@@ -815,10 +790,7 @@ func runTests(admissionReviewVersion string) {
815790
ExpectWithOffset(1, err).NotTo(HaveOccurred())
816791

817792
By("registering the type in the Scheme")
818-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
819-
builder.Register(&TestDefaultValidator{}, &TestDefaultValidatorList{})
820-
err = builder.AddToScheme(m.GetScheme())
821-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
793+
addToScheme(m.GetScheme())
822794

823795
validatingCustomPath := "/custom-validating-path"
824796
defaultingCustomPath := "/custom-defaulting-path"
@@ -936,10 +908,7 @@ func runTests(admissionReviewVersion string) {
936908
m, err := manager.New(cfg, manager.Options{})
937909
ExpectWithOffset(1, err).NotTo(HaveOccurred())
938910

939-
builder := scheme.Builder{GroupVersion: testDefaulterGVK.GroupVersion()}
940-
builder.Register(&TestDefaulterObject{}, &TestDefaulterList{})
941-
err = builder.AddToScheme(m.GetScheme())
942-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
911+
addToScheme(m.GetScheme())
943912

944913
err = WebhookManagedBy(m, &TestDefaulterObject{}).
945914
WithDefaulter(&testDefaulter{}).
@@ -952,10 +921,7 @@ func runTests(admissionReviewVersion string) {
952921
m, err := manager.New(cfg, manager.Options{})
953922
ExpectWithOffset(1, err).NotTo(HaveOccurred())
954923

955-
builder := scheme.Builder{GroupVersion: testValidatorGVK.GroupVersion()}
956-
builder.Register(&TestValidatorObject{}, &TestValidatorList{})
957-
err = builder.AddToScheme(m.GetScheme())
958-
ExpectWithOffset(1, err).NotTo(HaveOccurred())
924+
addToScheme(m.GetScheme())
959925

960926
err = WebhookManagedBy(m, &TestValidatorObject{}).
961927
WithValidator(&testValidator{}).
@@ -978,6 +944,18 @@ type TestDefaulterObject struct {
978944

979945
var testDefaulterGVK = schema.GroupVersionKind{Group: "foo.test.org", Version: "v1", Kind: testDefaulterKind}
980946

947+
func addToScheme(scheme *runtime.Scheme) {
948+
scheme.AddKnownTypes(testDefaulterGVK.GroupVersion(),
949+
&TestDefaulterObject{},
950+
&TestDefaulterList{},
951+
&TestValidatorObject{},
952+
&TestValidatorList{},
953+
&TestDefaultValidator{},
954+
&TestDefaultValidatorList{},
955+
)
956+
metav1.AddToGroupVersion(scheme, testDefaulterGVK.GroupVersion())
957+
}
958+
981959
func (d *TestDefaulterObject) GetObjectKind() schema.ObjectKind { return d }
982960
func (d *TestDefaulterObject) DeepCopyObject() runtime.Object {
983961
return &TestDefaulterObject{

pkg/cache/informer_cache_unit_test.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929

3030
"sigs.k8s.io/controller-runtime/pkg/cache/internal"
3131
"sigs.k8s.io/controller-runtime/pkg/controller/controllertest"
32-
crscheme "sigs.k8s.io/controller-runtime/pkg/scheme"
3332
)
3433

3534
const (
@@ -86,14 +85,9 @@ var _ = Describe("ip.objectTypeForListObject", func() {
8685
It("should find the object type of a list with a slice of pointers items field", func() {
8786
By("registering the type", func() {
8887
ip.scheme = runtime.NewScheme()
89-
err := (&crscheme.Builder{
90-
GroupVersion: schema.GroupVersion{Group: itemPointerSliceTypeGroupName, Version: itemPointerSliceTypeVersion},
91-
}).
92-
Register(
93-
&controllertest.UnconventionalListType{},
94-
&controllertest.UnconventionalListTypeList{},
95-
).AddToScheme(ip.scheme)
96-
Expect(err).ToNot(HaveOccurred())
88+
gv := schema.GroupVersion{Group: itemPointerSliceTypeGroupName, Version: itemPointerSliceTypeVersion}
89+
ip.scheme.AddKnownTypes(gv, &controllertest.UnconventionalListType{}, &controllertest.UnconventionalListTypeList{})
90+
metav1.AddToGroupVersion(ip.scheme, gv)
9791
})
9892

9993
By("calling objectTypeForListObject", func() {

pkg/client/fake/client_test.go

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ import (
5454

5555
"sigs.k8s.io/controller-runtime/pkg/client"
5656
"sigs.k8s.io/controller-runtime/pkg/client/interceptor"
57-
"sigs.k8s.io/controller-runtime/pkg/scheme"
5857
)
5958

6059
const (
@@ -1848,10 +1847,8 @@ var _ = Describe("Fake client", func() {
18481847
})
18491848

18501849
It("should allow SSA apply on status without object has changed issues", func(ctx SpecContext) {
1851-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "chaosapps.metamagical.io", Version: "v1"}}
1852-
schemeBuilder.Register(&ChaosPod{})
18531850
testScheme := runtime.NewScheme()
1854-
Expect(schemeBuilder.AddToScheme(testScheme)).NotTo(HaveOccurred())
1851+
addChaosPodToScheme(testScheme)
18551852

18561853
customResource := &ChaosPod{
18571854
TypeMeta: metav1.TypeMeta{
@@ -1898,10 +1895,8 @@ var _ = Describe("Fake client", func() {
18981895
})
18991896

19001897
It("should block SSA apply on status when passing the wrong non empty resource version", func(ctx SpecContext) {
1901-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "chaosapps.metamagical.io", Version: "v1"}}
1902-
schemeBuilder.Register(&ChaosPod{})
19031898
testScheme := runtime.NewScheme()
1904-
Expect(schemeBuilder.AddToScheme(testScheme)).NotTo(HaveOccurred())
1899+
addChaosPodToScheme(testScheme)
19051900

19061901
customResource := &ChaosPod{
19071902
TypeMeta: metav1.TypeMeta{
@@ -1958,11 +1953,10 @@ var _ = Describe("Fake client", func() {
19581953
})
19591954

19601955
It("should Unmarshal the schemaless object with int64 to preserve ints", func(ctx SpecContext) {
1961-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
1962-
schemeBuilder.Register(&WithSchemalessSpec{})
1963-
1956+
gv := schema.GroupVersion{Group: "test", Version: "v1"}
19641957
scheme := runtime.NewScheme()
1965-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
1958+
scheme.AddKnownTypes(gv, &WithSchemalessSpec{})
1959+
metav1.AddToGroupVersion(scheme, gv)
19661960

19671961
spec := Schemaless{
19681962
"key": int64(1),
@@ -1983,11 +1977,10 @@ var _ = Describe("Fake client", func() {
19831977
})
19841978

19851979
It("should Unmarshal the schemaless object with float64 to preserve ints", func(ctx SpecContext) {
1986-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
1987-
schemeBuilder.Register(&WithSchemalessSpec{})
1988-
1980+
gv := schema.GroupVersion{Group: "test", Version: "v1"}
19891981
scheme := runtime.NewScheme()
1990-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
1982+
scheme.AddKnownTypes(gv, &WithSchemalessSpec{})
1983+
metav1.AddToGroupVersion(scheme, gv)
19911984

19921985
spec := Schemaless{
19931986
"key": 1.1,
@@ -2008,11 +2001,10 @@ var _ = Describe("Fake client", func() {
20082001
})
20092002

20102003
It("works with types that have an embedded struct pointer", func(ctx SpecContext) {
2011-
schemeBuilder := &scheme.Builder{GroupVersion: schema.GroupVersion{Group: "test", Version: "v1"}}
2012-
schemeBuilder.Register(&EmbeddedPointerStructCRD{})
2013-
2004+
gv := schema.GroupVersion{Group: "test", Version: "v1"}
20142005
scheme := runtime.NewScheme()
2015-
Expect(schemeBuilder.AddToScheme(scheme)).NotTo(HaveOccurred())
2006+
scheme.AddKnownTypes(gv, &EmbeddedPointerStructCRD{})
2007+
metav1.AddToGroupVersion(scheme, gv)
20162008

20172009
c := NewClientBuilder().WithScheme(scheme).Build()
20182010

@@ -3531,6 +3523,13 @@ func (in *EmbeddedPointerStructCRD) DeepCopyObject() runtime.Object {
35313523
return &out
35323524
}
35333525

3526+
var chaosPodGV = schema.GroupVersion{Group: "chaosapps.metamagical.io", Version: "v1"}
3527+
3528+
func addChaosPodToScheme(scheme *runtime.Scheme) {
3529+
scheme.AddKnownTypes(chaosPodGV, &ChaosPod{})
3530+
metav1.AddToGroupVersion(scheme, chaosPodGV)
3531+
}
3532+
35343533
// ChaosPod is a custom resource type used for testing SSA apply operations
35353534
// on custom resources with status subresources.
35363535
type ChaosPod struct {

0 commit comments

Comments
 (0)