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  }