github.com/grahambrereton-form3/tilt@v0.10.18/internal/k8s/exec.go (about) 1 package k8s 2 3 import ( 4 "context" 5 "fmt" 6 "io" 7 8 "github.com/opentracing/opentracing-go" 9 corev1 "k8s.io/api/core/v1" 10 "k8s.io/client-go/tools/remotecommand" 11 "k8s.io/kubectl/pkg/scheme" 12 13 "github.com/windmilleng/tilt/internal/container" 14 ) 15 16 func (k K8sClient) Exec(ctx context.Context, podID PodID, cName container.Name, n Namespace, cmd []string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error { 17 span, ctx := opentracing.StartSpanFromContext(ctx, "k8s-Exec") 18 span.SetTag("cmd", fmt.Sprintf("%v", cmd)) 19 defer span.Finish() 20 21 req := k.core.RESTClient().Post(). 22 Resource("pods"). 23 Namespace(n.String()). 24 Name(podID.String()). 25 SubResource("exec"). 26 Param("container", cName.String()) 27 req.VersionedParams(&corev1.PodExecOptions{ 28 Container: cName.String(), 29 Command: cmd, 30 Stdin: stdin != nil, 31 Stdout: stdout != nil, 32 Stderr: stderr != nil, 33 }, scheme.ParameterCodec) 34 35 exec, err := remotecommand.NewSPDYExecutor(k.restConfig, "POST", req.URL()) 36 if err != nil { 37 return err 38 } 39 40 return exec.Stream(remotecommand.StreamOptions{ 41 Stdin: stdin, 42 Stdout: stdout, 43 Stderr: stderr, 44 }) 45 }