From 7652f38c289909bc61b1113c0570b9de345bbed9 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 7 Oct 2025 11:37:32 +0200 Subject: [PATCH] client: remove API-version compatibility for API < v1.44 Signed-off-by: Sebastiaan van Stijn --- client/container_create.go | 61 ++++++------------- client/container_exec.go | 33 ---------- client/container_restart.go | 14 +---- client/container_stop.go | 14 +---- client/container_wait.go | 14 ----- client/hijack.go | 6 -- client/image_build.go | 9 +-- client/image_list.go | 26 ++++---- client/image_list_test.go | 5 +- client/network_create.go | 33 +--------- client/service_create.go | 27 +------- client/service_update.go | 10 +-- .../moby/moby/client/container_create.go | 61 ++++++------------- .../moby/moby/client/container_exec.go | 33 ---------- .../moby/moby/client/container_restart.go | 14 +---- .../moby/moby/client/container_stop.go | 14 +---- .../moby/moby/client/container_wait.go | 14 ----- vendor/github.com/moby/moby/client/hijack.go | 6 -- .../moby/moby/client/image_build.go | 9 +-- .../github.com/moby/moby/client/image_list.go | 26 ++++---- .../moby/moby/client/network_create.go | 33 +--------- .../moby/moby/client/service_create.go | 27 +------- .../moby/moby/client/service_update.go | 10 +-- 23 files changed, 80 insertions(+), 419 deletions(-) diff --git a/client/container_create.go b/client/container_create.go index 89e4306e39..617f0a12cc 100644 --- a/client/container_create.go +++ b/client/container_create.go @@ -3,7 +3,6 @@ package client import ( "context" "encoding/json" - "errors" "net/url" "path" "sort" @@ -25,54 +24,28 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config var response container.CreateResponse - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return response, err - } - - if err := cli.NewVersionError(ctx, "1.25", "stop timeout"); config.StopTimeout != nil && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.41", "specify container image platform"); platform != nil && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.44", "specify health-check start interval"); config.Healthcheck != nil && config.Healthcheck.StartInterval != 0 && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.44", "specify mac-address per network"); hasEndpointSpecificMacAddress(networkingConfig) && err != nil { - return response, err - } - if hostConfig != nil { - if platform != nil && platform.OS == "linux" && versions.LessThan(cli.ClientVersion(), "1.42") { - // When using API under 1.42, the Linux daemon doesn't respect the ConsoleSize - hostConfig.ConsoleSize = [2]uint{0, 0} - } - if versions.LessThan(cli.ClientVersion(), "1.44") { - for _, m := range hostConfig.Mounts { - if m.BindOptions != nil { - // ReadOnlyNonRecursive can be safely ignored when API < 1.44 - if m.BindOptions.ReadOnlyForceRecursive { - return response, errors.New("bind-recursive=readonly requires API v1.44 or later") - } - if m.BindOptions.NonRecursive && versions.LessThan(cli.ClientVersion(), "1.40") { - return response, errors.New("bind-recursive=disabled requires API v1.40 or later") - } - } - } - } - hostConfig.CapAdd = normalizeCapabilities(hostConfig.CapAdd) hostConfig.CapDrop = normalizeCapabilities(hostConfig.CapDrop) } - // Since API 1.44, the container-wide MacAddress is deprecated and triggers a WARNING if it's specified. - if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") { - config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + // FIXME(thaJeztah): remove this once we updated our (integration) tests; + // some integration tests depend on this to test old API versions; see https://github.com/moby/moby/pull/51120#issuecomment-3376224865 + if config.MacAddress != "" { //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err + } + if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") { + // Since API 1.44, the container-wide MacAddress is deprecated and triggers a WARNING if it's specified. + // + // FIXME(thaJeztah): remove the field from the API + config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + } } query := url.Values{} diff --git a/client/container_exec.go b/client/container_exec.go index 2a0cdec79d..aaa7526f81 100644 --- a/client/container_exec.go +++ b/client/container_exec.go @@ -6,7 +6,6 @@ import ( "net/http" "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/versions" ) // ExecCreateOptions is a small subset of the Config struct that holds the configuration @@ -32,22 +31,6 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, containerID string, return container.ExecCreateResponse{}, err } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return container.ExecCreateResponse{}, err - } - - if err := cli.NewVersionError(ctx, "1.25", "env"); len(options.Env) != 0 && err != nil { - return container.ExecCreateResponse{}, err - } - if versions.LessThan(cli.ClientVersion(), "1.42") { - options.ConsoleSize = nil - } - req := container.ExecCreateRequest{ User: options.User, Privileged: options.Privileged, @@ -86,19 +69,6 @@ type ExecStartOptions struct { // ContainerExecStart starts an exec process already created in the docker host. func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config ExecStartOptions) error { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - - if versions.LessThan(cli.ClientVersion(), "1.42") { - config.ConsoleSize = nil - } - req := container.ExecStartRequest{ Detach: config.Detach, Tty: config.Tty, @@ -133,9 +103,6 @@ type ExecAttachOptions = ExecStartOptions // // [stdcopy.StdCopy]: https://pkg.go.dev/github.com/moby/moby/api/pkg/stdcopy#StdCopy func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config ExecAttachOptions) (HijackedResponse, error) { - if versions.LessThan(cli.ClientVersion(), "1.42") { - config.ConsoleSize = nil - } req := container.ExecStartRequest{ Detach: config.Detach, Tty: config.Tty, diff --git a/client/container_restart.go b/client/container_restart.go index 8df9b41f16..872a986482 100644 --- a/client/container_restart.go +++ b/client/container_restart.go @@ -4,8 +4,6 @@ import ( "context" "net/url" "strconv" - - "github.com/moby/moby/api/types/versions" ) // ContainerRestart stops, and starts a container again. @@ -22,17 +20,7 @@ func (cli *Client) ContainerRestart(ctx context.Context, containerID string, opt query.Set("t", strconv.Itoa(*options.Timeout)) } if options.Signal != "" { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - if versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) - } + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) defer ensureReaderClosed(resp) diff --git a/client/container_stop.go b/client/container_stop.go index 4e73a49682..0dc542b603 100644 --- a/client/container_stop.go +++ b/client/container_stop.go @@ -4,8 +4,6 @@ import ( "context" "net/url" "strconv" - - "github.com/moby/moby/api/types/versions" ) // ContainerStopOptions holds the options to stop or restart a container. @@ -44,17 +42,7 @@ func (cli *Client) ContainerStop(ctx context.Context, containerID string, option query.Set("t", strconv.Itoa(*options.Timeout)) } if options.Signal != "" { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - if versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) - } + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) defer ensureReaderClosed(resp) diff --git a/client/container_wait.go b/client/container_wait.go index c38a159a65..4267af92ee 100644 --- a/client/container_wait.go +++ b/client/container_wait.go @@ -9,7 +9,6 @@ import ( "net/url" "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/versions" ) const containerWaitErrorMsgLimit = 2 * 1024 /* Max: 2KiB */ @@ -41,19 +40,6 @@ func (cli *Client) ContainerWait(ctx context.Context, containerID string, condit return resultC, errC } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - errC <- err - return resultC, errC - } - if versions.LessThan(cli.ClientVersion(), "1.30") { - return cli.legacyContainerWait(ctx, containerID) - } - query := url.Values{} if condition != "" { query.Set("condition", string(condition)) diff --git a/client/hijack.go b/client/hijack.go index f06f53a323..31c44e5988 100644 --- a/client/hijack.go +++ b/client/hijack.go @@ -9,7 +9,6 @@ import ( "net/url" "time" - "github.com/moby/moby/api/types/versions" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) @@ -28,11 +27,6 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu return HijackedResponse{}, err } - if versions.LessThan(cli.ClientVersion(), "1.42") { - // Prior to 1.42, Content-Type is always set to raw-stream and not relevant - mediaType = "" - } - return NewHijackedResponse(conn, mediaType), nil } diff --git a/client/image_build.go b/client/image_build.go index c095d7f693..fffcc91643 100644 --- a/client/image_build.go +++ b/client/image_build.go @@ -42,7 +42,7 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio }, nil } -func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBuildOptions) (url.Values, error) { +func (cli *Client) imageBuildOptionsToQuery(_ context.Context, options ImageBuildOptions) (url.Values, error) { query := url.Values{} if len(options.Tags) > 0 { query["t"] = options.Tags @@ -79,9 +79,7 @@ func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBu } if options.Squash { - if err := cli.NewVersionError(ctx, "1.25", "squash"); err != nil { - return query, err - } + // TODO(thaJeztah): squash is experimental, and deprecated when using BuildKit? query.Set("squash", "1") } @@ -157,9 +155,6 @@ func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBu query.Set("session", options.SessionID) } if options.Platform != "" { - if err := cli.NewVersionError(ctx, "1.32", "platform"); err != nil { - return query, err - } query.Set("platform", strings.ToLower(options.Platform)) } if options.BuildID != "" { diff --git a/client/image_list.go b/client/image_list.go index 0248fa5ae3..d2516d80d3 100644 --- a/client/image_list.go +++ b/client/image_list.go @@ -18,26 +18,28 @@ import ( func (cli *Client) ImageList(ctx context.Context, options ImageListOptions) ([]image.Summary, error) { var images []image.Summary - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return images, err - } - query := url.Values{} options.Filters.updateURLValues(query) if options.All { query.Set("all", "1") } - if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + if options.SharedSize { query.Set("shared-size", "1") } - if options.Manifests && versions.GreaterThanOrEqualTo(cli.version, "1.47") { - query.Set("manifests", "1") + if options.Manifests { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return images, err + } + + if versions.GreaterThanOrEqualTo(cli.version, "1.47") { + query.Set("manifests", "1") + } } resp, err := cli.get(ctx, "/images/json", query, nil) diff --git a/client/image_list_test.go b/client/image_list_test.go index 85fc1f8d03..619150bd24 100644 --- a/client/image_list_test.go +++ b/client/image_list_test.go @@ -123,9 +123,8 @@ func TestImageListWithSharedSize(t *testing.T) { options 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: ImageListOptions{SharedSize: true}, sharedSize: "1"}, - {name: "unset before 1.42, even if requested", version: "1.41", options: ImageListOptions{SharedSize: true}}, + {name: "unset, no options set"}, + {name: "set", options: ImageListOptions{SharedSize: true}, sharedSize: "1"}, } { t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/client/network_create.go b/client/network_create.go index 5761d52d94..c2703e6a73 100644 --- a/client/network_create.go +++ b/client/network_create.go @@ -5,21 +5,11 @@ import ( "encoding/json" "github.com/moby/moby/api/types/network" - "github.com/moby/moby/api/types/versions" ) // NetworkCreate creates a new network in the docker host. func (cli *Client) NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error) { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return network.CreateResponse{}, err - } - - networkCreateRequest := network.CreateRequest{ + req := network.CreateRequest{ Name: name, Driver: options.Driver, Scope: options.Scope, @@ -35,27 +25,6 @@ func (cli *Client) NetworkCreate(ctx context.Context, name string, options Netwo Labels: options.Labels, } - var req any - if versions.LessThan(cli.version, "1.44") { - // CheckDuplicate is removed in API v1.44, and no longer used by - // daemons supporting that API version (v25.0.0-beta.1 and up) - // regardless of the API version used, but it must be set to true - // when sent to older daemons. - // - // TODO(thaJeztah) remove this once daemon versions v24.0 and lower are no - // longer expected to be used (when Mirantis Container Runtime v23 - // is EOL); https://github.com/moby/moby/blob/v2.0.0-beta.0/project/BRANCHES-AND-TAGS.md - req = struct { - network.CreateRequest - CheckDuplicate bool - }{ - CreateRequest: networkCreateRequest, - CheckDuplicate: true, - } - } else { - req = networkCreateRequest - } - resp, err := cli.post(ctx, "/networks/create", nil, req, nil) defer ensureReaderClosed(resp) if err != nil { diff --git a/client/service_create.go b/client/service_create.go index 0f1bb60eec..0f56fb0a71 100644 --- a/client/service_create.go +++ b/client/service_create.go @@ -11,7 +11,6 @@ import ( "github.com/distribution/reference" "github.com/moby/moby/api/types/registry" "github.com/moby/moby/api/types/swarm" - "github.com/moby/moby/api/types/versions" "github.com/opencontainers/go-digest" ) @@ -19,21 +18,12 @@ import ( func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options ServiceCreateOptions) (swarm.ServiceCreateResponse, error) { var response swarm.ServiceCreateResponse - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return response, err - } - // Make sure containerSpec is not nil when no runtime is set or the runtime is set to container if service.TaskTemplate.ContainerSpec == nil && (service.TaskTemplate.Runtime == "" || service.TaskTemplate.Runtime == swarm.RuntimeContainer) { service.TaskTemplate.ContainerSpec = &swarm.ContainerSpec{} } - if err := validateServiceSpec(service, cli.version); err != nil { + if err := validateServiceSpec(service); err != nil { return response, err } @@ -172,7 +162,7 @@ func digestWarning(image string) string { return fmt.Sprintf("image %s could not be accessed on a registry to record\nits digest. Each node will access %s independently,\npossibly leading to different nodes running different\nversions of the image.\n", image, image) } -func validateServiceSpec(s swarm.ServiceSpec, apiVersion string) error { +func validateServiceSpec(s swarm.ServiceSpec) error { if s.TaskTemplate.ContainerSpec != nil && s.TaskTemplate.PluginSpec != nil { return errors.New("must not specify both a container spec and a plugin spec in the task template") } @@ -182,18 +172,5 @@ func validateServiceSpec(s swarm.ServiceSpec, apiVersion string) error { if s.TaskTemplate.ContainerSpec != nil && (s.TaskTemplate.Runtime != "" && s.TaskTemplate.Runtime != swarm.RuntimeContainer) { return errors.New("mismatched runtime with container spec") } - if s.TaskTemplate.ContainerSpec != nil && apiVersion != "" && versions.LessThan(apiVersion, "1.44") { - for _, m := range s.TaskTemplate.ContainerSpec.Mounts { - if m.BindOptions != nil { - if m.BindOptions.NonRecursive && versions.LessThan(apiVersion, "1.40") { - return errors.New("bind-recursive=disabled requires API v1.40 or later") - } - // ReadOnlyNonRecursive can be safely ignored when API < 1.44 - if m.BindOptions.ReadOnlyForceRecursive && versions.LessThan(apiVersion, "1.44") { - return errors.New("bind-recursive=readonly requires API v1.44 or later") - } - } - } - } return nil } diff --git a/client/service_update.go b/client/service_update.go index b253e8605b..42e5fc9711 100644 --- a/client/service_update.go +++ b/client/service_update.go @@ -20,15 +20,7 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version return swarm.ServiceUpdateResponse{}, err } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return swarm.ServiceUpdateResponse{}, err - } - if err := validateServiceSpec(service, cli.version); err != nil { + if err := validateServiceSpec(service); err != nil { return swarm.ServiceUpdateResponse{}, err } diff --git a/vendor/github.com/moby/moby/client/container_create.go b/vendor/github.com/moby/moby/client/container_create.go index 89e4306e39..617f0a12cc 100644 --- a/vendor/github.com/moby/moby/client/container_create.go +++ b/vendor/github.com/moby/moby/client/container_create.go @@ -3,7 +3,6 @@ package client import ( "context" "encoding/json" - "errors" "net/url" "path" "sort" @@ -25,54 +24,28 @@ func (cli *Client) ContainerCreate(ctx context.Context, config *container.Config var response container.CreateResponse - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return response, err - } - - if err := cli.NewVersionError(ctx, "1.25", "stop timeout"); config.StopTimeout != nil && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.41", "specify container image platform"); platform != nil && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.44", "specify health-check start interval"); config.Healthcheck != nil && config.Healthcheck.StartInterval != 0 && err != nil { - return response, err - } - if err := cli.NewVersionError(ctx, "1.44", "specify mac-address per network"); hasEndpointSpecificMacAddress(networkingConfig) && err != nil { - return response, err - } - if hostConfig != nil { - if platform != nil && platform.OS == "linux" && versions.LessThan(cli.ClientVersion(), "1.42") { - // When using API under 1.42, the Linux daemon doesn't respect the ConsoleSize - hostConfig.ConsoleSize = [2]uint{0, 0} - } - if versions.LessThan(cli.ClientVersion(), "1.44") { - for _, m := range hostConfig.Mounts { - if m.BindOptions != nil { - // ReadOnlyNonRecursive can be safely ignored when API < 1.44 - if m.BindOptions.ReadOnlyForceRecursive { - return response, errors.New("bind-recursive=readonly requires API v1.44 or later") - } - if m.BindOptions.NonRecursive && versions.LessThan(cli.ClientVersion(), "1.40") { - return response, errors.New("bind-recursive=disabled requires API v1.40 or later") - } - } - } - } - hostConfig.CapAdd = normalizeCapabilities(hostConfig.CapAdd) hostConfig.CapDrop = normalizeCapabilities(hostConfig.CapDrop) } - // Since API 1.44, the container-wide MacAddress is deprecated and triggers a WARNING if it's specified. - if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") { - config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + // FIXME(thaJeztah): remove this once we updated our (integration) tests; + // some integration tests depend on this to test old API versions; see https://github.com/moby/moby/pull/51120#issuecomment-3376224865 + if config.MacAddress != "" { //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return response, err + } + if versions.GreaterThanOrEqualTo(cli.ClientVersion(), "1.44") { + // Since API 1.44, the container-wide MacAddress is deprecated and triggers a WARNING if it's specified. + // + // FIXME(thaJeztah): remove the field from the API + config.MacAddress = "" //nolint:staticcheck // ignore SA1019: field is deprecated, but still used on API < v1.44. + } } query := url.Values{} diff --git a/vendor/github.com/moby/moby/client/container_exec.go b/vendor/github.com/moby/moby/client/container_exec.go index 2a0cdec79d..aaa7526f81 100644 --- a/vendor/github.com/moby/moby/client/container_exec.go +++ b/vendor/github.com/moby/moby/client/container_exec.go @@ -6,7 +6,6 @@ import ( "net/http" "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/versions" ) // ExecCreateOptions is a small subset of the Config struct that holds the configuration @@ -32,22 +31,6 @@ func (cli *Client) ContainerExecCreate(ctx context.Context, containerID string, return container.ExecCreateResponse{}, err } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return container.ExecCreateResponse{}, err - } - - if err := cli.NewVersionError(ctx, "1.25", "env"); len(options.Env) != 0 && err != nil { - return container.ExecCreateResponse{}, err - } - if versions.LessThan(cli.ClientVersion(), "1.42") { - options.ConsoleSize = nil - } - req := container.ExecCreateRequest{ User: options.User, Privileged: options.Privileged, @@ -86,19 +69,6 @@ type ExecStartOptions struct { // ContainerExecStart starts an exec process already created in the docker host. func (cli *Client) ContainerExecStart(ctx context.Context, execID string, config ExecStartOptions) error { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - - if versions.LessThan(cli.ClientVersion(), "1.42") { - config.ConsoleSize = nil - } - req := container.ExecStartRequest{ Detach: config.Detach, Tty: config.Tty, @@ -133,9 +103,6 @@ type ExecAttachOptions = ExecStartOptions // // [stdcopy.StdCopy]: https://pkg.go.dev/github.com/moby/moby/api/pkg/stdcopy#StdCopy func (cli *Client) ContainerExecAttach(ctx context.Context, execID string, config ExecAttachOptions) (HijackedResponse, error) { - if versions.LessThan(cli.ClientVersion(), "1.42") { - config.ConsoleSize = nil - } req := container.ExecStartRequest{ Detach: config.Detach, Tty: config.Tty, diff --git a/vendor/github.com/moby/moby/client/container_restart.go b/vendor/github.com/moby/moby/client/container_restart.go index 8df9b41f16..872a986482 100644 --- a/vendor/github.com/moby/moby/client/container_restart.go +++ b/vendor/github.com/moby/moby/client/container_restart.go @@ -4,8 +4,6 @@ import ( "context" "net/url" "strconv" - - "github.com/moby/moby/api/types/versions" ) // ContainerRestart stops, and starts a container again. @@ -22,17 +20,7 @@ func (cli *Client) ContainerRestart(ctx context.Context, containerID string, opt query.Set("t", strconv.Itoa(*options.Timeout)) } if options.Signal != "" { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - if versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) - } + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/restart", query, nil, nil) defer ensureReaderClosed(resp) diff --git a/vendor/github.com/moby/moby/client/container_stop.go b/vendor/github.com/moby/moby/client/container_stop.go index 4e73a49682..0dc542b603 100644 --- a/vendor/github.com/moby/moby/client/container_stop.go +++ b/vendor/github.com/moby/moby/client/container_stop.go @@ -4,8 +4,6 @@ import ( "context" "net/url" "strconv" - - "github.com/moby/moby/api/types/versions" ) // ContainerStopOptions holds the options to stop or restart a container. @@ -44,17 +42,7 @@ func (cli *Client) ContainerStop(ctx context.Context, containerID string, option query.Set("t", strconv.Itoa(*options.Timeout)) } if options.Signal != "" { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return err - } - if versions.GreaterThanOrEqualTo(cli.version, "1.42") { - query.Set("signal", options.Signal) - } + query.Set("signal", options.Signal) } resp, err := cli.post(ctx, "/containers/"+containerID+"/stop", query, nil, nil) defer ensureReaderClosed(resp) diff --git a/vendor/github.com/moby/moby/client/container_wait.go b/vendor/github.com/moby/moby/client/container_wait.go index c38a159a65..4267af92ee 100644 --- a/vendor/github.com/moby/moby/client/container_wait.go +++ b/vendor/github.com/moby/moby/client/container_wait.go @@ -9,7 +9,6 @@ import ( "net/url" "github.com/moby/moby/api/types/container" - "github.com/moby/moby/api/types/versions" ) const containerWaitErrorMsgLimit = 2 * 1024 /* Max: 2KiB */ @@ -41,19 +40,6 @@ func (cli *Client) ContainerWait(ctx context.Context, containerID string, condit return resultC, errC } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - errC <- err - return resultC, errC - } - if versions.LessThan(cli.ClientVersion(), "1.30") { - return cli.legacyContainerWait(ctx, containerID) - } - query := url.Values{} if condition != "" { query.Set("condition", string(condition)) diff --git a/vendor/github.com/moby/moby/client/hijack.go b/vendor/github.com/moby/moby/client/hijack.go index f06f53a323..31c44e5988 100644 --- a/vendor/github.com/moby/moby/client/hijack.go +++ b/vendor/github.com/moby/moby/client/hijack.go @@ -9,7 +9,6 @@ import ( "net/url" "time" - "github.com/moby/moby/api/types/versions" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) @@ -28,11 +27,6 @@ func (cli *Client) postHijacked(ctx context.Context, path string, query url.Valu return HijackedResponse{}, err } - if versions.LessThan(cli.ClientVersion(), "1.42") { - // Prior to 1.42, Content-Type is always set to raw-stream and not relevant - mediaType = "" - } - return NewHijackedResponse(conn, mediaType), nil } diff --git a/vendor/github.com/moby/moby/client/image_build.go b/vendor/github.com/moby/moby/client/image_build.go index c095d7f693..fffcc91643 100644 --- a/vendor/github.com/moby/moby/client/image_build.go +++ b/vendor/github.com/moby/moby/client/image_build.go @@ -42,7 +42,7 @@ func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, optio }, nil } -func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBuildOptions) (url.Values, error) { +func (cli *Client) imageBuildOptionsToQuery(_ context.Context, options ImageBuildOptions) (url.Values, error) { query := url.Values{} if len(options.Tags) > 0 { query["t"] = options.Tags @@ -79,9 +79,7 @@ func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBu } if options.Squash { - if err := cli.NewVersionError(ctx, "1.25", "squash"); err != nil { - return query, err - } + // TODO(thaJeztah): squash is experimental, and deprecated when using BuildKit? query.Set("squash", "1") } @@ -157,9 +155,6 @@ func (cli *Client) imageBuildOptionsToQuery(ctx context.Context, options ImageBu query.Set("session", options.SessionID) } if options.Platform != "" { - if err := cli.NewVersionError(ctx, "1.32", "platform"); err != nil { - return query, err - } query.Set("platform", strings.ToLower(options.Platform)) } if options.BuildID != "" { diff --git a/vendor/github.com/moby/moby/client/image_list.go b/vendor/github.com/moby/moby/client/image_list.go index 0248fa5ae3..d2516d80d3 100644 --- a/vendor/github.com/moby/moby/client/image_list.go +++ b/vendor/github.com/moby/moby/client/image_list.go @@ -18,26 +18,28 @@ import ( func (cli *Client) ImageList(ctx context.Context, options ImageListOptions) ([]image.Summary, error) { var images []image.Summary - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return images, err - } - query := url.Values{} options.Filters.updateURLValues(query) if options.All { query.Set("all", "1") } - if options.SharedSize && versions.GreaterThanOrEqualTo(cli.version, "1.42") { + if options.SharedSize { query.Set("shared-size", "1") } - if options.Manifests && versions.GreaterThanOrEqualTo(cli.version, "1.47") { - query.Set("manifests", "1") + if options.Manifests { + // Make sure we negotiated (if the client is configured to do so), + // as code below contains API-version specific handling of options. + // + // Normally, version-negotiation (if enabled) would not happen until + // the API request is made. + if err := cli.checkVersion(ctx); err != nil { + return images, err + } + + if versions.GreaterThanOrEqualTo(cli.version, "1.47") { + query.Set("manifests", "1") + } } resp, err := cli.get(ctx, "/images/json", query, nil) diff --git a/vendor/github.com/moby/moby/client/network_create.go b/vendor/github.com/moby/moby/client/network_create.go index 5761d52d94..c2703e6a73 100644 --- a/vendor/github.com/moby/moby/client/network_create.go +++ b/vendor/github.com/moby/moby/client/network_create.go @@ -5,21 +5,11 @@ import ( "encoding/json" "github.com/moby/moby/api/types/network" - "github.com/moby/moby/api/types/versions" ) // NetworkCreate creates a new network in the docker host. func (cli *Client) NetworkCreate(ctx context.Context, name string, options NetworkCreateOptions) (network.CreateResponse, error) { - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return network.CreateResponse{}, err - } - - networkCreateRequest := network.CreateRequest{ + req := network.CreateRequest{ Name: name, Driver: options.Driver, Scope: options.Scope, @@ -35,27 +25,6 @@ func (cli *Client) NetworkCreate(ctx context.Context, name string, options Netwo Labels: options.Labels, } - var req any - if versions.LessThan(cli.version, "1.44") { - // CheckDuplicate is removed in API v1.44, and no longer used by - // daemons supporting that API version (v25.0.0-beta.1 and up) - // regardless of the API version used, but it must be set to true - // when sent to older daemons. - // - // TODO(thaJeztah) remove this once daemon versions v24.0 and lower are no - // longer expected to be used (when Mirantis Container Runtime v23 - // is EOL); https://github.com/moby/moby/blob/v2.0.0-beta.0/project/BRANCHES-AND-TAGS.md - req = struct { - network.CreateRequest - CheckDuplicate bool - }{ - CreateRequest: networkCreateRequest, - CheckDuplicate: true, - } - } else { - req = networkCreateRequest - } - resp, err := cli.post(ctx, "/networks/create", nil, req, nil) defer ensureReaderClosed(resp) if err != nil { diff --git a/vendor/github.com/moby/moby/client/service_create.go b/vendor/github.com/moby/moby/client/service_create.go index 0f1bb60eec..0f56fb0a71 100644 --- a/vendor/github.com/moby/moby/client/service_create.go +++ b/vendor/github.com/moby/moby/client/service_create.go @@ -11,7 +11,6 @@ import ( "github.com/distribution/reference" "github.com/moby/moby/api/types/registry" "github.com/moby/moby/api/types/swarm" - "github.com/moby/moby/api/types/versions" "github.com/opencontainers/go-digest" ) @@ -19,21 +18,12 @@ import ( func (cli *Client) ServiceCreate(ctx context.Context, service swarm.ServiceSpec, options ServiceCreateOptions) (swarm.ServiceCreateResponse, error) { var response swarm.ServiceCreateResponse - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return response, err - } - // Make sure containerSpec is not nil when no runtime is set or the runtime is set to container if service.TaskTemplate.ContainerSpec == nil && (service.TaskTemplate.Runtime == "" || service.TaskTemplate.Runtime == swarm.RuntimeContainer) { service.TaskTemplate.ContainerSpec = &swarm.ContainerSpec{} } - if err := validateServiceSpec(service, cli.version); err != nil { + if err := validateServiceSpec(service); err != nil { return response, err } @@ -172,7 +162,7 @@ func digestWarning(image string) string { return fmt.Sprintf("image %s could not be accessed on a registry to record\nits digest. Each node will access %s independently,\npossibly leading to different nodes running different\nversions of the image.\n", image, image) } -func validateServiceSpec(s swarm.ServiceSpec, apiVersion string) error { +func validateServiceSpec(s swarm.ServiceSpec) error { if s.TaskTemplate.ContainerSpec != nil && s.TaskTemplate.PluginSpec != nil { return errors.New("must not specify both a container spec and a plugin spec in the task template") } @@ -182,18 +172,5 @@ func validateServiceSpec(s swarm.ServiceSpec, apiVersion string) error { if s.TaskTemplate.ContainerSpec != nil && (s.TaskTemplate.Runtime != "" && s.TaskTemplate.Runtime != swarm.RuntimeContainer) { return errors.New("mismatched runtime with container spec") } - if s.TaskTemplate.ContainerSpec != nil && apiVersion != "" && versions.LessThan(apiVersion, "1.44") { - for _, m := range s.TaskTemplate.ContainerSpec.Mounts { - if m.BindOptions != nil { - if m.BindOptions.NonRecursive && versions.LessThan(apiVersion, "1.40") { - return errors.New("bind-recursive=disabled requires API v1.40 or later") - } - // ReadOnlyNonRecursive can be safely ignored when API < 1.44 - if m.BindOptions.ReadOnlyForceRecursive && versions.LessThan(apiVersion, "1.44") { - return errors.New("bind-recursive=readonly requires API v1.44 or later") - } - } - } - } return nil } diff --git a/vendor/github.com/moby/moby/client/service_update.go b/vendor/github.com/moby/moby/client/service_update.go index b253e8605b..42e5fc9711 100644 --- a/vendor/github.com/moby/moby/client/service_update.go +++ b/vendor/github.com/moby/moby/client/service_update.go @@ -20,15 +20,7 @@ func (cli *Client) ServiceUpdate(ctx context.Context, serviceID string, version return swarm.ServiceUpdateResponse{}, err } - // Make sure we negotiated (if the client is configured to do so), - // as code below contains API-version specific handling of options. - // - // Normally, version-negotiation (if enabled) would not happen until - // the API request is made. - if err := cli.checkVersion(ctx); err != nil { - return swarm.ServiceUpdateResponse{}, err - } - if err := validateServiceSpec(service, cli.version); err != nil { + if err := validateServiceSpec(service); err != nil { return swarm.ServiceUpdateResponse{}, err }