Skip to content

Commit 06dac2b

Browse files
committed
feat(pkg/attacher): attach with a TTY
Signed-off-by: Lorenzo Fontana <[email protected]>
1 parent 827c417 commit 06dac2b

File tree

4 files changed

+34
-6
lines changed

4 files changed

+34
-6
lines changed

go.mod

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module github.com/fntlnz/kubectl-trace
22

33
require (
44
github.com/BurntSushi/toml v0.3.1 // indirect
5+
github.com/docker/docker v1.13.1 // indirect
56
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 // indirect
67
github.com/elazarl/goproxy v0.0.0-20181111060418-2ce16c963a8a // indirect
78
github.com/ghodss/yaml v1.0.0 // indirect
@@ -16,6 +17,7 @@ require (
1617
github.com/json-iterator/go v1.1.5 // indirect
1718
github.com/kr/pretty v0.1.0 // indirect
1819
github.com/mitchellh/go-homedir v1.0.0
20+
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
1921
github.com/mitchellh/mapstructure v1.1.2 // indirect
2022
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
2123
github.com/modern-go/reflect2 v1.0.1 // indirect
@@ -42,4 +44,5 @@ require (
4244
k8s.io/api v0.0.0-20181004124137-fd83cbc87e76
4345
k8s.io/apimachinery v0.0.0-20180913025736-6dd46049f395
4446
k8s.io/client-go v9.0.0+incompatible
47+
k8s.io/kubernetes v1.12.2
4548
)

go.sum

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
22
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
33
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
44
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+
github.com/docker/docker v1.13.1 h1:5VBhsO6ckUxB0A8CE5LlUJdXzik9cbEbBTQ/ggeml7M=
6+
github.com/docker/docker v1.13.1/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
57
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg=
68
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
79
github.com/elazarl/goproxy v0.0.0-20181111060418-2ce16c963a8a h1:A4wNiqeKqU56ZhtnzJCTyPZ1+cyu8jKtIchQ3TtxHgw=
@@ -43,6 +45,8 @@ github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDe
4345
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
4446
github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnGC8aR0=
4547
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
48+
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
49+
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
4650
github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
4751
github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
4852
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
@@ -114,3 +118,5 @@ k8s.io/apimachinery v0.0.0-20180913025736-6dd46049f395 h1:X+c9tYTDc9Pmt+Z1YSMqmU
114118
k8s.io/apimachinery v0.0.0-20180913025736-6dd46049f395/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0=
115119
k8s.io/client-go v9.0.0+incompatible h1:NXWpDuPFeVB5lYP1fTqJUtwigjtmRXJNtndnN53ldGI=
116120
k8s.io/client-go v9.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
121+
k8s.io/kubernetes v1.12.2 h1:J94sY8nziFyzMNhnbD5CiSZTo7yWytir0ia+vJuwYfc=
122+
k8s.io/kubernetes v1.12.2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=

pkg/attacher/attach.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"k8s.io/apimachinery/pkg/util/wait"
1414
"k8s.io/client-go/kubernetes/scheme"
1515
tcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
16+
"k8s.io/kubernetes/pkg/kubectl/util/term"
1617

1718
corev1 "k8s.io/api/core/v1"
1819
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -83,9 +84,12 @@ func (a *Attacher) Attach(selector, namespace string) {
8384
restClient := a.CoreV1Client.RESTClient().(*restclient.RESTClient)
8485
containerName := pod.Spec.Containers[0].Name
8586

86-
attfn := defaultAttachFunc(restClient, pod.Name, containerName, pod.Namespace, a.Config)
87+
t, err := setupTTY(os.Stdout, os.Stdin)
88+
if err != nil {
89+
return false, err
90+
}
91+
err = t.Safe(defaultAttachFunc(restClient, pod.Name, containerName, pod.Namespace, a.Config, t))
8792

88-
err = attfn()
8993
if err != nil {
9094
a.logger.Warn("attach retry", zap.Error(err))
9195
return false, nil
@@ -96,8 +100,7 @@ func (a *Attacher) Attach(selector, namespace string) {
96100
<-a.ctx.Done()
97101
}
98102

99-
func defaultAttachFunc(restClient *restclient.RESTClient, podName string, containerName string, namespace string, config *restclient.Config) func() error {
100-
raw := false
103+
func defaultAttachFunc(restClient *restclient.RESTClient, podName string, containerName string, namespace string, config *restclient.Config, t term.TTY) func() error {
101104
return func() error {
102105
req := restClient.Post().
103106
Resource("pods").
@@ -109,11 +112,11 @@ func defaultAttachFunc(restClient *restclient.RESTClient, podName string, contai
109112
Stdin: true,
110113
Stdout: true,
111114
Stderr: true,
112-
TTY: raw,
115+
TTY: t.Raw,
113116
}, scheme.ParameterCodec)
114117

115118
att := &defaultRemoteAttach{}
116-
return att.Attach("POST", req.URL(), config, os.Stdin, os.Stdout, os.Stderr, raw, nil)
119+
return att.Attach("POST", req.URL(), config, t.In, t.Out, os.Stderr, t.Raw, t.MonitorSize(t.GetSize()))
117120
}
118121
}
119122

@@ -132,3 +135,17 @@ func (*defaultRemoteAttach) Attach(method string, url *url.URL, config *restclie
132135
TerminalSizeQueue: terminalSizeQueue,
133136
})
134137
}
138+
139+
func setupTTY(out io.Writer, in io.Reader) (term.TTY, error) {
140+
t := term.TTY{
141+
Out: out,
142+
In: in,
143+
Raw: true,
144+
}
145+
146+
if !t.IsTerminalIn() {
147+
return t, fmt.Errorf("unable to use a TTY if the input is not a terminal")
148+
}
149+
150+
return t, nil
151+
}

pkg/tracejob/job.go

+2
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ func (t *TraceJobClient) CreateJob(nj TraceJob) (*batchv1.Job, error) {
216216
Name: nj.Name,
217217
Image: "quay.io/fntlnz/kubectl-trace-bpftrace:master", //TODO(fntlnz): yes this should be configurable!
218218
Command: bpfTraceCmd,
219+
TTY: true,
220+
Stdin: true,
219221
VolumeMounts: []apiv1.VolumeMount{
220222
apiv1.VolumeMount{
221223
Name: "program",

0 commit comments

Comments
 (0)