Skip to content

Commit adca92c

Browse files
committed
Add Healthy status condition
- record the last health assessment result in a dedicated status condition - use the condition status when issuing events to prevent notifications spam Signed-off-by: Stefan Prodan <stefan.prodan@gmail.com>
1 parent 26ec841 commit adca92c

4 files changed

Lines changed: 32 additions & 6 deletions

File tree

api/v1beta1/condition_types.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ limitations under the License.
1717
package v1beta1
1818

1919
const (
20+
// HealthyCondition is the condition type used
21+
// to record the last health assessment result.
22+
HealthyCondition string = "Healthy"
23+
2024
// PruneFailedReason represents the fact that the
2125
// pruning of the Kustomization failed.
2226
PruneFailedReason string = "PruneFailed"

api/v1beta1/kustomization_types.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
apimeta "k8s.io/apimachinery/pkg/api/meta"
2021
"time"
2122

2223
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -184,6 +185,16 @@ func KustomizationProgressing(k Kustomization) Kustomization {
184185
return k
185186
}
186187

188+
// SetKustomizationHealthiness sets the HealthyCondition status for a Kustomization.
189+
func SetKustomizationHealthiness(k *Kustomization, status metav1.ConditionStatus, reason, message string) {
190+
switch len(k.Spec.HealthChecks) {
191+
case 0:
192+
apimeta.RemoveStatusCondition(k.GetStatusConditions(), HealthyCondition)
193+
default:
194+
meta.SetResourceCondition(k, HealthyCondition, status, reason, trimString(message, MaxConditionMessageLength))
195+
}
196+
}
197+
187198
// SetKustomizeReadiness sets the ReadyCondition, ObservedGeneration, and LastAttemptedRevision,
188199
// on the Kustomization.
189200
func SetKustomizationReadiness(k *Kustomization, status metav1.ConditionStatus, reason, message string, revision string) {
@@ -205,6 +216,7 @@ func KustomizationNotReady(k Kustomization, revision, reason, message string) Ku
205216
// including a Snapshot.
206217
func KustomizationNotReadySnapshot(k Kustomization, snapshot *Snapshot, revision, reason, message string) Kustomization {
207218
SetKustomizationReadiness(&k, metav1.ConditionFalse, reason, trimString(message, MaxConditionMessageLength), revision)
219+
SetKustomizationHealthiness(&k, metav1.ConditionFalse, reason, reason)
208220
k.Status.Snapshot = snapshot
209221
k.Status.LastAttemptedRevision = revision
210222
return k
@@ -213,6 +225,7 @@ func KustomizationNotReadySnapshot(k Kustomization, snapshot *Snapshot, revision
213225
// KustomizationReady registers a successful apply attempt of the given Kustomization.
214226
func KustomizationReady(k Kustomization, snapshot *Snapshot, revision, reason, message string) Kustomization {
215227
SetKustomizationReadiness(&k, metav1.ConditionTrue, reason, trimString(message, MaxConditionMessageLength), revision)
228+
SetKustomizationHealthiness(&k, metav1.ConditionTrue, reason, reason)
216229
k.Status.Snapshot = snapshot
217230
k.Status.LastAppliedRevision = revision
218231
return k

controllers/kustomization_controller.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -695,10 +695,10 @@ func (r *KustomizationReconciler) checkHealth(ctx context.Context, statusPoller
695695
return err
696696
}
697697

698-
readiness := apimeta.FindStatusCondition(kustomization.Status.Conditions, meta.ReadyCondition)
699-
ready := readiness != nil && readiness.Status == metav1.ConditionTrue
698+
healthiness := apimeta.FindStatusCondition(kustomization.Status.Conditions, kustomizev1.HealthyCondition)
699+
healthy := healthiness != nil && healthiness.Status == metav1.ConditionTrue
700700

701-
if !ready || (kustomization.Status.LastAppliedRevision != revision && changed) {
701+
if !healthy || (kustomization.Status.LastAppliedRevision != revision && changed) {
702702
r.event(ctx, kustomization, revision, events.EventSeverityInfo, "Health check passed", nil)
703703
}
704704
return nil

controllers/kustomization_controller_test.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,26 +170,35 @@ var _ = Describe("KustomizationReconciler", func() {
170170
Suspend: false,
171171
Timeout: nil,
172172
Validation: "client",
173+
//HealthChecks: []meta.NamespacedObjectKindReference{
174+
// {
175+
// APIVersion: "v1",
176+
// Kind: "ServiceAccount",
177+
// Name: "test",
178+
// Namespace: "test",
179+
// },
180+
//},
173181
},
174182
}
175183
Expect(k8sClient.Create(context.Background(), k)).Should(Succeed())
176184
defer k8sClient.Delete(context.Background(), k)
177185

178186
got := &kustomizev1.Kustomization{}
179-
var cond metav1.Condition
187+
var readyCondition metav1.Condition
180188
Eventually(func() bool {
181189
_ = k8sClient.Get(context.Background(), kName, got)
182190
for _, c := range got.Status.Conditions {
183191
if c.Reason == t.waitForReason {
184-
cond = c
192+
readyCondition = c
185193
return true
186194
}
187195
}
188196
return false
189197
}, timeout, interval).Should(BeTrue())
190198

191-
Expect(cond.Status).To(Equal(t.expectStatus))
199+
Expect(readyCondition.Status).To(Equal(t.expectStatus))
192200
Expect(got.Status.LastAppliedRevision).To(Equal(t.expectRevision))
201+
//Expect(apimeta.IsStatusConditionTrue(got.Status.Conditions, kustomizev1.HealthyCondition)).To(BeTrue())
193202

194203
ns := &corev1.Namespace{}
195204
Expect(k8sClient.Get(context.Background(), types.NamespacedName{Name: "test"}, ns)).Should(Succeed())

0 commit comments

Comments
 (0)