Skip to content

Commit 4ce7960

Browse files
authored
Merge pull request #12409 from sivchari/implement-v2contract
⚠️ Implement v1beta2 contract in CAPD
2 parents d1ed8dc + 6a8d821 commit 4ce7960

33 files changed

+1197
-377
lines changed

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,11 @@ test-cover: ## Run unit and integration tests and generate a coverage report
952952
.PHONY: test-docker-infrastructure
953953
test-docker-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for docker infrastructure provider
954954
cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -race ./... $(TEST_ARGS)
955+
$(MAKE) test-docker-infrastructure-conversions TEST_ARGS="$(TEST_ARGS)"
956+
957+
.PHONY: test-docker-infrastructure-conversions
958+
test-docker-infrastructure-conversions: $(SETUP_ENVTEST) ## Run conversions test for docker infrastructure provider
959+
cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -run "^TestFuzzyConversion$$" ./... $(TEST_ARGS)
955960

956961
.PHONY: test-docker-infrastructure-verbose
957962
test-docker-infrastructure-verbose: ## Run unit and integration tests for docker infrastructure provider with verbose flag

test/e2e/config/docker.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ providers:
352352
- sourcePath: "../data/infrastructure-docker/main/clusterclass-quick-start-kcp-only.yaml"
353353
- sourcePath: "../data/infrastructure-docker/main/clusterclass-quick-start-runtimesdk.yaml"
354354
- sourcePath: "../data/infrastructure-docker/main/clusterclass-in-memory.yaml"
355-
- sourcePath: "../data/shared/main/docker/metadata.yaml"
355+
- sourcePath: "../data/shared/main/metadata.yaml"
356356

357357
- name: test-extension
358358
type: RuntimeExtensionProvider

test/e2e/data/shared/main/docker/metadata.yaml

Lines changed: 0 additions & 45 deletions
This file was deleted.

test/infrastructure/docker/api/v1alpha3/conversion.go

Lines changed: 157 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,16 @@ limitations under the License.
1717
package v1alpha3
1818

1919
import (
20+
"maps"
21+
"slices"
22+
"sort"
23+
2024
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2125
apiconversion "k8s.io/apimachinery/pkg/conversion"
26+
"k8s.io/utils/ptr"
2227
"sigs.k8s.io/controller-runtime/pkg/conversion"
2328

29+
clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2"
2430
clusterv1alpha3 "sigs.k8s.io/cluster-api/internal/api/core/v1alpha3"
2531
infrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2"
2632
utilconversion "sigs.k8s.io/cluster-api/util/conversion"
@@ -33,15 +39,6 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error {
3339
return err
3440
}
3541

36-
// Reset conditions from autogenerated conversions
37-
// NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions.
38-
dst.Status.Conditions = nil
39-
if src.Status.Conditions != nil {
40-
dst.Status.Deprecated = &infrav1.DockerClusterDeprecatedStatus{}
41-
dst.Status.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{}
42-
clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions)
43-
}
44-
4542
// Manually restore data.
4643
restored := &infrav1.DockerCluster{}
4744
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
@@ -61,6 +58,7 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error {
6158
}
6259

6360
dst.Status.Conditions = restored.Status.Conditions
61+
dst.Status.Initialization = restored.Status.Initialization
6462

6563
return nil
6664
}
@@ -72,13 +70,6 @@ func (dst *DockerCluster) ConvertFrom(srcRaw conversion.Hub) error {
7270
return err
7371
}
7472

75-
// Reset conditions from autogenerated conversions
76-
// NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions.
77-
dst.Status.Conditions = nil
78-
if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil {
79-
clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions)
80-
}
81-
8273
// Preserve Hub data on down-conversion except for metadata
8374
if err := utilconversion.MarshalData(src, dst); err != nil {
8475
return err
@@ -94,16 +85,6 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error {
9485
return err
9586
}
9687

97-
// Reset conditions from autogenerated conversions
98-
// NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions.
99-
dst.Status.Conditions = nil
100-
101-
if src.Status.Conditions != nil {
102-
dst.Status.Deprecated = &infrav1.DockerMachineDeprecatedStatus{}
103-
dst.Status.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{}
104-
clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions)
105-
}
106-
10788
// Manually restore data.
10889
restored := &infrav1.DockerMachine{}
10990
if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok {
@@ -115,6 +96,7 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error {
11596
}
11697

11798
dst.Status.Conditions = restored.Status.Conditions
99+
dst.Status.Initialization = restored.Status.Initialization
118100

119101
return nil
120102
}
@@ -126,13 +108,6 @@ func (dst *DockerMachine) ConvertFrom(srcRaw conversion.Hub) error {
126108
return err
127109
}
128110

129-
// Reset conditions from autogenerated conversions
130-
// NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions.
131-
dst.Status.Conditions = nil
132-
if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil {
133-
clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions)
134-
}
135-
136111
if err := utilconversion.MarshalData(src, dst); err != nil {
137112
return err
138113
}
@@ -177,7 +152,22 @@ func (dst *DockerMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error {
177152
// Convert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec is an autogenerated conversion function.
178153
func Convert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in *infrav1.DockerClusterSpec, out *DockerClusterSpec, s apiconversion.Scope) error {
179154
// DockerClusterSpec.LoadBalancer was added in v1alpha4, so automatic conversion is not possible
180-
return autoConvert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in, out, s)
155+
if err := autoConvert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in, out, s); err != nil {
156+
return err
157+
}
158+
159+
// Move FailureDomains
160+
if in.FailureDomains != nil {
161+
out.FailureDomains = clusterv1alpha3.FailureDomains{}
162+
for _, fd := range in.FailureDomains {
163+
out.FailureDomains[fd.Name] = clusterv1alpha3.FailureDomainSpec{
164+
ControlPlane: fd.ControlPlane,
165+
Attributes: fd.Attributes,
166+
}
167+
}
168+
}
169+
170+
return nil
181171
}
182172

183173
func Convert_v1beta2_DockerMachineTemplateResource_To_v1alpha3_DockerMachineTemplateResource(in *infrav1.DockerMachineTemplateResource, out *DockerMachineTemplateResource, s apiconversion.Scope) error {
@@ -192,11 +182,52 @@ func Convert_v1beta2_DockerMachineSpec_To_v1alpha3_DockerMachineSpec(in *infrav1
192182
}
193183

194184
func Convert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in *infrav1.DockerClusterStatus, out *DockerClusterStatus, s apiconversion.Scope) error {
195-
return autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in, out, s)
185+
if err := autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in, out, s); err != nil {
186+
return err
187+
}
188+
189+
// Reset conditions from autogenerated conversions
190+
// NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions.
191+
out.Conditions = nil
192+
if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil {
193+
clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions)
194+
}
195+
196+
if in.Initialization != nil && in.Initialization.Provisioned != nil {
197+
out.Ready = *in.Initialization.Provisioned
198+
}
199+
200+
// Move FailureDomains
201+
if in.FailureDomains != nil {
202+
out.FailureDomains = clusterv1alpha3.FailureDomains{}
203+
for _, fd := range in.FailureDomains {
204+
out.FailureDomains[fd.Name] = clusterv1alpha3.FailureDomainSpec{
205+
ControlPlane: fd.ControlPlane,
206+
Attributes: fd.Attributes,
207+
}
208+
}
209+
}
210+
211+
return nil
196212
}
197213

198214
func Convert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in *infrav1.DockerMachineStatus, out *DockerMachineStatus, s apiconversion.Scope) error {
199-
return autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in, out, s)
215+
if err := autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in, out, s); err != nil {
216+
return err
217+
}
218+
219+
// Reset conditions from autogenerated conversions
220+
// NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions.
221+
out.Conditions = nil
222+
if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil {
223+
clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions)
224+
}
225+
226+
if in.Initialization != nil && in.Initialization.Provisioned != nil {
227+
out.Ready = *in.Initialization.Provisioned
228+
}
229+
230+
return nil
200231
}
201232

202233
// Implement local conversion func because conversion-gen is not aware of conversion func in other packages (see https://github.com/kubernetes/code-generator/issues/94)
@@ -208,3 +239,93 @@ func Convert_v1alpha3_Condition_To_v1_Condition(in *clusterv1alpha3.Condition, o
208239
func Convert_v1_Condition_To_v1alpha3_Condition(in *metav1.Condition, out *clusterv1alpha3.Condition, s apiconversion.Scope) error {
209240
return clusterv1alpha3.Convert_v1_Condition_To_v1alpha3_Condition(in, out, s)
210241
}
242+
243+
func Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *infrav1.DockerMachineStatus, s apiconversion.Scope) error {
244+
if err := autoConvert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in, out, s); err != nil {
245+
return err
246+
}
247+
248+
// Reset conditions from autogenerated conversions
249+
// NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions.
250+
out.Conditions = nil
251+
252+
if in.Conditions != nil {
253+
out.Deprecated = &infrav1.DockerMachineDeprecatedStatus{}
254+
out.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{}
255+
clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions)
256+
}
257+
258+
if out.Initialization == nil {
259+
out.Initialization = &infrav1.DockerMachineInitializationStatus{}
260+
}
261+
262+
if in.Ready {
263+
out.Initialization.Provisioned = ptr.To(in.Ready)
264+
}
265+
266+
return nil
267+
}
268+
269+
func Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *infrav1.DockerClusterStatus, s apiconversion.Scope) error {
270+
// NOTE: custom conversion func is required because status.conditions has been added in v1beta2.
271+
if err := autoConvert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in, out, s); err != nil {
272+
return err
273+
}
274+
275+
// Reset conditions from autogenerated conversions
276+
// NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions.
277+
out.Conditions = nil
278+
if in.Conditions != nil {
279+
out.Deprecated = &infrav1.DockerClusterDeprecatedStatus{}
280+
out.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{}
281+
clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions)
282+
}
283+
284+
if out.Initialization == nil {
285+
out.Initialization = &infrav1.DockerClusterInitializationStatus{}
286+
}
287+
288+
if in.Ready {
289+
out.Initialization.Provisioned = ptr.To(in.Ready)
290+
}
291+
292+
// Move FailureDomains
293+
if in.FailureDomains != nil {
294+
out.FailureDomains = []clusterv1.FailureDomain{}
295+
domainNames := slices.Collect(maps.Keys(in.FailureDomains))
296+
sort.Strings(domainNames)
297+
for _, name := range domainNames {
298+
domain := in.FailureDomains[name]
299+
out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{
300+
Name: name,
301+
ControlPlane: domain.ControlPlane,
302+
Attributes: domain.Attributes,
303+
})
304+
}
305+
}
306+
307+
return nil
308+
}
309+
310+
func Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *infrav1.DockerClusterSpec, s apiconversion.Scope) error {
311+
if err := autoConvert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s); err != nil {
312+
return err
313+
}
314+
315+
// Move FailureDomains
316+
if in.FailureDomains != nil {
317+
out.FailureDomains = []clusterv1.FailureDomain{}
318+
domainNames := slices.Collect(maps.Keys(in.FailureDomains))
319+
sort.Strings(domainNames)
320+
for _, name := range domainNames {
321+
domain := in.FailureDomains[name]
322+
out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{
323+
Name: name,
324+
ControlPlane: domain.ControlPlane,
325+
Attributes: domain.Attributes,
326+
})
327+
}
328+
}
329+
330+
return nil
331+
}

test/infrastructure/docker/api/v1alpha3/conversion_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ func hubDockerClusterStatus(in *infrav1.DockerClusterStatus, c randfill.Continue
6565
in.Deprecated = nil
6666
}
6767
}
68+
69+
if in.Initialization != nil {
70+
if reflect.DeepEqual(in.Initialization, &infrav1.DockerClusterInitializationStatus{}) {
71+
in.Initialization = nil
72+
}
73+
}
6874
}
6975

7076
func DockerMachineFuzzFunc(_ runtimeserializer.CodecFactory) []any {
@@ -81,4 +87,10 @@ func hubDockerMachineStatus(in *infrav1.DockerMachineStatus, c randfill.Continue
8187
in.Deprecated = nil
8288
}
8389
}
90+
91+
if in.Initialization != nil {
92+
if reflect.DeepEqual(in.Initialization, &infrav1.DockerMachineInitializationStatus{}) {
93+
in.Initialization = nil
94+
}
95+
}
8496
}

0 commit comments

Comments
 (0)