@@ -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.
0 commit comments