github.com/grahambrereton-form3/tilt@v0.10.18/internal/k8s/kubectl_runner.go (about)

     1  package k8s
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  )
    10  
    11  type kubectlRunner interface {
    12  	exec(ctx context.Context, argv []string) (stdout string, stderr string, err error)
    13  	execWithStdin(ctx context.Context, argv []string, stdin string) (stdout string, stderr string, err error)
    14  }
    15  
    16  type realKubectlRunner struct {
    17  	kubeContext KubeContext
    18  }
    19  
    20  var _ kubectlRunner = realKubectlRunner{}
    21  
    22  func (k realKubectlRunner) tiltPath() string {
    23  	// TODO(nick): It might be better to dependency inject this. Right now, this
    24  	// only works if os.Args[0] is the Tilt binary.  It won't work right if this
    25  	// is linked into separately compiled binaries that don't have a kubectl
    26  	// sub-command.
    27  	return os.Args[0]
    28  }
    29  
    30  func (k realKubectlRunner) prependGlobalArgs(args []string) []string {
    31  	return append([]string{"kubectl", "--context", string(k.kubeContext)}, args...)
    32  }
    33  
    34  func (k realKubectlRunner) exec(ctx context.Context, args []string) (stdout string, stderr string, err error) {
    35  	args = k.prependGlobalArgs(args)
    36  	c := exec.CommandContext(ctx, k.tiltPath(), args...)
    37  
    38  	stdoutBuf := &bytes.Buffer{}
    39  	stderrBuf := &bytes.Buffer{}
    40  	c.Stdout = stdoutBuf
    41  	c.Stderr = stderrBuf
    42  
    43  	err = c.Run()
    44  	return stdoutBuf.String(), stderrBuf.String(), err
    45  }
    46  
    47  func (k realKubectlRunner) execWithStdin(ctx context.Context, args []string, stdin string) (stdout string, stderr string, err error) {
    48  	args = k.prependGlobalArgs(args)
    49  	c := exec.CommandContext(ctx, k.tiltPath(), args...)
    50  	c.Stdin = strings.NewReader(stdin)
    51  
    52  	stdoutBuf := &bytes.Buffer{}
    53  	stderrBuf := &bytes.Buffer{}
    54  	c.Stdout = stdoutBuf
    55  	c.Stderr = stderrBuf
    56  
    57  	err = c.Run()
    58  	return stdoutBuf.String(), stderrBuf.String(), err
    59  }