diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/build_prune.go | 10 | ||||
-rw-r--r-- | client/client.go | 5 | ||||
-rw-r--r-- | client/client_unix.go | 4 | ||||
-rw-r--r-- | client/events.go | 1 | ||||
-rw-r--r-- | client/events_test.go | 1 | ||||
-rw-r--r-- | client/image_list.go | 3 | ||||
-rw-r--r-- | client/image_list_test.go | 41 | ||||
-rw-r--r-- | client/ping.go | 6 |
8 files changed, 56 insertions, 15 deletions
diff --git a/client/build_prune.go b/client/build_prune.go index 397d67cdcf..2b6606236e 100644 --- a/client/build_prune.go +++ b/client/build_prune.go @@ -3,8 +3,8 @@ package client // import "github.com/docker/docker/client" import ( "context" "encoding/json" - "fmt" "net/url" + "strconv" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" @@ -23,12 +23,12 @@ func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePru if opts.All { query.Set("all", "1") } - query.Set("keep-storage", fmt.Sprintf("%d", opts.KeepStorage)) - filters, err := filters.ToJSON(opts.Filters) + query.Set("keep-storage", strconv.Itoa(int(opts.KeepStorage))) + f, err := filters.ToJSON(opts.Filters) if err != nil { return nil, errors.Wrap(err, "prune could not marshal filters option") } - query.Set("filters", filters) + query.Set("filters", f) serverResp, err := cli.post(ctx, "/build/prune", query, nil, nil) defer ensureReaderClosed(serverResp) @@ -38,7 +38,7 @@ func (cli *Client) BuildCachePrune(ctx context.Context, opts types.BuildCachePru } if err := json.NewDecoder(serverResp.body).Decode(&report); err != nil { - return nil, fmt.Errorf("Error retrieving disk usage: %v", err) + return nil, errors.Wrap(err, "error retrieving disk usage") } return &report, nil diff --git a/client/client.go b/client/client.go index 26a0fa2756..224ed6f454 100644 --- a/client/client.go +++ b/client/client.go @@ -282,13 +282,12 @@ func (cli *Client) HTTPClient() *http.Client { // ParseHostURL parses a url string, validates the string is a host url, and // returns the parsed URL func ParseHostURL(host string) (*url.URL, error) { - protoAddrParts := strings.SplitN(host, "://", 2) - if len(protoAddrParts) == 1 { + proto, addr, ok := strings.Cut(host, "://") + if !ok || addr == "" { return nil, errors.Errorf("unable to parse docker host `%s`", host) } var basePath string - proto, addr := protoAddrParts[0], protoAddrParts[1] if proto == "tcp" { parsed, err := url.Parse("tcp://" + addr) if err != nil { diff --git a/client/client_unix.go b/client/client_unix.go index f0783f7085..685149a68c 100644 --- a/client/client_unix.go +++ b/client/client_unix.go @@ -1,5 +1,5 @@ -//go:build linux || freebsd || openbsd || netbsd || darwin || solaris || illumos || dragonfly -// +build linux freebsd openbsd netbsd darwin solaris illumos dragonfly +//go:build !windows +// +build !windows package client // import "github.com/docker/docker/client" diff --git a/client/events.go b/client/events.go index f0dc9d9e12..a9c48a9288 100644 --- a/client/events.go +++ b/client/events.go @@ -17,7 +17,6 @@ import ( // be sent over the error channel. If an error is sent all processing will be stopped. It's up // to the caller to reopen the stream in the event of an error by reinvoking this method. func (cli *Client) Events(ctx context.Context, options types.EventsOptions) (<-chan events.Message, <-chan error) { - messages := make(chan events.Message) errs := make(chan error, 1) diff --git a/client/events_test.go b/client/events_test.go index bcd11ab252..f78042fb2f 100644 --- a/client/events_test.go +++ b/client/events_test.go @@ -58,7 +58,6 @@ func TestEventsErrorFromServer(t *testing.T) { } func TestEvents(t *testing.T) { - expectedURL := "/events" filters := filters.NewArgs() diff --git a/client/image_list.go b/client/image_list.go index a4d7505094..950d513334 100644 --- a/client/image_list.go +++ b/client/image_list.go @@ -34,6 +34,9 @@ func (cli *Client) ImageList(ctx context.Context, options types.ImageListOptions if options.All { query.Set("all", "1") } + if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + query.Set("shared-size", "1") + } serverResp, err := cli.get(ctx, "/images/json", query, nil) defer ensureReaderClosed(serverResp) diff --git a/client/image_list_test.go b/client/image_list_test.go index 4619393ff3..b302d970c9 100644 --- a/client/image_list_test.go +++ b/client/image_list_test.go @@ -7,12 +7,15 @@ import ( "fmt" "io" "net/http" + "net/url" "strings" "testing" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/docker/errdefs" + "gotest.tools/v3/assert" + is "gotest.tools/v3/assert/cmp" ) func TestImageListError(t *testing.T) { @@ -158,3 +161,41 @@ func TestImageListApiBefore125(t *testing.T) { t.Fatalf("expected 2 images, got %v", images) } } + +// Checks if shared-size query parameter is set/not being set correctly +// for /images/json. +func TestImageListWithSharedSize(t *testing.T) { + t.Parallel() + const sharedSize = "shared-size" + for _, tc := range []struct { + name string + version string + options types.ImageListOptions + sharedSize string // expected value for the shared-size query param, or empty if it should not be set. + }{ + {name: "unset after 1.42, no options set", version: "1.42"}, + {name: "set after 1.42, if requested", version: "1.42", options: types.ImageListOptions{SharedSize: true}, sharedSize: "1"}, + {name: "unset before 1.42, even if requested", version: "1.41", options: types.ImageListOptions{SharedSize: true}}, + } { + tc := tc + t.Run(tc.name, func(t *testing.T) { + t.Parallel() + var query url.Values + client := &Client{ + client: newMockClient(func(req *http.Request) (*http.Response, error) { + query = req.URL.Query() + return &http.Response{ + StatusCode: http.StatusOK, + Body: io.NopCloser(strings.NewReader("[]")), + }, nil + }), + version: tc.version, + } + _, err := client.ImageList(context.Background(), tc.options) + assert.Check(t, err) + expectedSet := tc.sharedSize != "" + assert.Check(t, is.Equal(query.Has(sharedSize), expectedSet)) + assert.Check(t, is.Equal(query.Get(sharedSize), tc.sharedSize)) + }) + } +} diff --git a/client/ping.go b/client/ping.go index 27e8695cb5..347ae71e02 100644 --- a/client/ping.go +++ b/client/ping.go @@ -64,10 +64,10 @@ func parsePingResponse(cli *Client, resp serverResponse) (types.Ping, error) { ping.BuilderVersion = types.BuilderVersion(bv) } if si := resp.header.Get("Swarm"); si != "" { - parts := strings.SplitN(si, "/", 2) + state, role, _ := strings.Cut(si, "/") ping.SwarmStatus = &swarm.Status{ - NodeState: swarm.LocalNodeState(parts[0]), - ControlAvailable: len(parts) == 2 && parts[1] == "manager", + NodeState: swarm.LocalNodeState(state), + ControlAvailable: role == "manager", } } err := cli.checkResponseErr(resp) |