Skip to content

Commit 7b902dd

Browse files
author
Radu Matei
authored
Merge pull request #2 from radu-matei/dynamic-options
Create dynamic attach options and stream options based on user define…
2 parents 7faa498 + 0c5a573 commit 7b902dd

2 files changed

Lines changed: 46 additions & 29 deletions

File tree

cmd.go

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,6 @@ func Command(cfg Config, name string, arg ...string) *Cmd {
4343

4444
// Start starts the specified command but does not wait for it to complete.
4545
func (cmd *Cmd) Start() error {
46-
if cmd.Stdin == nil {
47-
cmd.Stdin = ioutil.NopCloser(nil)
48-
}
49-
50-
if cmd.Stdout == nil {
51-
cmd.Stdout = ioutil.Discard
52-
}
53-
54-
if cmd.Stderr == nil {
55-
cmd.Stdout = ioutil.Discard
56-
}
57-
5846
pod, err := createPod(cmd.Cfg.Kubeconfig, cmd.Cfg.Namespace, cmd.Cfg.Name, cmd.Cfg.Image, []string{cmd.Path}, cmd.Args)
5947
if err != nil {
6048
return fmt.Errorf("cannot create pod: %v", err)
@@ -73,12 +61,31 @@ func (cmd *Cmd) Start() error {
7361
//
7462
// The command must have been started by Start.
7563
func (cmd *Cmd) Wait() error {
64+
if cmd.Stdin == nil {
65+
cmd.Stdin = ioutil.NopCloser(nil)
66+
}
67+
68+
if cmd.Stdout == nil {
69+
cmd.Stdout = ioutil.Discard
70+
}
71+
72+
if cmd.Stderr == nil {
73+
cmd.Stderr = ioutil.Discard
74+
}
7675

7776
// wait for pod to be running
7877
fmt.Printf("waiting for pod to be running\n")
7978
watchPod(cmd.Cfg.Kubeconfig, cmd.pod)
8079

81-
err := attach(cmd.Cfg.Kubeconfig, cmd.pod, cmd.Stdin, cmd.Stdout, cmd.Stderr)
80+
attachOptions := &v1.PodAttachOptions{
81+
Stdin: cmd.Stdin != ioutil.NopCloser(nil),
82+
Stdout: cmd.Stdout != ioutil.Discard,
83+
//Stderr: cmd.Stderr != ioutil.Discard,
84+
Stderr: true,
85+
TTY: false,
86+
}
87+
88+
err := attach(cmd.Cfg.Kubeconfig, cmd.pod, attachOptions, cmd.Stdin, cmd.Stdout, cmd.Stderr)
8289
if err != nil {
8390
return fmt.Errorf("cannot attach: %v", err)
8491
}

kube_util.go

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func containerToAttachTo(container string, pod *v1.Pod) (*v1.Container, error) {
104104
}
105105

106106
// attach attaches to a given pod, outputting to stdout and stderr
107-
func attach(kubeconfig string, pod *v1.Pod, stdin io.Reader, stdout, stderr io.Writer) error {
107+
func attach(kubeconfig string, pod *v1.Pod, attachOptions *v1.PodAttachOptions, stdin io.Reader, stdout, stderr io.Writer) error {
108108
clientset, config, err := getKubeClient(kubeconfig)
109109
if err != nil {
110110
log.Fatalf("cannot get clientset: %v", err)
@@ -121,33 +121,26 @@ func attach(kubeconfig string, pod *v1.Pod, stdin io.Reader, stdout, stderr io.W
121121
Namespace(pod.Namespace).
122122
SubResource("attach")
123123

124-
req.VersionedParams(&v1.PodAttachOptions{
125-
Container: container.Name,
126-
Stdin: true,
127-
Stdout: true,
128-
Stderr: true,
129-
TTY: false,
130-
}, scheme.ParameterCodec)
124+
attachOptions.Container = container.Name
125+
req.VersionedParams(attachOptions, scheme.ParameterCodec)
131126

132-
err = startStream("POST", req.URL(), config, stdin, stdout, stderr, false)
127+
streamOptions := getStreamOptions(attachOptions, stdin, stdout, stderr)
128+
129+
err = startStream("POST", req.URL(), config, streamOptions)
133130
if err != nil {
134131
return fmt.Errorf("error executing: %v", err)
135132
}
136133

137134
return nil
138135
}
139136

140-
func startStream(method string, url *url.URL, config *restclient.Config, stdin io.Reader, stdout, stderr io.Writer, tty bool) error {
137+
func startStream(method string, url *url.URL, config *restclient.Config, streamOptions remotecommand.StreamOptions) error {
141138
exec, err := remotecommand.NewSPDYExecutor(config, method, url)
142139
if err != nil {
143140
return err
144141
}
145-
return exec.Stream(remotecommand.StreamOptions{
146-
Stdin: stdin,
147-
Stdout: stdout,
148-
Stderr: stderr,
149-
Tty: tty,
150-
})
142+
143+
return exec.Stream(streamOptions)
151144
}
152145

153146
// watchPod waits until the created pod is in running state
@@ -179,3 +172,20 @@ func watchPod(kubeconfig string, pod *v1.Pod) {
179172

180173
controller.Run(stop)
181174
}
175+
176+
func getStreamOptions(attachOptions *v1.PodAttachOptions, stdin io.Reader, stdout, stderr io.Writer) remotecommand.StreamOptions {
177+
var streamOptions remotecommand.StreamOptions
178+
if attachOptions.Stdin {
179+
streamOptions.Stdin = stdin
180+
}
181+
182+
if attachOptions.Stdout {
183+
streamOptions.Stdout = stdout
184+
}
185+
186+
if attachOptions.Stderr {
187+
streamOptions.Stderr = stderr
188+
}
189+
190+
return streamOptions
191+
}

0 commit comments

Comments
 (0)