Skip to content

Commit 31338e9

Browse files
authored
Fix uperf vm (#238)
* fixing SSH issue for uperf driver in VM mode Signed-off-by: Charles CAPORALI <ccaporal@redhat.com> * Fixing regression on iperf driver Signed-off-by: Charles CAPORALI <ccaporal@redhat.com> --------- Signed-off-by: Charles CAPORALI <ccaporal@redhat.com>
1 parent 01ea288 commit 31338e9

2 files changed

Lines changed: 110 additions & 22 deletions

File tree

pkg/drivers/iperf.go

Lines changed: 88 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,29 +101,40 @@ func (i *iperf3) Run(c *kubernetes.Clientset,
101101
if virt {
102102
retry := 10
103103
present := false
104-
sshclient, err := k8s.SSHConnect(perf)
105-
if err != nil {
106-
return stdout, err
104+
createdClient := false
105+
var err error
106+
var vmClient config.VMExecutor
107+
108+
if perf.VMClientExecutor != nil {
109+
vmClient = perf.VMClientExecutor
110+
} else {
111+
vmClient, err = k8s.ConnectToVM(perf)
112+
if err != nil {
113+
return stdout, err
114+
}
115+
createdClient = true
107116
}
108117
for i := 0; i <= retry; i++ {
109118
log.Debug("⏰ Waiting for iperf3 to be present on VM")
110-
_, err = sshclient.Run("until iperf3 -h; do sleep 30; done")
119+
_, err = vmClient.Run("until iperf3 -h; do sleep 30; done")
111120
if err == nil {
112121
present = true
113122
break
114123
}
115124
time.Sleep(10 * time.Second)
116125
}
117126
if !present {
118-
if err := sshclient.Close(); err != nil {
119-
log.Warnf("Error closing SSH client: %v", err)
127+
if createdClient {
128+
if err := vmClient.Close(); err != nil {
129+
log.Warnf("Error closing VM client: %v", err)
130+
}
120131
}
121132
return stdout, fmt.Errorf("iperf3 binary is not present on the VM")
122133
}
123134
var stdout []byte
124135
ran := false
125136
for i := 0; i <= retry; i++ {
126-
stdout, err = sshclient.Run(strings.Join(cmd[:], " "))
137+
stdout, err = vmClient.Run(strings.Join(cmd[:], " "))
127138
if err == nil {
128139
ran = true
129140
break
@@ -132,14 +143,82 @@ func (i *iperf3) Run(c *kubernetes.Clientset,
132143
log.Debugf("⏰ Retrying iperf3 command -- cloud-init still finishing up")
133144
time.Sleep(60 * time.Second)
134145
}
135-
if err := sshclient.Close(); err != nil {
136-
log.Warnf("Error closing SSH client: %v", err)
146+
if createdClient {
147+
if err := vmClient.Close(); err != nil {
148+
log.Warnf("Error closing VM client: %v", err)
149+
}
137150
}
138151
if !ran {
139152
return *bytes.NewBuffer(stdout), fmt.Errorf("unable to run iperf3")
140153
}
141154
} else {
142155
//Pod mode
156+
req := c.CoreV1().RESTClient().
157+
Post().
158+
Namespace(pod.Namespace).
159+
Resource("pods").
160+
Name(pod.Name).
161+
SubResource("exec").
162+
VersionedParams(&apiv1.PodExecOptions{
163+
Container: pod.Spec.Containers[0].Name,
164+
Command: cmd,
165+
Stdin: false,
166+
Stdout: true,
167+
Stderr: true,
168+
TTY: true,
169+
}, scheme.ParameterCodec)
170+
exec, err := remotecommand.NewSPDYExecutor(&rc, "POST", req.URL())
171+
if err != nil {
172+
return stdout, err
173+
}
174+
// Connect this process' std{in,out,err} to the remote shell process.
175+
err = exec.StreamWithContext(context.Background(), remotecommand.StreamOptions{
176+
Stdin: nil,
177+
Stdout: &stdout,
178+
Stderr: &stderr,
179+
})
180+
if err != nil {
181+
return stdout, err
182+
}
183+
}
184+
185+
//Empty buffer
186+
stdout = bytes.Buffer{}
187+
stderr = bytes.Buffer{}
188+
189+
//VM result
190+
if virt {
191+
createdClient := false
192+
var err error
193+
var vmClient config.VMExecutor
194+
195+
if perf.VMClientExecutor != nil {
196+
vmClient = perf.VMClientExecutor
197+
} else {
198+
vmClient, err = k8s.ConnectToVM(perf)
199+
if err != nil {
200+
return stdout, err
201+
}
202+
createdClient = true
203+
}
204+
stdout, err := vmClient.Run(fmt.Sprintf("cat %s", file))
205+
if err != nil {
206+
if createdClient {
207+
if closeErr := vmClient.Close(); closeErr != nil {
208+
log.Warnf("Error closing SSH client: %v", closeErr)
209+
}
210+
}
211+
return *bytes.NewBuffer(stdout), err
212+
}
213+
log.Debug(strings.TrimSpace(bytes.NewBuffer(stdout).String()))
214+
if createdClient {
215+
if err := vmClient.Close(); err != nil {
216+
log.Warnf("Error closing SSH client: %v", err)
217+
}
218+
}
219+
return *bytes.NewBuffer(stdout), nil
220+
//Pod results
221+
} else {
143222
req := c.CoreV1().RESTClient().
144223
Post().
145224
Namespace(pod.Namespace).
@@ -170,7 +249,6 @@ func (i *iperf3) Run(c *kubernetes.Clientset,
170249
log.Debug(strings.TrimSpace(stdout.String()))
171250
return stdout, nil
172251
}
173-
return stdout, nil
174252
}
175253

176254
// ParseResults accepts the stdout from the execution of the benchmark.

pkg/drivers/uperf.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,24 +97,27 @@ func createUperfProfile(c *kubernetes.Clientset, rc rest.Config, nc config.Confi
9797
uperfCmd := "echo '" + fileContent + "' > " + filePath
9898
cmd = []string{uperfCmd}
9999

100+
var err error
101+
createdClient := false
100102
var vmClient config.VMExecutor
101103
if perf.VMClientExecutor != nil {
102104
vmClient = perf.VMClientExecutor
103105
} else {
104-
sshclient, err := k8s.SSHConnect(perf)
106+
vmClient, err = k8s.ConnectToVM(perf)
105107
if err != nil {
106108
return filePath, err
107109
}
108-
vmClient = &k8s.SSHClientWrapper{Client: sshclient}
110+
createdClient = true
109111
}
110-
111112
log.Debug(strings.Join(cmd[:], " "))
112-
_, err := vmClient.Run(strings.Join(cmd[:], " "))
113+
_, err = vmClient.Run(strings.Join(cmd[:], " "))
113114
if err != nil {
114115
return filePath, err
115116
}
116-
if err := vmClient.Close(); err != nil {
117-
log.Warnf("Error closing VM client: %v", err)
117+
if createdClient {
118+
if err := vmClient.Close(); err != nil {
119+
log.Warnf("Error closing VM client: %v", err)
120+
}
118121
}
119122
return filePath, nil
120123

@@ -199,15 +202,16 @@ func (u *uperf) Run(c *kubernetes.Clientset, rc rest.Config, nc config.Config, c
199202
retry := 10
200203
present := false
201204

205+
createdClient := false
202206
var vmClient config.VMExecutor
203207
if perf.VMClientExecutor != nil {
204208
vmClient = perf.VMClientExecutor
205209
} else {
206-
sshclient, err := k8s.SSHConnect(perf)
210+
vmClient, err = k8s.ConnectToVM(perf)
207211
if err != nil {
208212
return stdout, err
209213
}
210-
vmClient = &k8s.SSHClientWrapper{Client: sshclient}
214+
createdClient = true
211215
}
212216

213217
var err error
@@ -217,12 +221,16 @@ func (u *uperf) Run(c *kubernetes.Clientset, rc rest.Config, nc config.Config, c
217221
if err == nil {
218222
present = true
219223
break
224+
} else {
225+
log.Debugf("Failed running command %s", err)
220226
}
221227
time.Sleep(30 * time.Second)
222228
}
223229
if !present {
224-
if err := vmClient.Close(); err != nil {
225-
log.Warnf("Error closing VM client: %v", err)
230+
if createdClient {
231+
if err := vmClient.Close(); err != nil {
232+
log.Warnf("Error closing VM client: %v", err)
233+
}
226234
}
227235
return stdout, fmt.Errorf("uperf binary is not present on the VM")
228236
}
@@ -238,8 +246,10 @@ func (u *uperf) Run(c *kubernetes.Clientset, rc rest.Config, nc config.Config, c
238246
log.Debugf("⏰ Retrying uperf command -- cloud-init still finishing up")
239247
time.Sleep(60 * time.Second)
240248
}
241-
if err := vmClient.Close(); err != nil {
242-
log.Warnf("Error closing VM client: %v", err)
249+
if createdClient {
250+
if err := vmClient.Close(); err != nil {
251+
log.Warnf("Error closing VM client: %v", err)
252+
}
243253
}
244254
if !ran {
245255
return *bytes.NewBuffer(stdout), fmt.Errorf("unable to run uperf")

0 commit comments

Comments
 (0)