Skip to content

Commit

Permalink
server: platform specific tty handling
Browse files Browse the repository at this point in the history
Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
  • Loading branch information
vbatts committed May 16, 2018
1 parent 72cb448 commit 1206efc
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 25 deletions.
26 changes: 1 addition & 25 deletions server/container_exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,11 @@ import (
"time"

"github.com/docker/docker/pkg/pools"
"github.com/kr/pty"
"github.com/kubernetes-incubator/cri-o/oci"
"github.com/sirupsen/logrus"
"golang.org/x/net/context"
"k8s.io/client-go/tools/remotecommand"
pb "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2"
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util/term"
utilexec "k8s.io/utils/exec"
)

Expand Down Expand Up @@ -65,28 +62,7 @@ func (ss streamService) Exec(containerID string, cmd []string, stdin io.Reader,
execCmd := exec.Command(ss.runtimeServer.Runtime().Path(c), args...)
var cmdErr error
if tty {
p, err := pty.Start(execCmd)
if err != nil {
return err
}
defer p.Close()

// make sure to close the stdout stream
defer stdout.Close()

kubecontainer.HandleResizing(resize, func(size remotecommand.TerminalSize) {
term.SetSize(p.Fd(), size)
})

if stdin != nil {
go pools.Copy(p, stdin)
}

if stdout != nil {
go pools.Copy(stdout, p)
}

cmdErr = execCmd.Wait()
cmdErr = ss.ttyCmd(execCmd, stdin, stdout, resize)
} else {
if stdin != nil {
// Use an os.Pipe here as it returns true *os.File objects.
Expand Down
39 changes: 39 additions & 0 deletions server/container_exec_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// +build !windows

package server

import (
"io"
"os/exec"

"github.com/docker/docker/pkg/pools"
"github.com/kr/pty"
"k8s.io/client-go/tools/remotecommand"
kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
"k8s.io/kubernetes/pkg/util/term"
)

func (ss streamService) ttyCmd(execCmd *exec.Cmd, stdin io.Reader, stdout io.WriteCloser, resize <-chan remotecommand.TerminalSize) error {
p, err := pty.Start(execCmd)
if err != nil {
return err
}
defer p.Close()

// make sure to close the stdout stream
defer stdout.Close()

kubecontainer.HandleResizing(resize, func(size remotecommand.TerminalSize) {
term.SetSize(p.Fd(), size)
})

if stdin != nil {
go pools.Copy(p, stdin)
}

if stdout != nil {
go pools.Copy(stdout, p)
}

return execCmd.Wait()
}
15 changes: 15 additions & 0 deletions server/container_exec_windows.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// +build windows

package server

import (
"fmt"
"io"
"os/exec"

"k8s.io/client-go/tools/remotecommand"
)

func (ss streamService) ttyCmd(cmd *exec.Cmd, stdin io.Reader, stdout io.WriteCloser, resize <-chan remotecommand.TerminalSize) error {
return fmt.Errorf("unsupported")
}

0 comments on commit 1206efc

Please sign in to comment.