Skip to content

Commit 2b6669b

Browse files
authored
Merge pull request #11452 from fabriziopandini/add-v1beta2-conditions-to-CABPK
🌱 Add v1beta2 conditions to CABPK
2 parents 15de135 + 18441d7 commit 2b6669b

File tree

2 files changed

+181
-6
lines changed

2 files changed

+181
-6
lines changed

bootstrap/kubeadm/api/v1beta1/v1beta2_condition_consts.go

+33-5
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,44 @@ package v1beta1
1818

1919
import clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
2020

21-
// Conditions that will be used for the KubeadmConfig object in v1Beta2 API version.
21+
// KubeadmConfig's Ready condition and corresponding reasons that will be used in v1Beta2 API version.
2222
const (
2323
// KubeadmConfigReadyV1Beta2Condition is true if the KubeadmConfig is not deleted,
2424
// and both DataSecretCreated, CertificatesAvailable conditions are true.
2525
KubeadmConfigReadyV1Beta2Condition = clusterv1.ReadyV1Beta2Condition
2626

27-
// CertificatesAvailableV1Beta2Condition documents that cluster certificates required
27+
// KubeadmConfigReadyV1Beta2Reason surfaces when the KubeadmConfig is ready.
28+
KubeadmConfigReadyV1Beta2Reason = clusterv1.ReadyV1Beta2Reason
29+
30+
// KubeadmConfigNotReadyV1Beta2Reason surfaces when the KubeadmConfig is not ready.
31+
KubeadmConfigNotReadyV1Beta2Reason = clusterv1.NotReadyV1Beta2Reason
32+
33+
// KubeadmConfigReadyUnknownV1Beta2Reason surfaces when KubeadmConfig readiness is unknown.
34+
KubeadmConfigReadyUnknownV1Beta2Reason = clusterv1.ReadyUnknownV1Beta2Reason
35+
)
36+
37+
// KubeadmConfig's CertificatesAvailable condition and corresponding reasons that will be used in v1Beta2 API version.
38+
const (
39+
// KubeadmConfigCertificatesAvailableV1Beta2Condition documents that cluster certificates required
2840
// for generating the bootstrap data secret are available.
29-
CertificatesAvailableV1Beta2Condition = "CertificatesAvailable"
41+
KubeadmConfigCertificatesAvailableV1Beta2Condition = "CertificatesAvailable"
42+
43+
// KubeadmConfigCertificatesAvailableV1Beta2Reason surfaces when certificates required for machine bootstrap are is available.
44+
KubeadmConfigCertificatesAvailableV1Beta2Reason = clusterv1.AvailableV1Beta2Reason
45+
46+
// KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason surfaces unexpected failures when reading or
47+
// generating certificates required for machine bootstrap.
48+
KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason = clusterv1.InternalErrorV1Beta2Reason
49+
)
50+
51+
// KubeadmConfig's DataSecretAvailable condition and corresponding reasons that will be used in v1Beta2 API version.
52+
const (
53+
// KubeadmConfigDataSecretAvailableV1Beta2Condition is true if the bootstrap secret is available.
54+
KubeadmConfigDataSecretAvailableV1Beta2Condition = "DataSecretAvailable"
55+
56+
// KubeadmConfigDataSecretAvailableV1Beta2Reason surfaces when the bootstrap secret is available.
57+
KubeadmConfigDataSecretAvailableV1Beta2Reason = clusterv1.AvailableV1Beta2Reason
3058

31-
// DataSecretAvailableV1Beta2Condition is true if the bootstrap secret is available.
32-
DataSecretAvailableV1Beta2Condition = "DataSecretAvailable"
59+
// KubeadmConfigDataSecretNotAvailableV1Beta2Reason surfaces when the bootstrap secret is not available.
60+
KubeadmConfigDataSecretNotAvailableV1Beta2Reason = clusterv1.NotAvailableV1Beta2Reason
3361
)

bootstrap/kubeadm/internal/controllers/kubeadmconfig_controller.go

+148-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import (
5656
"sigs.k8s.io/cluster-api/internal/util/taints"
5757
"sigs.k8s.io/cluster-api/util"
5858
"sigs.k8s.io/cluster-api/util/conditions"
59+
v1beta2conditions "sigs.k8s.io/cluster-api/util/conditions/v1beta2"
5960
clog "sigs.k8s.io/cluster-api/util/log"
6061
"sigs.k8s.io/cluster-api/util/patch"
6162
"sigs.k8s.io/cluster-api/util/paused"
@@ -229,8 +230,39 @@ func (r *KubeadmConfigReconciler) Reconcile(ctx context.Context, req ctrl.Reques
229230
bootstrapv1.CertificatesAvailableCondition,
230231
),
231232
)
233+
if err := v1beta2conditions.SetSummaryCondition(config, config, bootstrapv1.KubeadmConfigReadyV1Beta2Condition,
234+
v1beta2conditions.ForConditionTypes{
235+
bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
236+
bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
237+
},
238+
// Using a custom merge strategy to override reasons applied during merge and to ignore some
239+
// info message so the ready condition aggregation in other resources is less noisy.
240+
v1beta2conditions.CustomMergeStrategy{
241+
MergeStrategy: v1beta2conditions.DefaultMergeStrategy(
242+
// Use custom reasons.
243+
v1beta2conditions.ComputeReasonFunc(v1beta2conditions.GetDefaultComputeMergeReasonFunc(
244+
bootstrapv1.KubeadmConfigNotReadyV1Beta2Reason,
245+
bootstrapv1.KubeadmConfigReadyUnknownV1Beta2Reason,
246+
bootstrapv1.KubeadmConfigReadyV1Beta2Reason,
247+
)),
248+
),
249+
},
250+
); err != nil {
251+
rerr = kerrors.NewAggregate([]error{rerr, err})
252+
}
232253
// Patch ObservedGeneration only if the reconciliation completed successfully
233-
patchOpts := []patch.Option{}
254+
patchOpts := []patch.Option{
255+
patch.WithOwnedConditions{Conditions: []clusterv1.ConditionType{
256+
clusterv1.ReadyCondition,
257+
bootstrapv1.DataSecretAvailableCondition,
258+
bootstrapv1.CertificatesAvailableCondition,
259+
}},
260+
patch.WithOwnedV1Beta2Conditions{Conditions: []string{
261+
bootstrapv1.KubeadmConfigReadyV1Beta2Condition,
262+
bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
263+
bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
264+
}},
265+
}
234266
if rerr == nil {
235267
patchOpts = append(patchOpts, patch.WithStatusObservedGeneration{})
236268
}
@@ -264,13 +296,24 @@ func (r *KubeadmConfigReconciler) reconcile(ctx context.Context, scope *Scope, c
264296
case !cluster.Status.InfrastructureReady:
265297
log.Info("Cluster infrastructure is not ready, waiting")
266298
conditions.MarkFalse(config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.WaitingForClusterInfrastructureReason, clusterv1.ConditionSeverityInfo, "")
299+
v1beta2conditions.Set(scope.Config, metav1.Condition{
300+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
301+
Status: metav1.ConditionFalse,
302+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
303+
Message: "Waiting for Cluster status.infrastructureReady to be true",
304+
})
267305
return ctrl.Result{}, nil
268306
// Reconcile status for machines that already have a secret reference, but our status isn't up to date.
269307
// This case solves the pivoting scenario (or a backup restore) which doesn't preserve the status subresource on objects.
270308
case configOwner.DataSecretName() != nil && (!config.Status.Ready || config.Status.DataSecretName == nil):
271309
config.Status.Ready = true
272310
config.Status.DataSecretName = configOwner.DataSecretName()
273311
conditions.MarkTrue(config, bootstrapv1.DataSecretAvailableCondition)
312+
v1beta2conditions.Set(scope.Config, metav1.Condition{
313+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
314+
Status: metav1.ConditionTrue,
315+
Reason: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Reason,
316+
})
274317
return ctrl.Result{}, nil
275318
// Status is ready means a config has been generated.
276319
case config.Status.Ready:
@@ -402,6 +445,12 @@ func (r *KubeadmConfigReconciler) handleClusterNotInitialized(ctx context.Contex
402445
// using the DataSecretGeneratedFailedReason
403446
if conditions.GetReason(scope.Config, bootstrapv1.DataSecretAvailableCondition) != bootstrapv1.DataSecretGenerationFailedReason {
404447
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, clusterv1.WaitingForControlPlaneAvailableReason, clusterv1.ConditionSeverityInfo, "")
448+
v1beta2conditions.Set(scope.Config, metav1.Condition{
449+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
450+
Status: metav1.ConditionFalse,
451+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
452+
Message: "Waiting for Cluster control plane to be initialized",
453+
})
405454
}
406455

407456
// if it's NOT a control plane machine, requeue
@@ -505,10 +554,21 @@ func (r *KubeadmConfigReconciler) handleClusterNotInitialized(ctx context.Contex
505554
}
506555
if err != nil {
507556
conditions.MarkFalse(scope.Config, bootstrapv1.CertificatesAvailableCondition, bootstrapv1.CertificatesGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
557+
v1beta2conditions.Set(scope.Config, metav1.Condition{
558+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
559+
Status: metav1.ConditionUnknown,
560+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason,
561+
Message: "Please check controller logs for errors",
562+
})
508563
return ctrl.Result{}, err
509564
}
510565

511566
conditions.MarkTrue(scope.Config, bootstrapv1.CertificatesAvailableCondition)
567+
v1beta2conditions.Set(scope.Config, metav1.Condition{
568+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
569+
Status: metav1.ConditionTrue,
570+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Reason,
571+
})
512572

513573
verbosityFlag := ""
514574
if scope.Config.Spec.Verbosity != nil {
@@ -518,12 +578,24 @@ func (r *KubeadmConfigReconciler) handleClusterNotInitialized(ctx context.Contex
518578
files, err := r.resolveFiles(ctx, scope.Config)
519579
if err != nil {
520580
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
581+
v1beta2conditions.Set(scope.Config, metav1.Condition{
582+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
583+
Status: metav1.ConditionFalse,
584+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
585+
Message: "Failed to read content from secrets for spec.files",
586+
})
521587
return ctrl.Result{}, err
522588
}
523589

524590
users, err := r.resolveUsers(ctx, scope.Config)
525591
if err != nil {
526592
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
593+
v1beta2conditions.Set(scope.Config, metav1.Condition{
594+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
595+
Status: metav1.ConditionFalse,
596+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
597+
Message: "Failed to read password from secrets for spec.users",
598+
})
527599
return ctrl.Result{}, err
528600
}
529601

@@ -580,13 +652,30 @@ func (r *KubeadmConfigReconciler) joinWorker(ctx context.Context, scope *Scope)
580652
)
581653
if err != nil {
582654
conditions.MarkFalse(scope.Config, bootstrapv1.CertificatesAvailableCondition, bootstrapv1.CertificatesCorruptedReason, clusterv1.ConditionSeverityError, err.Error())
655+
v1beta2conditions.Set(scope.Config, metav1.Condition{
656+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
657+
Status: metav1.ConditionUnknown,
658+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason,
659+
Message: "Please check controller logs for errors",
660+
})
583661
return ctrl.Result{}, err
584662
}
585663
if err := certificates.EnsureAllExist(); err != nil {
586664
conditions.MarkFalse(scope.Config, bootstrapv1.CertificatesAvailableCondition, bootstrapv1.CertificatesCorruptedReason, clusterv1.ConditionSeverityError, err.Error())
665+
v1beta2conditions.Set(scope.Config, metav1.Condition{
666+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
667+
Status: metav1.ConditionUnknown,
668+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason,
669+
Message: "Please check controller logs for errors",
670+
})
587671
return ctrl.Result{}, err
588672
}
589673
conditions.MarkTrue(scope.Config, bootstrapv1.CertificatesAvailableCondition)
674+
v1beta2conditions.Set(scope.Config, metav1.Condition{
675+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
676+
Status: metav1.ConditionTrue,
677+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Reason,
678+
})
590679

591680
// Ensure that joinConfiguration.Discovery is properly set for joining node on the current cluster.
592681
if res, err := r.reconcileDiscovery(ctx, scope.Cluster, scope.Config, certificates); err != nil {
@@ -630,19 +719,37 @@ func (r *KubeadmConfigReconciler) joinWorker(ctx context.Context, scope *Scope)
630719
files, err := r.resolveFiles(ctx, scope.Config)
631720
if err != nil {
632721
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
722+
v1beta2conditions.Set(scope.Config, metav1.Condition{
723+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
724+
Status: metav1.ConditionFalse,
725+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
726+
Message: "Failed to read content from secrets for spec.files",
727+
})
633728
return ctrl.Result{}, err
634729
}
635730

636731
users, err := r.resolveUsers(ctx, scope.Config)
637732
if err != nil {
638733
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
734+
v1beta2conditions.Set(scope.Config, metav1.Condition{
735+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
736+
Status: metav1.ConditionFalse,
737+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
738+
Message: "Failed to read password from secrets for spec.users",
739+
})
639740
return ctrl.Result{}, err
640741
}
641742

642743
if discoveryFile := scope.Config.Spec.JoinConfiguration.Discovery.File; discoveryFile != nil && discoveryFile.KubeConfig != nil {
643744
kubeconfig, err := r.resolveDiscoveryKubeConfig(discoveryFile)
644745
if err != nil {
645746
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
747+
v1beta2conditions.Set(scope.Config, metav1.Condition{
748+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
749+
Status: metav1.ConditionFalse,
750+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
751+
Message: "Failed to create kubeconfig for spec.joinConfiguration.discovery.file",
752+
})
646753
return ctrl.Result{}, err
647754
}
648755
files = append(files, *kubeconfig)
@@ -709,14 +816,31 @@ func (r *KubeadmConfigReconciler) joinControlplane(ctx context.Context, scope *S
709816
)
710817
if err != nil {
711818
conditions.MarkFalse(scope.Config, bootstrapv1.CertificatesAvailableCondition, bootstrapv1.CertificatesCorruptedReason, clusterv1.ConditionSeverityError, err.Error())
819+
v1beta2conditions.Set(scope.Config, metav1.Condition{
820+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
821+
Status: metav1.ConditionUnknown,
822+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason,
823+
Message: "Please check controller logs for errors",
824+
})
712825
return ctrl.Result{}, err
713826
}
714827
if err := certificates.EnsureAllExist(); err != nil {
715828
conditions.MarkFalse(scope.Config, bootstrapv1.CertificatesAvailableCondition, bootstrapv1.CertificatesCorruptedReason, clusterv1.ConditionSeverityError, err.Error())
829+
v1beta2conditions.Set(scope.Config, metav1.Condition{
830+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
831+
Status: metav1.ConditionUnknown,
832+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableInternalErrorV1Beta2Reason,
833+
Message: "Please check controller logs for errors",
834+
})
716835
return ctrl.Result{}, err
717836
}
718837

719838
conditions.MarkTrue(scope.Config, bootstrapv1.CertificatesAvailableCondition)
839+
v1beta2conditions.Set(scope.Config, metav1.Condition{
840+
Type: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Condition,
841+
Status: metav1.ConditionTrue,
842+
Reason: bootstrapv1.KubeadmConfigCertificatesAvailableV1Beta2Reason,
843+
})
720844

721845
// Ensure that joinConfiguration.Discovery is properly set for joining node on the current cluster.
722846
if res, err := r.reconcileDiscovery(ctx, scope.Cluster, scope.Config, certificates); err != nil {
@@ -747,19 +871,37 @@ func (r *KubeadmConfigReconciler) joinControlplane(ctx context.Context, scope *S
747871
files, err := r.resolveFiles(ctx, scope.Config)
748872
if err != nil {
749873
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
874+
v1beta2conditions.Set(scope.Config, metav1.Condition{
875+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
876+
Status: metav1.ConditionFalse,
877+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
878+
Message: "Failed to read content from secrets for spec.files",
879+
})
750880
return ctrl.Result{}, err
751881
}
752882

753883
users, err := r.resolveUsers(ctx, scope.Config)
754884
if err != nil {
755885
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
886+
v1beta2conditions.Set(scope.Config, metav1.Condition{
887+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
888+
Status: metav1.ConditionFalse,
889+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
890+
Message: "Failed to read password from secrets for spec.users",
891+
})
756892
return ctrl.Result{}, err
757893
}
758894

759895
if discoveryFile := scope.Config.Spec.JoinConfiguration.Discovery.File; discoveryFile != nil && discoveryFile.KubeConfig != nil {
760896
kubeconfig, err := r.resolveDiscoveryKubeConfig(discoveryFile)
761897
if err != nil {
762898
conditions.MarkFalse(scope.Config, bootstrapv1.DataSecretAvailableCondition, bootstrapv1.DataSecretGenerationFailedReason, clusterv1.ConditionSeverityWarning, err.Error())
899+
v1beta2conditions.Set(scope.Config, metav1.Condition{
900+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
901+
Status: metav1.ConditionFalse,
902+
Reason: bootstrapv1.KubeadmConfigDataSecretNotAvailableV1Beta2Reason,
903+
Message: "Failed to create kubeconfig for spec.joinConfiguration.discovery.file",
904+
})
763905
return ctrl.Result{}, err
764906
}
765907
files = append(files, *kubeconfig)
@@ -1235,6 +1377,11 @@ func (r *KubeadmConfigReconciler) storeBootstrapData(ctx context.Context, scope
12351377
scope.Config.Status.DataSecretName = ptr.To(secret.Name)
12361378
scope.Config.Status.Ready = true
12371379
conditions.MarkTrue(scope.Config, bootstrapv1.DataSecretAvailableCondition)
1380+
v1beta2conditions.Set(scope.Config, metav1.Condition{
1381+
Type: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Condition,
1382+
Status: metav1.ConditionTrue,
1383+
Reason: bootstrapv1.KubeadmConfigDataSecretAvailableV1Beta2Reason,
1384+
})
12381385
return nil
12391386
}
12401387

0 commit comments

Comments
 (0)