@@ -170,14 +170,14 @@ func parseImageName(image string) (string, string) {
170170 return repoToPull , tag
171171}
172172
173- func (cli * HyperClient ) clientRequest (method , path string , in io.Reader , headers map [string ][]string ) (io.ReadCloser , string , int , error ) {
173+ func (cli * HyperClient ) clientRequest (method , path string , in io.Reader , headers map [string ][]string ) (io.ReadCloser , string , int , * net. Conn , * httputil. ClientConn , error ) {
174174 expectedPayload := (method == "POST" || method == "PUT" )
175175 if expectedPayload && in == nil {
176176 in = bytes .NewReader ([]byte {})
177177 }
178178 req , err := http .NewRequest (method , path , in )
179179 if err != nil {
180- return nil , "" , - 1 , err
180+ return nil , "" , - 1 , nil , nil , err
181181 }
182182 req .Header .Set ("User-Agent" , "kubelet" )
183183 req .URL .Host = cli .addr
@@ -196,44 +196,39 @@ func (cli *HyperClient) clientRequest(method, path string, in io.Reader, headers
196196 var dial net.Conn
197197 dial , err = net .DialTimeout (HYPER_PROTO , HYPER_ADDR , 32 * time .Second )
198198 if err != nil {
199- return nil , "" , - 1 , err
199+ return nil , "" , - 1 , nil , nil , err
200200 }
201- defer dial .Close ()
202201
203202 clientconn := httputil .NewClientConn (dial , nil )
204- defer clientconn .Close ()
205-
206203 resp , err := clientconn .Do (req )
207204 statusCode := - 1
208205 if resp != nil {
209206 statusCode = resp .StatusCode
210207 }
211208 if err != nil {
212209 if strings .Contains (err .Error (), "connection refused" ) {
213- return nil , "" , statusCode , ErrConnectionRefused
210+ return nil , "" , statusCode , & dial , clientconn , ErrConnectionRefused
214211 }
215212
216- return nil , "" , statusCode , fmt .Errorf ("An error occurred trying to connect: %v" , err )
213+ return nil , "" , statusCode , & dial , clientconn , fmt .Errorf ("An error occurred trying to connect: %v" , err )
217214 }
218215
219216 if statusCode < 200 || statusCode >= 400 {
220217 body , err := ioutil .ReadAll (resp .Body )
221218 if err != nil {
222- return nil , "" , statusCode , err
219+ return nil , "" , statusCode , & dial , clientconn , err
223220 }
224221 if len (body ) == 0 {
225- return nil , "" , statusCode , fmt .Errorf ("Error: request returned %s for API route and version %s, check if the server supports the requested API version" , http .StatusText (statusCode ), req .URL )
226- }
227- if len (bytes .TrimSpace (body )) > 150 {
228- return nil , "" , statusCode , fmt .Errorf ("Error from daemon's response" )
222+ return nil , "" , statusCode , nil , nil , fmt .Errorf ("Error: request returned %s for API route and version %s, check if the server supports the requested API version" , http .StatusText (statusCode ), req .URL )
229223 }
230- return nil , "" , statusCode , fmt .Errorf ("%s" , bytes .TrimSpace (body ))
224+
225+ return nil , "" , statusCode , & dial , clientconn , fmt .Errorf ("%s" , bytes .TrimSpace (body ))
231226 }
232227
233- return resp .Body , resp .Header .Get ("Content-Type" ), statusCode , nil
228+ return resp .Body , resp .Header .Get ("Content-Type" ), statusCode , & dial , clientconn , nil
234229}
235230
236- func (cli * HyperClient ) call (method , path string , data interface {}, headers map [string ][]string ) (io. ReadCloser , int , error ) {
231+ func (cli * HyperClient ) call (method , path string , data interface {}, headers map [string ][]string ) ([] byte , int , error ) {
237232 params , err := cli .encodeData (data )
238233 if err != nil {
239234 return nil , - 1 , err
@@ -246,63 +241,67 @@ func (cli *HyperClient) call(method, path string, data interface{}, headers map[
246241 headers ["Content-Type" ] = []string {"application/json" }
247242 }
248243
249- body , _ , statusCode , err := cli .clientRequest (method , path , params , headers )
250- return body , statusCode , err
251- }
244+ body , _ , statusCode , dial , clientconn , err := cli .clientRequest (method , path , params , headers )
245+ if dial != nil {
246+ defer (* dial ).Close ()
247+ }
248+ if clientconn != nil {
249+ defer clientconn .Close ()
250+ }
251+ if err != nil {
252+ return nil , statusCode , err
253+ }
252254
253- func (cli * HyperClient ) stream (method , path string , in io.Reader , out io.Writer , headers map [string ][]string ) error {
254- return cli .streamHelper (method , path , true , in , out , nil , headers )
255- }
255+ if body == nil {
256+ return nil , statusCode , err
257+ }
258+
259+ defer body .Close ()
256260
257- func (cli * HyperClient ) streamHelper (method , path string , setRawTerminal bool , in io.Reader , stdout , stderr io.Writer , headers map [string ][]string ) error {
258- body , contentType , _ , err := cli .clientRequest (method , path , in , headers )
261+ result , err := ioutil .ReadAll (body )
259262 if err != nil {
260- return err
263+ return nil , - 1 , err
261264 }
262- return cli .streamBody (body , contentType , setRawTerminal , stdout , stderr )
265+
266+ return result , statusCode , nil
263267}
264268
265- func MatchesContentType (contentType , expectedType string ) bool {
266- mimetype , _ , err := mime .ParseMediaType (contentType )
269+ func (cli * HyperClient ) stream (method , path string , in io.Reader , out io.Writer , headers map [string ][]string ) error {
270+ body , contentType , _ , dial , clientconn , err := cli .clientRequest (method , path , in , headers )
271+ if dial != nil {
272+ defer (* dial ).Close ()
273+ }
274+ if clientconn != nil {
275+ defer clientconn .Close ()
276+ }
267277 if err != nil {
268- glog . V ( 4 ). Infof ( "Error parsing media type: %s error: %v" , contentType , err )
278+ return err
269279 }
270- return err == nil && mimetype == expectedType
271- }
272280
273- func (cli * HyperClient ) streamBody (body io.ReadCloser , contentType string , setRawTerminal bool , stdout , stderr io.Writer ) error {
274281 defer body .Close ()
275282
276283 if MatchesContentType (contentType , "application/json" ) {
277284 buf := new (bytes.Buffer )
278285 buf .ReadFrom (body )
279- if stdout != nil {
280- stdout .Write (buf .Bytes ())
286+ if out != nil {
287+ out .Write (buf .Bytes ())
281288 }
282289 return nil
283290 }
284291 return nil
292+
285293}
286294
287- func readBody (stream io.ReadCloser , statusCode int , err error ) ([]byte , int , error ) {
288- if stream != nil {
289- defer stream .Close ()
290- }
291- if err != nil {
292- return nil , statusCode , err
293- }
294- if stream == nil {
295- return nil , statusCode , err
296- }
297- body , err := ioutil .ReadAll (stream )
295+ func MatchesContentType (contentType , expectedType string ) bool {
296+ mimetype , _ , err := mime .ParseMediaType (contentType )
298297 if err != nil {
299- return nil , - 1 , err
298+ glog . V ( 4 ). Infof ( "Error parsing media type: %s error: %v" , contentType , err )
300299 }
301- return body , statusCode , nil
300+ return err == nil && mimetype == expectedType
302301}
303302
304303func (client * HyperClient ) Version () (string , error ) {
305- body , _ , err := readBody ( client .call ("GET" , "/version" , nil , nil ) )
304+ body , _ , err := client .call ("GET" , "/version" , nil , nil )
306305 if err != nil {
307306 return "" , err
308307 }
@@ -324,7 +323,7 @@ func (client *HyperClient) Version() (string, error) {
324323func (client * HyperClient ) ListPods () ([]HyperPod , error ) {
325324 v := url.Values {}
326325 v .Set (KEY_ITEM , TYPE_POD )
327- body , _ , err := readBody ( client .call ("GET" , "/list?" + v .Encode (), nil , nil ) )
326+ body , _ , err := client .call ("GET" , "/list?" + v .Encode (), nil , nil )
328327 if err != nil {
329328 return nil , err
330329 }
@@ -346,7 +345,7 @@ func (client *HyperClient) ListPods() ([]HyperPod, error) {
346345
347346 values := url.Values {}
348347 values .Set (KEY_POD_NAME , hyperPod .PodID )
349- body , _ , err = readBody ( client .call ("GET" , "/pod/info?" + values .Encode (), nil , nil ) )
348+ body , _ , err = client .call ("GET" , "/pod/info?" + values .Encode (), nil , nil )
350349 if err != nil {
351350 return nil , err
352351 }
@@ -365,7 +364,7 @@ func (client *HyperClient) ListPods() ([]HyperPod, error) {
365364func (client * HyperClient ) ListContainers () ([]HyperContainer , error ) {
366365 v := url.Values {}
367366 v .Set (KEY_ITEM , TYPE_CONTAINER )
368- body , _ , err := readBody ( client .call ("GET" , "/list?" + v .Encode (), nil , nil ) )
367+ body , _ , err := client .call ("GET" , "/list?" + v .Encode (), nil , nil )
369368 if err != nil {
370369 return nil , err
371370 }
@@ -395,7 +394,7 @@ func (client *HyperClient) ListContainers() ([]HyperContainer, error) {
395394}
396395
397396func (client * HyperClient ) Info () (map [string ]interface {}, error ) {
398- body , _ , err := readBody ( client .call ("GET" , "/info" , nil , nil ) )
397+ body , _ , err := client .call ("GET" , "/info" , nil , nil )
399398 if err != nil {
400399 return nil , err
401400 }
@@ -412,7 +411,7 @@ func (client *HyperClient) Info() (map[string]interface{}, error) {
412411func (client * HyperClient ) ListImages () ([]HyperImage , error ) {
413412 v := url.Values {}
414413 v .Set ("all" , "no" )
415- body , _ , err := readBody ( client .call ("GET" , "/images/get?" + v .Encode (), nil , nil ) )
414+ body , _ , err := client .call ("GET" , "/images/get?" + v .Encode (), nil , nil )
416415 if err != nil {
417416 return nil , err
418417 }
@@ -457,7 +456,7 @@ func (client *HyperClient) ListImages() ([]HyperImage, error) {
457456func (client * HyperClient ) RemoveImage (imageID string ) error {
458457 v := url.Values {}
459458 v .Set (KEY_IMAGEID , imageID )
460- _ , _ , err := readBody ( client .call ("POST" , "/images/remove?" + v .Encode (), nil , nil ) )
459+ _ , _ , err := client .call ("POST" , "/images/remove?" + v .Encode (), nil , nil )
461460 if err != nil {
462461 return err
463462 }
@@ -468,7 +467,7 @@ func (client *HyperClient) RemoveImage(imageID string) error {
468467func (client * HyperClient ) RemovePod (podID string ) error {
469468 v := url.Values {}
470469 v .Set (KEY_POD_ID , podID )
471- _ , _ , err := readBody ( client .call ("POST" , "/pod/remove?" + v .Encode (), nil , nil ) )
470+ _ , _ , err := client .call ("POST" , "/pod/remove?" + v .Encode (), nil , nil )
472471 if err != nil {
473472 return err
474473 }
@@ -479,7 +478,7 @@ func (client *HyperClient) RemovePod(podID string) error {
479478func (client * HyperClient ) StartPod (podID string ) error {
480479 v := url.Values {}
481480 v .Set (KEY_POD_ID , podID )
482- _ , _ , err := readBody ( client .call ("POST" , "/pod/start?" + v .Encode (), nil , nil ) )
481+ _ , _ , err := client .call ("POST" , "/pod/start?" + v .Encode (), nil , nil )
483482 if err != nil {
484483 return err
485484 }
@@ -491,7 +490,7 @@ func (client *HyperClient) StopPod(podID string) error {
491490 v := url.Values {}
492491 v .Set (KEY_POD_ID , podID )
493492 v .Set ("stopVM" , "yes" )
494- _ , _ , err := readBody ( client .call ("POST" , "/pod/stop?" + v .Encode (), nil , nil ) )
493+ _ , _ , err := client .call ("POST" , "/pod/stop?" + v .Encode (), nil , nil )
495494 if err != nil {
496495 return err
497496 }
@@ -508,7 +507,6 @@ func (client *HyperClient) PullImage(image string, credential string) error {
508507 headers ["X-Registry-Auth" ] = []string {credential }
509508 }
510509
511- //_, _, err := readBody(client.call("POST", "/image/create?"+v.Encode(), nil, headers))
512510 err := client .stream ("POST" , "/image/create?" + v .Encode (), nil , nil , headers )
513511 if err != nil {
514512 return err
@@ -521,7 +519,7 @@ func (client *HyperClient) CreatePod(podArgs string) (map[string]interface{}, er
521519 glog .V (5 ).Infof ("Hyper: starting to create pod %s" , podArgs )
522520 v := url.Values {}
523521 v .Set (KEY_POD_ARGS , podArgs )
524- body , _ , err := readBody ( client .call ("POST" , "/pod/create?" + v .Encode (), nil , nil ) )
522+ body , _ , err := client .call ("POST" , "/pod/create?" + v .Encode (), nil , nil )
525523 if err != nil {
526524 return nil , err
527525 }
@@ -641,7 +639,7 @@ func (client *HyperClient) IsImagePresent(repo, tag string) (bool, error) {
641639func (client * HyperClient ) ListServices (podId string ) ([]HyperService , error ) {
642640 v := url.Values {}
643641 v .Set ("podId" , podId )
644- body , _ , err := readBody ( client .call ("GET" , "/service/list?" + v .Encode (), nil , nil ) )
642+ body , _ , err := client .call ("GET" , "/service/list?" + v .Encode (), nil , nil )
645643 if err != nil {
646644 if strings .Contains (err .Error (), "doesn't have services discovery" ) {
647645 return nil , nil
@@ -668,7 +666,7 @@ func (client *HyperClient) UpdateServices(podId string, services []HyperService)
668666 return err
669667 }
670668 v .Set ("services" , string (serviceData ))
671- _ , _ , err = readBody ( client .call ("POST" , "/service/update?" + v .Encode (), nil , nil ) )
669+ _ , _ , err = client .call ("POST" , "/service/update?" + v .Encode (), nil , nil )
672670 if err != nil {
673671 return err
674672 }
0 commit comments