func()

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
}