Skip to content
This repository was archived by the owner on Jan 21, 2020. It is now read-only.

Commit c9b8799

Browse files
author
David Chung
authored
stream stdout/stderr to log when running a long vagrant provisioning command (#375)
Signed-off-by: David Chung <[email protected]>
1 parent 1af9efa commit c9b8799

File tree

1 file changed

+52
-4
lines changed

1 file changed

+52
-4
lines changed

examples/instance/vagrant/instance.go

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package main
22

33
import (
4+
"bufio"
45
"bytes"
56
"encoding/json"
67
"errors"
78
"fmt"
9+
"io"
810
"io/ioutil"
911
"os"
1012
"os/exec"
1113
"path"
1214

15+
log "github.com/Sirupsen/logrus"
1316
"github.com/docker/infrakit/pkg/spi/instance"
1417
"github.com/docker/infrakit/pkg/template"
1518
)
@@ -29,15 +32,60 @@ func (v vagrantPlugin) Validate(req json.RawMessage) error {
2932
return nil
3033
}
3134

35+
func stream(r io.ReadCloser, dest chan<- string) {
36+
go func() {
37+
defer r.Close()
38+
reader := bufio.NewReader(r)
39+
for {
40+
line, err := reader.ReadString('\n')
41+
if err != nil {
42+
return
43+
}
44+
dest <- line
45+
}
46+
}()
47+
}
48+
3249
func inheritedEnvCommand(cmdAndArgs []string, extraEnv ...string) (string, error) {
3350
cmd := exec.Command(cmdAndArgs[0], cmdAndArgs[1:]...)
3451
cmd.Env = append(os.Environ(), extraEnv...)
35-
output, err := cmd.CombinedOutput()
36-
fmt.Printf("DEBUGGING cmd output: %s\n", string(output))
52+
53+
stdoutChan := make(chan string)
54+
stderrChan := make(chan string)
55+
56+
stdout, err := cmd.StdoutPipe()
3757
if err != nil {
38-
fmt.Printf("Err: %s\n", err)
58+
return "", err
3959
}
40-
return string(output), err
60+
61+
stderr, err := cmd.StderrPipe()
62+
if err != nil {
63+
return "", err
64+
}
65+
66+
stream(stdout, stdoutChan)
67+
stream(stderr, stderrChan)
68+
69+
done := make(chan struct{})
70+
go func() {
71+
for {
72+
select {
73+
case stderrl := <-stderrChan:
74+
log.Warningln("Vagrant STDERR:", stderrl)
75+
case stdoutl := <-stdoutChan:
76+
log.Infoln("Vagrant STDOUT:", stdoutl)
77+
case <-done:
78+
return
79+
}
80+
}
81+
}()
82+
83+
err = cmd.Run()
84+
85+
log.Infoln("Command completed, err=", err)
86+
close(done)
87+
88+
return "", err
4189
}
4290

4391
// Provision creates a new instance.

0 commit comments

Comments
 (0)