summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/build_prune.go10
-rw-r--r--client/client.go5
-rw-r--r--client/client_unix.go4
-rw-r--r--client/events.go1
-rw-r--r--client/events_test.go1
-rw-r--r--client/image_list.go3
-rw-r--r--client/image_list_test.go41
-rw-r--r--client/ping.go6
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)