Skip to content

Commit 77935f6

Browse files
authored
Merge pull request #9045 from JoelSpeed/drop-schemebuilder-pattern
🌱 Remove reliance on controller-runtime scheme builder
2 parents bda002f + 8b44611 commit 77935f6

File tree

10 files changed

+90
-14
lines changed

10 files changed

+90
-14
lines changed

api/v1beta1/cluster_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@ type ClusterList struct {
599599
}
600600

601601
func init() {
602-
SchemeBuilder.Register(&Cluster{}, &ClusterList{})
602+
objectTypes = append(objectTypes, &Cluster{}, &ClusterList{})
603603
}
604604

605605
// FailureDomains is a slice of FailureDomains.

api/v1beta1/clusterclass_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -706,5 +706,5 @@ type ClusterClassList struct {
706706
}
707707

708708
func init() {
709-
SchemeBuilder.Register(&ClusterClass{}, &ClusterClassList{})
709+
objectTypes = append(objectTypes, &ClusterClass{}, &ClusterClassList{})
710710
}

api/v1beta1/groupversion_info.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,26 @@ limitations under the License.
2020
package v1beta1
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
// GroupVersion is group version used to register these objects.
2930
GroupVersion = schema.GroupVersion{Group: "cluster.x-k8s.io", Version: "v1beta1"}
3031

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

3435
// AddToScheme adds the types in this group-version to the given scheme.
35-
AddToScheme = SchemeBuilder.AddToScheme
36+
AddToScheme = schemeBuilder.AddToScheme
37+
38+
objectTypes = []runtime.Object{}
3639
)
40+
41+
func addKnownTypes(scheme *runtime.Scheme) error {
42+
scheme.AddKnownTypes(GroupVersion, objectTypes...)
43+
metav1.AddToGroupVersion(scheme, GroupVersion)
44+
return nil
45+
}

api/v1beta1/machine_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,5 +307,5 @@ type MachineList struct {
307307
}
308308

309309
func init() {
310-
SchemeBuilder.Register(&Machine{}, &MachineList{})
310+
objectTypes = append(objectTypes, &Machine{}, &MachineList{})
311311
}

api/v1beta1/machinedeployment_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ type MachineDeploymentList struct {
337337
}
338338

339339
func init() {
340-
SchemeBuilder.Register(&MachineDeployment{}, &MachineDeploymentList{})
340+
objectTypes = append(objectTypes, &MachineDeployment{}, &MachineDeploymentList{})
341341
}
342342

343343
// GetConditions returns the set of conditions for the machinedeployment.

api/v1beta1/machinedeployment_webhook_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
. "github.com/onsi/gomega"
2525
admissionv1 "k8s.io/api/admission/v1"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
27+
"k8s.io/apimachinery/pkg/runtime"
2728
"k8s.io/apimachinery/pkg/util/intstr"
2829
"k8s.io/utils/pointer"
2930
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -45,8 +46,8 @@ func TestMachineDeploymentDefault(t *testing.T) {
4546
},
4647
}
4748

48-
scheme, err := SchemeBuilder.Build()
49-
g.Expect(err).ToNot(HaveOccurred())
49+
scheme := runtime.NewScheme()
50+
g.Expect(AddToScheme(scheme)).To(Succeed())
5051
defaulter := MachineDeploymentDefaulter(scheme)
5152

5253
t.Run("for MachineDeployment", defaultValidateTestCustomDefaulter(md, defaulter))

api/v1beta1/machinehealthcheck_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,5 +169,5 @@ type MachineHealthCheckList struct {
169169
}
170170

171171
func init() {
172-
SchemeBuilder.Register(&MachineHealthCheck{}, &MachineHealthCheckList{})
172+
objectTypes = append(objectTypes, &MachineHealthCheck{}, &MachineHealthCheckList{})
173173
}

api/v1beta1/machineset_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,5 +240,5 @@ type MachineSetList struct {
240240
}
241241

242242
func init() {
243-
SchemeBuilder.Register(&MachineSet{}, &MachineSetList{})
243+
objectTypes = append(objectTypes, &MachineSet{}, &MachineSetList{})
244244
}

docs/book/src/developer/providers/implementers-guide/create_api.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,68 @@ As the deleted comments request, run `make manager manifests` to regenerate some
6262
git add .
6363
git commit -m "Added cluster types"
6464
```
65+
66+
# Registering APIs in the scheme
67+
68+
To enable clients to encode and decode your API, your types must be able to be registered within a [scheme].
69+
70+
[scheme]: https://pkg.go.dev/k8s.io/apimachinery/pkg/runtime#Scheme
71+
72+
By default, Kubebuilder will provide you with a scheme builder like:
73+
74+
```go
75+
import "sigs.k8s.io/controller-runtime/pkg/scheme"
76+
77+
var (
78+
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
79+
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
80+
81+
// AddToScheme adds the types in this group-version to the given scheme.
82+
AddToScheme = SchemeBuilder.AddToScheme
83+
)
84+
```
85+
86+
and scheme registration that looks like:
87+
88+
```go
89+
func init() {
90+
SchemeBuilder.Register(&Captain{}, &CaptainList{})
91+
}
92+
```
93+
94+
This pattern introduces a dependency on controller-runtime to your API types, which is discouraged for
95+
API packages as it makes it more difficult for consumers of your API to import your API types.
96+
In general, you should minimise the imports within the API folder of your package to allow your API types
97+
to be imported cleanly into other projects.
98+
99+
To mitigate this, use the following schemebuilder pattern:
100+
101+
```go
102+
import "k8s.io/apimachinery/pkg/runtime"
103+
104+
var (
105+
// schemeBuilder is used to add go types to the GroupVersionKind scheme.
106+
schemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
107+
108+
// AddToScheme adds the types in this group-version to the given scheme.
109+
AddToScheme = schemeBuilder.AddToScheme
110+
111+
objectTypes = []runtime.Object{}
112+
)
113+
114+
func addKnownTypes(scheme *runtime.Scheme) error {
115+
scheme.AddKnownTypes(GroupVersion, objectTypes...)
116+
metav1.AddToGroupVersion(scheme, GroupVersion)
117+
return nil
118+
}
119+
```
120+
121+
and register types as below:
122+
123+
```go
124+
func init() {
125+
objectTypes = append(objectTypes, &Captain{}, &CaptainList{})
126+
}
127+
```
128+
129+
This pattern reduces the number of dependencies being introduced into the API package within your project.

internal/test/builder/builders.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
corev1 "k8s.io/api/core/v1"
2626
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2727
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
28+
"k8s.io/apimachinery/pkg/runtime"
2829
"k8s.io/apimachinery/pkg/util/intstr"
2930
"sigs.k8s.io/controller-runtime/pkg/client"
3031
"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
@@ -1268,8 +1269,8 @@ func (m *MachineDeploymentBuilder) Build() *clusterv1.MachineDeployment {
12681269
}
12691270
}
12701271
if m.defaulter {
1271-
scheme, err := clusterv1.SchemeBuilder.Build()
1272-
if err != nil {
1272+
scheme := runtime.NewScheme()
1273+
if err := clusterv1.AddToScheme(scheme); err != nil {
12731274
panic(err)
12741275
}
12751276
ctx := admission.NewContextWithRequest(context.Background(), admission.Request{

0 commit comments

Comments
 (0)