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 }