-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.go
138 lines (118 loc) · 2.56 KB
/
server.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"bufio"
"encoding/json"
"fmt"
"github.com/cleversoap/go-cp"
"log"
"net/http"
"os/exec"
"strconv"
"strings"
)
var quit chan struct{}
type histogramColumn struct {
Value float64 `json:"value"`
Count int64 `json:"count"`
}
type histogram struct {
Histogram []histogramColumn `json:"histogram"`
}
func runCyclictest() *exec.Cmd {
cmd := exec.Command("sh", "-c", "./cyclictest -q -D2 -h100 > outputGo")
err := cmd.Start()
if err != nil {
log.Fatal(err)
}
return cmd
}
func startCyclictest() {
var cmd *exec.Cmd
for {
select {
case <-quit:
// kill_cyclictest(cmd)
break
default:
cmd = runCyclictest()
cmd.Wait()
err := cp.Copy("outputGo", "output.txt")
if err != nil {
panic(err)
}
}
}
}
func killCyclictest(cmd *exec.Cmd) {
// Kill it:
if err := cmd.Process.Kill(); err != nil {
log.Fatal("failed to kill process: ", err)
}
}
func parseCyclictestResults() histogram {
var val float64
var count int64
var errori error
cmd := exec.Command("sh", "-c", "python ./create_hist.py")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
in := bufio.NewScanner(stdout)
err = cmd.Start()
if err != nil {
log.Fatal(err)
}
var histArray histogram
var histArr []histogramColumn
for in.Scan() {
line := in.Text()
fmt.Println(line)
s := strings.Split(line, " ")
if val, errori = strconv.ParseFloat(s[0], 64); errori != nil {
log.Fatal(errori)
}
if count, errori = strconv.ParseInt(s[1], 10, 64); errori != nil {
log.Fatal(errori)
}
col := histogramColumn{
Value: val,
Count: count,
}
histArr = append(histArr, col)
}
histArray.Histogram = histArr
fmt.Println()
return histArray
}
func stopCyclRoutine() {
quit <- struct{}{}
}
func HTTPDataHandler(w http.ResponseWriter, r *http.Request) {
ret := parseCyclictestResults()
js, err := json.Marshal(ret)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.Write(js)
}
func HTTPStopHandler(w http.ResponseWriter, r *http.Request) {
stopCyclRoutine()
w.Header().Set("Server", "Cyclic Web Server")
w.WriteHeader(200)
}
func HTTPStartHandler(w http.ResponseWriter, r *http.Request) {
quit = make(chan struct{})
go startCyclictest()
w.Header().Set("Server", "Cyclic Web Server")
w.WriteHeader(200)
}
func main() {
go startCyclictest()
http.HandleFunc("/v1/data", HTTPDataHandler)
http.HandleFunc("/v1/start", HTTPStartHandler)
http.HandleFunc("/v1/stop", HTTPStopHandler)
log.Fatal(http.ListenAndServe(":9000", nil))
}