From 86338215b7aff34bab669c9842c19aab771c5d6b Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Sun, 5 Jan 2025 15:42:56 +0000 Subject: [PATCH] ability to create different waiters Signed-off-by: Austin Abro --- pkg/action/action.go | 2 +- pkg/kube/client.go | 43 +++++++++++++++++++++++++++++++---------- pkg/kube/client_test.go | 35 ++++++++------------------------- pkg/kube/wait.go | 7 ------- 4 files changed, 42 insertions(+), 45 deletions(-) diff --git a/pkg/action/action.go b/pkg/action/action.go index e8e0a997a..7edb4a1ae 100644 --- a/pkg/action/action.go +++ b/pkg/action/action.go @@ -371,7 +371,7 @@ func (cfg *Configuration) recordRelease(r *release.Release) { // Init initializes the action configuration func (cfg *Configuration) Init(getter genericclioptions.RESTClientGetter, namespace, helmDriver string, log DebugLog) error { - kc, err := kube.New(getter, nil) + kc, err := kube.New(getter, kube.StatusWaiter) if err != nil { return err } diff --git a/pkg/kube/client.go b/pkg/kube/client.go index 91b09eb65..ce22f265a 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -88,6 +88,13 @@ type Client struct { Waiter } +type WaitStrategy int + +const ( + StatusWaiter WaitStrategy = iota + LegacyWaiter +) + func init() { // Add CRDs to the scheme. They are missing by default. if err := apiextv1.AddToScheme(scheme.Scheme); err != nil { @@ -112,21 +119,37 @@ func getStatusWatcher(factory Factory) (watcher.StatusWatcher, error) { return sw, nil } -// New creates a new Client. -func New(getter genericclioptions.RESTClientGetter, waiter Waiter) (*Client, error) { - if getter == nil { - getter = genericclioptions.NewConfigFlags(true) - } - factory := cmdutil.NewFactory(getter) - if waiter == nil { +func NewWaiter(strategy WaitStrategy, factory Factory, log func(string, ...interface{})) (Waiter, error) { + switch strategy { + case LegacyWaiter: + kc, err := factory.KubernetesClientSet() + if err != nil { + return nil, err + } + return &waiter{kubeClient: kc, log: log}, nil + case StatusWaiter: sw, err := getStatusWatcher(factory) if err != nil { return nil, err } - waiter = &statusWaiter{ + return &statusWaiter{ sw: sw, - log: nopLogger, - } + log: log, + }, nil + default: + return nil, errors.New("unknown wait strategy") + } +} + +// New creates a new Client. +func New(getter genericclioptions.RESTClientGetter, ws WaitStrategy) (*Client, error) { + if getter == nil { + getter = genericclioptions.NewConfigFlags(true) + } + factory := cmdutil.NewFactory(getter) + waiter, err := NewWaiter(ws, factory, nopLogger) + if err != nil { + return nil, err } return &Client{ Factory: factory, diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 037719219..3ab415a48 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -453,10 +453,6 @@ func TestPerform(t *testing.T) { } } -// Likely it is not possible to get this test to work with kstatus given that it seems -// kstatus is not making constant get checks on the resources and is instead waiting for events -// Potentially the test could be reworked to make the pods after five seconds -// would need this -> func TestWait(t *testing.T) { podList := newPodList("starfish", "otter", "squid") @@ -517,16 +513,11 @@ func TestWait(t *testing.T) { } }), } - cs, err := c.getKubeClient() + waiter, err := NewWaiter(LegacyWaiter, c.Factory, c.Log) if err != nil { t.Fatal(err) } - checker := NewReadyChecker(cs, c.Log, PausedAsReady(true)) - c.Waiter = &waiter{ - c: checker, - log: c.Log, - timeout: time.Second * 30, - } + c.Waiter = waiter resources, err := c.Build(objBody(&podList), false) if err != nil { t.Fatal(err) @@ -579,16 +570,11 @@ func TestWaitJob(t *testing.T) { } }), } - cs, err := c.getKubeClient() + waiter, err := NewWaiter(LegacyWaiter, c.Factory, c.Log) if err != nil { t.Fatal(err) } - checker := NewReadyChecker(cs, c.Log, PausedAsReady(true), CheckJobs(true)) - c.Waiter = &waiter{ - c: checker, - log: c.Log, - timeout: time.Second * 30, - } + c.Waiter = waiter resources, err := c.Build(objBody(job), false) if err != nil { t.Fatal(err) @@ -643,16 +629,11 @@ func TestWaitDelete(t *testing.T) { } }), } - cs, err := c.getKubeClient() + waiter, err := NewWaiter(LegacyWaiter, c.Factory, c.Log) if err != nil { t.Fatal(err) } - checker := NewReadyChecker(cs, c.Log, PausedAsReady(true)) - c.Waiter = &waiter{ - c: checker, - log: c.Log, - timeout: time.Second * 30, - } + c.Waiter = waiter resources, err := c.Build(objBody(&pod), false) if err != nil { t.Fatal(err) @@ -679,7 +660,7 @@ func TestWaitDelete(t *testing.T) { func TestReal(t *testing.T) { t.Skip("This is a live test, comment this line to run") - c, err := New(nil, nil) + c, err := New(nil, StatusWaiter) if err != nil { t.Fatal(err) } @@ -692,7 +673,7 @@ func TestReal(t *testing.T) { } testSvcEndpointManifest := testServiceManifest + "\n---\n" + testEndpointManifest - c, err = New(nil, nil) + c, err = New(nil, StatusWaiter) if err != nil { t.Fatal(err) } diff --git a/pkg/kube/wait.go b/pkg/kube/wait.go index cbec8fa59..0ee4504cb 100644 --- a/pkg/kube/wait.go +++ b/pkg/kube/wait.go @@ -46,13 +46,6 @@ type waiter struct { kubeClient *kubernetes.Clientset } -func (w *waiter) NewLegacyWaiter(kubeClient *kubernetes.Clientset, log func(string, ...interface{})) *waiter { - return &waiter{ - log: log, - kubeClient: kubeClient, - } -} - func (w *waiter) Wait(resources ResourceList, timeout time.Duration) error { w.c = NewReadyChecker(w.kubeClient, w.log, PausedAsReady(true)) w.timeout = timeout