in pkg/service/platform/k8s/k8s.go [340:389]
func (s *K8SService) ExecInPod(namespace, podName string, command []string) (stdout, stderr io.Reader, err error) {
ctx := context.Background()
pod, err := s.CoreClient.Pods(namespace).Get(ctx, podName, metaV1.GetOptions{})
if err != nil {
return nil, nil, fmt.Errorf("failed to GET Pod %q: %w", podName, err)
}
req := s.CoreClient.RESTClient().
Post().
Namespace(pod.Namespace).
Resource("pods").
Name(pod.Name).
SubResource("exec").
VersionedParams(&coreV1Api.PodExecOptions{
Container: pod.Spec.Containers[0].Name,
Command: command,
Stdin: false,
Stdout: true,
Stderr: true,
TTY: false,
}, k8sScheme.ParameterCodec)
restConfig, err := newRestConfig()
if err != nil {
return nil, nil, err
}
exec, err := remotecommand.NewSPDYExecutor(restConfig, "POST", req.URL())
if err != nil {
return nil, nil, fmt.Errorf("failed to connect to the %q server: %w", req.URL(), err)
}
stdoutBuffer, stderrBuffer := new(bytes.Buffer), new(bytes.Buffer)
err = exec.StreamWithContext(ctx, remotecommand.StreamOptions{
Stdin: nil,
Stdout: stdoutBuffer,
Stderr: stderrBuffer,
Tty: false,
})
if err != nil {
return nil, stderrBuffer, fmt.Errorf("failed to execute shell-style stream: %w", err)
}
stdout = stdoutBuffer
stderr = stderrBuffer
return
}