From 7459a4bfad57479d1531684938b53a8b90d2099a Mon Sep 17 00:00:00 2001 From: Nathan LeClaire Date: Wed, 8 Feb 2017 16:53:38 -0800 Subject: [PATCH] Fix system container bug Signed-off-by: Nathan LeClaire --- alpine/packages/diagnostics/http.go | 30 ++----------------- .../diagnostics/system_log_capture.go | 21 ++++--------- 2 files changed, 8 insertions(+), 43 deletions(-) diff --git a/alpine/packages/diagnostics/http.go b/alpine/packages/diagnostics/http.go index be37464d6..9f71aa7fa 100644 --- a/alpine/packages/diagnostics/http.go +++ b/alpine/packages/diagnostics/http.go @@ -52,10 +52,6 @@ func dockerHTTPGet(ctx context.Context, url string) (*http.Response, error) { Transport: &UnixSocketRoundTripper{}, } - return dockerHTTPGetWithClient(ctx, url, client) -} - -func dockerHTTPGetWithClient(ctx context.Context, url string, client *http.Client) (*http.Response, error) { req, err := http.NewRequest(http.MethodGet, url, nil) if err != nil { return nil, err @@ -73,24 +69,11 @@ func dockerHTTPGetWithClient(ctx context.Context, url string, client *http.Clien } return resp, err - } // UnixSocketRoundTripper provides a way to make HTTP request to Docker socket // directly. -type UnixSocketRoundTripper struct { - Stream bool - conn *httputil.ClientConn -} - -// Close will close the connection if the caller needs to clean up after -// themselves in a streaming request. -func (u UnixSocketRoundTripper) Close() error { - if u.conn != nil { - return u.conn.Close() - } - return nil -} +type UnixSocketRoundTripper struct{} // RoundTrip dials the Docker UNIX socket to make a HTTP request. func (u UnixSocketRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { @@ -98,16 +81,9 @@ func (u UnixSocketRoundTripper) RoundTrip(req *http.Request) (*http.Response, er if err != nil { return nil, err } - u.conn = httputil.NewClientConn(dial, nil) + conn := httputil.NewClientConn(dial, nil) - // If the client makes a streaming request (e.g., /container/x/logs) - // it's their responsibility to close the connection, because it needs - // to remain open to stream the response body. - if !u.Stream { - defer u.conn.Close() - } - - return u.conn.Do(req) + return conn.Do(req) } // Listen starts the HTTPDiagnosticListener and sets up handlers for its endpoints diff --git a/alpine/packages/diagnostics/system_log_capture.go b/alpine/packages/diagnostics/system_log_capture.go index 415c8503d..2e5aeb2d7 100644 --- a/alpine/packages/diagnostics/system_log_capture.go +++ b/alpine/packages/diagnostics/system_log_capture.go @@ -7,7 +7,6 @@ import ( "encoding/json" "io/ioutil" "log" - "net/http" ) const ( @@ -27,7 +26,10 @@ func (s SystemContainerCapturer) Capture(parentCtx context.Context, w *tar.Write errCh := make(chan error) go func() { - resp, err := dockerHTTPGet(ctx, "/containers/json?all=1&label="+systemContainerLabel) + // URL encoded. + // Reads more like this: + // /v1.25/containers/json?all=1&filters={"label":{"com.docker.editions.system":true}} + resp, err := dockerHTTPGet(ctx, "/containers/json?all=1&filters=%7B%22label%22%3A%7B%22"+systemContainerLabel+"%22%3Atrue%7D%7D") if err != nil { errCh <- err return @@ -46,15 +48,7 @@ func (s SystemContainerCapturer) Capture(parentCtx context.Context, w *tar.Write } for _, c := range names { - transport := &UnixSocketRoundTripper{ - Stream: true, - } - - client := &http.Client{ - Transport: transport, - } - - resp, err := dockerHTTPGetWithClient(ctx, "/containers/"+c.ID+"/logs?stderr=1&stdout=1×tamps=1&tail=all", client) + resp, err := dockerHTTPGet(ctx, "/containers/"+c.ID+"/logs?stderr=1&stdout=1×tamps=1&tail=all") if err != nil { log.Println("ERROR (get request):", err) continue @@ -62,11 +56,6 @@ func (s SystemContainerCapturer) Capture(parentCtx context.Context, w *tar.Write defer resp.Body.Close() - // logs makes streaming request where the original http - // conn is left open so we must clean up after - // ourselves when we're done reading - defer transport.Close() - logLines, err := ioutil.ReadAll(resp.Body) if err != nil { log.Println("ERROR (reading response):", err)