From ed428234bd42ef2f2e54d1086b0f5ed2421c7f12 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Fri, 7 Nov 2025 17:14:33 +0100 Subject: [PATCH] api: remove / internalize LegacyDiskUsage These fields have been removed from the API specification, and the struct was only needed to produce legacy responses (server), or to unmarshal legacy responses in the client. As the API module only provides API definitions for the current API version, we should remove these legacy structs, and keep them internal to the daemon and client. Signed-off-by: Sebastiaan van Stijn --- api/docs/CHANGELOG.md | 8 ++-- api/types/system/disk_usage.go | 19 --------- client/system_disk_usage.go | 41 ++++++++++++------- client/system_disk_usage_test.go | 8 ++-- daemon/server/router/system/disk_usage.go | 27 ++++++++++++ daemon/server/router/system/system_routes.go | 28 +++++++------ .../moby/moby/api/types/system/disk_usage.go | 19 --------- .../moby/moby/client/system_disk_usage.go | 41 ++++++++++++------- 8 files changed, 104 insertions(+), 87 deletions(-) create mode 100644 daemon/server/router/system/disk_usage.go diff --git a/api/docs/CHANGELOG.md b/api/docs/CHANGELOG.md index 12273c7aad..c8613a2edf 100644 --- a/api/docs/CHANGELOG.md +++ b/api/docs/CHANGELOG.md @@ -75,9 +75,11 @@ keywords: "API, Docker, rcli, REST, documentation" `BuildCacheUsage` fields with brief system disk usage data for each system object type. The endpoint supports the `?verbose=1` query to return verbose system disk usage information. * Deprecated: `GET /system/df` response fields `LayersSize`, `Images`, `Containers`, - `Volumes`, and `BuildCache` are deprecated in favor of the type specific usage fields. - The legacy fields will not be populated for new API versions that specify the `verbose` - query. + `Volumes`, and `BuildCache` have been removed in favor of the-type specific usage fields. + API v1.52 returns both the legacy and current fields to help existing integrations + to transition to the new response. The legacy fields are not populated if the + `verbose` query parameter is used. Starting with API v1.53, the legacy fields + will no longer be returned. ## v1.51 API changes diff --git a/api/types/system/disk_usage.go b/api/types/system/disk_usage.go index 53d7a499d8..33230aed23 100644 --- a/api/types/system/disk_usage.go +++ b/api/types/system/disk_usage.go @@ -24,27 +24,8 @@ const ( // DiskUsage contains response of Engine API: // GET "/system/df" type DiskUsage struct { - LegacyDiskUsage - ImageUsage *image.DiskUsage `json:"ImageUsage,omitempty"` ContainerUsage *container.DiskUsage `json:"ContainerUsage,omitempty"` VolumeUsage *volume.DiskUsage `json:"VolumeUsage,omitempty"` BuildCacheUsage *build.DiskUsage `json:"BuildCacheUsage,omitempty"` } - -type LegacyDiskUsage struct { - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.TotalSize] instead. - LayersSize int64 `json:"LayersSize,omitempty"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.Items] instead. - Images []image.Summary `json:"Images,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ContainersDiskUsage.Items] instead. - Containers []container.Summary `json:"Containers,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [VolumesDiskUsage.Items] instead. - Volumes []volume.Volume `json:"Volumes,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [BuildCacheDiskUsage.Items] instead. - BuildCache []build.CacheRecord `json:"BuildCache,omitzero"` -} diff --git a/client/system_disk_usage.go b/client/system_disk_usage.go index 0fa6a94ed7..64a369df8f 100644 --- a/client/system_disk_usage.go +++ b/client/system_disk_usage.go @@ -6,7 +6,6 @@ import ( "fmt" "net/url" "slices" - "strings" "github.com/moby/moby/api/types/build" "github.com/moby/moby/api/types/container" @@ -149,14 +148,19 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return DiskUsageResult{}, err } - var du system.DiskUsage - if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { - return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err) + if versions.LessThan(cli.version, "1.52") { + // Generate result from a legacy response. + var du legacyDiskUsage + if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { + return DiskUsageResult{}, fmt.Errorf("retrieving disk usage: %v", err) + } + + return diskUsageResultFromLegacyAPI(&du), nil } - // Generate result from a legacy response. - if versions.LessThan(cli.version, "1.52") { - return diskUsageResultFromLegacyAPI(&du), nil + var du system.DiskUsage + if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { + return DiskUsageResult{}, fmt.Errorf("retrieving disk usage: %v", err) } var r DiskUsageResult @@ -215,7 +219,16 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return r, nil } -func diskUsageResultFromLegacyAPI(du *system.DiskUsage) DiskUsageResult { +// legacyDiskUsage is the response as was used by API < v1.52. +type legacyDiskUsage struct { + LayersSize int64 `json:"LayersSize,omitempty"` + Images []image.Summary `json:"Images,omitzero"` + Containers []container.Summary `json:"Containers,omitzero"` + Volumes []volume.Volume `json:"Volumes,omitzero"` + BuildCache []build.CacheRecord `json:"BuildCache,omitzero"` +} + +func diskUsageResultFromLegacyAPI(du *legacyDiskUsage) DiskUsageResult { return DiskUsageResult{ Images: imageDiskUsageFromLegacyAPI(du), Containers: containerDiskUsageFromLegacyAPI(du), @@ -224,7 +237,7 @@ func diskUsageResultFromLegacyAPI(du *system.DiskUsage) DiskUsageResult { } } -func imageDiskUsageFromLegacyAPI(du *system.DiskUsage) ImagesDiskUsage { +func imageDiskUsageFromLegacyAPI(du *legacyDiskUsage) ImagesDiskUsage { idu := ImagesDiskUsage{ TotalSize: du.LayersSize, TotalCount: int64(len(du.Images)), @@ -250,7 +263,7 @@ func imageDiskUsageFromLegacyAPI(du *system.DiskUsage) ImagesDiskUsage { return idu } -func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { +func containerDiskUsageFromLegacyAPI(du *legacyDiskUsage) ContainersDiskUsage { cdu := ContainersDiskUsage{ TotalCount: int64(len(du.Containers)), Items: du.Containers, @@ -259,8 +272,8 @@ func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { var used int64 for _, c := range cdu.Items { cdu.TotalSize += c.SizeRw - switch strings.ToLower(c.State) { - case "running", "paused", "restarting": + switch c.State { + case container.StateRunning, container.StatePaused, container.StateRestarting: cdu.ActiveCount++ used += c.SizeRw } @@ -270,7 +283,7 @@ func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { return cdu } -func buildCacheDiskUsageFromLegacyAPI(du *system.DiskUsage) BuildCacheDiskUsage { +func buildCacheDiskUsageFromLegacyAPI(du *legacyDiskUsage) BuildCacheDiskUsage { bdu := BuildCacheDiskUsage{ TotalCount: int64(len(du.BuildCache)), Items: du.BuildCache, @@ -294,7 +307,7 @@ func buildCacheDiskUsageFromLegacyAPI(du *system.DiskUsage) BuildCacheDiskUsage return bdu } -func volumeDiskUsageFromLegacyAPI(du *system.DiskUsage) VolumesDiskUsage { +func volumeDiskUsageFromLegacyAPI(du *legacyDiskUsage) VolumesDiskUsage { vdu := VolumesDiskUsage{ TotalCount: int64(len(du.Volumes)), Items: du.Volumes, diff --git a/client/system_disk_usage_test.go b/client/system_disk_usage_test.go index fd8464fdac..dd4c7a2d1c 100644 --- a/client/system_disk_usage_test.go +++ b/client/system_disk_usage_test.go @@ -139,11 +139,9 @@ func TestLegacyDiskUsage(t *testing.T) { return nil, err } - return mockJSONResponse(http.StatusOK, nil, system.DiskUsage{ - LegacyDiskUsage: system.LegacyDiskUsage{ - LayersSize: 4096, - Images: []image.Summary{}, - }, + return mockJSONResponse(http.StatusOK, nil, &legacyDiskUsage{ + LayersSize: 4096, + Images: []image.Summary{}, })(req) })) assert.NilError(t, err) diff --git a/daemon/server/router/system/disk_usage.go b/daemon/server/router/system/disk_usage.go new file mode 100644 index 0000000000..cb03a9baec --- /dev/null +++ b/daemon/server/router/system/disk_usage.go @@ -0,0 +1,27 @@ +package system + +import ( + buildtypes "github.com/moby/moby/api/types/build" + "github.com/moby/moby/api/types/container" + "github.com/moby/moby/api/types/image" + "github.com/moby/moby/api/types/system" + "github.com/moby/moby/api/types/volume" +) + +// diskUsageCompat is used to provide API responses with backward-compatibility +// for API < v1.52, which used a different format. For API v1.52, we return +// both "old" and "new" responses if the client did not explicitly opt in to +// using the new format (through the use of the "verbose" query-parameter). +type diskUsageCompat struct { + *legacyDiskUsage + *system.DiskUsage +} + +// legacyDiskUsage is the response as was used by API < v1.52. +type legacyDiskUsage struct { + LayersSize int64 `json:"LayersSize,omitempty"` + Images []image.Summary `json:"Images,omitzero"` + Containers []container.Summary `json:"Containers,omitzero"` + Volumes []volume.Volume `json:"Volumes,omitzero"` + BuildCache []buildtypes.CacheRecord `json:"BuildCache,omitzero"` +} diff --git a/daemon/server/router/system/system_routes.go b/daemon/server/router/system/system_routes.go index b0945c7243..f753b04da7 100644 --- a/daemon/server/router/system/system_routes.go +++ b/daemon/server/router/system/system_routes.go @@ -216,32 +216,34 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, } diskUsage.BuildCache = buildCacheUsage - var legacy system.LegacyDiskUsage + var legacy legacyDiskUsage if legacyFields { if diskUsage.Images != nil { - legacy.LayersSize = diskUsage.Images.TotalSize //nolint: staticcheck,SA1019: kept to maintain backwards compatibility with API < v1.52. - legacy.Images = nonNilSlice(diskUsage.Images.Items) //nolint: staticcheck,SA1019: kept to maintain backwards compatibility with API < v1.52. + legacy.LayersSize = diskUsage.Images.TotalSize + legacy.Images = nonNilSlice(diskUsage.Images.Items) } if diskUsage.Containers != nil { - legacy.Containers = nonNilSlice(diskUsage.Containers.Items) //nolint: staticcheck,SA1019: kept to maintain backwards compatibility with API < v1.52. + legacy.Containers = nonNilSlice(diskUsage.Containers.Items) } if diskUsage.Volumes != nil { - legacy.Volumes = nonNilSlice(diskUsage.Volumes.Items) //nolint: staticcheck,SA1019: kept to maintain backwards compatibility with API < v1.52. + legacy.Volumes = nonNilSlice(diskUsage.Volumes.Items) } if diskUsage.BuildCache != nil { - legacy.BuildCache = nonNilSlice(diskUsage.BuildCache.Items) //nolint: staticcheck,SA1019: kept to maintain backwards compatibility with API < v1.52. + legacy.BuildCache = nonNilSlice(diskUsage.BuildCache.Items) } } if versions.LessThan(version, "1.52") { - return httputils.WriteJSON(w, http.StatusOK, legacy) + return httputils.WriteJSON(w, http.StatusOK, &legacy) } - return httputils.WriteJSON(w, http.StatusOK, &system.DiskUsage{ - LegacyDiskUsage: legacy, - ImageUsage: diskUsage.Images, - ContainerUsage: diskUsage.Containers, - VolumeUsage: diskUsage.Volumes, - BuildCacheUsage: diskUsage.BuildCache, + return httputils.WriteJSON(w, http.StatusOK, &diskUsageCompat{ + legacyDiskUsage: &legacy, + DiskUsage: &system.DiskUsage{ + ImageUsage: diskUsage.Images, + ContainerUsage: diskUsage.Containers, + VolumeUsage: diskUsage.Volumes, + BuildCacheUsage: diskUsage.BuildCache, + }, }) } diff --git a/vendor/github.com/moby/moby/api/types/system/disk_usage.go b/vendor/github.com/moby/moby/api/types/system/disk_usage.go index 53d7a499d8..33230aed23 100644 --- a/vendor/github.com/moby/moby/api/types/system/disk_usage.go +++ b/vendor/github.com/moby/moby/api/types/system/disk_usage.go @@ -24,27 +24,8 @@ const ( // DiskUsage contains response of Engine API: // GET "/system/df" type DiskUsage struct { - LegacyDiskUsage - ImageUsage *image.DiskUsage `json:"ImageUsage,omitempty"` ContainerUsage *container.DiskUsage `json:"ContainerUsage,omitempty"` VolumeUsage *volume.DiskUsage `json:"VolumeUsage,omitempty"` BuildCacheUsage *build.DiskUsage `json:"BuildCacheUsage,omitempty"` } - -type LegacyDiskUsage struct { - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.TotalSize] instead. - LayersSize int64 `json:"LayersSize,omitempty"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.Items] instead. - Images []image.Summary `json:"Images,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [ContainersDiskUsage.Items] instead. - Containers []container.Summary `json:"Containers,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [VolumesDiskUsage.Items] instead. - Volumes []volume.Volume `json:"Volumes,omitzero"` - - // Deprecated: kept to maintain backwards compatibility with API < v1.52, use [BuildCacheDiskUsage.Items] instead. - BuildCache []build.CacheRecord `json:"BuildCache,omitzero"` -} diff --git a/vendor/github.com/moby/moby/client/system_disk_usage.go b/vendor/github.com/moby/moby/client/system_disk_usage.go index 0fa6a94ed7..64a369df8f 100644 --- a/vendor/github.com/moby/moby/client/system_disk_usage.go +++ b/vendor/github.com/moby/moby/client/system_disk_usage.go @@ -6,7 +6,6 @@ import ( "fmt" "net/url" "slices" - "strings" "github.com/moby/moby/api/types/build" "github.com/moby/moby/api/types/container" @@ -149,14 +148,19 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return DiskUsageResult{}, err } - var du system.DiskUsage - if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { - return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err) + if versions.LessThan(cli.version, "1.52") { + // Generate result from a legacy response. + var du legacyDiskUsage + if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { + return DiskUsageResult{}, fmt.Errorf("retrieving disk usage: %v", err) + } + + return diskUsageResultFromLegacyAPI(&du), nil } - // Generate result from a legacy response. - if versions.LessThan(cli.version, "1.52") { - return diskUsageResultFromLegacyAPI(&du), nil + var du system.DiskUsage + if err := json.NewDecoder(resp.Body).Decode(&du); err != nil { + return DiskUsageResult{}, fmt.Errorf("retrieving disk usage: %v", err) } var r DiskUsageResult @@ -215,7 +219,16 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis return r, nil } -func diskUsageResultFromLegacyAPI(du *system.DiskUsage) DiskUsageResult { +// legacyDiskUsage is the response as was used by API < v1.52. +type legacyDiskUsage struct { + LayersSize int64 `json:"LayersSize,omitempty"` + Images []image.Summary `json:"Images,omitzero"` + Containers []container.Summary `json:"Containers,omitzero"` + Volumes []volume.Volume `json:"Volumes,omitzero"` + BuildCache []build.CacheRecord `json:"BuildCache,omitzero"` +} + +func diskUsageResultFromLegacyAPI(du *legacyDiskUsage) DiskUsageResult { return DiskUsageResult{ Images: imageDiskUsageFromLegacyAPI(du), Containers: containerDiskUsageFromLegacyAPI(du), @@ -224,7 +237,7 @@ func diskUsageResultFromLegacyAPI(du *system.DiskUsage) DiskUsageResult { } } -func imageDiskUsageFromLegacyAPI(du *system.DiskUsage) ImagesDiskUsage { +func imageDiskUsageFromLegacyAPI(du *legacyDiskUsage) ImagesDiskUsage { idu := ImagesDiskUsage{ TotalSize: du.LayersSize, TotalCount: int64(len(du.Images)), @@ -250,7 +263,7 @@ func imageDiskUsageFromLegacyAPI(du *system.DiskUsage) ImagesDiskUsage { return idu } -func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { +func containerDiskUsageFromLegacyAPI(du *legacyDiskUsage) ContainersDiskUsage { cdu := ContainersDiskUsage{ TotalCount: int64(len(du.Containers)), Items: du.Containers, @@ -259,8 +272,8 @@ func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { var used int64 for _, c := range cdu.Items { cdu.TotalSize += c.SizeRw - switch strings.ToLower(c.State) { - case "running", "paused", "restarting": + switch c.State { + case container.StateRunning, container.StatePaused, container.StateRestarting: cdu.ActiveCount++ used += c.SizeRw } @@ -270,7 +283,7 @@ func containerDiskUsageFromLegacyAPI(du *system.DiskUsage) ContainersDiskUsage { return cdu } -func buildCacheDiskUsageFromLegacyAPI(du *system.DiskUsage) BuildCacheDiskUsage { +func buildCacheDiskUsageFromLegacyAPI(du *legacyDiskUsage) BuildCacheDiskUsage { bdu := BuildCacheDiskUsage{ TotalCount: int64(len(du.BuildCache)), Items: du.BuildCache, @@ -294,7 +307,7 @@ func buildCacheDiskUsageFromLegacyAPI(du *system.DiskUsage) BuildCacheDiskUsage return bdu } -func volumeDiskUsageFromLegacyAPI(du *system.DiskUsage) VolumesDiskUsage { +func volumeDiskUsageFromLegacyAPI(du *legacyDiskUsage) VolumesDiskUsage { vdu := VolumesDiskUsage{ TotalCount: int64(len(du.Volumes)), Items: du.Volumes,