From 0f7e22dba4c1b970dfa64c76e236285362a3eb1f Mon Sep 17 00:00:00 2001 From: Stefan Bueringer Date: Fri, 3 Dec 2021 17:54:12 +0100 Subject: [PATCH] KCP: remove redundant and unused KubeadmControlPlaneTemplate fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Büringer buringerst@vmware.com --- .../kubeadm/api/v1alpha3/conversion.go | 40 +++--- .../kubeadm/api/v1alpha4/conversion.go | 107 ++++++++++---- .../kubeadm/api/v1alpha4/conversion_test.go | 17 ++- .../api/v1alpha4/zz_generated.conversion.go | 14 +- .../v1beta1/kubeadm_control_plane_webhook.go | 134 ++++++++++-------- .../kubeadmcontrolplanetemplate_types.go | 47 +++++- .../kubeadmcontrolplanetemplate_webhook.go | 12 +- ...ubeadmcontrolplanetemplate_webhook_test.go | 29 +--- .../api/v1beta1/zz_generated.deepcopy.go | 50 +++++++ ...x-k8s.io_kubeadmcontrolplanetemplates.yaml | 85 +---------- .../v1beta1/clusterclass-quick-start.yaml | 12 -- 11 files changed, 322 insertions(+), 225 deletions(-) diff --git a/controlplane/kubeadm/api/v1alpha3/conversion.go b/controlplane/kubeadm/api/v1alpha3/conversion.go index 54056351266f..3fe3138fdda1 100644 --- a/controlplane/kubeadm/api/v1alpha3/conversion.go +++ b/controlplane/kubeadm/api/v1alpha3/conversion.go @@ -25,10 +25,10 @@ import ( utilconversion "sigs.k8s.io/cluster-api/util/conversion" ) -func (src *KubeadmControlPlane) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlane) +func (src *KubeadmControlPlane) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlane) - if err := Convert_v1alpha3_KubeadmControlPlane_To_v1beta1_KubeadmControlPlane(src, dest, nil); err != nil { + if err := Convert_v1alpha3_KubeadmControlPlane_To_v1beta1_KubeadmControlPlane(src, dst, nil); err != nil { return err } @@ -38,53 +38,53 @@ func (src *KubeadmControlPlane) ConvertTo(destRaw conversion.Hub) error { return err } - dest.Spec.MachineTemplate.ObjectMeta = restored.Spec.MachineTemplate.ObjectMeta - dest.Status.Version = restored.Status.Version + dst.Spec.MachineTemplate.ObjectMeta = restored.Spec.MachineTemplate.ObjectMeta + dst.Status.Version = restored.Status.Version if restored.Spec.KubeadmConfigSpec.JoinConfiguration != nil && restored.Spec.KubeadmConfigSpec.JoinConfiguration.NodeRegistration.IgnorePreflightErrors != nil { - if dest.Spec.KubeadmConfigSpec.JoinConfiguration == nil { - dest.Spec.KubeadmConfigSpec.JoinConfiguration = &kubeadmbootstrapv1.JoinConfiguration{} + if dst.Spec.KubeadmConfigSpec.JoinConfiguration == nil { + dst.Spec.KubeadmConfigSpec.JoinConfiguration = &kubeadmbootstrapv1.JoinConfiguration{} } - dest.Spec.KubeadmConfigSpec.JoinConfiguration.NodeRegistration.IgnorePreflightErrors = restored.Spec.KubeadmConfigSpec.JoinConfiguration.NodeRegistration.IgnorePreflightErrors + dst.Spec.KubeadmConfigSpec.JoinConfiguration.NodeRegistration.IgnorePreflightErrors = restored.Spec.KubeadmConfigSpec.JoinConfiguration.NodeRegistration.IgnorePreflightErrors } if restored.Spec.KubeadmConfigSpec.InitConfiguration != nil && restored.Spec.KubeadmConfigSpec.InitConfiguration.NodeRegistration.IgnorePreflightErrors != nil { - if dest.Spec.KubeadmConfigSpec.InitConfiguration == nil { - dest.Spec.KubeadmConfigSpec.InitConfiguration = &kubeadmbootstrapv1.InitConfiguration{} + if dst.Spec.KubeadmConfigSpec.InitConfiguration == nil { + dst.Spec.KubeadmConfigSpec.InitConfiguration = &kubeadmbootstrapv1.InitConfiguration{} } - dest.Spec.KubeadmConfigSpec.InitConfiguration.NodeRegistration.IgnorePreflightErrors = restored.Spec.KubeadmConfigSpec.InitConfiguration.NodeRegistration.IgnorePreflightErrors + dst.Spec.KubeadmConfigSpec.InitConfiguration.NodeRegistration.IgnorePreflightErrors = restored.Spec.KubeadmConfigSpec.InitConfiguration.NodeRegistration.IgnorePreflightErrors } - dest.Spec.KubeadmConfigSpec.Ignition = restored.Spec.KubeadmConfigSpec.Ignition + dst.Spec.KubeadmConfigSpec.Ignition = restored.Spec.KubeadmConfigSpec.Ignition return nil } -func (dest *KubeadmControlPlane) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlane) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlane) - if err := Convert_v1beta1_KubeadmControlPlane_To_v1alpha3_KubeadmControlPlane(src, dest, nil); err != nil { + if err := Convert_v1beta1_KubeadmControlPlane_To_v1alpha3_KubeadmControlPlane(src, dst, nil); err != nil { return err } // Preserve Hub data on down-conversion except for metadata - if err := utilconversion.MarshalData(src, dest); err != nil { + if err := utilconversion.MarshalData(src, dst); err != nil { return err } return nil } -func (src *KubeadmControlPlaneList) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlaneList) +func (src *KubeadmControlPlaneList) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlaneList) - return Convert_v1alpha3_KubeadmControlPlaneList_To_v1beta1_KubeadmControlPlaneList(src, dest, nil) + return Convert_v1alpha3_KubeadmControlPlaneList_To_v1beta1_KubeadmControlPlaneList(src, dst, nil) } -func (dest *KubeadmControlPlaneList) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlaneList) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlaneList) - return Convert_v1beta1_KubeadmControlPlaneList_To_v1alpha3_KubeadmControlPlaneList(src, dest, nil) + return Convert_v1beta1_KubeadmControlPlaneList_To_v1alpha3_KubeadmControlPlaneList(src, dst, nil) } func Convert_v1beta1_KubeadmControlPlaneSpec_To_v1alpha3_KubeadmControlPlaneSpec(in *v1beta1.KubeadmControlPlaneSpec, out *KubeadmControlPlaneSpec, s apiconversion.Scope) error { diff --git a/controlplane/kubeadm/api/v1alpha4/conversion.go b/controlplane/kubeadm/api/v1alpha4/conversion.go index 84bd401606fc..4ecc9ff3eb69 100644 --- a/controlplane/kubeadm/api/v1alpha4/conversion.go +++ b/controlplane/kubeadm/api/v1alpha4/conversion.go @@ -17,16 +17,18 @@ limitations under the License. package v1alpha4 import ( + apiconversion "k8s.io/apimachinery/pkg/conversion" "sigs.k8s.io/controller-runtime/pkg/conversion" + kubeadmbootstrapv1alpha4 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1alpha4" "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" utilconversion "sigs.k8s.io/cluster-api/util/conversion" ) -func (src *KubeadmControlPlane) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlane) +func (src *KubeadmControlPlane) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlane) - if err := Convert_v1alpha4_KubeadmControlPlane_To_v1beta1_KubeadmControlPlane(src, dest, nil); err != nil { + if err := Convert_v1alpha4_KubeadmControlPlane_To_v1beta1_KubeadmControlPlane(src, dst, nil); err != nil { return err } @@ -36,38 +38,38 @@ func (src *KubeadmControlPlane) ConvertTo(destRaw conversion.Hub) error { return err } - dest.Spec.KubeadmConfigSpec.Ignition = restored.Spec.KubeadmConfigSpec.Ignition + dst.Spec.KubeadmConfigSpec.Ignition = restored.Spec.KubeadmConfigSpec.Ignition return nil } -func (dest *KubeadmControlPlane) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlane) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlane) - if err := Convert_v1beta1_KubeadmControlPlane_To_v1alpha4_KubeadmControlPlane(src, dest, nil); err != nil { + if err := Convert_v1beta1_KubeadmControlPlane_To_v1alpha4_KubeadmControlPlane(src, dst, nil); err != nil { return err } // Preserve Hub data on down-conversion except for metadata - return utilconversion.MarshalData(src, dest) + return utilconversion.MarshalData(src, dst) } -func (src *KubeadmControlPlaneList) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlaneList) +func (src *KubeadmControlPlaneList) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlaneList) - return Convert_v1alpha4_KubeadmControlPlaneList_To_v1beta1_KubeadmControlPlaneList(src, dest, nil) + return Convert_v1alpha4_KubeadmControlPlaneList_To_v1beta1_KubeadmControlPlaneList(src, dst, nil) } -func (dest *KubeadmControlPlaneList) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlaneList) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlaneList) - return Convert_v1beta1_KubeadmControlPlaneList_To_v1alpha4_KubeadmControlPlaneList(src, dest, nil) + return Convert_v1beta1_KubeadmControlPlaneList_To_v1alpha4_KubeadmControlPlaneList(src, dst, nil) } -func (src *KubeadmControlPlaneTemplate) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlaneTemplate) +func (src *KubeadmControlPlaneTemplate) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlaneTemplate) - if err := Convert_v1alpha4_KubeadmControlPlaneTemplate_To_v1beta1_KubeadmControlPlaneTemplate(src, dest, nil); err != nil { + if err := Convert_v1alpha4_KubeadmControlPlaneTemplate_To_v1beta1_KubeadmControlPlaneTemplate(src, dst, nil); err != nil { return err } @@ -77,30 +79,87 @@ func (src *KubeadmControlPlaneTemplate) ConvertTo(destRaw conversion.Hub) error return err } - dest.Spec.Template.Spec.KubeadmConfigSpec.Ignition = restored.Spec.Template.Spec.KubeadmConfigSpec.Ignition + dst.Spec.Template.Spec.KubeadmConfigSpec.Ignition = restored.Spec.Template.Spec.KubeadmConfigSpec.Ignition + dst.Spec.Template.Spec.MachineTemplate = restored.Spec.Template.Spec.MachineTemplate return nil } -func (dest *KubeadmControlPlaneTemplate) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlaneTemplate) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlaneTemplate) - if err := Convert_v1beta1_KubeadmControlPlaneTemplate_To_v1alpha4_KubeadmControlPlaneTemplate(src, dest, nil); err != nil { + if err := Convert_v1beta1_KubeadmControlPlaneTemplate_To_v1alpha4_KubeadmControlPlaneTemplate(src, dst, nil); err != nil { return err } // Preserve Hub data on down-conversion except for metadata - return utilconversion.MarshalData(src, dest) + return utilconversion.MarshalData(src, dst) } -func (src *KubeadmControlPlaneTemplateList) ConvertTo(destRaw conversion.Hub) error { - dest := destRaw.(*v1beta1.KubeadmControlPlaneTemplateList) +func (src *KubeadmControlPlaneTemplateList) ConvertTo(dstRaw conversion.Hub) error { + dst := dstRaw.(*v1beta1.KubeadmControlPlaneTemplateList) - return Convert_v1alpha4_KubeadmControlPlaneTemplateList_To_v1beta1_KubeadmControlPlaneTemplateList(src, dest, nil) + return Convert_v1alpha4_KubeadmControlPlaneTemplateList_To_v1beta1_KubeadmControlPlaneTemplateList(src, dst, nil) } -func (dest *KubeadmControlPlaneTemplateList) ConvertFrom(srcRaw conversion.Hub) error { +func (dst *KubeadmControlPlaneTemplateList) ConvertFrom(srcRaw conversion.Hub) error { src := srcRaw.(*v1beta1.KubeadmControlPlaneTemplateList) - return Convert_v1beta1_KubeadmControlPlaneTemplateList_To_v1alpha4_KubeadmControlPlaneTemplateList(src, dest, nil) + return Convert_v1beta1_KubeadmControlPlaneTemplateList_To_v1alpha4_KubeadmControlPlaneTemplateList(src, dst, nil) +} + +func Convert_v1alpha4_KubeadmControlPlaneSpec_To_v1beta1_KubeadmControlPlaneTemplateResourceSpec(in *KubeadmControlPlaneSpec, out *v1beta1.KubeadmControlPlaneTemplateResourceSpec, s apiconversion.Scope) error { + out.MachineTemplate = &v1beta1.KubeadmControlPlaneTemplateMachineTemplate{ + NodeDrainTimeout: in.MachineTemplate.NodeDrainTimeout, + } + + if err := kubeadmbootstrapv1alpha4.Convert_v1alpha4_KubeadmConfigSpec_To_v1beta1_KubeadmConfigSpec(&in.KubeadmConfigSpec, &out.KubeadmConfigSpec, s); err != nil { + return err + } + + out.RolloutAfter = in.RolloutAfter + + if in.RolloutStrategy != nil { + out.RolloutStrategy = &v1beta1.RolloutStrategy{} + if len(in.RolloutStrategy.Type) > 0 { + out.RolloutStrategy.Type = v1beta1.RolloutStrategyType(in.RolloutStrategy.Type) + } + if in.RolloutStrategy.RollingUpdate != nil { + out.RolloutStrategy.RollingUpdate = &v1beta1.RollingUpdate{} + + if in.RolloutStrategy.RollingUpdate.MaxSurge != nil { + out.RolloutStrategy.RollingUpdate.MaxSurge = in.RolloutStrategy.RollingUpdate.MaxSurge + } + } + } + + return nil +} + +func Convert_v1beta1_KubeadmControlPlaneTemplateResourceSpec_To_v1alpha4_KubeadmControlPlaneSpec(in *v1beta1.KubeadmControlPlaneTemplateResourceSpec, out *KubeadmControlPlaneSpec, s apiconversion.Scope) error { + if in.MachineTemplate != nil { + out.MachineTemplate.NodeDrainTimeout = in.MachineTemplate.NodeDrainTimeout + } + + if err := kubeadmbootstrapv1alpha4.Convert_v1beta1_KubeadmConfigSpec_To_v1alpha4_KubeadmConfigSpec(&in.KubeadmConfigSpec, &out.KubeadmConfigSpec, s); err != nil { + return err + } + + out.RolloutAfter = in.RolloutAfter + + if in.RolloutStrategy != nil { + out.RolloutStrategy = &RolloutStrategy{} + if len(in.RolloutStrategy.Type) > 0 { + out.RolloutStrategy.Type = RolloutStrategyType(in.RolloutStrategy.Type) + } + if in.RolloutStrategy.RollingUpdate != nil { + out.RolloutStrategy.RollingUpdate = &RollingUpdate{} + + if in.RolloutStrategy.RollingUpdate.MaxSurge != nil { + out.RolloutStrategy.RollingUpdate.MaxSurge = in.RolloutStrategy.RollingUpdate.MaxSurge + } + } + } + + return nil } diff --git a/controlplane/kubeadm/api/v1alpha4/conversion_test.go b/controlplane/kubeadm/api/v1alpha4/conversion_test.go index 8b2dc55143b7..2821468c59ab 100644 --- a/controlplane/kubeadm/api/v1alpha4/conversion_test.go +++ b/controlplane/kubeadm/api/v1alpha4/conversion_test.go @@ -20,10 +20,12 @@ import ( "testing" fuzz "github.com/google/gofuzz" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/apitesting/fuzzer" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" - "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1alpha4" + clusterv1alpha4 "sigs.k8s.io/cluster-api/api/v1alpha4" + cabpkv1alpha4 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1alpha4" cabpkv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" "sigs.k8s.io/cluster-api/bootstrap/kubeadm/types/upstreamv1beta1" "sigs.k8s.io/cluster-api/controlplane/kubeadm/api/v1beta1" @@ -65,6 +67,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} { cabpkBootstrapTokenStringFuzzer, dnsFuzzer, kubeadmBootstrapTokenStringFuzzerV1Alpha4, + kubeadmControlPlaneTemplateResourceSpecFuzzerV1Alpha4, } } @@ -85,7 +88,17 @@ func dnsFuzzer(obj *upstreamv1beta1.DNS, c fuzz.Continue) { obj.Type = "" } -func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *v1alpha4.BootstrapTokenString, c fuzz.Continue) { +func kubeadmBootstrapTokenStringFuzzerV1Alpha4(in *cabpkv1alpha4.BootstrapTokenString, c fuzz.Continue) { in.ID = fakeID in.Secret = fakeSecret } + +func kubeadmControlPlaneTemplateResourceSpecFuzzerV1Alpha4(in *KubeadmControlPlaneTemplateResource, c fuzz.Continue) { + c.Fuzz(in) + + // Fields have been dropped in KCPTemplate. + in.Spec.Replicas = nil + in.Spec.Version = "" + in.Spec.MachineTemplate.ObjectMeta = clusterv1alpha4.ObjectMeta{} + in.Spec.MachineTemplate.InfrastructureRef = corev1.ObjectReference{} +} diff --git a/controlplane/kubeadm/api/v1alpha4/zz_generated.conversion.go b/controlplane/kubeadm/api/v1alpha4/zz_generated.conversion.go index a42a35fb5271..eec854984534 100644 --- a/controlplane/kubeadm/api/v1alpha4/zz_generated.conversion.go +++ b/controlplane/kubeadm/api/v1alpha4/zz_generated.conversion.go @@ -152,6 +152,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*KubeadmControlPlaneSpec)(nil), (*v1beta1.KubeadmControlPlaneTemplateResourceSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha4_KubeadmControlPlaneSpec_To_v1beta1_KubeadmControlPlaneTemplateResourceSpec(a.(*KubeadmControlPlaneSpec), b.(*v1beta1.KubeadmControlPlaneTemplateResourceSpec), scope) + }); err != nil { + return err + } + if err := s.AddConversionFunc((*v1beta1.KubeadmControlPlaneTemplateResourceSpec)(nil), (*KubeadmControlPlaneSpec)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_KubeadmControlPlaneTemplateResourceSpec_To_v1alpha4_KubeadmControlPlaneSpec(a.(*v1beta1.KubeadmControlPlaneTemplateResourceSpec), b.(*KubeadmControlPlaneSpec), scope) + }); err != nil { + return err + } return nil } @@ -426,7 +436,7 @@ func Convert_v1beta1_KubeadmControlPlaneTemplateList_To_v1alpha4_KubeadmControlP } func autoConvert_v1alpha4_KubeadmControlPlaneTemplateResource_To_v1beta1_KubeadmControlPlaneTemplateResource(in *KubeadmControlPlaneTemplateResource, out *v1beta1.KubeadmControlPlaneTemplateResource, s conversion.Scope) error { - if err := Convert_v1alpha4_KubeadmControlPlaneSpec_To_v1beta1_KubeadmControlPlaneSpec(&in.Spec, &out.Spec, s); err != nil { + if err := Convert_v1alpha4_KubeadmControlPlaneSpec_To_v1beta1_KubeadmControlPlaneTemplateResourceSpec(&in.Spec, &out.Spec, s); err != nil { return err } return nil @@ -438,7 +448,7 @@ func Convert_v1alpha4_KubeadmControlPlaneTemplateResource_To_v1beta1_KubeadmCont } func autoConvert_v1beta1_KubeadmControlPlaneTemplateResource_To_v1alpha4_KubeadmControlPlaneTemplateResource(in *v1beta1.KubeadmControlPlaneTemplateResource, out *KubeadmControlPlaneTemplateResource, s conversion.Scope) error { - if err := Convert_v1beta1_KubeadmControlPlaneSpec_To_v1alpha4_KubeadmControlPlaneSpec(&in.Spec, &out.Spec, s); err != nil { + if err := Convert_v1beta1_KubeadmControlPlaneTemplateResourceSpec_To_v1alpha4_KubeadmControlPlaneSpec(&in.Spec, &out.Spec, s); err != nil { return err } return nil diff --git a/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook.go b/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook.go index 7e68b62e4978..053c6104eb54 100644 --- a/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook.go +++ b/controlplane/kubeadm/api/v1beta1/kubeadm_control_plane_webhook.go @@ -32,6 +32,7 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/webhook" + cabpkv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" "sigs.k8s.io/cluster-api/util/container" "sigs.k8s.io/cluster-api/util/version" ) @@ -67,31 +68,37 @@ func defaultKubeadmControlPlaneSpec(s *KubeadmControlPlaneSpec, namespace string s.Version = "v" + s.Version } + s.RolloutStrategy = defaultRolloutStrategy(s.RolloutStrategy) +} + +func defaultRolloutStrategy(rolloutStrategy *RolloutStrategy) *RolloutStrategy { ios1 := intstr.FromInt(1) - if s.RolloutStrategy == nil { - s.RolloutStrategy = &RolloutStrategy{} + if rolloutStrategy == nil { + rolloutStrategy = &RolloutStrategy{} } // Enforce RollingUpdate strategy and default MaxSurge if not set. - if s.RolloutStrategy != nil { - if len(s.RolloutStrategy.Type) == 0 { - s.RolloutStrategy.Type = RollingUpdateStrategyType + if rolloutStrategy != nil { + if len(rolloutStrategy.Type) == 0 { + rolloutStrategy.Type = RollingUpdateStrategyType } - if s.RolloutStrategy.Type == RollingUpdateStrategyType { - if s.RolloutStrategy.RollingUpdate == nil { - s.RolloutStrategy.RollingUpdate = &RollingUpdate{} + if rolloutStrategy.Type == RollingUpdateStrategyType { + if rolloutStrategy.RollingUpdate == nil { + rolloutStrategy.RollingUpdate = &RollingUpdate{} } - s.RolloutStrategy.RollingUpdate.MaxSurge = intstr.ValueOrDefault(s.RolloutStrategy.RollingUpdate.MaxSurge, ios1) + rolloutStrategy.RollingUpdate.MaxSurge = intstr.ValueOrDefault(rolloutStrategy.RollingUpdate.MaxSurge, ios1) } } + + return rolloutStrategy } // ValidateCreate implements webhook.Validator so a webhook will be registered for the type. func (in *KubeadmControlPlane) ValidateCreate() error { spec := in.Spec allErrs := validateKubeadmControlPlaneSpec(spec, in.Namespace, field.NewPath("spec")) - allErrs = append(allErrs, validateEtcd(&spec, nil)...) + allErrs = append(allErrs, validateClusterConfiguration(spec.KubeadmConfigSpec.ClusterConfiguration, nil, field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration"))...) allErrs = append(allErrs, in.Spec.KubeadmConfigSpec.Validate()...) if len(allErrs) > 0 { return apierrors.NewInvalid(GroupVersion.WithKind("KubeadmControlPlane").GroupKind(), in.Name, allErrs) @@ -193,7 +200,7 @@ func (in *KubeadmControlPlane) ValidateUpdate(old runtime.Object) error { } allErrs = append(allErrs, in.validateVersion(prev.Spec.Version)...) - allErrs = append(allErrs, validateEtcd(&in.Spec, &prev.Spec)...) + allErrs = append(allErrs, validateClusterConfiguration(in.Spec.KubeadmConfigSpec.ClusterConfiguration, prev.Spec.KubeadmConfigSpec.ClusterConfiguration, field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration"))...) allErrs = append(allErrs, in.validateCoreDNSVersion(prev)...) allErrs = append(allErrs, in.Spec.KubeadmConfigSpec.Validate()...) @@ -292,51 +299,47 @@ func validateKubeadmControlPlaneSpec(s KubeadmControlPlaneSpec, namespace string allErrs = append(allErrs, field.Invalid(pathPrefix.Child("version"), s.Version, "must be a valid semantic version")) } - if s.RolloutStrategy != nil { - if s.RolloutStrategy.Type != RollingUpdateStrategyType { - allErrs = append( - allErrs, - field.Required( - pathPrefix.Child("rolloutStrategy", "type"), - "only RollingUpdateStrategyType is supported", - ), - ) - } + allErrs = append(allErrs, validateRolloutStrategy(s.RolloutStrategy, s.Replicas, pathPrefix.Child("rolloutStrategy"))...) - ios1 := intstr.FromInt(1) - ios0 := intstr.FromInt(0) + return allErrs +} - if *s.RolloutStrategy.RollingUpdate.MaxSurge == ios0 && *s.Replicas < int32(3) { - allErrs = append( - allErrs, - field.Required( - pathPrefix.Child("rolloutStrategy", "rollingUpdate"), - "when KubeadmControlPlane is configured to scale-in, replica count needs to be at least 3", - ), - ) - } +func validateRolloutStrategy(rolloutStrategy *RolloutStrategy, replicas *int32, pathPrefix *field.Path) field.ErrorList { + allErrs := field.ErrorList{} - if *s.RolloutStrategy.RollingUpdate.MaxSurge != ios1 && *s.RolloutStrategy.RollingUpdate.MaxSurge != ios0 { - allErrs = append( - allErrs, - field.Required( - pathPrefix.Child("rolloutStrategy", "rollingUpdate", "maxSurge"), - "value must be 1 or 0", - ), - ) - } + if rolloutStrategy == nil { + return allErrs } - if s.KubeadmConfigSpec.ClusterConfiguration == nil { - return allErrs + if rolloutStrategy.Type != RollingUpdateStrategyType { + allErrs = append( + allErrs, + field.Required( + pathPrefix.Child("type"), + "only RollingUpdateStrategyType is supported", + ), + ) } - // TODO: Remove when kubeadm types include OpenAPI validation - if !container.ImageTagIsValid(s.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageTag) { + + ios1 := intstr.FromInt(1) + ios0 := intstr.FromInt(0) + + if *rolloutStrategy.RollingUpdate.MaxSurge == ios0 && (replicas != nil && *replicas < int32(3)) { allErrs = append( allErrs, - field.Forbidden( - pathPrefix.Child("kubeadmConfigSpec", "clusterConfiguration", "dns", "imageTag"), - fmt.Sprintf("tag %s is invalid", s.KubeadmConfigSpec.ClusterConfiguration.DNS.ImageTag), + field.Required( + pathPrefix.Child("rollingUpdate"), + "when KubeadmControlPlane is configured to scale-in, replica count needs to be at least 3", + ), + ) + } + + if *rolloutStrategy.RollingUpdate.MaxSurge != ios1 && *rolloutStrategy.RollingUpdate.MaxSurge != ios0 { + allErrs = append( + allErrs, + field.Required( + pathPrefix.Child("rollingUpdate", "maxSurge"), + "value must be 1 or 0", ), ) } @@ -344,51 +347,62 @@ func validateKubeadmControlPlaneSpec(s KubeadmControlPlaneSpec, namespace string return allErrs } -func validateEtcd(s, prev *KubeadmControlPlaneSpec) field.ErrorList { +func validateClusterConfiguration(newClusterConfiguration, oldClusterConfiguration *cabpkv1.ClusterConfiguration, pathPrefix *field.Path) field.ErrorList { allErrs := field.ErrorList{} - if s.KubeadmConfigSpec.ClusterConfiguration == nil { + if newClusterConfiguration == nil { return allErrs } // TODO: Remove when kubeadm types include OpenAPI validation - if s.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local != nil && !container.ImageTagIsValid(s.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageTag) { + if !container.ImageTagIsValid(newClusterConfiguration.DNS.ImageTag) { + allErrs = append( + allErrs, + field.Forbidden( + pathPrefix.Child("dns", "imageTag"), + fmt.Sprintf("tag %s is invalid", newClusterConfiguration.DNS.ImageTag), + ), + ) + } + + // TODO: Remove when kubeadm types include OpenAPI validation + if newClusterConfiguration.Etcd.Local != nil && !container.ImageTagIsValid(newClusterConfiguration.Etcd.Local.ImageTag) { allErrs = append( allErrs, field.Forbidden( - field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration", "etcd", "local", "imageTag"), - fmt.Sprintf("tag %s is invalid", s.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local.ImageTag), + pathPrefix.Child("etcd", "local", "imageTag"), + fmt.Sprintf("tag %s is invalid", newClusterConfiguration.Etcd.Local.ImageTag), ), ) } - if s.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local != nil && s.KubeadmConfigSpec.ClusterConfiguration.Etcd.External != nil { + if newClusterConfiguration.Etcd.Local != nil && newClusterConfiguration.Etcd.External != nil { allErrs = append( allErrs, field.Forbidden( - field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration", "etcd", "local"), + pathPrefix.Child("etcd", "local"), "cannot have both external and local etcd", ), ) } // update validations - if prev != nil && prev.KubeadmConfigSpec.ClusterConfiguration != nil { - if s.KubeadmConfigSpec.ClusterConfiguration.Etcd.External != nil && prev.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local != nil { + if oldClusterConfiguration != nil { + if newClusterConfiguration.Etcd.External != nil && oldClusterConfiguration.Etcd.Local != nil { allErrs = append( allErrs, field.Forbidden( - field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration", "etcd", "external"), + pathPrefix.Child("etcd", "external"), "cannot change between external and local etcd", ), ) } - if s.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local != nil && prev.KubeadmConfigSpec.ClusterConfiguration.Etcd.External != nil { + if newClusterConfiguration.Etcd.Local != nil && oldClusterConfiguration.Etcd.External != nil { allErrs = append( allErrs, field.Forbidden( - field.NewPath("spec", "kubeadmConfigSpec", "clusterConfiguration", "etcd", "local"), + pathPrefix.Child("etcd", "local"), "cannot change between external and local etcd", ), ) diff --git a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_types.go b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_types.go index 0edee1737b50..85d66e4f90a3 100644 --- a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_types.go +++ b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_types.go @@ -18,6 +18,8 @@ package v1beta1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + cabpkv1 "sigs.k8s.io/cluster-api/bootstrap/kubeadm/api/v1beta1" ) // KubeadmControlPlaneTemplateSpec defines the desired state of KubeadmControlPlaneTemplate. @@ -53,5 +55,48 @@ func init() { // KubeadmControlPlaneTemplateResource describes the data needed to create a KubeadmControlPlane from a template. type KubeadmControlPlaneTemplateResource struct { - Spec KubeadmControlPlaneSpec `json:"spec"` + Spec KubeadmControlPlaneTemplateResourceSpec `json:"spec"` +} + +// KubeadmControlPlaneTemplateResourceSpec defines the desired state of KubeadmControlPlane. +// NOTE: KubeadmControlPlaneTemplateResourceSpec is similar to KubeadmControlPlaneSpec but +// omits Replicas and Version fields. These fields do not make sense on the KubeadmControlPlaneTemplate, +// because they are calculated by the Cluster topology reconciler during reconciliation and thus cannot +// be configured on the KubeadmControlPlaneTemplate. +type KubeadmControlPlaneTemplateResourceSpec struct { + // MachineTemplate contains information about how machines + // should be shaped when creating or updating a control plane. + // +optional + MachineTemplate *KubeadmControlPlaneTemplateMachineTemplate `json:"machineTemplate,omitempty"` + + // KubeadmConfigSpec is a KubeadmConfigSpec + // to use for initializing and joining machines to the control plane. + KubeadmConfigSpec cabpkv1.KubeadmConfigSpec `json:"kubeadmConfigSpec"` + + // RolloutAfter is a field to indicate a rollout should be performed + // after the specified time even if no changes have been made to the + // KubeadmControlPlane. + // + // +optional + RolloutAfter *metav1.Time `json:"rolloutAfter,omitempty"` + + // The RolloutStrategy to use to replace control plane machines with + // new ones. + // +optional + // +kubebuilder:default={type: "RollingUpdate", rollingUpdate: {maxSurge: 1}} + RolloutStrategy *RolloutStrategy `json:"rolloutStrategy,omitempty"` +} + +// KubeadmControlPlaneTemplateMachineTemplate defines the template for Machines +// in a KubeadmControlPlaneTemplate object. +// NOTE: KubeadmControlPlaneTemplateMachineTemplate is similar to KubeadmControlPlaneMachineTemplate but +// omits ObjectMeta and InfrastructureRef fields. These fields do not make sense on the KubeadmControlPlaneTemplate, +// because they are calculated by the Cluster topology reconciler during reconciliation and thus cannot +// be configured on the KubeadmControlPlaneTemplate. +type KubeadmControlPlaneTemplateMachineTemplate struct { + // NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane node + // The default value is 0, meaning that the node can be drained without any time limitations. + // NOTE: NodeDrainTimeout is different from `kubectl drain --timeout` + // +optional + NodeDrainTimeout *metav1.Duration `json:"nodeDrainTimeout,omitempty"` } diff --git a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook.go b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook.go index c400e0700318..29de74817e4b 100644 --- a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook.go +++ b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook.go @@ -43,7 +43,7 @@ var _ webhook.Defaulter = &KubeadmControlPlaneTemplate{} // Default implements webhook.Defaulter so a webhook will be registered for the type. func (r *KubeadmControlPlaneTemplate) Default() { - defaultKubeadmControlPlaneSpec(&r.Spec.Template.Spec, r.Namespace) + r.Spec.Template.Spec.RolloutStrategy = defaultRolloutStrategy(r.Spec.Template.Spec.RolloutStrategy) } // +kubebuilder:webhook:verbs=create;update,path=/validate-controlplane-cluster-x-k8s-io-v1beta1-kubeadmcontrolplanetemplate,mutating=false,failurePolicy=fail,groups=controlplane.cluster.x-k8s.io,resources=kubeadmcontrolplanetemplates,versions=v1beta1,name=validation.kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io,sideEffects=None,admissionReviewVersions=v1;v1beta1 @@ -62,8 +62,8 @@ func (r *KubeadmControlPlaneTemplate) ValidateCreate() error { } spec := r.Spec.Template.Spec - allErrs := validateKubeadmControlPlaneSpec(spec, r.Namespace, field.NewPath("spec", "template", "spec")) - allErrs = append(allErrs, validateEtcd(&spec, nil)...) + allErrs := validateKubeadmControlPlaneTemplateResourceSpec(spec, field.NewPath("spec", "template", "spec")) + allErrs = append(allErrs, validateClusterConfiguration(spec.KubeadmConfigSpec.ClusterConfiguration, nil, field.NewPath("spec", "template", "spec", "kubeadmConfigSpec", "clusterConfiguration"))...) if len(allErrs) > 0 { return apierrors.NewInvalid(GroupVersion.WithKind("KubeadmControlPlaneTemplate").GroupKind(), r.Name, allErrs) } @@ -94,3 +94,9 @@ func (r *KubeadmControlPlaneTemplate) ValidateUpdate(oldRaw runtime.Object) erro func (r *KubeadmControlPlaneTemplate) ValidateDelete() error { return nil } + +// validateKubeadmControlPlaneTemplateResourceSpec is a copy of validateKubeadmControlPlaneSpec which +// only validates the fields in KubeadmControlPlaneTemplateResourceSpec we care about. +func validateKubeadmControlPlaneTemplateResourceSpec(s KubeadmControlPlaneTemplateResourceSpec, pathPrefix *field.Path) field.ErrorList { + return validateRolloutStrategy(s.RolloutStrategy, nil, pathPrefix.Child("rolloutStrategy")) +} diff --git a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook_test.go b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook_test.go index b93e2a920730..c2cf562eeafe 100644 --- a/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook_test.go +++ b/controlplane/kubeadm/api/v1beta1/kubeadmcontrolplanetemplate_webhook_test.go @@ -18,12 +18,11 @@ package v1beta1 import ( "testing" + "time" . "github.com/onsi/gomega" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilfeature "k8s.io/component-base/featuregate/testing" - "k8s.io/utils/pointer" "sigs.k8s.io/cluster-api/feature" ) @@ -41,16 +40,9 @@ func TestKubeadmControlPlaneTemplateValidationFeatureGateEnabled(t *testing.T) { }, Spec: KubeadmControlPlaneTemplateSpec{ Template: KubeadmControlPlaneTemplateResource{ - Spec: KubeadmControlPlaneSpec{ - Replicas: pointer.Int32Ptr(3), - Version: "v1.20.2", - MachineTemplate: KubeadmControlPlaneMachineTemplate{ - InfrastructureRef: corev1.ObjectReference{ - Name: "machine-infra", - Namespace: testnamespace, - Kind: "TestMachineTemplate", - APIVersion: "test/v1alpha4", - }, + Spec: KubeadmControlPlaneTemplateResourceSpec{ + MachineTemplate: &KubeadmControlPlaneTemplateMachineTemplate{ + NodeDrainTimeout: &metav1.Duration{Duration: time.Second}, }, }, }, @@ -72,16 +64,9 @@ func TestKubeadmControlPlaneTemplateValidationFeatureGateDisabled(t *testing.T) }, Spec: KubeadmControlPlaneTemplateSpec{ Template: KubeadmControlPlaneTemplateResource{ - Spec: KubeadmControlPlaneSpec{ - Replicas: pointer.Int32Ptr(2), - Version: "1.20.2", - MachineTemplate: KubeadmControlPlaneMachineTemplate{ - InfrastructureRef: corev1.ObjectReference{ - Name: "machine-infra", - Namespace: testnamespace, - Kind: "TestMachineTemplate", - APIVersion: "test/v1alpha4", - }, + Spec: KubeadmControlPlaneTemplateResourceSpec{ + MachineTemplate: &KubeadmControlPlaneTemplateMachineTemplate{ + NodeDrainTimeout: &metav1.Duration{Duration: time.Second}, }, }, }, diff --git a/controlplane/kubeadm/api/v1beta1/zz_generated.deepcopy.go b/controlplane/kubeadm/api/v1beta1/zz_generated.deepcopy.go index c85f0774d0c6..15fac74acc5d 100644 --- a/controlplane/kubeadm/api/v1beta1/zz_generated.deepcopy.go +++ b/controlplane/kubeadm/api/v1beta1/zz_generated.deepcopy.go @@ -230,6 +230,26 @@ func (in *KubeadmControlPlaneTemplateList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeadmControlPlaneTemplateMachineTemplate) DeepCopyInto(out *KubeadmControlPlaneTemplateMachineTemplate) { + *out = *in + if in.NodeDrainTimeout != nil { + in, out := &in.NodeDrainTimeout, &out.NodeDrainTimeout + *out = new(v1.Duration) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeadmControlPlaneTemplateMachineTemplate. +func (in *KubeadmControlPlaneTemplateMachineTemplate) DeepCopy() *KubeadmControlPlaneTemplateMachineTemplate { + if in == nil { + return nil + } + out := new(KubeadmControlPlaneTemplateMachineTemplate) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KubeadmControlPlaneTemplateResource) DeepCopyInto(out *KubeadmControlPlaneTemplateResource) { *out = *in @@ -246,6 +266,36 @@ func (in *KubeadmControlPlaneTemplateResource) DeepCopy() *KubeadmControlPlaneTe return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KubeadmControlPlaneTemplateResourceSpec) DeepCopyInto(out *KubeadmControlPlaneTemplateResourceSpec) { + *out = *in + if in.MachineTemplate != nil { + in, out := &in.MachineTemplate, &out.MachineTemplate + *out = new(KubeadmControlPlaneTemplateMachineTemplate) + (*in).DeepCopyInto(*out) + } + in.KubeadmConfigSpec.DeepCopyInto(&out.KubeadmConfigSpec) + if in.RolloutAfter != nil { + in, out := &in.RolloutAfter, &out.RolloutAfter + *out = (*in).DeepCopy() + } + if in.RolloutStrategy != nil { + in, out := &in.RolloutStrategy, &out.RolloutStrategy + *out = new(RolloutStrategy) + (*in).DeepCopyInto(*out) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KubeadmControlPlaneTemplateResourceSpec. +func (in *KubeadmControlPlaneTemplateResourceSpec) DeepCopy() *KubeadmControlPlaneTemplateResourceSpec { + if in == nil { + return nil + } + out := new(KubeadmControlPlaneTemplateResourceSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KubeadmControlPlaneTemplateSpec) DeepCopyInto(out *KubeadmControlPlaneTemplateSpec) { *out = *in diff --git a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml index f2370c63915b..3926bcbc36c5 100644 --- a/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml +++ b/controlplane/kubeadm/config/crd/bases/controlplane.cluster.x-k8s.io_kubeadmcontrolplanetemplates.yaml @@ -1207,8 +1207,12 @@ spec: needed to create a KubeadmControlPlane from a template. properties: spec: - description: KubeadmControlPlaneSpec defines the desired state - of KubeadmControlPlane. + description: 'KubeadmControlPlaneTemplateResourceSpec defines + the desired state of KubeadmControlPlane. NOTE: KubeadmControlPlaneTemplateResourceSpec + is similar to KubeadmControlPlaneSpec but omits Replicas and + Version fields. These fields do not make sense on the KubeadmControlPlaneTemplate, + because they are calculated by the Cluster topology reconciler + during reconciliation and thus cannot be configured on the KubeadmControlPlaneTemplate.' properties: kubeadmConfigSpec: description: KubeadmConfigSpec is a KubeadmConfigSpec to use @@ -2222,68 +2226,6 @@ spec: machines should be shaped when creating or updating a control plane. properties: - infrastructureRef: - description: InfrastructureRef is a required reference - to a custom resource offered by an infrastructure provider. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object - instead of an entire object, this string should - contain a valid JSON/Go field access statement, - such as desiredState.manifest.containers[2]. For - example, if the object reference is to a container - within a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container - that triggered the event) or if no container name - is specified "spec.containers[2]" (container with - index 2 in this pod). This syntax is chosen only - to have some well-defined way of referencing a part - of an object. TODO: this design is not final and - this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: - https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this - reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - metadata: - description: 'Standard object''s metadata. More info: - https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' - properties: - annotations: - additionalProperties: - type: string - description: 'Annotations is an unstructured key value - map stored with a resource that may be set by external - tools to store and retrieve arbitrary metadata. - They are not queryable and should be preserved when - modifying objects. More info: http://kubernetes.io/docs/user-guide/annotations' - type: object - labels: - additionalProperties: - type: string - description: 'Map of string keys and values that can - be used to organize and categorize (scope and select) - objects. May match selectors of replication controllers - and services. More info: http://kubernetes.io/docs/user-guide/labels' - type: object - type: object nodeDrainTimeout: description: 'NodeDrainTimeout is the total amount of time that the controller will spend on draining a controlplane @@ -2291,17 +2233,7 @@ spec: be drained without any time limitations. NOTE: NodeDrainTimeout is different from `kubectl drain --timeout`' type: string - required: - - infrastructureRef type: object - replicas: - description: Number of desired machines. Defaults to 1. When - stacked etcd is used only odd numbers are permitted, as - per [etcd best practice](https://etcd.io/docs/v3.3.12/faq/#why-an-odd-number-of-cluster-members). - This is a pointer to distinguish between explicit zero and - not specified. - format: int32 - type: integer rolloutAfter: description: RolloutAfter is a field to indicate a rollout should be performed after the specified time even if no @@ -2337,13 +2269,8 @@ spec: strategy is "RollingUpdate". Default is RollingUpdate. type: string type: object - version: - description: Version defines the desired Kubernetes version. - type: string required: - kubeadmConfigSpec - - machineTemplate - - version type: object required: - spec diff --git a/test/e2e/data/infrastructure-docker/v1beta1/clusterclass-quick-start.yaml b/test/e2e/data/infrastructure-docker/v1beta1/clusterclass-quick-start.yaml index 9d7affa1806d..222bb2a030c4 100644 --- a/test/e2e/data/infrastructure-docker/v1beta1/clusterclass-quick-start.yaml +++ b/test/e2e/data/infrastructure-docker/v1beta1/clusterclass-quick-start.yaml @@ -133,17 +133,8 @@ metadata: spec: template: spec: - # The replicas value be overridden by the corresponding - # Cluster's spec.topology.controlPlane.replicas. - replicas: 1 machineTemplate: nodeDrainTimeout: 1s - # The infrastructureRef will be overridden by the corresponding - # ClusterClass's spec.controlPlane.machineInfrastructure. - infrastructureRef: - kind: DockerMachineTemplate - apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 - name: "quick-start-control-plane" kubeadmConfigSpec: clusterConfiguration: controllerManager: @@ -167,9 +158,6 @@ spec: # kind will implement systemd support in: https://github.com/kubernetes-sigs/kind/issues/1726 cgroup-driver: cgroupfs eviction-hard: 'nodefs.available<0%,nodefs.inodesFree<0%,imagefs.available<0%' - # The version value will be overridden by the corresponding - # Cluster's spec.topology.version. - version: v1.21.2 --- apiVersion: infrastructure.cluster.x-k8s.io/v1beta1 kind: DockerMachineTemplate