From c56c899177ee0143d9bdba8dfeecf2acc4f7b2e2 Mon Sep 17 00:00:00 2001 From: Aaron Weisberg Date: Wed, 15 Feb 2023 11:25:52 -0800 Subject: [PATCH] adds readiness interface Signed-off-by: Aaron Weisberg --- pkg/kube/ready.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/kube/ready.go b/pkg/kube/ready.go index b214c4797..9e847b57b 100644 --- a/pkg/kube/ready.go +++ b/pkg/kube/ready.go @@ -81,6 +81,11 @@ type ReadyChecker struct { pausedAsReady bool } +// Readiness can be implemented by any CR to communicate to helm whether it should be considered Ready +type Readiness interface { + IsReady() bool +} + // IsReady checks if v is ready. It supports checking readiness for pods, // deployments, persistent volume claims, services, daemon sets, custom // resource definitions, stateful sets, replication controllers, and replica @@ -96,7 +101,15 @@ func (c *ReadyChecker) IsReady(ctx context.Context, v *resource.Info) (bool, err ok = true err error ) - switch value := AsVersioned(v).(type) { + asVersioned := AsVersioned(v) + + // If Readiness is implemented, set ok to result. + // Conditions on known types should override this. + if readiness, impl := asVersioned.(Readiness); impl { + ok = readiness.IsReady() + } + + switch value := asVersioned.(type) { case *corev1.Pod: pod, err := c.client.CoreV1().Pods(v.Namespace).Get(ctx, v.Name, metav1.GetOptions{}) if err != nil || !c.isPodReady(pod) {