From baed6240468250c855a5ec235e47a64e078bd042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arda=20G=C3=BC=C3=A7l=C3=BC?= Date: Mon, 24 Jul 2023 15:28:21 +0300 Subject: [PATCH] kubectl debug: Introduce customizable AttachFunc instead static one Currently, kubectl debug statically relies on handleAttachPod function in order to attach to the pod. However, external tools would want to set their own customized attach function and this commit introduces generic `AttachFunc` function interface which can also override by external tools. From the point of kubectl debug, there is no functionality change. --- .../src/k8s.io/kubectl/pkg/cmd/debug/debug.go | 46 ++++++++++--------- .../kubectl/pkg/cmd/debug/debug_test.go | 2 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug.go b/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug.go index 852e3807014..1066a86b8b8 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug.go @@ -111,6 +111,7 @@ type DebugOptions struct { Args []string ArgsOnly bool Attach bool + AttachFunc func(ctx context.Context, restClientGetter genericclioptions.RESTClientGetter, cmdPath string, ns, podName, containerName string) error Container string CopyTo string Replace bool @@ -212,6 +213,9 @@ func (o *DebugOptions) Complete(restClientGetter genericclioptions.RESTClientGet attachFlag := cmd.Flags().Lookup("attach") if !attachFlag.Changed && o.Interactive { o.Attach = true + if o.AttachFunc == nil { + o.AttachFunc = o.handleAttachPod + } } // Environment @@ -377,26 +381,8 @@ func (o *DebugOptions) Run(restClientGetter genericclioptions.RESTClientGetter, return visitErr } - if o.Attach && len(containerName) > 0 { - opts := &attach.AttachOptions{ - StreamOptions: exec.StreamOptions{ - IOStreams: o.IOStreams, - Stdin: o.Interactive, - TTY: o.TTY, - Quiet: o.Quiet, - }, - CommandName: cmd.Parent().CommandPath() + " attach", - - Attach: &attach.DefaultRemoteAttach{}, - } - config, err := restClientGetter.ToRESTConfig() - if err != nil { - return err - } - opts.Config = config - opts.AttachFunc = attach.DefaultAttachFunc - - if err := o.handleAttachPod(ctx, restClientGetter, debugPod.Namespace, debugPod.Name, containerName, opts); err != nil { + if o.Attach && len(containerName) > 0 && o.AttachFunc != nil { + if err := o.AttachFunc(ctx, restClientGetter, cmd.Parent().CommandPath(), debugPod.Namespace, debugPod.Name, containerName); err != nil { return err } } @@ -795,7 +781,25 @@ func (o *DebugOptions) waitForContainer(ctx context.Context, ns, podName, contai return result, err } -func (o *DebugOptions) handleAttachPod(ctx context.Context, restClientGetter genericclioptions.RESTClientGetter, ns, podName, containerName string, opts *attach.AttachOptions) error { +func (o *DebugOptions) handleAttachPod(ctx context.Context, restClientGetter genericclioptions.RESTClientGetter, cmdPath string, ns, podName, containerName string) error { + opts := &attach.AttachOptions{ + StreamOptions: exec.StreamOptions{ + IOStreams: o.IOStreams, + Stdin: o.Interactive, + TTY: o.TTY, + Quiet: o.Quiet, + }, + CommandName: cmdPath + " attach", + + Attach: &attach.DefaultRemoteAttach{}, + } + config, err := restClientGetter.ToRESTConfig() + if err != nil { + return err + } + opts.Config = config + opts.AttachFunc = attach.DefaultAttachFunc + pod, err := o.waitForContainer(ctx, ns, podName, containerName) if err != nil { return err diff --git a/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug_test.go b/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug_test.go index 3febf5210f3..17a04803225 100644 --- a/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug_test.go +++ b/staging/src/k8s.io/kubectl/pkg/cmd/debug/debug_test.go @@ -2104,7 +2104,7 @@ func TestCompleteAndValidate(t *testing.T) { } if diff := cmp.Diff(tc.wantOpts, opts, cmpFilter, cmpopts.IgnoreFields(DebugOptions{}, - "attachChanged", "shareProcessedChanged", "podClient", "WarningPrinter", "Applier", "explicitNamespace", "Builder")); diff != "" { + "attachChanged", "shareProcessedChanged", "podClient", "WarningPrinter", "Applier", "explicitNamespace", "Builder", "AttachFunc")); diff != "" { t.Error("CompleteAndValidate unexpected diff in generated object: (-want +got):\n", diff) } })