summaryrefslogtreecommitdiff
path: root/server/container_portforward.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/container_portforward.go')
-rw-r--r--server/container_portforward.go91
1 files changed, 0 insertions, 91 deletions
diff --git a/server/container_portforward.go b/server/container_portforward.go
deleted file mode 100644
index 97dd53423..000000000
--- a/server/container_portforward.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package server
-
-import (
- "bytes"
- "fmt"
- "io"
- "os/exec"
- "strings"
-
- "github.com/docker/docker/pkg/pools"
- "github.com/kubernetes-incubator/cri-o/oci"
- "github.com/sirupsen/logrus"
- "golang.org/x/net/context"
- pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/v1alpha1/runtime"
-)
-
-// PortForward prepares a streaming endpoint to forward ports from a PodSandbox.
-func (s *Server) PortForward(ctx context.Context, req *pb.PortForwardRequest) (*pb.PortForwardResponse, error) {
- logrus.Debugf("PortForwardRequest %+v", req)
-
- resp, err := s.GetPortForward(req)
-
- if err != nil {
- return nil, fmt.Errorf("unable to prepare portforward endpoint")
- }
-
- return resp, nil
-}
-
-func (ss streamService) PortForward(podSandboxID string, port int32, stream io.ReadWriteCloser) error {
- c := ss.runtimeServer.GetSandboxContainer(podSandboxID)
-
- if c == nil {
- return fmt.Errorf("could not find container for sandbox %q", podSandboxID)
- }
-
- if err := ss.runtimeServer.Runtime().UpdateStatus(c); err != nil {
- return err
- }
-
- cState := ss.runtimeServer.Runtime().ContainerStatus(c)
- if !(cState.Status == oci.ContainerStateRunning || cState.Status == oci.ContainerStateCreated) {
- return fmt.Errorf("container is not created or running")
- }
-
- containerPid := cState.Pid
- socatPath, lookupErr := exec.LookPath("socat")
- if lookupErr != nil {
- return fmt.Errorf("unable to do port forwarding: socat not found")
- }
-
- args := []string{"-t", fmt.Sprintf("%d", containerPid), "-n", socatPath, "-", fmt.Sprintf("TCP4:localhost:%d", port)}
-
- nsenterPath, lookupErr := exec.LookPath("nsenter")
- if lookupErr != nil {
- return fmt.Errorf("unable to do port forwarding: nsenter not found")
- }
-
- commandString := fmt.Sprintf("%s %s", nsenterPath, strings.Join(args, " "))
- logrus.Debugf("executing port forwarding command: %s", commandString)
-
- command := exec.Command(nsenterPath, args...)
- command.Stdout = stream
-
- stderr := new(bytes.Buffer)
- command.Stderr = stderr
-
- // If we use Stdin, command.Run() won't return until the goroutine that's copying
- // from stream finishes. Unfortunately, if you have a client like telnet connected
- // via port forwarding, as long as the user's telnet client is connected to the user's
- // local listener that port forwarding sets up, the telnet session never exits. This
- // means that even if socat has finished running, command.Run() won't ever return
- // (because the client still has the connection and stream open).
- //
- // The work around is to use StdinPipe(), as Wait() (called by Run()) closes the pipe
- // when the command (socat) exits.
- inPipe, err := command.StdinPipe()
- if err != nil {
- return fmt.Errorf("unable to do port forwarding: error creating stdin pipe: %v", err)
- }
- go func() {
- pools.Copy(inPipe, stream)
- inPipe.Close()
- }()
-
- if err := command.Run(); err != nil {
- return fmt.Errorf("%v: %s", err, stderr.String())
- }
-
- return nil
-}