Skip to content

Commit a632b84

Browse files
committed
daemon: define default (and maximum) API version
With the daemon and API migrating to separate modules, users of the daemon module may upgrade the API module to higher versions. Currently, the daemon uses the API's Default version. While the version of the API module is allowed to be updated (following SemVer), we should not allow the Daemon to support higher API versions than it was written for. This patch introduces a DefaultAPIVersion in the daemon/config package that is used as default version of the API for the daemon to use. Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent 9af9d27 commit a632b84

7 files changed

Lines changed: 34 additions & 29 deletions

File tree

daemon/command/daemon.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
containerddefaults "github.com/containerd/containerd/v2/defaults"
1919
"github.com/containerd/containerd/v2/pkg/tracing"
2020
"github.com/containerd/log"
21-
"github.com/docker/docker/api"
2221
"github.com/docker/docker/daemon"
2322
buildbackend "github.com/docker/docker/daemon/builder/backend"
2423
"github.com/docker/docker/daemon/builder/dockerfile"
@@ -751,7 +750,7 @@ func initMiddlewares(_ context.Context, s *apiserver.Server, cfg *config.Config,
751750
exp := middleware.NewExperimentalMiddleware(cfg.Experimental)
752751
s.UseMiddleware(exp)
753752

754-
vm, err := middleware.NewVersionMiddleware(dockerversion.Version, api.DefaultVersion, cfg.MinAPIVersion)
753+
vm, err := middleware.NewVersionMiddleware(dockerversion.Version, config.DefaultAPIVersion, cfg.MinAPIVersion)
755754
if err != nil {
756755
return nil, err
757756
}

daemon/config/config.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ const (
5656
DefaultContainersNamespace = "moby"
5757
// DefaultPluginNamespace is the name of the default containerd namespace used for plugins.
5858
DefaultPluginNamespace = "plugins.moby"
59+
// DefaultAPIVersion is the highest REST API version supported by the daemon.
60+
//
61+
// This version may be lower than the [api.DefaultVersion], which is the default
62+
// (and highest supported) version of the api library module used.
63+
DefaultAPIVersion = "1.52"
5964
// defaultMinAPIVersion is the minimum API version supported by the API.
6065
// This version can be overridden through the "DOCKER_MIN_API_VERSION"
6166
// environment variable. It currently defaults to the minimum API version
@@ -670,8 +675,8 @@ func ValidateMinAPIVersion(ver string) error {
670675
if versions.LessThan(ver, defaultMinAPIVersion) {
671676
return errors.Errorf(`minimum supported API version is %s: %s`, defaultMinAPIVersion, ver)
672677
}
673-
if versions.GreaterThan(ver, api.DefaultVersion) {
674-
return errors.Errorf(`maximum supported API version is %s: %s`, api.DefaultVersion, ver)
678+
if versions.GreaterThan(ver, DefaultAPIVersion) {
679+
return errors.Errorf(`maximum supported API version is %s: %s`, DefaultAPIVersion, ver)
675680
}
676681
return nil
677682
}

daemon/config/config_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"testing"
1212

1313
"dario.cat/mergo"
14-
"github.com/docker/docker/api"
1514
"github.com/docker/docker/daemon/libnetwork/ipamutils"
1615
"github.com/docker/docker/daemon/pkg/opts"
1716
"github.com/docker/docker/registry"
@@ -634,7 +633,7 @@ func TestValidateMinAPIVersion(t *testing.T) {
634633
},
635634
{
636635
doc: "current version",
637-
input: api.DefaultVersion,
636+
input: DefaultAPIVersion,
638637
},
639638
}
640639

daemon/info.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414

1515
"github.com/containerd/containerd/v2/pkg/tracing"
1616
"github.com/containerd/log"
17-
"github.com/docker/docker/api"
1817
"github.com/docker/docker/api/types"
1918
"github.com/docker/docker/api/types/system"
2019
"github.com/docker/docker/daemon/command/debug"
@@ -118,7 +117,7 @@ func (daemon *Daemon) SystemVersion(ctx context.Context) (types.Version, error)
118117
Version: dockerversion.Version,
119118
Details: map[string]string{
120119
"GitCommit": dockerversion.GitCommit,
121-
"ApiVersion": api.DefaultVersion,
120+
"ApiVersion": config.DefaultAPIVersion,
122121
"MinAPIVersion": cfg.MinAPIVersion,
123122
"GoVersion": runtime.Version(),
124123
"Os": runtime.GOOS,
@@ -133,7 +132,7 @@ func (daemon *Daemon) SystemVersion(ctx context.Context) (types.Version, error)
133132
// Populate deprecated fields for older clients
134133
Version: dockerversion.Version,
135134
GitCommit: dockerversion.GitCommit,
136-
APIVersion: api.DefaultVersion,
135+
APIVersion: config.DefaultAPIVersion,
137136
MinAPIVersion: cfg.MinAPIVersion,
138137
GoVersion: runtime.Version(),
139138
Os: runtime.GOOS,

daemon/server/middleware/version.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
"github.com/docker/docker/api"
1010
"github.com/docker/docker/api/types/versions"
11+
"github.com/docker/docker/daemon/config"
1112
"github.com/docker/docker/daemon/server/httputils"
1213
)
1314

@@ -18,7 +19,7 @@ type VersionMiddleware struct {
1819

1920
// defaultAPIVersion is the default API version provided by the API server,
2021
// specified as "major.minor". It is usually configured to the latest API
21-
// version [github.com/docker/docker/api.DefaultVersion].
22+
// version [config.DefaultAPIVersion] supported by the daemon.
2223
//
2324
// API requests for API versions greater than this version are rejected by
2425
// the server and produce a [versionUnsupportedError].
@@ -34,11 +35,11 @@ type VersionMiddleware struct {
3435

3536
// NewVersionMiddleware creates a VersionMiddleware with the given versions.
3637
func NewVersionMiddleware(serverVersion, defaultAPIVersion, minAPIVersion string) (*VersionMiddleware, error) {
37-
if versions.LessThan(defaultAPIVersion, api.MinSupportedAPIVersion) || versions.GreaterThan(defaultAPIVersion, api.DefaultVersion) {
38-
return nil, fmt.Errorf("invalid default API version (%s): must be between %s and %s", defaultAPIVersion, api.MinSupportedAPIVersion, api.DefaultVersion)
38+
if versions.LessThan(defaultAPIVersion, api.MinSupportedAPIVersion) || versions.GreaterThan(defaultAPIVersion, config.DefaultAPIVersion) {
39+
return nil, fmt.Errorf("invalid default API version (%s): must be between %s and %s", defaultAPIVersion, api.MinSupportedAPIVersion, config.DefaultAPIVersion)
3940
}
40-
if versions.LessThan(minAPIVersion, api.MinSupportedAPIVersion) || versions.GreaterThan(minAPIVersion, api.DefaultVersion) {
41-
return nil, fmt.Errorf("invalid minimum API version (%s): must be between %s and %s", minAPIVersion, api.MinSupportedAPIVersion, api.DefaultVersion)
41+
if versions.LessThan(minAPIVersion, api.MinSupportedAPIVersion) || versions.GreaterThan(minAPIVersion, config.DefaultAPIVersion) {
42+
return nil, fmt.Errorf("invalid minimum API version (%s): must be between %s and %s", minAPIVersion, api.MinSupportedAPIVersion, config.DefaultAPIVersion)
4243
}
4344
if versions.GreaterThan(minAPIVersion, defaultAPIVersion) {
4445
return nil, fmt.Errorf("invalid API version: the minimum API version (%s) is higher than the default version (%s)", minAPIVersion, defaultAPIVersion)

daemon/server/middleware/version_test.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"testing"
1010

1111
"github.com/docker/docker/api"
12+
"github.com/docker/docker/daemon/config"
1213
"github.com/docker/docker/daemon/server/httputils"
1314
"gotest.tools/v3/assert"
1415
is "gotest.tools/v3/assert/cmp"
@@ -20,38 +21,38 @@ func TestNewVersionMiddlewareValidation(t *testing.T) {
2021
}{
2122
{
2223
doc: "defaults",
23-
defaultVersion: api.DefaultVersion,
24+
defaultVersion: config.DefaultAPIVersion,
2425
minVersion: api.MinSupportedAPIVersion,
2526
},
2627
{
2728
doc: "invalid default lower than min",
2829
defaultVersion: api.MinSupportedAPIVersion,
29-
minVersion: api.DefaultVersion,
30-
expectedErr: fmt.Sprintf("invalid API version: the minimum API version (%s) is higher than the default version (%s)", api.DefaultVersion, api.MinSupportedAPIVersion),
30+
minVersion: config.DefaultAPIVersion,
31+
expectedErr: fmt.Sprintf("invalid API version: the minimum API version (%s) is higher than the default version (%s)", config.DefaultAPIVersion, api.MinSupportedAPIVersion),
3132
},
3233
{
3334
doc: "invalid default too low",
3435
defaultVersion: "0.1",
3536
minVersion: api.MinSupportedAPIVersion,
36-
expectedErr: fmt.Sprintf("invalid default API version (0.1): must be between %s and %s", api.MinSupportedAPIVersion, api.DefaultVersion),
37+
expectedErr: fmt.Sprintf("invalid default API version (0.1): must be between %s and %s", api.MinSupportedAPIVersion, config.DefaultAPIVersion),
3738
},
3839
{
3940
doc: "invalid default too high",
4041
defaultVersion: "9999.9999",
41-
minVersion: api.DefaultVersion,
42-
expectedErr: fmt.Sprintf("invalid default API version (9999.9999): must be between %s and %s", api.MinSupportedAPIVersion, api.DefaultVersion),
42+
minVersion: config.DefaultAPIVersion,
43+
expectedErr: fmt.Sprintf("invalid default API version (9999.9999): must be between %s and %s", api.MinSupportedAPIVersion, config.DefaultAPIVersion),
4344
},
4445
{
4546
doc: "invalid minimum too low",
4647
defaultVersion: api.MinSupportedAPIVersion,
4748
minVersion: "0.1",
48-
expectedErr: fmt.Sprintf("invalid minimum API version (0.1): must be between %s and %s", api.MinSupportedAPIVersion, api.DefaultVersion),
49+
expectedErr: fmt.Sprintf("invalid minimum API version (0.1): must be between %s and %s", api.MinSupportedAPIVersion, config.DefaultAPIVersion),
4950
},
5051
{
5152
doc: "invalid minimum too high",
52-
defaultVersion: api.DefaultVersion,
53+
defaultVersion: config.DefaultAPIVersion,
5354
minVersion: "9999.9999",
54-
expectedErr: fmt.Sprintf("invalid minimum API version (9999.9999): must be between %s and %s", api.MinSupportedAPIVersion, api.DefaultVersion),
55+
expectedErr: fmt.Sprintf("invalid minimum API version (9999.9999): must be between %s and %s", api.MinSupportedAPIVersion, config.DefaultAPIVersion),
5556
},
5657
}
5758

@@ -75,7 +76,7 @@ func TestVersionMiddlewareVersion(t *testing.T) {
7576
return nil
7677
}
7778

78-
m, err := NewVersionMiddleware("1.2.3", api.DefaultVersion, api.MinSupportedAPIVersion)
79+
m, err := NewVersionMiddleware("1.2.3", config.DefaultAPIVersion, api.MinSupportedAPIVersion)
7980
assert.NilError(t, err)
8081
h := m.WrapHandler(handler)
8182

@@ -89,7 +90,7 @@ func TestVersionMiddlewareVersion(t *testing.T) {
8990
errString string
9091
}{
9192
{
92-
expectedVersion: api.DefaultVersion,
93+
expectedVersion: config.DefaultAPIVersion,
9394
},
9495
{
9596
reqVersion: api.MinSupportedAPIVersion,
@@ -101,7 +102,7 @@ func TestVersionMiddlewareVersion(t *testing.T) {
101102
},
102103
{
103104
reqVersion: "9999.9999",
104-
errString: fmt.Sprintf("client version 9999.9999 is too new. Maximum supported API version is %s", api.DefaultVersion),
105+
errString: fmt.Sprintf("client version 9999.9999 is too new. Maximum supported API version is %s", config.DefaultAPIVersion),
105106
},
106107
}
107108

@@ -125,7 +126,7 @@ func TestVersionMiddlewareWithErrorsReturnsHeaders(t *testing.T) {
125126
return nil
126127
}
127128

128-
m, err := NewVersionMiddleware("1.2.3", api.DefaultVersion, api.MinSupportedAPIVersion)
129+
m, err := NewVersionMiddleware("1.2.3", config.DefaultAPIVersion, api.MinSupportedAPIVersion)
129130
assert.NilError(t, err)
130131
h := m.WrapHandler(handler)
131132

@@ -140,6 +141,6 @@ func TestVersionMiddlewareWithErrorsReturnsHeaders(t *testing.T) {
140141
hdr := resp.Result().Header
141142
assert.Check(t, is.Contains(hdr.Get("Server"), "Docker/1.2.3"))
142143
assert.Check(t, is.Contains(hdr.Get("Server"), runtime.GOOS))
143-
assert.Check(t, is.Equal(hdr.Get("Api-Version"), api.DefaultVersion))
144+
assert.Check(t, is.Equal(hdr.Get("Api-Version"), config.DefaultAPIVersion))
144145
assert.Check(t, is.Equal(hdr.Get("Ostype"), runtime.GOOS))
145146
}

daemon/server/server_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import (
88
"testing"
99

1010
"github.com/docker/docker/api"
11+
"github.com/docker/docker/daemon/config"
1112
"github.com/docker/docker/daemon/server/httputils"
1213
"github.com/docker/docker/daemon/server/middleware"
1314
)
1415

1516
func TestMiddlewares(t *testing.T) {
1617
srv := &Server{}
1718

18-
m, err := middleware.NewVersionMiddleware("0.1omega2", api.DefaultVersion, api.MinSupportedAPIVersion)
19+
m, err := middleware.NewVersionMiddleware("0.1omega2", config.DefaultAPIVersion, api.MinSupportedAPIVersion)
1920
if err != nil {
2021
t.Fatal(err)
2122
}

0 commit comments

Comments
 (0)