Skip to content
This repository was archived by the owner on Feb 8, 2021. It is now read-only.

Commit 8b81dd4

Browse files
committed
Merge pull request #22 from feiskyer/fix-hyperclient
Fix hyperclient
2 parents fa86ae3 + faae738 commit 8b81dd4

File tree

1 file changed

+59
-61
lines changed

1 file changed

+59
-61
lines changed

pkg/kubelet/hyper/hyperclient.go

Lines changed: 59 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -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

304303
func (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) {
324323
func (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) {
365364
func (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

397396
func (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) {
412411
func (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) {
457456
func (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 {
468467
func (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 {
479478
func (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) {
641639
func (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

Comments
 (0)