/
main.go
155 lines (125 loc) · 3.83 KB
/
main.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"os"
"text/template"
"time"
"golang.org/x/crypto/ssh"
)
/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
COMMANDS NECESSARY TO RUN BEORE RUNNING commandList
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PROVISION_WITH=plex_image.yml vagrant up --provision
PROVISION_WITH=../../stressplex/install_wrk.yml vagrant provision
VM=1 make adhoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Example usage:
go run main.go vagrant localhost:2222 ~/.vagrant.d/insecure_private_key
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
type wrkFields struct {
Name string
AdhocName string
PlexHealthPort string
WrkThreads string
MaxConnections string
TestMinutes string
TargetRps string
Wrk2Address string
}
func NewWrkFields() wrkFields {
return wrkFields{
Name: "lets_gooooooo",
AdhocName: fmt.Sprintf("%d", time.Now().Nanosecond()),
PlexHealthPort: "8080",
WrkThreads: "12",
MaxConnections: "100",
TestMinutes: "1",
TargetRps: "90000",
Wrk2Address: "http://127.0.0.1:8080",
}
}
var commandList = []string{
"echo \"[restarting plex]\"",
"sudo supervisorctl restart plexd",
"while netstat -lnt | awk '$4 ~ /:{{.PlexHealthPort}}$/ {exit 1}'; do sleep 10; done", // waits for plexd to come up
"echo \"[creating input directory]\"",
"sudo mkdir /var/tmp/plex/stressplex/{{.AdhocName}} -p",
"sudo cp ~/live.lua /var/tmp/plex/stressplex/{{.AdhocName}}/live.lua",
"echo \"[running wrk2]\"",
"sudo /usr/local/bin/wrk2 -s /var/tmp/plex/stressplex/{{.AdhocName}}/live.lua -t{{.WrkThreads}} -c{{.MaxConnections}} -d{{.TestMinutes}}m -R {{.TargetRps}} --latency {{.Wrk2Address}} > ~/results.txt",
"sudo cat ~/results.txt",
"echo \"[writing output]\"",
"sudo mkdir /var/log/plex/stressplex/{{.AdhocName}} -p",
"sudo cp ~/results.txt /var/log/plex/stressplex/{{.AdhocName}}/{{.Name}}_resp_results",
"echo \"[cleaning up]\"",
"sudo rm ~/results.txt",
"sudo rm -rf /var/tmp/plex/stressplex/{{.AdhocName}}",
"echo \"RESULTS LOCATED: /var/log/plex/stressplex/{{.AdhocName}}/{{.Name}}_resp_results\"",
}
func main() {
auth := getAuth(os.Args)
client, session, err := connectToHost(os.Args[1], os.Args[2], auth)
if err != nil {
log.Fatal(err)
}
defer client.Close()
var commands string
params := NewWrkFields()
for _, cmd := range commandList {
var b bytes.Buffer
t := template.Must(template.New("command").Parse(cmd))
t.Execute(&b, params)
fmt.Println(b.String())
commands += b.String() + ";"
}
out, err := session.CombinedOutput(commands[:len(commands)-1])
if err != nil {
fmt.Println(err)
}
fmt.Println(string(out))
}
func getAuth(args []string) ssh.AuthMethod {
switch len(args) {
case 3:
var pass string
fmt.Print("Password: ")
fmt.Scanf("%s\n", &pass)
return ssh.Password(pass)
case 4:
pemBytes, err := ioutil.ReadFile(args[3])
if err != nil {
log.Fatal(err)
}
signer, err := ssh.ParsePrivateKey(pemBytes)
if err != nil {
log.Fatalf("parse key failed:%v", err)
}
return ssh.PublicKeys(signer)
default:
log.Fatalf("Usage: %s <user> <host:port> <(optional) location of .pem file>", os.Args[0])
return nil
}
}
func connectToHost(user, host string, auth ssh.AuthMethod) (*ssh.Client, *ssh.Session, error) {
sshConfig := &ssh.ClientConfig{
User: user,
Auth: []ssh.AuthMethod{auth},
}
client, err := ssh.Dial("tcp", host, sshConfig)
if err != nil {
return nil, nil, err
}
session, err := client.NewSession()
if err != nil {
client.Close()
return nil, nil, err
}
return client, session, nil
}