From 7fde4962a85fb58c09e5412a7114592ca27a3d6a Mon Sep 17 00:00:00 2001 From: Austin Abro Date: Sun, 16 Feb 2025 21:33:15 +0000 Subject: [PATCH] set waiter in functions Signed-off-by: Austin Abro --- pkg/action/action.go | 2 +- pkg/action/install.go | 7 +++---- pkg/action/rollback.go | 8 ++++---- pkg/action/uninstall.go | 5 +++++ pkg/action/upgrade.go | 8 ++++++++ pkg/kube/client.go | 13 +++++++++++-- pkg/kube/client_test.go | 4 ++-- pkg/kube/fake/fake.go | 4 ++++ pkg/kube/fake/printer.go | 4 ++++ pkg/kube/interface.go | 2 ++ 10 files changed, 44 insertions(+), 13 deletions(-) diff --git a/pkg/action/action.go b/pkg/action/action.go index a2d7523a5..d067c67ea 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, kube.StatusWatcherStrategy) + kc, err := kube.New(getter) if err != nil { return err } diff --git a/pkg/action/install.go b/pkg/action/install.go index a12dee11d..a589aaf04 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -157,10 +157,6 @@ func (i *Install) GetRegistryClient() *registry.Client { return i.ChartPathOptions.registryClient } -func (i *Install) shouldWait() bool { - return i.Wait != "" -} - func (i *Install) installCRDs(crds []chart.CRD) error { // We do these one file at a time in the order they were read. totalItems := []*resource.Info{} @@ -298,6 +294,9 @@ func (i *Install) RunWithContext(ctx context.Context, chrt *chart.Chart, vals ma i.Wait = kube.StatusWatcherStrategy } } + if err := i.cfg.KubeClient.SetWaiter(i.Wait); err != nil { + return nil, fmt.Errorf("failed to set kube client waiter: %w", err) + } caps, err := i.cfg.getCapabilities() if err != nil { diff --git a/pkg/action/rollback.go b/pkg/action/rollback.go index 8cb8b4ed4..804bdbd58 100644 --- a/pkg/action/rollback.go +++ b/pkg/action/rollback.go @@ -61,6 +61,10 @@ func (r *Rollback) Run(name string) error { return err } + if err := r.cfg.KubeClient.SetWaiter(r.Wait); err != nil { + return fmt.Errorf("failed to set kube client waiter: %w", err) + } + r.cfg.Releases.MaxHistory = r.MaxHistory r.cfg.Log("preparing rollback of %s", name) @@ -90,10 +94,6 @@ func (r *Rollback) Run(name string) error { return nil } -func (r *Rollback) shouldWait() bool { - return !(r.Wait == "") -} - // prepareRollback finds the previous release and prepares a new release object with // the previous release's configuration func (r *Rollback) prepareRollback(name string) (*release.Release, *release.Release, error) { diff --git a/pkg/action/uninstall.go b/pkg/action/uninstall.go index 0a03f2180..f21551bbf 100644 --- a/pkg/action/uninstall.go +++ b/pkg/action/uninstall.go @@ -17,6 +17,7 @@ limitations under the License. package action import ( + "fmt" "strings" "time" @@ -60,6 +61,10 @@ func (u *Uninstall) Run(name string) (*release.UninstallReleaseResponse, error) return nil, err } + if err := u.cfg.KubeClient.SetWaiter(u.Wait); err != nil { + return nil, fmt.Errorf("failed to set kube client waiter: %w", err) + } + if u.DryRun { // In the dry run case, just see if the release exists r, err := u.cfg.releaseContent(name, 0) diff --git a/pkg/action/upgrade.go b/pkg/action/upgrade.go index 671426a27..626c1e6ad 100644 --- a/pkg/action/upgrade.go +++ b/pkg/action/upgrade.go @@ -160,6 +160,9 @@ func (u *Upgrade) RunWithContext(ctx context.Context, name string, chart *chart. u.Wait = kube.StatusWatcherStrategy } } + if err := u.cfg.KubeClient.SetWaiter(u.Wait); err != nil { + return nil, fmt.Errorf("failed to set kube client waiter: %w", err) + } if err := chartutil.ValidateReleaseName(name); err != nil { return nil, errors.Errorf("release name is invalid: %s", name) @@ -528,6 +531,11 @@ func (u *Upgrade) failRelease(rel *release.Release, created kube.ResourceList, e if u.Wait == kube.HookOnlyStrategy { rollin.Wait = kube.StatusWatcherStrategy } + // TODO pretty sure this is unnecessary as the waiter is already set if atomic at the start of upgrade + werr := u.cfg.KubeClient.SetWaiter(u.Wait) + if werr != nil { + return rel, errors.Wrapf(herr, "an error occurred while creating the waiter. original upgrade error: %s", err) + } rollin.WaitForJobs = u.WaitForJobs rollin.DisableHooks = u.DisableHooks rollin.Recreate = u.Recreate diff --git a/pkg/kube/client.go b/pkg/kube/client.go index de28c3421..425152006 100644 --- a/pkg/kube/client.go +++ b/pkg/kube/client.go @@ -144,8 +144,17 @@ func (c *Client) newWaiter(strategy WaitStrategy) (Waiter, error) { } } +func (c *Client) SetWaiter(ws WaitStrategy) error { + var err error + c.Waiter, err = c.newWaiter(ws) + if err != nil { + return err + } + return nil +} + // New creates a new Client. -func New(getter genericclioptions.RESTClientGetter, ws WaitStrategy) (*Client, error) { +func New(getter genericclioptions.RESTClientGetter) (*Client, error) { if getter == nil { getter = genericclioptions.NewConfigFlags(true) } @@ -155,7 +164,7 @@ func New(getter genericclioptions.RESTClientGetter, ws WaitStrategy) (*Client, e Log: nopLogger, } var err error - c.Waiter, err = c.newWaiter(ws) + c.Waiter, err = c.newWaiter(HookOnlyStrategy) if err != nil { return nil, err } diff --git a/pkg/kube/client_test.go b/pkg/kube/client_test.go index 8c8f89cdb..a5ad2b1eb 100644 --- a/pkg/kube/client_test.go +++ b/pkg/kube/client_test.go @@ -659,7 +659,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, StatusWatcherStrategy) + c, err := New(nil) if err != nil { t.Fatal(err) } @@ -672,7 +672,7 @@ func TestReal(t *testing.T) { } testSvcEndpointManifest := testServiceManifest + "\n---\n" + testEndpointManifest - c, err = New(nil, StatusWatcherStrategy) + c, err = New(nil) if err != nil { t.Fatal(err) } diff --git a/pkg/kube/fake/fake.go b/pkg/kube/fake/fake.go index ceca3c113..d722320f8 100644 --- a/pkg/kube/fake/fake.go +++ b/pkg/kube/fake/fake.go @@ -139,6 +139,10 @@ func (f *FailingKubeClient) DeleteWithPropagationPolicy(resources kube.ResourceL return f.PrintingKubeClient.DeleteWithPropagationPolicy(resources, policy) } +func (f *FailingKubeClient) SetWaiter(ws kube.WaitStrategy) error { + return nil +} + func createDummyResourceList() kube.ResourceList { var resInfo resource.Info resInfo.Name = "dummyName" diff --git a/pkg/kube/fake/printer.go b/pkg/kube/fake/printer.go index 0b957d725..3c0430aa1 100644 --- a/pkg/kube/fake/printer.go +++ b/pkg/kube/fake/printer.go @@ -121,6 +121,10 @@ func (p *PrintingKubeClient) DeleteWithPropagationPolicy(resources kube.Resource return &kube.Result{Deleted: resources}, nil } +func (f *PrintingKubeClient) SetWaiter(ws kube.WaitStrategy) error { + return nil +} + func bufferize(resources kube.ResourceList) io.Reader { var builder strings.Builder for _, info := range resources { diff --git a/pkg/kube/interface.go b/pkg/kube/interface.go index 7af8ebca6..fc74a9833 100644 --- a/pkg/kube/interface.go +++ b/pkg/kube/interface.go @@ -47,6 +47,8 @@ type Interface interface { Build(reader io.Reader, validate bool) (ResourceList, error) // IsReachable checks whether the client is able to connect to the cluster. IsReachable() error + // Set Waiter sets the Kube.Waiter + SetWaiter(ws WaitStrategy) error Waiter }