diff --git a/Makefile b/Makefile index e2f36eb7d00e..1fa499957cb9 100644 --- a/Makefile +++ b/Makefile @@ -952,6 +952,11 @@ test-cover: ## Run unit and integration tests and generate a coverage report .PHONY: test-docker-infrastructure test-docker-infrastructure: $(SETUP_ENVTEST) ## Run unit and integration tests for docker infrastructure provider cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -race ./... $(TEST_ARGS) + $(MAKE) test-docker-infrastructure-conversions TEST_ARGS="$(TEST_ARGS)" + +.PHONY: test-docker-infrastructure-conversions +test-docker-infrastructure-conversions: $(SETUP_ENVTEST) ## Run conversions test for docker infrastructure provider + cd $(CAPD_DIR); KUBEBUILDER_ASSETS="$(KUBEBUILDER_ASSETS)" go test -run "^TestFuzzyConversion$$" ./... $(TEST_ARGS) .PHONY: test-docker-infrastructure-verbose test-docker-infrastructure-verbose: ## Run unit and integration tests for docker infrastructure provider with verbose flag diff --git a/test/e2e/config/docker.yaml b/test/e2e/config/docker.yaml index 1aa1443b1871..0b9c1f0b4089 100644 --- a/test/e2e/config/docker.yaml +++ b/test/e2e/config/docker.yaml @@ -352,7 +352,7 @@ providers: - sourcePath: "../data/infrastructure-docker/main/clusterclass-quick-start-kcp-only.yaml" - sourcePath: "../data/infrastructure-docker/main/clusterclass-quick-start-runtimesdk.yaml" - sourcePath: "../data/infrastructure-docker/main/clusterclass-in-memory.yaml" - - sourcePath: "../data/shared/main/docker/metadata.yaml" + - sourcePath: "../data/shared/main/metadata.yaml" - name: test-extension type: RuntimeExtensionProvider diff --git a/test/e2e/data/shared/main/docker/metadata.yaml b/test/e2e/data/shared/main/docker/metadata.yaml deleted file mode 100644 index 8755a6695366..000000000000 --- a/test/e2e/data/shared/main/docker/metadata.yaml +++ /dev/null @@ -1,45 +0,0 @@ -apiVersion: clusterctl.cluster.x-k8s.io/v1alpha3 -kind: Metadata -releaseSeries: - - major: 1 - minor: 11 - contract: v1beta1 - - major: 1 - minor: 10 - contract: v1beta1 - - major: 1 - minor: 9 - contract: v1beta1 - - major: 1 - minor: 8 - contract: v1beta1 - - major: 1 - minor: 7 - contract: v1beta1 - - major: 1 - minor: 6 - contract: v1beta1 - - major: 1 - minor: 5 - contract: v1beta1 - - major: 1 - minor: 4 - contract: v1beta1 - - major: 1 - minor: 3 - contract: v1beta1 - - major: 1 - minor: 2 - contract: v1beta1 - - major: 1 - minor: 1 - contract: v1beta1 - - major: 1 - minor: 0 - contract: v1beta1 - - major: 0 - minor: 4 - contract: v1alpha4 - - major: 0 - minor: 3 - contract: v1alpha3 diff --git a/test/infrastructure/docker/api/v1alpha3/conversion.go b/test/infrastructure/docker/api/v1alpha3/conversion.go index 3354a580a2c4..5d7169e22353 100644 --- a/test/infrastructure/docker/api/v1alpha3/conversion.go +++ b/test/infrastructure/docker/api/v1alpha3/conversion.go @@ -17,10 +17,16 @@ limitations under the License. package v1alpha3 import ( + "maps" + "slices" + "sort" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiconversion "k8s.io/apimachinery/pkg/conversion" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/conversion" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" clusterv1alpha3 "sigs.k8s.io/cluster-api/internal/api/core/v1alpha3" infrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" utilconversion "sigs.k8s.io/cluster-api/util/conversion" @@ -33,15 +39,6 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions. - dst.Status.Conditions = nil - if src.Status.Conditions != nil { - dst.Status.Deprecated = &infrav1.DockerClusterDeprecatedStatus{} - dst.Status.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{} - clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions) - } - // Manually restore data. restored := &infrav1.DockerCluster{} if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok { @@ -61,6 +58,7 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error { } dst.Status.Conditions = restored.Status.Conditions + dst.Status.Initialization = restored.Status.Initialization return nil } @@ -72,13 +70,6 @@ func (dst *DockerCluster) ConvertFrom(srcRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions. - dst.Status.Conditions = nil - if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil { - clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions) - } - // Preserve Hub data on down-conversion except for metadata if err := utilconversion.MarshalData(src, dst); err != nil { return err @@ -94,16 +85,6 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions. - dst.Status.Conditions = nil - - if src.Status.Conditions != nil { - dst.Status.Deprecated = &infrav1.DockerMachineDeprecatedStatus{} - dst.Status.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{} - clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions) - } - // Manually restore data. restored := &infrav1.DockerMachine{} if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok { @@ -115,6 +96,7 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error { } dst.Status.Conditions = restored.Status.Conditions + dst.Status.Initialization = restored.Status.Initialization return nil } @@ -126,13 +108,6 @@ func (dst *DockerMachine) ConvertFrom(srcRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions. - dst.Status.Conditions = nil - if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil { - clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions) - } - if err := utilconversion.MarshalData(src, dst); err != nil { return err } @@ -177,7 +152,22 @@ func (dst *DockerMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error { // Convert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec is an autogenerated conversion function. func Convert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in *infrav1.DockerClusterSpec, out *DockerClusterSpec, s apiconversion.Scope) error { // DockerClusterSpec.LoadBalancer was added in v1alpha4, so automatic conversion is not possible - return autoConvert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in, out, s) + if err := autoConvert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1alpha3.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1alpha3.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil } 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 } func Convert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in *infrav1.DockerClusterStatus, out *DockerClusterStatus, s apiconversion.Scope) error { - return autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in, out, s) + if err := autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions. + out.Conditions = nil + if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil { + clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions) + } + + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1alpha3.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1alpha3.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil } func Convert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in *infrav1.DockerMachineStatus, out *DockerMachineStatus, s apiconversion.Scope) error { - return autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in, out, s) + if err := autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha3 conditions. + out.Conditions = nil + if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil { + clusterv1alpha3.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha3_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions) + } + + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + return nil } // 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 func Convert_v1_Condition_To_v1alpha3_Condition(in *metav1.Condition, out *clusterv1alpha3.Condition, s apiconversion.Scope) error { return clusterv1alpha3.Convert_v1_Condition_To_v1alpha3_Condition(in, out, s) } + +func Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *infrav1.DockerMachineStatus, s apiconversion.Scope) error { + if err := autoConvert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions. + out.Conditions = nil + + if in.Conditions != nil { + out.Deprecated = &infrav1.DockerMachineDeprecatedStatus{} + out.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{} + clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions) + } + + if out.Initialization == nil { + out.Initialization = &infrav1.DockerMachineInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + return nil +} + +func Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *infrav1.DockerClusterStatus, s apiconversion.Scope) error { + // NOTE: custom conversion func is required because status.conditions has been added in v1beta2. + if err := autoConvert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1alpha3 conditions should not be automatically be converted into v1beta2 conditions. + out.Conditions = nil + if in.Conditions != nil { + out.Deprecated = &infrav1.DockerClusterDeprecatedStatus{} + out.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{} + clusterv1alpha3.Convert_v1alpha3_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions) + } + + if out.Initialization == nil { + out.Initialization = &infrav1.DockerClusterInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} + +func Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *infrav1.DockerClusterSpec, s apiconversion.Scope) error { + if err := autoConvert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} diff --git a/test/infrastructure/docker/api/v1alpha3/conversion_test.go b/test/infrastructure/docker/api/v1alpha3/conversion_test.go index 3e9d1ad3ff32..d4bdf45e196e 100644 --- a/test/infrastructure/docker/api/v1alpha3/conversion_test.go +++ b/test/infrastructure/docker/api/v1alpha3/conversion_test.go @@ -65,6 +65,12 @@ func hubDockerClusterStatus(in *infrav1.DockerClusterStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerClusterInitializationStatus{}) { + in.Initialization = nil + } + } } func DockerMachineFuzzFunc(_ runtimeserializer.CodecFactory) []any { @@ -81,4 +87,10 @@ func hubDockerMachineStatus(in *infrav1.DockerMachineStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerMachineInitializationStatus{}) { + in.Initialization = nil + } + } } diff --git a/test/infrastructure/docker/api/v1alpha3/zz_generated.conversion.go b/test/infrastructure/docker/api/v1alpha3/zz_generated.conversion.go index 984228c16b80..84fdd20e9184 100644 --- a/test/infrastructure/docker/api/v1alpha3/zz_generated.conversion.go +++ b/test/infrastructure/docker/api/v1alpha3/zz_generated.conversion.go @@ -27,7 +27,6 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" - v1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" corev1beta2 "sigs.k8s.io/cluster-api/api/core/v1beta2" corev1alpha3 "sigs.k8s.io/cluster-api/internal/api/core/v1alpha3" v1beta2 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" @@ -70,16 +69,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*DockerClusterStatus)(nil), (*v1beta2.DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(a.(*DockerClusterStatus), b.(*v1beta2.DockerClusterStatus), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerMachine)(nil), (*v1beta2.DockerMachine)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha3_DockerMachine_To_v1beta2_DockerMachine(a.(*DockerMachine), b.(*v1beta2.DockerMachine), scope) }); err != nil { @@ -105,11 +94,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerMachineStatus)(nil), (*v1beta2.DockerMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(a.(*DockerMachineStatus), b.(*v1beta2.DockerMachineStatus), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerMachineTemplate)(nil), (*v1beta2.DockerMachineTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha3_DockerMachineTemplate_To_v1beta2_DockerMachineTemplate(a.(*DockerMachineTemplate), b.(*v1beta2.DockerMachineTemplate), scope) }); err != nil { @@ -165,6 +149,21 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*DockerClusterStatus)(nil), (*v1beta2.DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(a.(*DockerClusterStatus), b.(*v1beta2.DockerClusterStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*DockerMachineStatus)(nil), (*v1beta2.DockerMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(a.(*DockerMachineStatus), b.(*v1beta2.DockerMachineStatus), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.DockerClusterSpec)(nil), (*DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(a.(*v1beta2.DockerClusterSpec), b.(*DockerClusterSpec), scope) }); err != nil { @@ -293,27 +292,22 @@ func autoConvert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *Doc if err := Convert_v1alpha3_APIEndpoint_To_v1beta2_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*v1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/internal/api/core/v1alpha3.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) return nil } -// Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec is an autogenerated conversion function. -func Convert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *v1beta2.DockerClusterSpec, s conversion.Scope) error { - return autoConvert_v1alpha3_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s) -} - func autoConvert_v1beta2_DockerClusterSpec_To_v1alpha3_DockerClusterSpec(in *v1beta2.DockerClusterSpec, out *DockerClusterSpec, s conversion.Scope) error { if err := Convert_v1beta2_APIEndpoint_To_v1alpha3_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*corev1alpha3.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/internal/api/core/v1alpha3.FailureDomains) // WARNING: in.LoadBalancer requires manual conversion: does not exist in peer-type return nil } func autoConvert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *v1beta2.DockerClusterStatus, s conversion.Scope) error { - out.Ready = in.Ready - out.FailureDomains = *(*v1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Ready requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/internal/api/core/v1alpha3.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]v1.Condition, len(*in)) @@ -328,11 +322,6 @@ func autoConvert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in return nil } -// Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus is an autogenerated conversion function. -func Convert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *v1beta2.DockerClusterStatus, s conversion.Scope) error { - return autoConvert_v1alpha3_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in, out, s) -} - func autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in *v1beta2.DockerClusterStatus, out *DockerClusterStatus, s conversion.Scope) error { if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -345,8 +334,8 @@ func autoConvert_v1beta2_DockerClusterStatus_To_v1alpha3_DockerClusterStatus(in } else { out.Conditions = nil } - out.Ready = in.Ready - out.FailureDomains = *(*corev1alpha3.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/internal/api/core/v1alpha3.FailureDomains) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type return nil } @@ -450,7 +439,7 @@ func autoConvert_v1beta2_DockerMachineSpec_To_v1alpha3_DockerMachineSpec(in *v1b } func autoConvert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *v1beta2.DockerMachineStatus, s conversion.Scope) error { - out.Ready = in.Ready + // WARNING: in.Ready requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1beta2.MachineAddress)(unsafe.Pointer(&in.Addresses)) if in.Conditions != nil { @@ -467,11 +456,6 @@ func autoConvert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in return nil } -// Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus is an autogenerated conversion function. -func Convert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *v1beta2.DockerMachineStatus, s conversion.Scope) error { - return autoConvert_v1alpha3_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in, out, s) -} - func autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in *v1beta2.DockerMachineStatus, out *DockerMachineStatus, s conversion.Scope) error { if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -484,7 +468,7 @@ func autoConvert_v1beta2_DockerMachineStatus_To_v1alpha3_DockerMachineStatus(in } else { out.Conditions = nil } - out.Ready = in.Ready + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1alpha3.MachineAddress)(unsafe.Pointer(&in.Addresses)) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type diff --git a/test/infrastructure/docker/api/v1alpha4/conversion.go b/test/infrastructure/docker/api/v1alpha4/conversion.go index 447c5f212bd6..36d63a753eb6 100644 --- a/test/infrastructure/docker/api/v1alpha4/conversion.go +++ b/test/infrastructure/docker/api/v1alpha4/conversion.go @@ -17,10 +17,16 @@ limitations under the License. package v1alpha4 import ( + "maps" + "slices" + "sort" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiconversion "k8s.io/apimachinery/pkg/conversion" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/conversion" + clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" clusterv1alpha4 "sigs.k8s.io/cluster-api/internal/api/core/v1alpha4" infrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" utilconversion "sigs.k8s.io/cluster-api/util/conversion" @@ -33,15 +39,6 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1alpha4 conditions should not be automatically be converted into v1beta2 conditions. - dst.Status.Conditions = nil - if src.Status.Conditions != nil { - dst.Status.Deprecated = &infrav1.DockerClusterDeprecatedStatus{} - dst.Status.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{} - clusterv1alpha4.Convert_v1alpha4_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions) - } - // Manually restore data. restored := &infrav1.DockerCluster{} if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok { @@ -53,6 +50,7 @@ func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error { } dst.Status.Conditions = restored.Status.Conditions + dst.Status.Initialization = restored.Status.Initialization return nil } @@ -64,13 +62,6 @@ func (dst *DockerCluster) ConvertFrom(srcRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha4 conditions. - dst.Status.Conditions = nil - if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil { - clusterv1alpha4.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha4_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions) - } - if err := utilconversion.MarshalData(src, dst); err != nil { return err } @@ -122,15 +113,6 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1alpha4 conditions should not be automatically be converted into v1beta2 conditions. - dst.Status.Conditions = nil - if src.Status.Conditions != nil { - dst.Status.Deprecated = &infrav1.DockerMachineDeprecatedStatus{} - dst.Status.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{} - clusterv1alpha4.Convert_v1alpha4_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&src.Status.Conditions, &dst.Status.Deprecated.V1Beta1.Conditions) - } - // Manually restore data. restored := &infrav1.DockerMachine{} if ok, err := utilconversion.UnmarshalData(src, restored); err != nil || !ok { @@ -142,6 +124,7 @@ func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error { } dst.Status.Conditions = restored.Status.Conditions + dst.Status.Initialization = restored.Status.Initialization return nil } @@ -153,13 +136,6 @@ func (dst *DockerMachine) ConvertFrom(srcRaw conversion.Hub) error { return err } - // Reset conditions from autogenerated conversions - // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha4 conditions. - dst.Status.Conditions = nil - if src.Status.Deprecated != nil && src.Status.Deprecated.V1Beta1 != nil && src.Status.Deprecated.V1Beta1.Conditions != nil { - clusterv1alpha4.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha4_Conditions(&src.Status.Deprecated.V1Beta1.Conditions, &dst.Status.Conditions) - } - if err := utilconversion.MarshalData(src, dst); err != nil { return err } @@ -220,11 +196,52 @@ func Convert_v1beta2_DockerMachineSpec_To_v1alpha4_DockerMachineSpec(in *infrav1 } func Convert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(in *infrav1.DockerClusterStatus, out *DockerClusterStatus, s apiconversion.Scope) error { - return autoConvert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(in, out, s) + if err := autoConvert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha4 conditions. + out.Conditions = nil + if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil { + clusterv1alpha4.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha4_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions) + } + + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1alpha4.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1alpha4.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil } func Convert_v1beta2_DockerMachineStatus_To_v1alpha4_DockerMachineStatus(in *infrav1.DockerMachineStatus, out *DockerMachineStatus, s apiconversion.Scope) error { - return autoConvert_v1beta2_DockerMachineStatus_To_v1alpha4_DockerMachineStatus(in, out, s) + if err := autoConvert_v1beta2_DockerMachineStatus_To_v1alpha4_DockerMachineStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1beta2 conditions should not be automatically be converted into v1alpha4 conditions. + out.Conditions = nil + if in.Deprecated != nil && in.Deprecated.V1Beta1 != nil && in.Deprecated.V1Beta1.Conditions != nil { + clusterv1alpha4.Convert_v1beta2_Deprecated_V1Beta1_Conditions_To_v1alpha4_Conditions(&in.Deprecated.V1Beta1.Conditions, &out.Conditions) + } + + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + return nil } func Convert_v1beta2_DockerCluster_To_v1alpha4_DockerCluster(in *infrav1.DockerCluster, out *DockerCluster, s apiconversion.Scope) error { @@ -252,3 +269,111 @@ func Convert_v1alpha4_Condition_To_v1_Condition(in *clusterv1alpha4.Condition, o func Convert_v1_Condition_To_v1alpha4_Condition(in *metav1.Condition, out *clusterv1alpha4.Condition, s apiconversion.Scope) error { return clusterv1alpha4.Convert_v1_Condition_To_v1alpha4_Condition(in, out, s) } + +func Convert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *infrav1.DockerMachineStatus, s apiconversion.Scope) error { + if err := autoConvert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1alpha4 conditions should not be automatically be converted into v1beta2 conditions. + out.Conditions = nil + if in.Conditions != nil { + out.Deprecated = &infrav1.DockerMachineDeprecatedStatus{} + out.Deprecated.V1Beta1 = &infrav1.DockerMachineV1Beta1DeprecatedStatus{} + clusterv1alpha4.Convert_v1alpha4_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions) + } + + if out.Initialization == nil { + out.Initialization = &infrav1.DockerMachineInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + return nil +} + +func Convert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *infrav1.DockerClusterStatus, s apiconversion.Scope) error { + // NOTE: custom conversion func is required because status.conditions has been added in v1beta2. + if err := autoConvert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in, out, s); err != nil { + return err + } + + // Reset conditions from autogenerated conversions + // NOTE: v1alpha4 conditions should not be automatically be converted into v1beta2 conditions. + out.Conditions = nil + if in.Conditions != nil { + out.Deprecated = &infrav1.DockerClusterDeprecatedStatus{} + out.Deprecated.V1Beta1 = &infrav1.DockerClusterV1Beta1DeprecatedStatus{} + clusterv1alpha4.Convert_v1alpha4_Conditions_To_v1beta2_Deprecated_V1Beta1_Conditions(&in.Conditions, &out.Deprecated.V1Beta1.Conditions) + } + + if out.Initialization == nil { + out.Initialization = &infrav1.DockerClusterInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} + +func Convert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *infrav1.DockerClusterSpec, s apiconversion.Scope) error { + if err := autoConvert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} + +func Convert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(in *infrav1.DockerClusterSpec, out *DockerClusterSpec, s apiconversion.Scope) error { + if err := autoConvert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1alpha4.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1alpha4.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil +} diff --git a/test/infrastructure/docker/api/v1alpha4/conversion_test.go b/test/infrastructure/docker/api/v1alpha4/conversion_test.go index cca6c73c0e65..9a9337b9c375 100644 --- a/test/infrastructure/docker/api/v1alpha4/conversion_test.go +++ b/test/infrastructure/docker/api/v1alpha4/conversion_test.go @@ -70,6 +70,12 @@ func hubDockerClusterStatus(in *infrav1.DockerClusterStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerClusterInitializationStatus{}) { + in.Initialization = nil + } + } } func DockerMachineFuzzFunc(_ runtimeserializer.CodecFactory) []any { @@ -86,4 +92,10 @@ func hubDockerMachineStatus(in *infrav1.DockerMachineStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerMachineInitializationStatus{}) { + in.Initialization = nil + } + } } diff --git a/test/infrastructure/docker/api/v1alpha4/zz_generated.conversion.go b/test/infrastructure/docker/api/v1alpha4/zz_generated.conversion.go index be4c102c4f39..bd8a26beb484 100644 --- a/test/infrastructure/docker/api/v1alpha4/zz_generated.conversion.go +++ b/test/infrastructure/docker/api/v1alpha4/zz_generated.conversion.go @@ -27,7 +27,6 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" - v1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" corev1beta2 "sigs.k8s.io/cluster-api/api/core/v1beta2" corev1alpha4 "sigs.k8s.io/cluster-api/internal/api/core/v1alpha4" v1beta2 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" @@ -65,21 +64,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1beta2.DockerClusterSpec)(nil), (*DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(a.(*v1beta2.DockerClusterSpec), b.(*DockerClusterSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*DockerClusterStatus)(nil), (*v1beta2.DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(a.(*DockerClusterStatus), b.(*v1beta2.DockerClusterStatus), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerClusterTemplate)(nil), (*v1beta2.DockerClusterTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha4_DockerClusterTemplate_To_v1beta2_DockerClusterTemplate(a.(*DockerClusterTemplate), b.(*v1beta2.DockerClusterTemplate), scope) }); err != nil { @@ -135,11 +119,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerMachineStatus)(nil), (*v1beta2.DockerMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(a.(*DockerMachineStatus), b.(*v1beta2.DockerMachineStatus), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerMachineTemplate)(nil), (*v1beta2.DockerMachineTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha4_DockerMachineTemplate_To_v1beta2_DockerMachineTemplate(a.(*DockerMachineTemplate), b.(*v1beta2.DockerMachineTemplate), scope) }); err != nil { @@ -200,6 +179,26 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*DockerClusterStatus)(nil), (*v1beta2.DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(a.(*DockerClusterStatus), b.(*v1beta2.DockerClusterStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*DockerMachineStatus)(nil), (*v1beta2.DockerMachineStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(a.(*DockerMachineStatus), b.(*v1beta2.DockerMachineStatus), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1beta2.DockerClusterSpec)(nil), (*DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(a.(*v1beta2.DockerClusterSpec), b.(*DockerClusterSpec), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.DockerClusterStatus)(nil), (*DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(a.(*v1beta2.DockerClusterStatus), b.(*DockerClusterStatus), scope) }); err != nil { @@ -348,37 +347,27 @@ func autoConvert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *Doc if err := Convert_v1alpha4_APIEndpoint_To_v1beta2_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*v1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/internal/api/core/v1alpha4.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if err := Convert_v1alpha4_DockerLoadBalancer_To_v1beta2_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec is an autogenerated conversion function. -func Convert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *v1beta2.DockerClusterSpec, s conversion.Scope) error { - return autoConvert_v1alpha4_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s) -} - func autoConvert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(in *v1beta2.DockerClusterSpec, out *DockerClusterSpec, s conversion.Scope) error { if err := Convert_v1beta2_APIEndpoint_To_v1alpha4_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*corev1alpha4.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/internal/api/core/v1alpha4.FailureDomains) if err := Convert_v1beta2_DockerLoadBalancer_To_v1alpha4_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec is an autogenerated conversion function. -func Convert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(in *v1beta2.DockerClusterSpec, out *DockerClusterSpec, s conversion.Scope) error { - return autoConvert_v1beta2_DockerClusterSpec_To_v1alpha4_DockerClusterSpec(in, out, s) -} - func autoConvert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *v1beta2.DockerClusterStatus, s conversion.Scope) error { - out.Ready = in.Ready - out.FailureDomains = *(*v1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Ready requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/internal/api/core/v1alpha4.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]v1.Condition, len(*in)) @@ -393,11 +382,6 @@ func autoConvert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in return nil } -// Convert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus is an autogenerated conversion function. -func Convert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *v1beta2.DockerClusterStatus, s conversion.Scope) error { - return autoConvert_v1alpha4_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in, out, s) -} - func autoConvert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(in *v1beta2.DockerClusterStatus, out *DockerClusterStatus, s conversion.Scope) error { if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -410,8 +394,8 @@ func autoConvert_v1beta2_DockerClusterStatus_To_v1alpha4_DockerClusterStatus(in } else { out.Conditions = nil } - out.Ready = in.Ready - out.FailureDomains = *(*corev1alpha4.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/internal/api/core/v1alpha4.FailureDomains) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type return nil } @@ -637,7 +621,7 @@ func autoConvert_v1beta2_DockerMachineSpec_To_v1alpha4_DockerMachineSpec(in *v1b } func autoConvert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *v1beta2.DockerMachineStatus, s conversion.Scope) error { - out.Ready = in.Ready + // WARNING: in.Ready requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1beta2.MachineAddress)(unsafe.Pointer(&in.Addresses)) if in.Conditions != nil { @@ -654,11 +638,6 @@ func autoConvert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in return nil } -// Convert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus is an autogenerated conversion function. -func Convert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *v1beta2.DockerMachineStatus, s conversion.Scope) error { - return autoConvert_v1alpha4_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in, out, s) -} - func autoConvert_v1beta2_DockerMachineStatus_To_v1alpha4_DockerMachineStatus(in *v1beta2.DockerMachineStatus, out *DockerMachineStatus, s conversion.Scope) error { if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -671,7 +650,7 @@ func autoConvert_v1beta2_DockerMachineStatus_To_v1alpha4_DockerMachineStatus(in } else { out.Conditions = nil } - out.Ready = in.Ready + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1alpha4.MachineAddress)(unsafe.Pointer(&in.Addresses)) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type diff --git a/test/infrastructure/docker/api/v1beta1/conversion.go b/test/infrastructure/docker/api/v1beta1/conversion.go index aec2a1b23d23..0d3631c1ded6 100644 --- a/test/infrastructure/docker/api/v1beta1/conversion.go +++ b/test/infrastructure/docker/api/v1beta1/conversion.go @@ -17,25 +17,50 @@ limitations under the License. package v1beta1 import ( + "maps" + "slices" + "sort" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" apiconversion "k8s.io/apimachinery/pkg/conversion" + "k8s.io/utils/ptr" "sigs.k8s.io/controller-runtime/pkg/conversion" clusterv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" infrav1 "sigs.k8s.io/cluster-api/test/infrastructure/docker/api/v1beta2" + utilconversion "sigs.k8s.io/cluster-api/util/conversion" ) func (src *DockerCluster) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*infrav1.DockerCluster) - return Convert_v1beta1_DockerCluster_To_v1beta2_DockerCluster(src, dst, nil) + if err := Convert_v1beta1_DockerCluster_To_v1beta2_DockerCluster(src, dst, nil); err != nil { + return err + } + + restored := &infrav1.DockerCluster{} + if ok, err := utilconversion.UnmarshalData(dst, restored); err != nil || !ok { + return err + } + + dst.Status.Initialization = restored.Status.Initialization + + return nil } func (dst *DockerCluster) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*infrav1.DockerCluster) - return Convert_v1beta2_DockerCluster_To_v1beta1_DockerCluster(src, dst, nil) + if err := Convert_v1beta2_DockerCluster_To_v1beta1_DockerCluster(src, dst, nil); err != nil { + return err + } + + if err := utilconversion.MarshalData(src, dst); err != nil { + return err + } + + return nil } func (src *DockerClusterTemplate) ConvertTo(dstRaw conversion.Hub) error { @@ -53,13 +78,32 @@ func (dst *DockerClusterTemplate) ConvertFrom(srcRaw conversion.Hub) error { func (src *DockerMachine) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*infrav1.DockerMachine) - return Convert_v1beta1_DockerMachine_To_v1beta2_DockerMachine(src, dst, nil) + if err := Convert_v1beta1_DockerMachine_To_v1beta2_DockerMachine(src, dst, nil); err != nil { + return err + } + + restored := &infrav1.DockerMachine{} + if ok, err := utilconversion.UnmarshalData(dst, restored); err != nil || !ok { + return err + } + + dst.Status.Initialization = restored.Status.Initialization + + return nil } func (dst *DockerMachine) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*infrav1.DockerMachine) - return Convert_v1beta2_DockerMachine_To_v1beta1_DockerMachine(src, dst, nil) + if err := Convert_v1beta2_DockerMachine_To_v1beta1_DockerMachine(src, dst, nil); err != nil { + return err + } + + if err := utilconversion.MarshalData(src, dst); err != nil { + return err + } + + return nil } func (src *DockerMachineTemplate) ConvertTo(dstRaw conversion.Hub) error { @@ -77,13 +121,32 @@ func (dst *DockerMachineTemplate) ConvertFrom(srcRaw conversion.Hub) error { func (src *DevCluster) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*infrav1.DevCluster) - return Convert_v1beta1_DevCluster_To_v1beta2_DevCluster(src, dst, nil) + if err := Convert_v1beta1_DevCluster_To_v1beta2_DevCluster(src, dst, nil); err != nil { + return err + } + + restored := &infrav1.DevCluster{} + if ok, err := utilconversion.UnmarshalData(dst, restored); err != nil || !ok { + return err + } + + dst.Status.Initialization = restored.Status.Initialization + + return nil } func (dst *DevCluster) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*infrav1.DevCluster) - return Convert_v1beta2_DevCluster_To_v1beta1_DevCluster(src, dst, nil) + if err := Convert_v1beta2_DevCluster_To_v1beta1_DevCluster(src, dst, nil); err != nil { + return err + } + + if err := utilconversion.MarshalData(src, dst); err != nil { + return err + } + + return nil } func (src *DevClusterTemplate) ConvertTo(dstRaw conversion.Hub) error { @@ -101,13 +164,32 @@ func (dst *DevClusterTemplate) ConvertFrom(srcRaw conversion.Hub) error { func (src *DevMachine) ConvertTo(dstRaw conversion.Hub) error { dst := dstRaw.(*infrav1.DevMachine) - return Convert_v1beta1_DevMachine_To_v1beta2_DevMachine(src, dst, nil) + if err := Convert_v1beta1_DevMachine_To_v1beta2_DevMachine(src, dst, nil); err != nil { + return err + } + + restored := &infrav1.DevMachine{} + if ok, err := utilconversion.UnmarshalData(dst, restored); err != nil || !ok { + return err + } + + dst.Status.Initialization = restored.Status.Initialization + + return nil } func (dst *DevMachine) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*infrav1.DevMachine) - return Convert_v1beta2_DevMachine_To_v1beta1_DevMachine(src, dst, nil) + if err := Convert_v1beta2_DevMachine_To_v1beta1_DevMachine(src, dst, nil); err != nil { + return err + } + + if err := utilconversion.MarshalData(src, dst); err != nil { + return err + } + + return nil } func (src *DevMachineTemplate) ConvertTo(dstRaw conversion.Hub) error { @@ -135,6 +217,28 @@ func Convert_v1beta1_DevClusterStatus_To_v1beta2_DevClusterStatus(in *DevCluster return err } + if out.Initialization == nil { + out.Initialization = &infrav1.DevClusterInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + // Reset conditions from autogenerated conversions // NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions. out.Conditions = nil @@ -165,6 +269,20 @@ func Convert_v1beta2_DevClusterStatus_To_v1beta1_DevClusterStatus(in *infrav1.De return err } + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + if in.FailureDomains != nil { + out.FailureDomains = clusterv1beta1.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1beta1.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + // Reset conditions from autogenerated conversions // NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1). out.Conditions = nil @@ -189,6 +307,14 @@ func Convert_v1beta1_DevMachineStatus_To_v1beta2_DevMachineStatus(in *DevMachine return err } + if out.Initialization == nil { + out.Initialization = &infrav1.DevMachineInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + // Reset conditions from autogenerated conversions // NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions. out.Conditions = nil @@ -219,6 +345,10 @@ func Convert_v1beta2_DevMachineStatus_To_v1beta1_DevMachineStatus(in *infrav1.De return err } + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + // Reset conditions from autogenerated conversions // NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1). out.Conditions = nil @@ -235,6 +365,7 @@ func Convert_v1beta2_DevMachineStatus_To_v1beta1_DevMachineStatus(in *infrav1.De out.V1Beta2 = &DevMachineV1Beta2Status{} out.V1Beta2.Conditions = in.Conditions + return nil } @@ -243,6 +374,28 @@ func Convert_v1beta1_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *Dock return err } + if out.Initialization == nil { + out.Initialization = &infrav1.DockerClusterInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + + if in.FailureDomains != nil { + out.FailureDomains = []clusterv1.FailureDomain{} + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + // Reset conditions from autogenerated conversions // NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions. out.Conditions = nil @@ -273,6 +426,20 @@ func Convert_v1beta2_DockerClusterStatus_To_v1beta1_DockerClusterStatus(in *infr return err } + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + + if in.FailureDomains != nil { + out.FailureDomains = clusterv1beta1.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1beta1.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + // Reset conditions from autogenerated conversions // NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1). out.Conditions = nil @@ -297,6 +464,14 @@ func Convert_v1beta1_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *Dock return err } + if out.Initialization == nil { + out.Initialization = &infrav1.DockerMachineInitializationStatus{} + } + + if in.Ready { + out.Initialization.Provisioned = ptr.To(in.Ready) + } + // Reset conditions from autogenerated conversions // NOTE: v1beta1 conditions should not be automatically be converted into v1beta2 conditions. out.Conditions = nil @@ -327,6 +502,10 @@ func Convert_v1beta2_DockerMachineStatus_To_v1beta1_DockerMachineStatus(in *infr return err } + if in.Initialization != nil && in.Initialization.Provisioned != nil { + out.Ready = *in.Initialization.Provisioned + } + // Reset conditions from autogenerated conversions // NOTE: v1beta2 conditions should not be automatically be converted into legacy conditions (v1beta1). out.Conditions = nil @@ -343,6 +522,7 @@ func Convert_v1beta2_DockerMachineStatus_To_v1beta1_DockerMachineStatus(in *infr out.V1Beta2 = &DockerMachineV1Beta2Status{} out.V1Beta2.Conditions = in.Conditions + return nil } @@ -355,3 +535,87 @@ func Convert_v1_Condition_To_v1beta1_Condition(in *metav1.Condition, out *cluste func Convert_v1beta1_Condition_To_v1_Condition(in *clusterv1beta1.Condition, out *metav1.Condition, s apiconversion.Scope) error { return clusterv1beta1.Convert_v1beta1_Condition_To_v1_Condition(in, out, s) } + +func Convert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *infrav1.DockerClusterSpec, s apiconversion.Scope) error { + if err := autoConvert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = make([]clusterv1.FailureDomain, 0, len(in.FailureDomains)) + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} + +func Convert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(in *infrav1.DockerClusterSpec, out *DockerClusterSpec, s apiconversion.Scope) error { + if err := autoConvert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1beta1.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1beta1.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil +} + +func Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(in *infrav1.DockerClusterBackendSpec, out *DockerClusterBackendSpec, s apiconversion.Scope) error { + if err := autoConvert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = clusterv1beta1.FailureDomains{} + for _, fd := range in.FailureDomains { + out.FailureDomains[fd.Name] = clusterv1beta1.FailureDomainSpec{ + ControlPlane: fd.ControlPlane, + Attributes: fd.Attributes, + } + } + } + + return nil +} + +func Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(in *DockerClusterBackendSpec, out *infrav1.DockerClusterBackendSpec, s apiconversion.Scope) error { + if err := autoConvert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(in, out, s); err != nil { + return err + } + + // Move FailureDomains + if in.FailureDomains != nil { + out.FailureDomains = make([]clusterv1.FailureDomain, 0, len(in.FailureDomains)) + domainNames := slices.Collect(maps.Keys(in.FailureDomains)) + sort.Strings(domainNames) + for _, name := range domainNames { + domain := in.FailureDomains[name] + out.FailureDomains = append(out.FailureDomains, clusterv1.FailureDomain{ + Name: name, + ControlPlane: domain.ControlPlane, + Attributes: domain.Attributes, + }) + } + } + + return nil +} diff --git a/test/infrastructure/docker/api/v1beta1/conversion_test.go b/test/infrastructure/docker/api/v1beta1/conversion_test.go index 171c25e8d651..18af6153c068 100644 --- a/test/infrastructure/docker/api/v1beta1/conversion_test.go +++ b/test/infrastructure/docker/api/v1beta1/conversion_test.go @@ -93,6 +93,12 @@ func hubDockerClusterStatus(in *infrav1.DockerClusterStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerClusterInitializationStatus{}) { + in.Initialization = nil + } + } } func spokeDockerClusterStatus(in *DockerClusterStatus, c randfill.Continue) { @@ -121,6 +127,12 @@ func hubDockerMachineStatus(in *infrav1.DockerMachineStatus, c randfill.Continue in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DockerMachineInitializationStatus{}) { + in.Initialization = nil + } + } } func spokeDockerMachineStatus(in *DockerMachineStatus, c randfill.Continue) { @@ -149,6 +161,12 @@ func hubDevClusterStatus(in *infrav1.DevClusterStatus, c randfill.Continue) { in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DevClusterInitializationStatus{}) { + in.Initialization = nil + } + } } func spokeDevClusterStatus(in *DevClusterStatus, c randfill.Continue) { @@ -177,6 +195,12 @@ func hubDevMachineStatus(in *infrav1.DevMachineStatus, c randfill.Continue) { in.Deprecated = nil } } + + if in.Initialization != nil { + if reflect.DeepEqual(in.Initialization, &infrav1.DevMachineInitializationStatus{}) { + in.Initialization = nil + } + } } func spokeDevMachineStatus(in *DevMachineStatus, c randfill.Continue) { diff --git a/test/infrastructure/docker/api/v1beta1/zz_generated.conversion.go b/test/infrastructure/docker/api/v1beta1/zz_generated.conversion.go index 7baa1ebd8013..a35e9787b3be 100644 --- a/test/infrastructure/docker/api/v1beta1/zz_generated.conversion.go +++ b/test/infrastructure/docker/api/v1beta1/zz_generated.conversion.go @@ -240,16 +240,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerClusterBackendSpec)(nil), (*v1beta2.DockerClusterBackendSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(a.(*DockerClusterBackendSpec), b.(*v1beta2.DockerClusterBackendSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1beta2.DockerClusterBackendSpec)(nil), (*DockerClusterBackendSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(a.(*v1beta2.DockerClusterBackendSpec), b.(*DockerClusterBackendSpec), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerClusterList)(nil), (*v1beta2.DockerClusterList)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_DockerClusterList_To_v1beta2_DockerClusterList(a.(*DockerClusterList), b.(*v1beta2.DockerClusterList), scope) }); err != nil { @@ -260,16 +250,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddGeneratedConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) - }); err != nil { - return err - } - if err := s.AddGeneratedConversionFunc((*v1beta2.DockerClusterSpec)(nil), (*DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(a.(*v1beta2.DockerClusterSpec), b.(*DockerClusterSpec), scope) - }); err != nil { - return err - } if err := s.AddGeneratedConversionFunc((*DockerClusterTemplate)(nil), (*v1beta2.DockerClusterTemplate)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_DockerClusterTemplate_To_v1beta2_DockerClusterTemplate(a.(*DockerClusterTemplate), b.(*v1beta2.DockerClusterTemplate), scope) }); err != nil { @@ -510,6 +490,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*DockerClusterBackendSpec)(nil), (*v1beta2.DockerClusterBackendSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(a.(*DockerClusterBackendSpec), b.(*v1beta2.DockerClusterBackendSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*DockerClusterSpec)(nil), (*v1beta2.DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(a.(*DockerClusterSpec), b.(*v1beta2.DockerClusterSpec), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*DockerClusterStatus)(nil), (*v1beta2.DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_DockerClusterStatus_To_v1beta2_DockerClusterStatus(a.(*DockerClusterStatus), b.(*v1beta2.DockerClusterStatus), scope) }); err != nil { @@ -535,6 +525,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*v1beta2.DockerClusterBackendSpec)(nil), (*DockerClusterBackendSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(a.(*v1beta2.DockerClusterBackendSpec), b.(*DockerClusterBackendSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1beta2.DockerClusterSpec)(nil), (*DockerClusterSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(a.(*v1beta2.DockerClusterSpec), b.(*DockerClusterSpec), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*v1beta2.DockerClusterStatus)(nil), (*DockerClusterStatus)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta2_DockerClusterStatus_To_v1beta1_DockerClusterStatus(a.(*v1beta2.DockerClusterStatus), b.(*DockerClusterStatus), scope) }); err != nil { @@ -630,7 +630,15 @@ func Convert_v1beta2_DevCluster_To_v1beta1_DevCluster(in *v1beta2.DevCluster, ou } func autoConvert_v1beta1_DevClusterBackendSpec_To_v1beta2_DevClusterBackendSpec(in *DevClusterBackendSpec, out *v1beta2.DevClusterBackendSpec, s conversion.Scope) error { - out.Docker = (*v1beta2.DockerClusterBackendSpec)(unsafe.Pointer(in.Docker)) + if in.Docker != nil { + in, out := &in.Docker, &out.Docker + *out = new(v1beta2.DockerClusterBackendSpec) + if err := Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(*in, *out, s); err != nil { + return err + } + } else { + out.Docker = nil + } out.InMemory = (*v1beta2.InMemoryClusterBackendSpec)(unsafe.Pointer(in.InMemory)) return nil } @@ -641,7 +649,15 @@ func Convert_v1beta1_DevClusterBackendSpec_To_v1beta2_DevClusterBackendSpec(in * } func autoConvert_v1beta2_DevClusterBackendSpec_To_v1beta1_DevClusterBackendSpec(in *v1beta2.DevClusterBackendSpec, out *DevClusterBackendSpec, s conversion.Scope) error { - out.Docker = (*DockerClusterBackendSpec)(unsafe.Pointer(in.Docker)) + if in.Docker != nil { + in, out := &in.Docker, &out.Docker + *out = new(DockerClusterBackendSpec) + if err := Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(*in, *out, s); err != nil { + return err + } + } else { + out.Docker = nil + } out.InMemory = (*InMemoryClusterBackendSpec)(unsafe.Pointer(in.InMemory)) return nil } @@ -724,8 +740,8 @@ func Convert_v1beta2_DevClusterSpec_To_v1beta1_DevClusterSpec(in *v1beta2.DevClu } func autoConvert_v1beta1_DevClusterStatus_To_v1beta2_DevClusterStatus(in *DevClusterStatus, out *v1beta2.DevClusterStatus, s conversion.Scope) error { - out.Ready = in.Ready - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Ready requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]v1.Condition, len(*in)) @@ -753,8 +769,8 @@ func autoConvert_v1beta2_DevClusterStatus_To_v1beta1_DevClusterStatus(in *v1beta } else { out.Conditions = nil } - out.Ready = in.Ready - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type return nil } @@ -1024,7 +1040,7 @@ func Convert_v1beta2_DevMachineSpec_To_v1beta1_DevMachineSpec(in *v1beta2.DevMac } func autoConvert_v1beta1_DevMachineStatus_To_v1beta2_DevMachineStatus(in *DevMachineStatus, out *v1beta2.DevMachineStatus, s conversion.Scope) error { - out.Ready = in.Ready + // WARNING: in.Ready requires manual conversion: does not exist in peer-type out.Addresses = *(*[]corev1beta2.MachineAddress)(unsafe.Pointer(&in.Addresses)) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions @@ -1054,7 +1070,7 @@ func autoConvert_v1beta2_DevMachineStatus_To_v1beta1_DevMachineStatus(in *v1beta } else { out.Conditions = nil } - out.Ready = in.Ready + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type out.Addresses = *(*[]corev1beta1.MachineAddress)(unsafe.Pointer(&in.Addresses)) out.Backend = (*DevMachineBackendStatus)(unsafe.Pointer(in.Backend)) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type @@ -1216,31 +1232,21 @@ func Convert_v1beta2_DockerCluster_To_v1beta1_DockerCluster(in *v1beta2.DockerCl } func autoConvert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(in *DockerClusterBackendSpec, out *v1beta2.DockerClusterBackendSpec, s conversion.Scope) error { - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if err := Convert_v1beta1_DockerLoadBalancer_To_v1beta2_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec is an autogenerated conversion function. -func Convert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(in *DockerClusterBackendSpec, out *v1beta2.DockerClusterBackendSpec, s conversion.Scope) error { - return autoConvert_v1beta1_DockerClusterBackendSpec_To_v1beta2_DockerClusterBackendSpec(in, out, s) -} - func autoConvert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(in *v1beta2.DockerClusterBackendSpec, out *DockerClusterBackendSpec, s conversion.Scope) error { - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains) if err := Convert_v1beta2_DockerLoadBalancer_To_v1beta1_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec is an autogenerated conversion function. -func Convert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(in *v1beta2.DockerClusterBackendSpec, out *DockerClusterBackendSpec, s conversion.Scope) error { - return autoConvert_v1beta2_DockerClusterBackendSpec_To_v1beta1_DockerClusterBackendSpec(in, out, s) -} - func autoConvert_v1beta1_DockerClusterList_To_v1beta2_DockerClusterList(in *DockerClusterList, out *v1beta2.DockerClusterList, s conversion.Scope) error { out.ListMeta = in.ListMeta if in.Items != nil { @@ -1287,37 +1293,27 @@ func autoConvert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *Dock if err := Convert_v1beta1_APIEndpoint_To_v1beta2_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if err := Convert_v1beta1_DockerLoadBalancer_To_v1beta2_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec is an autogenerated conversion function. -func Convert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in *DockerClusterSpec, out *v1beta2.DockerClusterSpec, s conversion.Scope) error { - return autoConvert_v1beta1_DockerClusterSpec_To_v1beta2_DockerClusterSpec(in, out, s) -} - func autoConvert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(in *v1beta2.DockerClusterSpec, out *DockerClusterSpec, s conversion.Scope) error { if err := Convert_v1beta2_APIEndpoint_To_v1beta1_APIEndpoint(&in.ControlPlaneEndpoint, &out.ControlPlaneEndpoint, s); err != nil { return err } - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains) if err := Convert_v1beta2_DockerLoadBalancer_To_v1beta1_DockerLoadBalancer(&in.LoadBalancer, &out.LoadBalancer, s); err != nil { return err } return nil } -// Convert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec is an autogenerated conversion function. -func Convert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(in *v1beta2.DockerClusterSpec, out *DockerClusterSpec, s conversion.Scope) error { - return autoConvert_v1beta2_DockerClusterSpec_To_v1beta1_DockerClusterSpec(in, out, s) -} - func autoConvert_v1beta1_DockerClusterStatus_To_v1beta2_DockerClusterStatus(in *DockerClusterStatus, out *v1beta2.DockerClusterStatus, s conversion.Scope) error { - out.Ready = in.Ready - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Ready requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types (sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains vs []sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain) if in.Conditions != nil { in, out := &in.Conditions, &out.Conditions *out = make([]v1.Condition, len(*in)) @@ -1345,8 +1341,8 @@ func autoConvert_v1beta2_DockerClusterStatus_To_v1beta1_DockerClusterStatus(in * } else { out.Conditions = nil } - out.Ready = in.Ready - out.FailureDomains = *(*corev1beta1.FailureDomains)(unsafe.Pointer(&in.FailureDomains)) + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type + // WARNING: in.FailureDomains requires manual conversion: inconvertible types ([]sigs.k8s.io/cluster-api/api/core/v1beta2.FailureDomain vs sigs.k8s.io/cluster-api/api/core/v1beta1.FailureDomains) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type return nil } @@ -1652,7 +1648,7 @@ func Convert_v1beta2_DockerMachineSpec_To_v1beta1_DockerMachineSpec(in *v1beta2. } func autoConvert_v1beta1_DockerMachineStatus_To_v1beta2_DockerMachineStatus(in *DockerMachineStatus, out *v1beta2.DockerMachineStatus, s conversion.Scope) error { - out.Ready = in.Ready + // WARNING: in.Ready requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1beta2.MachineAddress)(unsafe.Pointer(&in.Addresses)) if in.Conditions != nil { @@ -1682,7 +1678,7 @@ func autoConvert_v1beta2_DockerMachineStatus_To_v1beta1_DockerMachineStatus(in * } else { out.Conditions = nil } - out.Ready = in.Ready + // WARNING: in.Initialization requires manual conversion: does not exist in peer-type out.LoadBalancerConfigured = in.LoadBalancerConfigured out.Addresses = *(*[]corev1beta1.MachineAddress)(unsafe.Pointer(&in.Addresses)) // WARNING: in.Deprecated requires manual conversion: does not exist in peer-type diff --git a/test/infrastructure/docker/api/v1beta2/devcluster_types.go b/test/infrastructure/docker/api/v1beta2/devcluster_types.go index a2a593c21d4d..474962c15f98 100644 --- a/test/infrastructure/docker/api/v1beta2/devcluster_types.go +++ b/test/infrastructure/docker/api/v1beta2/devcluster_types.go @@ -19,7 +19,6 @@ package v1beta2 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) @@ -98,7 +97,11 @@ type DockerClusterBackendSpec struct { // Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API // controllers to do what they will with the defined failure domains. // +optional - FailureDomains clusterv1beta1.FailureDomains `json:"failureDomains,omitempty"` + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + FailureDomains []clusterv1.FailureDomain `json:"failureDomains,omitempty"` // loadBalancer allows defining configurations for the cluster load balancer. // +optional @@ -118,20 +121,34 @@ type DevClusterStatus struct { // +kubebuilder:validation:MaxItems=32 Conditions []metav1.Condition `json:"conditions,omitempty"` - // ready denotes that the dev cluster infrastructure is ready. + // initialization provides observations of the DevCluster initialization process. + // NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Cluster provisioning. // +optional - Ready bool `json:"ready"` + Initialization *DevClusterInitializationStatus `json:"initialization,omitempty"` - // failureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API + // failureDomains is a list of failure domain objects synced from the infrastructure provider. + // It don't mean much in CAPD since it's all local, but we can see how the rest of cluster API // will use this if we populate it. // +optional - FailureDomains clusterv1beta1.FailureDomains `json:"failureDomains,omitempty"` + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + FailureDomains []clusterv1.FailureDomain `json:"failureDomains,omitempty"` // deprecated groups all the status fields that are deprecated and will be removed when all the nested field are removed. // +optional Deprecated *DevClusterDeprecatedStatus `json:"deprecated,omitempty"` } +// DevClusterInitializationStatus provides observations of the DevCluster initialization process. +type DevClusterInitializationStatus struct { + // provisioned is true when the infrastructure provider reports that the Cluster's infrastructure is fully provisioned. + // NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Cluster provisioning. + // +optional + Provisioned *bool `json:"provisioned,omitempty"` +} + // DevClusterDeprecatedStatus groups all the status fields that are deprecated and will be removed when support for v1beta1 will be dropped. // See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context. type DevClusterDeprecatedStatus struct { diff --git a/test/infrastructure/docker/api/v1beta2/devmachine_types.go b/test/infrastructure/docker/api/v1beta2/devmachine_types.go index aa96aced8fed..a186cb9c4a6f 100644 --- a/test/infrastructure/docker/api/v1beta2/devmachine_types.go +++ b/test/infrastructure/docker/api/v1beta2/devmachine_types.go @@ -357,9 +357,10 @@ type DevMachineStatus struct { // +kubebuilder:validation:MaxItems=32 Conditions []metav1.Condition `json:"conditions,omitempty"` - // ready denotes that the machine is ready + // initialization provides observations of the DevMachine initialization process. + // NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Machine provisioning. // +optional - Ready bool `json:"ready"` + Initialization *DevMachineInitializationStatus `json:"initialization,omitempty"` // addresses contains the associated addresses for the dev machine. // +optional @@ -374,6 +375,14 @@ type DevMachineStatus struct { Deprecated *DevMachineDeprecatedStatus `json:"deprecated,omitempty"` } +// DevMachineInitializationStatus provides observations of the DevMachine initialization process. +type DevMachineInitializationStatus struct { + // provisioned is true when the infrastructure provider reports that the Machine's infrastructure is fully provisioned. + // NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Machine provisioning. + // +optional + Provisioned *bool `json:"provisioned,omitempty"` +} + // DevMachineBackendStatus define backend status for a DevMachine. type DevMachineBackendStatus struct { // docker define backend status for a DevMachine for a machine using docker containers. @@ -415,7 +424,7 @@ type DevMachineV1Beta1DeprecatedStatus struct { // +kubebuilder:printcolumn:name="Cluster",type="string",JSONPath=".metadata.labels['cluster\\.x-k8s\\.io/cluster-name']",description="Cluster" // +kubebuilder:printcolumn:name="Machine",type="string",JSONPath=".metadata.ownerReferences[?(@.kind==\"Machine\")].name",description="Machine object which owns with this DevMachine" // +kubebuilder:printcolumn:name="ProviderID",type="string",JSONPath=".spec.providerID",description="Provider ID" -// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.ready",description="Machine ready status" +// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.initialization.provisioned",description="Machine ready status" // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="Time duration since creation of the DevMachine" // DevMachine is the schema for the dev machine infrastructure API. diff --git a/test/infrastructure/docker/api/v1beta2/dockercluster_types.go b/test/infrastructure/docker/api/v1beta2/dockercluster_types.go index 2c890a14513e..34d9f60a1c4f 100644 --- a/test/infrastructure/docker/api/v1beta2/dockercluster_types.go +++ b/test/infrastructure/docker/api/v1beta2/dockercluster_types.go @@ -20,7 +20,6 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - clusterv1beta1 "sigs.k8s.io/cluster-api/api/core/v1beta1" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) @@ -44,7 +43,11 @@ type DockerClusterSpec struct { // Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API // controllers to do what they will with the defined failure domains. // +optional - FailureDomains clusterv1beta1.FailureDomains `json:"failureDomains,omitempty"` + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + FailureDomains []clusterv1.FailureDomain `json:"failureDomains,omitempty"` // LoadBalancer allows defining configurations for the cluster load balancer. // +optional @@ -92,20 +95,34 @@ type DockerClusterStatus struct { // +kubebuilder:validation:MaxItems=32 Conditions []metav1.Condition `json:"conditions,omitempty"` - // Ready denotes that the docker cluster (infrastructure) is ready. + // initialization provides observations of the DockerCluster initialization process. + // NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Cluster provisioning. // +optional - Ready bool `json:"ready"` + Initialization *DockerClusterInitializationStatus `json:"initialization,omitempty"` - // FailureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API + // failureDomains is a list of failure domain objects synced from the infrastructure provider. + // It don't mean much in CAPD since it's all local, but we can see how the rest of cluster API // will use this if we populate it. // +optional - FailureDomains clusterv1beta1.FailureDomains `json:"failureDomains,omitempty"` + // +listType=map + // +listMapKey=name + // +kubebuilder:validation:MinItems=1 + // +kubebuilder:validation:MaxItems=100 + FailureDomains []clusterv1.FailureDomain `json:"failureDomains,omitempty"` // deprecated groups all the status fields that are deprecated and will be removed when all the nested field are removed. // +optional Deprecated *DockerClusterDeprecatedStatus `json:"deprecated,omitempty"` } +// DockerClusterInitializationStatus provides observations of the DockerCluster initialization process. +type DockerClusterInitializationStatus struct { + // provisioned is true when the infrastructure provider reports that the Cluster's infrastructure is fully provisioned. + // NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Cluster provisioning. + // +optional + Provisioned *bool `json:"provisioned,omitempty"` +} + // DockerClusterDeprecatedStatus groups all the status fields that are deprecated and will be removed when support for v1beta1 will be dropped. // See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context. type DockerClusterDeprecatedStatus struct { diff --git a/test/infrastructure/docker/api/v1beta2/dockermachine_types.go b/test/infrastructure/docker/api/v1beta2/dockermachine_types.go index 2fc4e4114a63..362727149d21 100644 --- a/test/infrastructure/docker/api/v1beta2/dockermachine_types.go +++ b/test/infrastructure/docker/api/v1beta2/dockermachine_types.go @@ -90,9 +90,10 @@ type DockerMachineStatus struct { // +kubebuilder:validation:MaxItems=32 Conditions []metav1.Condition `json:"conditions,omitempty"` - // Ready denotes that the machine (docker container) is ready + // initialization provides observations of the DockerMachine initialization process. + // NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Machine provisioning. // +optional - Ready bool `json:"ready"` + Initialization *DockerMachineInitializationStatus `json:"initialization,omitempty"` // LoadBalancerConfigured denotes that the machine has been // added to the load balancer @@ -108,6 +109,14 @@ type DockerMachineStatus struct { Deprecated *DockerMachineDeprecatedStatus `json:"deprecated,omitempty"` } +// DockerMachineInitializationStatus provides observations of the DockerMachine initialization process. +type DockerMachineInitializationStatus struct { + // provisioned is true when the infrastructure provider reports that the Machine's infrastructure is fully provisioned. + // NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Machine provisioning. + // +optional + Provisioned *bool `json:"provisioned,omitempty"` +} + // DockerMachineDeprecatedStatus groups all the status fields that are deprecated and will be removed when support for v1beta1 will be dropped. // See https://github.com/kubernetes-sigs/cluster-api/blob/main/docs/proposals/20240916-improve-status-in-CAPI-resources.md for more context. type DockerMachineDeprecatedStatus struct { @@ -134,7 +143,7 @@ type DockerMachineV1Beta1DeprecatedStatus struct { // +kubebuilder:printcolumn:name="Cluster",type="string",JSONPath=".metadata.labels['cluster\\.x-k8s\\.io/cluster-name']",description="Cluster" // +kubebuilder:printcolumn:name="Machine",type="string",JSONPath=".metadata.ownerReferences[?(@.kind==\"Machine\")].name",description="Machine object which owns with this DockerMachine" // +kubebuilder:printcolumn:name="ProviderID",type="string",JSONPath=".spec.providerID",description="Provider ID" -// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.ready",description="Machine ready status" +// +kubebuilder:printcolumn:name="Ready",type="string",JSONPath=".status.initialization.provisioned",description="Machine ready status" // +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp",description="Time duration since creation of DockerMachine" // DockerMachine is the Schema for the dockermachines API. diff --git a/test/infrastructure/docker/api/v1beta2/zz_generated.deepcopy.go b/test/infrastructure/docker/api/v1beta2/zz_generated.deepcopy.go index 7e61f062e84f..46b800586222 100644 --- a/test/infrastructure/docker/api/v1beta2/zz_generated.deepcopy.go +++ b/test/infrastructure/docker/api/v1beta2/zz_generated.deepcopy.go @@ -24,7 +24,6 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" - "sigs.k8s.io/cluster-api/api/core/v1beta1" corev1beta2 "sigs.k8s.io/cluster-api/api/core/v1beta2" ) @@ -131,6 +130,26 @@ func (in *DevClusterDeprecatedStatus) DeepCopy() *DevClusterDeprecatedStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevClusterInitializationStatus) DeepCopyInto(out *DevClusterInitializationStatus) { + *out = *in + if in.Provisioned != nil { + in, out := &in.Provisioned, &out.Provisioned + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevClusterInitializationStatus. +func (in *DevClusterInitializationStatus) DeepCopy() *DevClusterInitializationStatus { + if in == nil { + return nil + } + out := new(DevClusterInitializationStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DevClusterList) DeepCopyInto(out *DevClusterList) { *out = *in @@ -190,11 +209,16 @@ func (in *DevClusterStatus) DeepCopyInto(out *DevClusterStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Initialization != nil { + in, out := &in.Initialization, &out.Initialization + *out = new(DevClusterInitializationStatus) + (*in).DeepCopyInto(*out) + } if in.FailureDomains != nil { in, out := &in.FailureDomains, &out.FailureDomains - *out = make(v1beta1.FailureDomains, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() + *out = make([]corev1beta2.FailureDomain, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } if in.Deprecated != nil { @@ -419,6 +443,26 @@ func (in *DevMachineDeprecatedStatus) DeepCopy() *DevMachineDeprecatedStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DevMachineInitializationStatus) DeepCopyInto(out *DevMachineInitializationStatus) { + *out = *in + if in.Provisioned != nil { + in, out := &in.Provisioned, &out.Provisioned + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DevMachineInitializationStatus. +func (in *DevMachineInitializationStatus) DeepCopy() *DevMachineInitializationStatus { + if in == nil { + return nil + } + out := new(DevMachineInitializationStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DevMachineList) DeepCopyInto(out *DevMachineList) { *out = *in @@ -482,6 +526,11 @@ func (in *DevMachineStatus) DeepCopyInto(out *DevMachineStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Initialization != nil { + in, out := &in.Initialization, &out.Initialization + *out = new(DevMachineInitializationStatus) + (*in).DeepCopyInto(*out) + } if in.Addresses != nil { in, out := &in.Addresses, &out.Addresses *out = make([]corev1beta2.MachineAddress, len(*in)) @@ -654,9 +703,9 @@ func (in *DockerClusterBackendSpec) DeepCopyInto(out *DockerClusterBackendSpec) *out = *in if in.FailureDomains != nil { in, out := &in.FailureDomains, &out.FailureDomains - *out = make(v1beta1.FailureDomains, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() + *out = make([]corev1beta2.FailureDomain, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) @@ -692,6 +741,26 @@ func (in *DockerClusterDeprecatedStatus) DeepCopy() *DockerClusterDeprecatedStat return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DockerClusterInitializationStatus) DeepCopyInto(out *DockerClusterInitializationStatus) { + *out = *in + if in.Provisioned != nil { + in, out := &in.Provisioned, &out.Provisioned + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DockerClusterInitializationStatus. +func (in *DockerClusterInitializationStatus) DeepCopy() *DockerClusterInitializationStatus { + if in == nil { + return nil + } + out := new(DockerClusterInitializationStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DockerClusterList) DeepCopyInto(out *DockerClusterList) { *out = *in @@ -730,9 +799,9 @@ func (in *DockerClusterSpec) DeepCopyInto(out *DockerClusterSpec) { out.ControlPlaneEndpoint = in.ControlPlaneEndpoint if in.FailureDomains != nil { in, out := &in.FailureDomains, &out.FailureDomains - *out = make(v1beta1.FailureDomains, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() + *out = make([]corev1beta2.FailureDomain, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } in.LoadBalancer.DeepCopyInto(&out.LoadBalancer) @@ -758,11 +827,16 @@ func (in *DockerClusterStatus) DeepCopyInto(out *DockerClusterStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Initialization != nil { + in, out := &in.Initialization, &out.Initialization + *out = new(DockerClusterInitializationStatus) + (*in).DeepCopyInto(*out) + } if in.FailureDomains != nil { in, out := &in.FailureDomains, &out.FailureDomains - *out = make(v1beta1.FailureDomains, len(*in)) - for key, val := range *in { - (*out)[key] = *val.DeepCopy() + *out = make([]corev1beta2.FailureDomain, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) } } if in.Deprecated != nil { @@ -1008,6 +1082,26 @@ func (in *DockerMachineDeprecatedStatus) DeepCopy() *DockerMachineDeprecatedStat return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DockerMachineInitializationStatus) DeepCopyInto(out *DockerMachineInitializationStatus) { + *out = *in + if in.Provisioned != nil { + in, out := &in.Provisioned, &out.Provisioned + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DockerMachineInitializationStatus. +func (in *DockerMachineInitializationStatus) DeepCopy() *DockerMachineInitializationStatus { + if in == nil { + return nil + } + out := new(DockerMachineInitializationStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *DockerMachineList) DeepCopyInto(out *DockerMachineList) { *out = *in @@ -1085,6 +1179,11 @@ func (in *DockerMachineStatus) DeepCopyInto(out *DockerMachineStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.Initialization != nil { + in, out := &in.Initialization, &out.Initialization + *out = new(DockerMachineInitializationStatus) + (*in).DeepCopyInto(*out) + } if in.Addresses != nil { in, out := &in.Addresses, &out.Addresses *out = make([]corev1beta2.MachineAddress, len(*in)) diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclusters.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclusters.yaml index 1654956d4eda..0f6e8e1fb056 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclusters.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclusters.yaml @@ -341,9 +341,14 @@ spec: containers. properties: failureDomains: - additionalProperties: + description: |- + failureDomains are usually not defined in the spec. + The docker provider is special since failure domains don't mean anything in a local docker environment. + Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API + controllers to do what they will with the defined failure domains. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -356,13 +361,20 @@ spec: description: controlPlane determines if this failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object - description: |- - failureDomains are usually not defined in the spec. - The docker provider is special since failure domains don't mean anything in a local docker environment. - Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map loadBalancer: description: loadBalancer allows defining configurations for the cluster load balancer. @@ -558,9 +570,13 @@ spec: type: object type: object failureDomains: - additionalProperties: + description: |- + failureDomains is a list of failure domain objects synced from the infrastructure provider. + It don't mean much in CAPD since it's all local, but we can see how the rest of cluster API + will use this if we populate it. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -573,15 +589,31 @@ spec: description: controlPlane determines if this failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + initialization: description: |- - failureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API - will use this if we populate it. + initialization provides observations of the DevCluster initialization process. + NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Cluster provisioning. + properties: + provisioned: + description: |- + provisioned is true when the infrastructure provider reports that the Cluster's infrastructure is fully provisioned. + NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Cluster provisioning. + type: boolean type: object - ready: - description: ready denotes that the dev cluster infrastructure is - ready. - type: boolean type: object type: object served: true diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclustertemplates.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclustertemplates.yaml index 2dca0a33f244..cc4eaf02295d 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclustertemplates.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devclustertemplates.yaml @@ -254,9 +254,14 @@ spec: using docker containers. properties: failureDomains: - additionalProperties: + description: |- + failureDomains are usually not defined in the spec. + The docker provider is special since failure domains don't mean anything in a local docker environment. + Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API + controllers to do what they will with the defined failure domains. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -271,13 +276,21 @@ spec: failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure + domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object - description: |- - failureDomains are usually not defined in the spec. - The docker provider is special since failure domains don't mean anything in a local docker environment. - Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map loadBalancer: description: loadBalancer allows defining configurations for the cluster load balancer. diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devmachines.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devmachines.yaml index dc13b6b8556f..5e6bfab6eaa2 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devmachines.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_devmachines.yaml @@ -411,7 +411,7 @@ spec: name: ProviderID type: string - description: Machine ready status - jsonPath: .status.ready + jsonPath: .status.initialization.provisioned name: Ready type: string - description: Time duration since creation of the DevMachine @@ -778,9 +778,17 @@ spec: type: array type: object type: object - ready: - description: ready denotes that the machine is ready - type: boolean + initialization: + description: |- + initialization provides observations of the DevMachine initialization process. + NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Machine provisioning. + properties: + provisioned: + description: |- + provisioned is true when the infrastructure provider reports that the Machine's infrastructure is fully provisioned. + NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Machine provisioning. + type: boolean + type: object type: object type: object served: true diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclusters.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclusters.yaml index d34f87bbcbf8..f193cdc59c67 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclusters.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclusters.yaml @@ -648,9 +648,14 @@ spec: - port type: object failureDomains: - additionalProperties: + description: |- + FailureDomains are usually not defined in the spec. + The docker provider is special since failure domains don't mean anything in a local docker environment. + Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API + controllers to do what they will with the defined failure domains. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -663,13 +668,20 @@ spec: description: controlPlane determines if this failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object - description: |- - FailureDomains are usually not defined in the spec. - The docker provider is special since failure domains don't mean anything in a local docker environment. - Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map loadBalancer: description: LoadBalancer allows defining configurations for the cluster load balancer. @@ -841,9 +853,13 @@ spec: type: object type: object failureDomains: - additionalProperties: + description: |- + failureDomains is a list of failure domain objects synced from the infrastructure provider. + It don't mean much in CAPD since it's all local, but we can see how the rest of cluster API + will use this if we populate it. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -856,15 +872,31 @@ spec: description: controlPlane determines if this failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + initialization: description: |- - FailureDomains don't mean much in CAPD since it's all local, but we can see how the rest of cluster API - will use this if we populate it. + initialization provides observations of the DockerCluster initialization process. + NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Cluster provisioning. + properties: + provisioned: + description: |- + provisioned is true when the infrastructure provider reports that the Cluster's infrastructure is fully provisioned. + NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Cluster provisioning. + type: boolean type: object - ready: - description: Ready denotes that the docker cluster (infrastructure) - is ready. - type: boolean type: object type: object served: true diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclustertemplates.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclustertemplates.yaml index 5061aa4e2012..e9eb27d6c5e5 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclustertemplates.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockerclustertemplates.yaml @@ -353,9 +353,14 @@ spec: - port type: object failureDomains: - additionalProperties: + description: |- + FailureDomains are usually not defined in the spec. + The docker provider is special since failure domains don't mean anything in a local docker environment. + Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API + controllers to do what they will with the defined failure domains. + items: description: |- - FailureDomainSpec is the Schema for Cluster API failure domains. + FailureDomain is the Schema for Cluster API failure domains. It allows controllers to understand how many failure domains a cluster can optionally span across. properties: attributes: @@ -368,13 +373,20 @@ spec: description: controlPlane determines if this failure domain is suitable for use by control plane machines. type: boolean + name: + description: name is the name of the failure domain. + maxLength: 256 + minLength: 1 + type: string + required: + - name type: object - description: |- - FailureDomains are usually not defined in the spec. - The docker provider is special since failure domains don't mean anything in a local docker environment. - Instead, the docker cluster controller will simply copy these into the Status and allow the Cluster API - controllers to do what they will with the defined failure domains. - type: object + maxItems: 100 + minItems: 1 + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map loadBalancer: description: LoadBalancer allows defining configurations for the cluster load balancer. diff --git a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockermachines.yaml b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockermachines.yaml index 725a5047bc4d..ae5ae4af9190 100644 --- a/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockermachines.yaml +++ b/test/infrastructure/docker/config/crd/bases/infrastructure.cluster.x-k8s.io_dockermachines.yaml @@ -611,7 +611,7 @@ spec: name: ProviderID type: string - description: Machine ready status - jsonPath: .status.ready + jsonPath: .status.initialization.provisioned name: Ready type: string - description: Time duration since creation of DockerMachine @@ -856,15 +856,22 @@ spec: type: array type: object type: object + initialization: + description: |- + initialization provides observations of the DockerMachine initialization process. + NOTE: Fields in this struct are part of the Cluster API contract and are used to orchestrate initial Machine provisioning. + properties: + provisioned: + description: |- + provisioned is true when the infrastructure provider reports that the Machine's infrastructure is fully provisioned. + NOTE: this field is part of the Cluster API contract, and it is used to orchestrate initial Machine provisioning. + type: boolean + type: object loadBalancerConfigured: description: |- LoadBalancerConfigured denotes that the machine has been added to the load balancer type: boolean - ready: - description: Ready denotes that the machine (docker container) is - ready - type: boolean type: object type: object served: true diff --git a/test/infrastructure/docker/config/crd/kustomization.yaml b/test/infrastructure/docker/config/crd/kustomization.yaml index bd8ea4af45c5..d7e348b9eaf2 100644 --- a/test/infrastructure/docker/config/crd/kustomization.yaml +++ b/test/infrastructure/docker/config/crd/kustomization.yaml @@ -1,6 +1,9 @@ labels: - pairs: - cluster.x-k8s.io/v1beta1: v1beta1_v1beta2 + # Note: This is needed so the topology reconciler can figure out + # the contract of v1beta1 when v1beta1 objects are used in ClusterClasses. + cluster.x-k8s.io/v1beta1: v1beta1 + cluster.x-k8s.io/v1beta2: v1beta2 # This kustomization.yaml is not intended to be run by itself, # since it depends on service name and namespace that are out of this kustomize package. diff --git a/test/infrastructure/docker/exp/internal/controllers/dockermachinepool_controller_phases.go b/test/infrastructure/docker/exp/internal/controllers/dockermachinepool_controller_phases.go index 2c92897687bc..8c9fa36b8846 100644 --- a/test/infrastructure/docker/exp/internal/controllers/dockermachinepool_controller_phases.go +++ b/test/infrastructure/docker/exp/internal/controllers/dockermachinepool_controller_phases.go @@ -27,6 +27,7 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/kind/pkg/cluster/constants" @@ -200,7 +201,8 @@ func (r *DockerMachinePoolReconciler) reconcileDockerMachines(ctx context.Contex for i := range orderedDockerMachines { dockerMachine := orderedDockerMachines[i] // TODO (v1beta2): test for v1beta2 conditions - if dockerMachine.Status.Ready || v1beta1conditions.IsTrue(&dockerMachine, clusterv1.ReadyV1Beta1Condition) { + initialization := dockerMachine.Status.Initialization + if initialization != nil && ptr.Deref(initialization.Provisioned, false) || v1beta1conditions.IsTrue(&dockerMachine, clusterv1.ReadyV1Beta1Condition) { totalReadyMachines++ } } @@ -385,10 +387,11 @@ func (r *DockerMachinePoolReconciler) getDeletionCandidates(ctx context.Context, return nil, nil, errors.Errorf("failed to find externalMachine for DockerMachine %s/%s", dockerMachine.Namespace, dockerMachine.Name) } + initialization := dockerMachine.Status.Initialization // TODO (v1beta2): test for v1beta2 conditions if !isMachineMatchingInfrastructureSpec(ctx, externalMachine, machinePool, dockerMachinePool) { outdatedMachines = append(outdatedMachines, dockerMachine) - } else if dockerMachine.Status.Ready || v1beta1conditions.IsTrue(&dockerMachine, clusterv1.ReadyV1Beta1Condition) { + } else if initialization != nil && ptr.Deref(initialization.Provisioned, false) || v1beta1conditions.IsTrue(&dockerMachine, clusterv1.ReadyV1Beta1Condition) { readyMatchingMachines = append(readyMatchingMachines, dockerMachine) } } diff --git a/test/infrastructure/docker/internal/controllers/backends/docker/dockercluster_backend.go b/test/infrastructure/docker/internal/controllers/backends/docker/dockercluster_backend.go index 3794e70238fa..febd7fcb1506 100644 --- a/test/infrastructure/docker/internal/controllers/backends/docker/dockercluster_backend.go +++ b/test/infrastructure/docker/internal/controllers/backends/docker/dockercluster_backend.go @@ -25,6 +25,7 @@ import ( "github.com/pkg/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -103,7 +104,9 @@ func (r *ClusterBackEndReconciler) ReconcileNormal(ctx context.Context, cluster } // Mark the dockerCluster ready - dockerCluster.Status.Ready = true + dockerCluster.Status.Initialization = &infrav1.DevClusterInitializationStatus{ + Provisioned: ptr.To(true), + } v1beta1conditions.MarkTrue(dockerCluster, infrav1.LoadBalancerAvailableV1Beta1Condition) conditions.Set(dockerCluster, metav1.Condition{ Type: infrav1.DevClusterDockerLoadBalancerAvailableCondition, diff --git a/test/infrastructure/docker/internal/controllers/backends/docker/dockermachine_backend.go b/test/infrastructure/docker/internal/controllers/backends/docker/dockermachine_backend.go index 8d2fe8622437..42c5a28d0ec2 100644 --- a/test/infrastructure/docker/internal/controllers/backends/docker/dockermachine_backend.go +++ b/test/infrastructure/docker/internal/controllers/backends/docker/dockermachine_backend.go @@ -27,6 +27,7 @@ import ( corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -117,7 +118,9 @@ func (r *MachineBackendReconciler) ReconcileNormal(ctx context.Context, cluster if dockerMachine.Spec.ProviderID != nil { // ensure ready state is set. // This is required after move, because status is not moved to the target cluster. - dockerMachine.Status.Ready = true + dockerMachine.Status.Initialization = &infrav1.DevMachineInitializationStatus{ + Provisioned: ptr.To(true), + } if externalMachine.Exists() { v1beta1conditions.MarkTrue(dockerMachine, infrav1.ContainerProvisionedV1Beta1Condition) @@ -361,7 +364,9 @@ func (r *MachineBackendReconciler) ReconcileNormal(ctx context.Context, cluster // Set ProviderID so the Cluster API Machine Controller can pull it providerID := externalMachine.ProviderID() dockerMachine.Spec.ProviderID = &providerID - dockerMachine.Status.Ready = true + dockerMachine.Status.Initialization = &infrav1.DevMachineInitializationStatus{ + Provisioned: ptr.To(true), + } return ctrl.Result{}, nil } diff --git a/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorycluster_backend.go b/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorycluster_backend.go index 32446bff6313..e88b0631d913 100644 --- a/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorycluster_backend.go +++ b/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorycluster_backend.go @@ -25,6 +25,7 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/klog/v2" + "k8s.io/utils/ptr" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" @@ -126,7 +127,9 @@ func (r *ClusterBackendReconciler) ReconcileNormal(ctx context.Context, cluster } // Mark the InMemoryCluster ready - inMemoryCluster.Status.Ready = true + inMemoryCluster.Status.Initialization = &infrav1.DevClusterInitializationStatus{ + Provisioned: ptr.To(true), + } return ctrl.Result{}, nil } diff --git a/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorymachine_backend.go b/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorymachine_backend.go index e63bf7234b0b..35c9e519dc2b 100644 --- a/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorymachine_backend.go +++ b/test/infrastructure/docker/internal/controllers/backends/inmemory/inmemorymachine_backend.go @@ -228,7 +228,9 @@ func (r *MachineBackendReconciler) reconcileNormalCloudMachine(ctx context.Conte // TODO: consider if to surface VM provisioned also on the cloud machine (currently it surfaces only on the inMemoryMachine) inMemoryMachine.Spec.ProviderID = ptr.To(calculateProviderID(inMemoryMachine)) - inMemoryMachine.Status.Ready = true + inMemoryMachine.Status.Initialization = &infrav1.DevMachineInitializationStatus{ + Provisioned: ptr.To(true), + } v1beta1conditions.MarkTrue(inMemoryMachine, infrav1.VMProvisionedCondition) conditions.Set(inMemoryMachine, metav1.Condition{ Type: infrav1.DevMachineInMemoryVMProvisionedCondition, diff --git a/test/infrastructure/docker/internal/controllers/dockercluster_controller.go b/test/infrastructure/docker/internal/controllers/dockercluster_controller.go index 223e56ef06f5..3f474edb349b 100644 --- a/test/infrastructure/docker/internal/controllers/dockercluster_controller.go +++ b/test/infrastructure/docker/internal/controllers/dockercluster_controller.go @@ -204,6 +204,13 @@ func dockerClusterToDevCluster(dockerCluster *infrav1.DockerCluster) *infrav1.De } } + var initialization *infrav1.DevClusterInitializationStatus + if dockerCluster.Status.Initialization != nil && dockerCluster.Status.Initialization.Provisioned != nil { + initialization = &infrav1.DevClusterInitializationStatus{ + Provisioned: dockerCluster.Status.Initialization.Provisioned, + } + } + return &infrav1.DevCluster{ ObjectMeta: dockerCluster.ObjectMeta, Spec: infrav1.DevClusterSpec{ @@ -216,7 +223,7 @@ func dockerClusterToDevCluster(dockerCluster *infrav1.DockerCluster) *infrav1.De }, }, Status: infrav1.DevClusterStatus{ - Ready: dockerCluster.Status.Ready, + Initialization: initialization, FailureDomains: dockerCluster.Status.FailureDomains, Conditions: dockerCluster.Status.Conditions, Deprecated: v1Beta1Status, @@ -234,11 +241,18 @@ func devClusterToDockerCluster(devCluster *infrav1.DevCluster, dockerCluster *in } } + var initialization *infrav1.DockerClusterInitializationStatus + if devCluster.Status.Initialization != nil && devCluster.Status.Initialization.Provisioned != nil { + initialization = &infrav1.DockerClusterInitializationStatus{ + Provisioned: devCluster.Status.Initialization.Provisioned, + } + } + dockerCluster.ObjectMeta = devCluster.ObjectMeta dockerCluster.Spec.ControlPlaneEndpoint = devCluster.Spec.ControlPlaneEndpoint dockerCluster.Spec.FailureDomains = devCluster.Spec.Backend.Docker.FailureDomains dockerCluster.Spec.LoadBalancer = devCluster.Spec.Backend.Docker.LoadBalancer - dockerCluster.Status.Ready = devCluster.Status.Ready + dockerCluster.Status.Initialization = initialization dockerCluster.Status.FailureDomains = devCluster.Status.FailureDomains dockerCluster.Status.Conditions = devCluster.Status.Conditions dockerCluster.Status.Deprecated = v1Beta1Status diff --git a/test/infrastructure/docker/internal/controllers/dockermachine_controller.go b/test/infrastructure/docker/internal/controllers/dockermachine_controller.go index cd340cdbdfb5..54fbdb2fc0c7 100644 --- a/test/infrastructure/docker/internal/controllers/dockermachine_controller.go +++ b/test/infrastructure/docker/internal/controllers/dockermachine_controller.go @@ -303,6 +303,13 @@ func dockerMachineToDevMachine(dockerMachine *infrav1.DockerMachine) *infrav1.De } } + var initialization *infrav1.DevMachineInitializationStatus + if dockerMachine.Status.Initialization != nil && dockerMachine.Status.Initialization.Provisioned != nil { + initialization = &infrav1.DevMachineInitializationStatus{ + Provisioned: dockerMachine.Status.Initialization.Provisioned, + } + } + return &infrav1.DevMachine{ ObjectMeta: dockerMachine.ObjectMeta, Spec: infrav1.DevMachineSpec{ @@ -318,10 +325,10 @@ func dockerMachineToDevMachine(dockerMachine *infrav1.DockerMachine) *infrav1.De }, }, Status: infrav1.DevMachineStatus{ - Ready: dockerMachine.Status.Ready, - Addresses: dockerMachine.Status.Addresses, - Conditions: dockerMachine.Status.Conditions, - Deprecated: v1Beta1Status, + Initialization: initialization, + Addresses: dockerMachine.Status.Addresses, + Conditions: dockerMachine.Status.Conditions, + Deprecated: v1Beta1Status, Backend: &infrav1.DevMachineBackendStatus{ Docker: &infrav1.DockerMachineBackendStatus{ LoadBalancerConfigured: dockerMachine.Status.LoadBalancerConfigured, @@ -341,6 +348,13 @@ func devMachineToDockerMachine(devMachine *infrav1.DevMachine, dockerMachine *in } } + var initialization *infrav1.DockerMachineInitializationStatus + if devMachine.Status.Initialization != nil && devMachine.Status.Initialization.Provisioned != nil { + initialization = &infrav1.DockerMachineInitializationStatus{ + Provisioned: devMachine.Status.Initialization.Provisioned, + } + } + dockerMachine.ObjectMeta = devMachine.ObjectMeta dockerMachine.Spec.ProviderID = devMachine.Spec.ProviderID dockerMachine.Spec.CustomImage = devMachine.Spec.Backend.Docker.CustomImage @@ -348,7 +362,7 @@ func devMachineToDockerMachine(devMachine *infrav1.DevMachine, dockerMachine *in dockerMachine.Spec.ExtraMounts = devMachine.Spec.Backend.Docker.ExtraMounts dockerMachine.Spec.Bootstrapped = devMachine.Spec.Backend.Docker.Bootstrapped dockerMachine.Spec.BootstrapTimeout = devMachine.Spec.Backend.Docker.BootstrapTimeout - dockerMachine.Status.Ready = devMachine.Status.Ready + dockerMachine.Status.Initialization = initialization dockerMachine.Status.Addresses = devMachine.Status.Addresses dockerMachine.Status.Conditions = devMachine.Status.Conditions dockerMachine.Status.Deprecated = v1Beta1Status diff --git a/test/infrastructure/docker/internal/webhooks/devcluster_webhook.go b/test/infrastructure/docker/internal/webhooks/devcluster_webhook.go index 43772921500d..75ec1038c356 100644 --- a/test/infrastructure/docker/internal/webhooks/devcluster_webhook.go +++ b/test/infrastructure/docker/internal/webhooks/devcluster_webhook.go @@ -19,6 +19,8 @@ package webhooks import ( "context" "fmt" + "slices" + "sort" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -72,7 +74,14 @@ func (webhook *DevCluster) ValidateCreate(_ context.Context, obj runtime.Object) } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type. -func (webhook *DevCluster) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { +func (webhook *DevCluster) ValidateUpdate(_ context.Context, _, newObj runtime.Object) (admission.Warnings, error) { + cluster, ok := newObj.(*infrav1.DevCluster) + if !ok { + return nil, apierrors.NewBadRequest(fmt.Sprintf("expected a DevCluster but got a %T", newObj)) + } + if allErrs := validateDevClusterSpec(cluster.Spec); len(allErrs) > 0 { + return nil, apierrors.NewInvalid(infrav1.GroupVersion.WithKind("DevCluster").GroupKind(), cluster.Name, allErrs) + } return nil, nil } @@ -94,6 +103,20 @@ func defaultDevClusterSpec(s *infrav1.DevClusterSpec) { } } -func validateDevClusterSpec(_ infrav1.DevClusterSpec) field.ErrorList { +func validateDevClusterSpec(spec infrav1.DevClusterSpec) field.ErrorList { + // Only validate the Docker backend if it is set. + if spec.Backend.Docker == nil { + return nil + } + domainNames := make([]string, 0, len(spec.Backend.Docker.FailureDomains)) + for _, fd := range spec.Backend.Docker.FailureDomains { + domainNames = append(domainNames, fd.Name) + } + originalDomainNames := slices.Clone(domainNames) + sort.Strings(domainNames) + if !slices.Equal(originalDomainNames, domainNames) { + return field.ErrorList{field.Invalid(field.NewPath("spec", "backend", "docker", "failureDomains"), spec.Backend.Docker.FailureDomains, "failure domains must be sorted by name")} + } + return nil } diff --git a/test/infrastructure/docker/internal/webhooks/dockercluster_webhook.go b/test/infrastructure/docker/internal/webhooks/dockercluster_webhook.go index b2caba4959be..7af4a48a7d18 100644 --- a/test/infrastructure/docker/internal/webhooks/dockercluster_webhook.go +++ b/test/infrastructure/docker/internal/webhooks/dockercluster_webhook.go @@ -19,6 +19,8 @@ package webhooks import ( "context" "fmt" + "slices" + "sort" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" @@ -72,7 +74,14 @@ func (webhook *DockerCluster) ValidateCreate(_ context.Context, obj runtime.Obje } // ValidateUpdate implements webhook.Validator so a webhook will be registered for the type. -func (webhook *DockerCluster) ValidateUpdate(_ context.Context, _, _ runtime.Object) (admission.Warnings, error) { +func (webhook *DockerCluster) ValidateUpdate(_ context.Context, _, newObj runtime.Object) (admission.Warnings, error) { + cluster, ok := newObj.(*infrav1.DockerCluster) + if !ok { + return nil, apierrors.NewBadRequest(fmt.Sprintf("expected a DockerCluster but got a %T", newObj)) + } + if allErrs := validateDockerClusterSpec(cluster.Spec); len(allErrs) > 0 { + return nil, apierrors.NewInvalid(infrav1.GroupVersion.WithKind("DockerCluster").GroupKind(), cluster.Name, allErrs) + } return nil, nil } @@ -87,6 +96,15 @@ func defaultDockerClusterSpec(s *infrav1.DockerClusterSpec) { } } -func validateDockerClusterSpec(_ infrav1.DockerClusterSpec) field.ErrorList { +func validateDockerClusterSpec(spec infrav1.DockerClusterSpec) field.ErrorList { + domainNames := make([]string, 0, len(spec.FailureDomains)) + for _, fd := range spec.FailureDomains { + domainNames = append(domainNames, fd.Name) + } + originalDomainNames := slices.Clone(domainNames) + sort.Strings(domainNames) + if !slices.Equal(originalDomainNames, domainNames) { + return field.ErrorList{field.Invalid(field.NewPath("spec", "failureDomains"), spec.FailureDomains, "failure domains must be sorted by name")} + } return nil }