Skip to content

Commit 1608f22

Browse files
committed
Add signal handling
1 parent 7b27793 commit 1608f22

File tree

1 file changed

+57
-24
lines changed

1 file changed

+57
-24
lines changed

cli/cli.go

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import (
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

108138
func 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

136166
func 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

Comments
 (0)