44 "flag"
55 "fmt"
66 "os"
7+ "os/signal"
78 "sort"
9+ "syscall"
810 "time"
911
1012 "github.com/gophergala2016/goad"
@@ -48,41 +50,69 @@ func main() {
4850 var finalResult queue.RegionsAggData
4951 defer printSummary (& finalResult )
5052
51- start (test , & finalResult )
53+ sigChan := make (chan os.Signal , 1 )
54+ signal .Notify (sigChan , syscall .SIGINT , syscall .SIGTERM ) // but interrupts from kbd are blocked by termbox
55+
56+ start (test , & finalResult , sigChan )
5257}
5358
54- func start (test * goad.Test , finalResult * queue.RegionsAggData ) {
59+ func start (test * goad.Test , finalResult * queue.RegionsAggData , sigChan chan os. Signal ) {
5560 err := termbox .Init ()
5661 if err != nil {
5762 panic (err )
5863 }
64+
5965 defer termbox .Close ()
6066
6167 resultChan := test .Start ()
6268 termbox .Sync ()
63- for result := range resultChan {
64- // result.Regions["eu-west-1"] = result.Regions["us-east-1"]
65- // sort so that regions always appear in the same order
66- var regions []string
67- for key := range result .Regions {
68- regions = append (regions , key )
69+ renderString (0 , 0 , "Launching on AWS..." , coldef , coldef )
70+ _ , h := termbox .Size ()
71+ renderString (0 , h - 1 , "Press ctrl-c to interrupt" , coldef , coldef )
72+ termbox .Flush ()
73+
74+ go func () {
75+ for {
76+ event := termbox .PollEvent ()
77+ if event .Key == 3 {
78+ sigChan <- syscall .SIGINT
79+ }
6980 }
70- sort .Strings (regions )
71- y := 3
72- totalReqs := 0
73- for _ , region := range regions {
74- data := result .Regions [region ]
75- totalReqs += data .TotalReqs
76- y = renderRegion (data , y )
77- y ++
81+ }()
82+
83+ outer:
84+ for {
85+ select {
86+ case result , ok := <- resultChan :
87+ if ! ok {
88+ break outer
89+ }
90+ // result.Regions["eu-west-1"] = result.Regions["us-east-1"]
91+ // sort so that regions always appear in the same order
92+ var regions []string
93+ for key := range result .Regions {
94+ regions = append (regions , key )
95+ }
96+ sort .Strings (regions )
97+ y := 3
98+ totalReqs := 0
99+ for _ , region := range regions {
100+ data := result .Regions [region ]
101+ totalReqs += data .TotalReqs
102+ y = renderRegion (data , y )
103+ y ++
104+ }
105+
106+ y = 0
107+ percentDone := float64 (totalReqs ) / float64 (result .TotalExpectedRequests )
108+ drawProgressBar (percentDone , y )
109+
110+ termbox .Flush ()
111+ finalResult .Regions = result .Regions
112+
113+ case <- sigChan :
114+ break outer
78115 }
79-
80- y = 0
81- percentDone := float64 (totalReqs ) / float64 (result .TotalExpectedRequests )
82- drawProgressBar (percentDone , y )
83-
84- termbox .Flush ()
85- finalResult .Regions = result .Regions
86116 }
87117}
88118
@@ -107,7 +137,7 @@ func renderRegion(data queue.AggData, y int) int {
107137
108138func drawProgressBar (percent float64 , y int ) {
109139 x := 0
110- percentStr := fmt .Sprintf ("%5.1f%%" , percent * 100 )
140+ percentStr := fmt .Sprintf ("%5.1f%% " , percent * 100 )
111141 renderString (x , y , percentStr , coldef , coldef )
112142 y ++
113143
@@ -134,6 +164,9 @@ func boldPrintln(msg string) {
134164}
135165
136166func printSummary (result * queue.RegionsAggData ) {
167+ if len (result .Regions ) == 0 {
168+ return
169+ }
137170 boldPrintln ("Summary" )
138171 fmt .Println ("" )
139172 for region , data := range result .Regions {
0 commit comments