Skip to content

Commit 9abc448

Browse files
committed
feat: implement v1beta1 to v1beta2 conversion webhooks
Signed-off-by: Bharath Nallapeta <nr.bharath97@gmail.com>
1 parent 6499b5c commit 9abc448

File tree

11 files changed

+3505
-37
lines changed

11 files changed

+3505
-37
lines changed

Makefile

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ TRIVY_VER := 0.49.1
6161

6262
# Binaries.
6363
CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen
64+
CONVERSION_GEN := $(TOOLS_BIN_DIR)/conversion-gen
6465
ENVSUBST := $(TOOLS_BIN_DIR)/envsubst
6566
GINKGO := $(TOOLS_BIN_DIR)/ginkgo
6667
GOJQ := $(TOOLS_BIN_DIR)/gojq
@@ -300,12 +301,19 @@ modules: ## Runs go mod to ensure proper vendoring.
300301
cd $(TOOLS_DIR); go mod tidy
301302

302303
.PHONY: generate
303-
generate: templates generate-controller-gen generate-codegen generate-go generate-manifests generate-api-docs ## Generate all generated code
304+
generate: templates generate-controller-gen generate-codegen generate-conversion-gen generate-go generate-manifests generate-api-docs ## Generate all generated code
304305

305306
.PHONY: generate-go
306307
generate-go: $(MOCKGEN)
307308
go generate ./...
308309

310+
.PHONY: generate-conversion-gen
311+
generate-conversion-gen: $(CONVERSION_GEN)
312+
$(CONVERSION_GEN) \
313+
--output-file=zz_generated.conversion.go \
314+
--go-header-file=./hack/boilerplate/boilerplate.generatego.txt \
315+
./api/v1beta1
316+
309317
.PHONY: generate-controller-gen
310318
generate-controller-gen: $(CONTROLLER_GEN)
311319
$(CONTROLLER_GEN) \

api/v1beta1/conversion.go

Lines changed: 255 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,33 +18,272 @@ package v1beta1
1818

1919
import (
2020
"strings"
21+
"unsafe"
2122

23+
corev1 "k8s.io/api/core/v1"
24+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
apiconversion "k8s.io/apimachinery/pkg/conversion"
2226
"k8s.io/utils/ptr"
27+
clusterv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1"
28+
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
29+
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
30+
ctrlconversion "sigs.k8s.io/controller-runtime/pkg/conversion"
31+
32+
infrav1beta2 "sigs.k8s.io/cluster-api-provider-openstack/api/v1beta2"
2333
)
2434

25-
// Hub marks OpenStackCluster as a conversion hub.
26-
func (*OpenStackCluster) Hub() {}
35+
// ConvertTo converts this OpenStackCluster to the Hub version (v1beta2).
36+
func (src *OpenStackCluster) ConvertTo(dstRaw ctrlconversion.Hub) error {
37+
dst := dstRaw.(*infrav1beta2.OpenStackCluster)
38+
if err := Convert_v1beta1_OpenStackCluster_To_v1beta2_OpenStackCluster(src, dst, nil); err != nil {
39+
return err
40+
}
41+
for i := range dst.Status.Conditions {
42+
dst.Status.Conditions[i].ObservedGeneration = src.Generation
43+
}
44+
return utilconversion.MarshalData(src, dst)
45+
}
46+
47+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
48+
//
49+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
50+
func (dst *OpenStackCluster) ConvertFrom(srcRaw ctrlconversion.Hub) error {
51+
src := srcRaw.(*infrav1beta2.OpenStackCluster)
52+
if err := Convert_v1beta2_OpenStackCluster_To_v1beta1_OpenStackCluster(src, dst, nil); err != nil {
53+
return err
54+
}
55+
_, err := utilconversion.UnmarshalData(src, dst)
56+
return err
57+
}
58+
59+
// ConvertTo converts this OpenStackMachine to the Hub version (v1beta2).
60+
func (src *OpenStackMachine) ConvertTo(dstRaw ctrlconversion.Hub) error {
61+
dst := dstRaw.(*infrav1beta2.OpenStackMachine)
62+
if err := Convert_v1beta1_OpenStackMachine_To_v1beta2_OpenStackMachine(src, dst, nil); err != nil {
63+
return err
64+
}
65+
for i := range dst.Status.Conditions {
66+
dst.Status.Conditions[i].ObservedGeneration = src.Generation
67+
}
68+
return utilconversion.MarshalData(src, dst)
69+
}
70+
71+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
72+
//
73+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
74+
func (dst *OpenStackMachine) ConvertFrom(srcRaw ctrlconversion.Hub) error {
75+
src := srcRaw.(*infrav1beta2.OpenStackMachine)
76+
if err := Convert_v1beta2_OpenStackMachine_To_v1beta1_OpenStackMachine(src, dst, nil); err != nil {
77+
return err
78+
}
79+
_, err := utilconversion.UnmarshalData(src, dst)
80+
return err
81+
}
82+
83+
// ConvertTo converts this OpenStackClusterTemplate to the Hub version (v1beta2).
84+
func (src *OpenStackClusterTemplate) ConvertTo(dstRaw ctrlconversion.Hub) error {
85+
dst := dstRaw.(*infrav1beta2.OpenStackClusterTemplate)
86+
if err := Convert_v1beta1_OpenStackClusterTemplate_To_v1beta2_OpenStackClusterTemplate(src, dst, nil); err != nil {
87+
return err
88+
}
89+
return utilconversion.MarshalData(src, dst)
90+
}
91+
92+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
93+
//
94+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
95+
func (dst *OpenStackClusterTemplate) ConvertFrom(srcRaw ctrlconversion.Hub) error {
96+
src := srcRaw.(*infrav1beta2.OpenStackClusterTemplate)
97+
if err := Convert_v1beta2_OpenStackClusterTemplate_To_v1beta1_OpenStackClusterTemplate(src, dst, nil); err != nil {
98+
return err
99+
}
100+
_, err := utilconversion.UnmarshalData(src, dst)
101+
return err
102+
}
103+
104+
// ConvertTo converts this OpenStackMachineTemplate to the Hub version (v1beta2).
105+
func (src *OpenStackMachineTemplate) ConvertTo(dstRaw ctrlconversion.Hub) error {
106+
dst := dstRaw.(*infrav1beta2.OpenStackMachineTemplate)
107+
if err := Convert_v1beta1_OpenStackMachineTemplate_To_v1beta2_OpenStackMachineTemplate(src, dst, nil); err != nil {
108+
return err
109+
}
110+
return utilconversion.MarshalData(src, dst)
111+
}
112+
113+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
114+
//
115+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
116+
func (dst *OpenStackMachineTemplate) ConvertFrom(srcRaw ctrlconversion.Hub) error {
117+
src := srcRaw.(*infrav1beta2.OpenStackMachineTemplate)
118+
if err := Convert_v1beta2_OpenStackMachineTemplate_To_v1beta1_OpenStackMachineTemplate(src, dst, nil); err != nil {
119+
return err
120+
}
121+
_, err := utilconversion.UnmarshalData(src, dst)
122+
return err
123+
}
27124

28-
// Hub marks OpenStackClusterList as a conversion hub.
29-
func (*OpenStackClusterList) Hub() {}
125+
// ConvertTo converts this OpenStackClusterList to the Hub version (v1beta2).
126+
func (src *OpenStackClusterList) ConvertTo(dstRaw ctrlconversion.Hub) error {
127+
dst := dstRaw.(*infrav1beta2.OpenStackClusterList)
128+
return Convert_v1beta1_OpenStackClusterList_To_v1beta2_OpenStackClusterList(src, dst, nil)
129+
}
30130

31-
// Hub marks OpenStackClusterTemplate as a conversion hub.
32-
func (*OpenStackClusterTemplate) Hub() {}
131+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
132+
//
133+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
134+
func (dst *OpenStackClusterList) ConvertFrom(srcRaw ctrlconversion.Hub) error {
135+
src := srcRaw.(*infrav1beta2.OpenStackClusterList)
136+
return Convert_v1beta2_OpenStackClusterList_To_v1beta1_OpenStackClusterList(src, dst, nil)
137+
}
33138

34-
// Hub marks OpenStackClusterTemplateList as a conversion hub.
35-
func (*OpenStackClusterTemplateList) Hub() {}
139+
// ConvertTo converts this OpenStackMachineList to the Hub version (v1beta2).
140+
func (src *OpenStackMachineList) ConvertTo(dstRaw ctrlconversion.Hub) error {
141+
dst := dstRaw.(*infrav1beta2.OpenStackMachineList)
142+
return Convert_v1beta1_OpenStackMachineList_To_v1beta2_OpenStackMachineList(src, dst, nil)
143+
}
36144

37-
// Hub marks OpenStackMachine as a conversion hub.
38-
func (*OpenStackMachine) Hub() {}
145+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
146+
//
147+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
148+
func (dst *OpenStackMachineList) ConvertFrom(srcRaw ctrlconversion.Hub) error {
149+
src := srcRaw.(*infrav1beta2.OpenStackMachineList)
150+
return Convert_v1beta2_OpenStackMachineList_To_v1beta1_OpenStackMachineList(src, dst, nil)
151+
}
39152

40-
// Hub marks OpenStackMachineList as a conversion hub.
41-
func (*OpenStackMachineList) Hub() {}
153+
// ConvertTo converts this OpenStackClusterTemplateList to the Hub version (v1beta2).
154+
func (src *OpenStackClusterTemplateList) ConvertTo(dstRaw ctrlconversion.Hub) error {
155+
dst := dstRaw.(*infrav1beta2.OpenStackClusterTemplateList)
156+
return Convert_v1beta1_OpenStackClusterTemplateList_To_v1beta2_OpenStackClusterTemplateList(src, dst, nil)
157+
}
42158

43-
// Hub marks OpenStackMachineTemplate as a conversion hub.
44-
func (*OpenStackMachineTemplate) Hub() {}
159+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
160+
//
161+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
162+
func (dst *OpenStackClusterTemplateList) ConvertFrom(srcRaw ctrlconversion.Hub) error {
163+
src := srcRaw.(*infrav1beta2.OpenStackClusterTemplateList)
164+
return Convert_v1beta2_OpenStackClusterTemplateList_To_v1beta1_OpenStackClusterTemplateList(src, dst, nil)
165+
}
45166

46-
// Hub marks OpenStackMachineTemplateList as a conversion hub.
47-
func (*OpenStackMachineTemplateList) Hub() {}
167+
// ConvertTo converts this OpenStackMachineTemplateList to the Hub version (v1beta2).
168+
func (src *OpenStackMachineTemplateList) ConvertTo(dstRaw ctrlconversion.Hub) error {
169+
dst := dstRaw.(*infrav1beta2.OpenStackMachineTemplateList)
170+
return Convert_v1beta1_OpenStackMachineTemplateList_To_v1beta2_OpenStackMachineTemplateList(src, dst, nil)
171+
}
172+
173+
// ConvertFrom converts from the Hub version (v1beta2) to this version.
174+
//
175+
//nolint:revive // dst is the receiver here (converting FROM hub TO spoke)
176+
func (dst *OpenStackMachineTemplateList) ConvertFrom(srcRaw ctrlconversion.Hub) error {
177+
src := srcRaw.(*infrav1beta2.OpenStackMachineTemplateList)
178+
return Convert_v1beta2_OpenStackMachineTemplateList_To_v1beta1_OpenStackMachineTemplateList(src, dst, nil)
179+
}
180+
181+
// Manual conversion functions for Status types that conversion-gen cannot
182+
// auto-generate due to FailureDomains (map↔slice), Conditions (CAPI↔metav1),
183+
// and deprecated fields (Ready, FailureReason, FailureMessage).
184+
185+
func Convert_v1beta1_OpenStackClusterStatus_To_v1beta2_OpenStackClusterStatus(in *OpenStackClusterStatus, out *infrav1beta2.OpenStackClusterStatus, _ apiconversion.Scope) error {
186+
out.Initialization = (*infrav1beta2.ClusterInitialization)(unsafe.Pointer(in.Initialization))
187+
out.Network = (*infrav1beta2.NetworkStatusWithSubnets)(unsafe.Pointer(in.Network))
188+
out.ExternalNetwork = (*infrav1beta2.NetworkStatus)(unsafe.Pointer(in.ExternalNetwork))
189+
out.Router = (*infrav1beta2.Router)(unsafe.Pointer(in.Router))
190+
out.APIServerLoadBalancer = (*infrav1beta2.LoadBalancer)(unsafe.Pointer(in.APIServerLoadBalancer))
191+
out.ControlPlaneSecurityGroup = (*infrav1beta2.SecurityGroupStatus)(unsafe.Pointer(in.ControlPlaneSecurityGroup))
192+
out.WorkerSecurityGroup = (*infrav1beta2.SecurityGroupStatus)(unsafe.Pointer(in.WorkerSecurityGroup))
193+
out.BastionSecurityGroup = (*infrav1beta2.SecurityGroupStatus)(unsafe.Pointer(in.BastionSecurityGroup))
194+
out.Bastion = (*infrav1beta2.BastionStatus)(unsafe.Pointer(in.Bastion))
195+
196+
if len(in.FailureDomains) > 0 {
197+
out.FailureDomains = make([]clusterv1.FailureDomain, 0, len(in.FailureDomains))
198+
for name, fd := range in.FailureDomains {
199+
out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{
200+
Name: name,
201+
ControlPlane: ptr.To(fd.ControlPlane),
202+
Attributes: fd.Attributes,
203+
})
204+
}
205+
}
206+
207+
out.Conditions = infrav1beta2.ConvertConditionsToV1Beta2(in.Conditions, 0)
208+
209+
return nil
210+
}
211+
212+
func Convert_v1beta2_OpenStackClusterStatus_To_v1beta1_OpenStackClusterStatus(in *infrav1beta2.OpenStackClusterStatus, out *OpenStackClusterStatus, _ apiconversion.Scope) error {
213+
out.Initialization = (*ClusterInitialization)(unsafe.Pointer(in.Initialization))
214+
out.Network = (*NetworkStatusWithSubnets)(unsafe.Pointer(in.Network))
215+
out.ExternalNetwork = (*NetworkStatus)(unsafe.Pointer(in.ExternalNetwork))
216+
out.Router = (*Router)(unsafe.Pointer(in.Router))
217+
out.APIServerLoadBalancer = (*LoadBalancer)(unsafe.Pointer(in.APIServerLoadBalancer))
218+
out.ControlPlaneSecurityGroup = (*SecurityGroupStatus)(unsafe.Pointer(in.ControlPlaneSecurityGroup))
219+
out.WorkerSecurityGroup = (*SecurityGroupStatus)(unsafe.Pointer(in.WorkerSecurityGroup))
220+
out.BastionSecurityGroup = (*SecurityGroupStatus)(unsafe.Pointer(in.BastionSecurityGroup))
221+
out.Bastion = (*BastionStatus)(unsafe.Pointer(in.Bastion))
222+
223+
if len(in.FailureDomains) > 0 {
224+
out.FailureDomains = make(clusterv1beta1.FailureDomains, len(in.FailureDomains))
225+
for _, fd := range in.FailureDomains {
226+
out.FailureDomains[fd.Name] = clusterv1beta1.FailureDomainSpec{
227+
ControlPlane: ptr.Deref(fd.ControlPlane, false),
228+
Attributes: fd.Attributes,
229+
}
230+
}
231+
}
232+
233+
out.Conditions = infrav1beta2.ConvertConditionsFromV1Beta2(in.Conditions)
234+
out.Ready = infrav1beta2.IsReady(in.Conditions)
235+
236+
return nil
237+
}
238+
239+
func Convert_v1beta1_OpenStackMachineStatus_To_v1beta2_OpenStackMachineStatus(in *OpenStackMachineStatus, out *infrav1beta2.OpenStackMachineStatus, _ apiconversion.Scope) error {
240+
out.Initialization = (*infrav1beta2.MachineInitialization)(unsafe.Pointer(in.Initialization))
241+
out.InstanceID = in.InstanceID
242+
out.Addresses = in.Addresses
243+
out.InstanceState = (*infrav1beta2.InstanceState)(unsafe.Pointer(in.InstanceState))
244+
out.Resolved = (*infrav1beta2.ResolvedMachineSpec)(unsafe.Pointer(in.Resolved))
245+
out.Resources = (*infrav1beta2.MachineResources)(unsafe.Pointer(in.Resources))
246+
247+
out.Conditions = infrav1beta2.ConvertConditionsToV1Beta2(in.Conditions, 0)
248+
249+
return nil
250+
}
251+
252+
func Convert_v1beta2_OpenStackMachineStatus_To_v1beta1_OpenStackMachineStatus(in *infrav1beta2.OpenStackMachineStatus, out *OpenStackMachineStatus, _ apiconversion.Scope) error {
253+
out.Initialization = (*MachineInitialization)(unsafe.Pointer(in.Initialization))
254+
out.InstanceID = in.InstanceID
255+
out.Addresses = in.Addresses
256+
out.InstanceState = (*InstanceState)(unsafe.Pointer(in.InstanceState))
257+
out.Resolved = (*ResolvedMachineSpec)(unsafe.Pointer(in.Resolved))
258+
out.Resources = (*MachineResources)(unsafe.Pointer(in.Resources))
259+
260+
out.Conditions = infrav1beta2.ConvertConditionsFromV1Beta2(in.Conditions)
261+
out.Ready = infrav1beta2.IsReady(in.Conditions)
262+
263+
return nil
264+
}
265+
266+
// Element-level Condition conversion functions required by conversion-gen's
267+
// autoConvert functions for Status types. The actual condition conversion is
268+
// handled at the Status level by the manual Convert_*_Status_* functions above.
269+
270+
func Convert_v1beta1_Condition_To_v1_Condition(in *clusterv1beta1.Condition, out *metav1.Condition, _ apiconversion.Scope) error {
271+
out.Type = string(in.Type)
272+
out.Status = metav1.ConditionStatus(in.Status)
273+
out.LastTransitionTime = in.LastTransitionTime
274+
out.Reason = in.Reason
275+
out.Message = in.Message
276+
return nil
277+
}
278+
279+
func Convert_v1_Condition_To_v1beta1_Condition(in *metav1.Condition, out *clusterv1beta1.Condition, _ apiconversion.Scope) error {
280+
out.Type = clusterv1beta1.ConditionType(in.Type)
281+
out.Status = corev1.ConditionStatus(in.Status)
282+
out.LastTransitionTime = in.LastTransitionTime
283+
out.Reason = in.Reason
284+
out.Message = in.Message
285+
return nil
286+
}
48287

49288
// LegacyCalicoSecurityGroupRules returns a list of security group rules for calico
50289
// that need to be applied to the control plane and worker security groups when

0 commit comments

Comments
 (0)