Skip to content

✨ Add CertificateValidityPeriod and CACertificateValidityPeriod to KubeadmConfig #12335

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions api/bootstrap/kubeadm/v1beta1/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,18 @@ func RestoreKubeadmConfigSpec(restored *bootstrapv1.KubeadmConfigSpec, dst *boot
}
dst.JoinConfiguration.Timeouts = restored.JoinConfiguration.Timeouts
}
if restored.ClusterConfiguration != nil &&
(restored.ClusterConfiguration.CertificateValidityPeriodDays != nil || restored.ClusterConfiguration.CACertificateValidityPeriodDays != nil) {
if dst.ClusterConfiguration == nil {
dst.ClusterConfiguration = &bootstrapv1.ClusterConfiguration{}
}
if restored.ClusterConfiguration.CertificateValidityPeriodDays != nil {
dst.ClusterConfiguration.CertificateValidityPeriodDays = restored.ClusterConfiguration.CertificateValidityPeriodDays
}
if restored.ClusterConfiguration.CACertificateValidityPeriodDays != nil {
dst.ClusterConfiguration.CACertificateValidityPeriodDays = restored.ClusterConfiguration.CACertificateValidityPeriodDays
}
}
}

func (src *KubeadmConfigSpec) ConvertTo(dst *bootstrapv1.KubeadmConfigSpec) {
Expand Down Expand Up @@ -329,3 +341,7 @@ 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 apimachineryconversion.Scope) error {
return clusterv1beta1.Convert_v1beta1_Condition_To_v1_Condition(in, out, s)
}

func Convert_v1beta2_ClusterConfiguration_To_v1beta1_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
return autoConvert_v1beta2_ClusterConfiguration_To_v1beta1_ClusterConfiguration(in, out, s)
}
17 changes: 7 additions & 10 deletions api/bootstrap/kubeadm/v1beta1/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions api/bootstrap/kubeadm/v1beta2/kubeadm_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,16 @@ type ClusterConfiguration struct {
// featureGates enabled by the user.
// +optional
FeatureGates map[string]bool `json:"featureGates,omitempty"`

// certificateValidityPeriodDays specifies the validity period for a non-CA certificate generated by kubeadm.
// Default value: 3650 days (10 years) set by kubeadm.
// +optional
CertificateValidityPeriodDays *int32 `json:"certificateValidityPeriodDays,omitempty"`

// caCertificateValidityPeriodDays specifies the validity period for a CA certificate generated by kubeadm.
// Default value: 3650 days (10 years) set by kubeadm.
// +optional
CACertificateValidityPeriodDays *int32 `json:"caCertificateValidityPeriodDays,omitempty"`
}

// ControlPlaneComponent holds settings common to control plane component of the cluster.
Expand Down
10 changes: 10 additions & 0 deletions api/bootstrap/kubeadm/v1beta2/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions api/controlplane/kubeadm/v1beta1/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@ func hubKubeadmConfigSpec(in *bootstrapv1.KubeadmConfigSpec, c randfill.Continue
}
in.JoinConfiguration.Timeouts.ControlPlaneComponentHealthCheckSeconds = initControlPlaneComponentHealthCheckSeconds
}
if in.ClusterConfiguration != nil {
in.ClusterConfiguration.CertificateValidityPeriodDays = nil
in.ClusterConfiguration.CACertificateValidityPeriodDays = nil
}
}

func hubBootstrapTokenString(in *bootstrapv1.BootstrapTokenString, _ randfill.Continue) {
Expand Down
23 changes: 23 additions & 0 deletions api/core/v1beta2/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,26 @@ func ConvertFromSeconds(in *int32) *metav1.Duration {
}
return ptr.To(metav1.Duration{Duration: time.Duration(*in) * time.Second})
}

// ConvertToDays takes *metav1.Duration and returns a *int32.
// Durations longer than MaxInt32 are capped.
// NOTE: this is a util function intended only for usage in API conversions.
func ConvertToDays(in *metav1.Duration) *int32 {
if in == nil {
return nil
}
hours := math.Trunc(in.Hours())
if hours > math.MaxInt32 {
return ptr.To[int32](math.MaxInt32)
}
return ptr.To(int32(hours / 24))
}

// ConvertFromDays takes *int32 and returns a *metav1.Duration.
// NOTE: this is a util function intended only for usage in API conversions.
func ConvertFromDays(in *int32) *metav1.Duration {
if in == nil {
return nil
}
return ptr.To(metav1.Duration{Duration: time.Duration(*in) * time.Hour * 24})
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions bootstrap/kubeadm/types/upstreamv1beta3/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,7 @@ func (src *ClusterConfiguration) GetAdditionalData(data *upstream.AdditionalData
data.ControlPlaneComponentHealthCheckSeconds = clusterv1.ConvertToSeconds(src.APIServer.TimeoutForControlPlane)
}
}

func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
return autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta3_ClusterConfiguration(in, out, s)
}
8 changes: 8 additions & 0 deletions bootstrap/kubeadm/types/upstreamv1beta3/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
hubControlPlaneComponentFuzzer,
hubLocalEtcdFuzzer,
hubNodeRegistrationOptionsFuzzer,
hubClusterConfigurationFuzzer,
}
}

Expand Down Expand Up @@ -195,3 +196,10 @@ func spokeBootstrapToken(in *BootstrapToken, c randfill.Continue) {
in.TTL = ptr.To[metav1.Duration](metav1.Duration{Duration: time.Duration(c.Int31()) * time.Second})
}
}

func hubClusterConfigurationFuzzer(obj *bootstrapv1.ClusterConfiguration, c randfill.Continue) {
c.FillNoCustom(obj)

obj.CertificateValidityPeriodDays = nil
obj.CACertificateValidityPeriodDays = nil
}
17 changes: 7 additions & 10 deletions bootstrap/kubeadm/types/upstreamv1beta3/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 16 additions & 3 deletions bootstrap/kubeadm/types/upstreamv1beta4/conversion.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,22 @@ func Convert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguratio
// Following fields do not exist in CABPK v1beta1 version:
// - Proxy (Not supported yet)
// - EncryptionAlgorithm (Not supported yet)
// - CertificateValidityPeriod (Not supported yet)
// - CACertificateValidityPeriod (Not supported yet)
return autoConvert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in, out, s)
if err := autoConvert_upstreamv1beta4_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in, out, s); err != nil {
return err
}
out.CertificateValidityPeriodDays = clusterv1.ConvertToDays(in.CertificateValidityPeriod)
out.CACertificateValidityPeriodDays = clusterv1.ConvertToSeconds(in.CACertificateValidityPeriod)
return nil
}

// Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration is an autogenerated conversion function.
func Convert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in *bootstrapv1.ClusterConfiguration, out *ClusterConfiguration, s apimachineryconversion.Scope) error {
if err := autoConvert_v1beta2_ClusterConfiguration_To_upstreamv1beta4_ClusterConfiguration(in, out, s); err != nil {
return err
}
out.CertificateValidityPeriod = clusterv1.ConvertFromDays(in.CertificateValidityPeriodDays)
out.CACertificateValidityPeriod = clusterv1.ConvertFromSeconds(in.CACertificateValidityPeriodDays)
return nil
}

func Convert_upstreamv1beta4_DNS_To_v1beta2_DNS(in *DNS, out *bootstrapv1.DNS, s apimachineryconversion.Scope) error {
Expand Down
22 changes: 20 additions & 2 deletions bootstrap/kubeadm/types/upstreamv1beta4/conversion_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ func fuzzFuncs(_ runtimeserializer.CodecFactory) []interface{} {
spokeJoinControlPlaneFuzzer,
spokeTimeoutsFuzzer,
hubJoinConfigurationFuzzer,
hubClusterConfigurationFuzzer,
}
}

Expand All @@ -95,8 +96,13 @@ func spokeClusterConfigurationFuzzer(obj *ClusterConfiguration, c randfill.Conti

obj.Proxy = Proxy{}
obj.EncryptionAlgorithm = ""
obj.CACertificateValidityPeriod = nil
obj.CertificateValidityPeriod = nil

if obj.CertificateValidityPeriod != nil {
obj.CertificateValidityPeriod = ptr.To[metav1.Duration](metav1.Duration{Duration: time.Duration(c.Int31()%24) * time.Hour * 24})
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since there is no built in methods in time package to use time.Days(), I was facing round trip errors while converting hours to Days back and forth due to round off of minute field.
So added this way to always get whole hours rather than in minutes.

Please suggest if there are any better ways to handle this.

}
if obj.CACertificateValidityPeriod != nil {
obj.CACertificateValidityPeriod = ptr.To[metav1.Duration](metav1.Duration{Duration: time.Duration(c.Int31()%24) * time.Hour * 24})
}

// Drop the following fields as they have been removed in v1beta2, so we don't have to preserve them.
obj.Networking.ServiceSubnet = ""
Expand Down Expand Up @@ -179,6 +185,18 @@ func hubJoinConfigurationFuzzer(obj *bootstrapv1.JoinConfiguration, c randfill.C
}
}

func hubClusterConfigurationFuzzer(obj *bootstrapv1.ClusterConfiguration, c randfill.Continue) {
c.FillNoCustom(obj)

if obj.CertificateValidityPeriodDays != nil {
obj.CertificateValidityPeriodDays = ptr.To[int32](*obj.CertificateValidityPeriodDays % 24)
}

if obj.CACertificateValidityPeriodDays != nil {
obj.CACertificateValidityPeriodDays = ptr.To[int32](*obj.CACertificateValidityPeriodDays % 24)
}
}

func spokeBootstrapToken(in *BootstrapToken, c randfill.Continue) {
c.FillNoCustom(in)

Expand Down
17 changes: 7 additions & 10 deletions bootstrap/kubeadm/types/upstreamv1beta4/zz_generated.conversion.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading