Signed-off-by: Austin Vazquez <austin.vazquez@docker.com>
| ... | ... |
@@ -2096,7 +2096,6 @@ definitions: |
| 2096 | 2096 |
type: "array" |
| 2097 | 2097 |
x-omitempty: true |
| 2098 | 2098 |
items: |
| 2099 |
- x-nullable: true |
|
| 2100 | 2099 |
x-go-type: |
| 2101 | 2100 |
type: Summary |
| 2102 | 2101 |
|
| ... | ... |
@@ -2279,7 +2278,6 @@ definitions: |
| 2279 | 2279 |
type: "array" |
| 2280 | 2280 |
x-omitempty: true |
| 2281 | 2281 |
items: |
| 2282 |
- x-nullable: true |
|
| 2283 | 2282 |
x-go-type: |
| 2284 | 2283 |
type: Volume |
| 2285 | 2284 |
|
| ... | ... |
@@ -2893,7 +2891,6 @@ definitions: |
| 2893 | 2893 |
type: "array" |
| 2894 | 2894 |
x-omitempty: true |
| 2895 | 2895 |
items: |
| 2896 |
- x-nullable: true |
|
| 2897 | 2896 |
x-go-type: |
| 2898 | 2897 |
type: CacheRecord |
| 2899 | 2898 |
|
| ... | ... |
@@ -5617,7 +5614,6 @@ definitions: |
| 5617 | 5617 |
type: "array" |
| 5618 | 5618 |
x-omitempty: true |
| 5619 | 5619 |
items: |
| 5620 |
- x-nullable: true |
|
| 5621 | 5620 |
x-go-type: |
| 5622 | 5621 |
type: Summary |
| 5623 | 5622 |
|
| ... | ... |
@@ -2096,7 +2096,6 @@ definitions: |
| 2096 | 2096 |
type: "array" |
| 2097 | 2097 |
x-omitempty: true |
| 2098 | 2098 |
items: |
| 2099 |
- x-nullable: true |
|
| 2100 | 2099 |
x-go-type: |
| 2101 | 2100 |
type: Summary |
| 2102 | 2101 |
|
| ... | ... |
@@ -2279,7 +2278,6 @@ definitions: |
| 2279 | 2279 |
type: "array" |
| 2280 | 2280 |
x-omitempty: true |
| 2281 | 2281 |
items: |
| 2282 |
- x-nullable: true |
|
| 2283 | 2282 |
x-go-type: |
| 2284 | 2283 |
type: Volume |
| 2285 | 2284 |
|
| ... | ... |
@@ -2893,7 +2891,6 @@ definitions: |
| 2893 | 2893 |
type: "array" |
| 2894 | 2894 |
x-omitempty: true |
| 2895 | 2895 |
items: |
| 2896 |
- x-nullable: true |
|
| 2897 | 2896 |
x-go-type: |
| 2898 | 2897 |
type: CacheRecord |
| 2899 | 2898 |
|
| ... | ... |
@@ -5617,7 +5614,6 @@ definitions: |
| 5617 | 5617 |
type: "array" |
| 5618 | 5618 |
x-omitempty: true |
| 5619 | 5619 |
items: |
| 5620 |
- x-nullable: true |
|
| 5621 | 5620 |
x-go-type: |
| 5622 | 5621 |
type: Summary |
| 5623 | 5622 |
|
| ... | ... |
@@ -17,7 +17,7 @@ type DiskUsage struct {
|
| 17 | 17 |
|
| 18 | 18 |
// List of build cache records. |
| 19 | 19 |
// |
| 20 |
- Items []*CacheRecord `json:"Items,omitempty"` |
|
| 20 |
+ Items []CacheRecord `json:"Items,omitempty"` |
|
| 21 | 21 |
|
| 22 | 22 |
// Disk space that can be reclaimed by removing inactive build cache records. |
| 23 | 23 |
// |
| ... | ... |
@@ -5,6 +5,7 @@ import ( |
| 5 | 5 |
"encoding/json" |
| 6 | 6 |
"fmt" |
| 7 | 7 |
"net/url" |
| 8 |
+ "slices" |
|
| 8 | 9 |
|
| 9 | 10 |
"github.com/moby/moby/api/types/build" |
| 10 | 11 |
"github.com/moby/moby/api/types/container" |
| ... | ... |
@@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 151 | 151 |
return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err)
|
| 152 | 152 |
} |
| 153 | 153 |
|
| 154 |
- var ( |
|
| 155 |
- r DiskUsageResult |
|
| 156 |
- imagesFrom = []*image.Summary{}
|
|
| 157 |
- containersFrom = []*container.Summary{}
|
|
| 158 |
- volumesFrom = []*volume.Volume{}
|
|
| 159 |
- buildCacheFrom = []*build.CacheRecord{}
|
|
| 160 |
- ) |
|
| 161 |
- |
|
| 154 |
+ var r DiskUsageResult |
|
| 162 | 155 |
if du.ImageUsage != nil {
|
| 163 | 156 |
r.Images = ImagesDiskUsage{
|
| 164 | 157 |
ActiveImages: du.ImageUsage.ActiveImages, |
| ... | ... |
@@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 168 | 168 |
} |
| 169 | 169 |
|
| 170 | 170 |
if options.Verbose {
|
| 171 |
- imagesFrom = du.ImageUsage.Items |
|
| 171 |
+ r.Images.Items = slices.Clone(du.ImageUsage.Items) |
|
| 172 | 172 |
} |
| 173 | 173 |
} else {
|
| 174 | 174 |
// Fallback for legacy response. |
| ... | ... |
@@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 176 | 176 |
TotalSize: du.LayersSize, |
| 177 | 177 |
} |
| 178 | 178 |
|
| 179 |
- if du.Images != nil && options.Verbose {
|
|
| 180 |
- imagesFrom = du.Images |
|
| 179 |
+ if options.Verbose {
|
|
| 180 |
+ r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) {
|
|
| 181 |
+ for _, i := range du.Images {
|
|
| 182 |
+ if !yield(*i) {
|
|
| 183 |
+ return |
|
| 184 |
+ } |
|
| 185 |
+ } |
|
| 186 |
+ }) |
|
| 181 | 187 |
} |
| 182 | 188 |
} |
| 183 | 189 |
|
| 184 |
- r.Images.Items = make([]image.Summary, len(imagesFrom)) |
|
| 185 |
- for i, ii := range imagesFrom {
|
|
| 186 |
- r.Images.Items[i] = *ii |
|
| 187 |
- } |
|
| 188 |
- |
|
| 189 | 190 |
if du.ContainerUsage != nil {
|
| 190 | 191 |
r.Containers = ContainersDiskUsage{
|
| 191 | 192 |
ActiveContainers: du.ContainerUsage.ActiveContainers, |
| ... | ... |
@@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 195 | 195 |
} |
| 196 | 196 |
|
| 197 | 197 |
if options.Verbose {
|
| 198 |
- containersFrom = du.ContainerUsage.Items |
|
| 198 |
+ r.Containers.Items = slices.Clone(du.ContainerUsage.Items) |
|
| 199 | 199 |
} |
| 200 | 200 |
} else if du.Containers != nil && options.Verbose {
|
| 201 | 201 |
// Fallback for legacy response. |
| 202 |
- containersFrom = du.Containers |
|
| 203 |
- } |
|
| 204 |
- |
|
| 205 |
- r.Containers.Items = make([]container.Summary, len(containersFrom)) |
|
| 206 |
- for i, c := range containersFrom {
|
|
| 207 |
- r.Containers.Items[i] = *c |
|
| 202 |
+ r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) {
|
|
| 203 |
+ for _, c := range du.Containers {
|
|
| 204 |
+ if !yield(*c) {
|
|
| 205 |
+ return |
|
| 206 |
+ } |
|
| 207 |
+ } |
|
| 208 |
+ }) |
|
| 208 | 209 |
} |
| 209 | 210 |
|
| 210 | 211 |
if du.BuildCacheUsage != nil {
|
| ... | ... |
@@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 216 | 216 |
} |
| 217 | 217 |
|
| 218 | 218 |
if options.Verbose {
|
| 219 |
- buildCacheFrom = du.BuildCacheUsage.Items |
|
| 219 |
+ r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items) |
|
| 220 | 220 |
} |
| 221 | 221 |
} else if du.BuildCache != nil && options.Verbose {
|
| 222 | 222 |
// Fallback for legacy response. |
| 223 |
- buildCacheFrom = du.BuildCache |
|
| 224 |
- } |
|
| 225 |
- |
|
| 226 |
- r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom)) |
|
| 227 |
- for i, b := range buildCacheFrom {
|
|
| 228 |
- r.BuildCache.Items[i] = *b |
|
| 223 |
+ r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) {
|
|
| 224 |
+ for _, b := range du.BuildCache {
|
|
| 225 |
+ if !yield(*b) {
|
|
| 226 |
+ return |
|
| 227 |
+ } |
|
| 228 |
+ } |
|
| 229 |
+ }) |
|
| 229 | 230 |
} |
| 230 | 231 |
|
| 231 | 232 |
if du.VolumeUsage != nil {
|
| ... | ... |
@@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 237 | 237 |
} |
| 238 | 238 |
|
| 239 | 239 |
if options.Verbose {
|
| 240 |
- volumesFrom = du.VolumeUsage.Items |
|
| 240 |
+ r.Volumes.Items = slices.Clone(du.VolumeUsage.Items) |
|
| 241 | 241 |
} |
| 242 | 242 |
} else if du.Volumes != nil && options.Verbose {
|
| 243 | 243 |
// Fallback for legacy response. |
| 244 |
- volumesFrom = du.Volumes |
|
| 245 |
- } |
|
| 246 |
- |
|
| 247 |
- r.Volumes.Items = make([]volume.Volume, len(volumesFrom)) |
|
| 248 |
- for i, v := range volumesFrom {
|
|
| 249 |
- r.Volumes.Items[i] = *v |
|
| 244 |
+ r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) {
|
|
| 245 |
+ for _, v := range du.Volumes {
|
|
| 246 |
+ if !yield(*v) {
|
|
| 247 |
+ return |
|
| 248 |
+ } |
|
| 249 |
+ } |
|
| 250 |
+ }) |
|
| 250 | 251 |
} |
| 251 | 252 |
|
| 252 | 253 |
return r, nil |
| ... | ... |
@@ -5,6 +5,7 @@ import ( |
| 5 | 5 |
"encoding/json" |
| 6 | 6 |
"fmt" |
| 7 | 7 |
"net/http" |
| 8 |
+ "slices" |
|
| 8 | 9 |
"strconv" |
| 9 | 10 |
"time" |
| 10 | 11 |
|
| ... | ... |
@@ -230,7 +231,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, |
| 230 | 230 |
v.LayersSize = systemDiskUsage.Images.TotalSize //nolint: staticcheck,SA1019: v.LayersSize is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.TotalSize] instead. |
| 231 | 231 |
v.Images = systemDiskUsage.Images.Items //nolint: staticcheck,SA1019: v.Images is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ImagesDiskUsage.Items] instead. |
| 232 | 232 |
} else if verbose {
|
| 233 |
- v.ImageUsage.Items = systemDiskUsage.Images.Items |
|
| 233 |
+ v.ImageUsage.Items = slices.Collect(func(yield func(image.Summary) bool) {
|
|
| 234 |
+ for _, i := range systemDiskUsage.Images.Items {
|
|
| 235 |
+ if !yield(*i) {
|
|
| 236 |
+ return |
|
| 237 |
+ } |
|
| 238 |
+ } |
|
| 239 |
+ }) |
|
| 234 | 240 |
} |
| 235 | 241 |
} |
| 236 | 242 |
if systemDiskUsage != nil && systemDiskUsage.Containers != nil {
|
| ... | ... |
@@ -244,7 +251,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, |
| 244 | 244 |
if legacyFields {
|
| 245 | 245 |
v.Containers = systemDiskUsage.Containers.Items //nolint: staticcheck,SA1019: v.Containers is deprecated: kept to maintain backwards compatibility with API < v1.52, use [ContainersDiskUsage.Items] instead. |
| 246 | 246 |
} else if verbose {
|
| 247 |
- v.ContainerUsage.Items = systemDiskUsage.Containers.Items |
|
| 247 |
+ v.ContainerUsage.Items = slices.Collect(func(yield func(container.Summary) bool) {
|
|
| 248 |
+ for _, c := range systemDiskUsage.Containers.Items {
|
|
| 249 |
+ if !yield(*c) {
|
|
| 250 |
+ return |
|
| 251 |
+ } |
|
| 252 |
+ } |
|
| 253 |
+ }) |
|
| 248 | 254 |
} |
| 249 | 255 |
} |
| 250 | 256 |
if systemDiskUsage != nil && systemDiskUsage.Volumes != nil {
|
| ... | ... |
@@ -258,7 +271,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, |
| 258 | 258 |
if legacyFields {
|
| 259 | 259 |
v.Volumes = systemDiskUsage.Volumes.Items //nolint: staticcheck,SA1019: v.Volumes is deprecated: kept to maintain backwards compatibility with API < v1.52, use [VolumesDiskUsage.Items] instead. |
| 260 | 260 |
} else if verbose {
|
| 261 |
- v.VolumeUsage.Items = systemDiskUsage.Volumes.Items |
|
| 261 |
+ v.VolumeUsage.Items = slices.Collect(func(yield func(volume.Volume) bool) {
|
|
| 262 |
+ for _, v := range systemDiskUsage.Volumes.Items {
|
|
| 263 |
+ if !yield(*v) {
|
|
| 264 |
+ return |
|
| 265 |
+ } |
|
| 266 |
+ } |
|
| 267 |
+ }) |
|
| 262 | 268 |
} |
| 263 | 269 |
} |
| 264 | 270 |
if getBuildCache {
|
| ... | ... |
@@ -289,7 +308,13 @@ func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, |
| 289 | 289 |
if legacyFields {
|
| 290 | 290 |
v.BuildCache = buildCache //nolint: staticcheck,SA1019: v.BuildCache is deprecated: kept to maintain backwards compatibility with API < v1.52, use [BuildCacheDiskUsage.Items] instead. |
| 291 | 291 |
} else if verbose {
|
| 292 |
- v.BuildCacheUsage.Items = buildCache |
|
| 292 |
+ v.BuildCacheUsage.Items = slices.Collect(func(yield func(buildtypes.CacheRecord) bool) {
|
|
| 293 |
+ for _, b := range buildCache {
|
|
| 294 |
+ if !yield(*b) {
|
|
| 295 |
+ return |
|
| 296 |
+ } |
|
| 297 |
+ } |
|
| 298 |
+ }) |
|
| 293 | 299 |
} |
| 294 | 300 |
} |
| 295 | 301 |
return httputils.WriteJSON(w, http.StatusOK, v) |
| ... | ... |
@@ -5,10 +5,6 @@ import ( |
| 5 | 5 |
"testing" |
| 6 | 6 |
|
| 7 | 7 |
"github.com/google/go-cmp/cmp/cmpopts" |
| 8 |
- "github.com/moby/moby/api/types/build" |
|
| 9 |
- containertypes "github.com/moby/moby/api/types/container" |
|
| 10 |
- "github.com/moby/moby/api/types/image" |
|
| 11 |
- "github.com/moby/moby/api/types/volume" |
|
| 12 | 8 |
"github.com/moby/moby/client" |
| 13 | 9 |
"github.com/moby/moby/v2/integration/internal/container" |
| 14 | 10 |
"github.com/moby/moby/v2/internal/testutil" |
| ... | ... |
@@ -56,19 +52,12 @@ func TestDiskUsage(t *testing.T) {
|
| 56 | 56 |
} |
| 57 | 57 |
|
| 58 | 58 |
assert.DeepEqual(t, du, client.DiskUsageResult{
|
| 59 |
- Containers: client.ContainersDiskUsage{
|
|
| 60 |
- Items: []containertypes.Summary{},
|
|
| 61 |
- }, |
|
| 59 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 62 | 60 |
Images: client.ImagesDiskUsage{
|
| 63 | 61 |
TotalSize: expectedLayersSize, |
| 64 |
- Items: []image.Summary{},
|
|
| 65 |
- }, |
|
| 66 |
- BuildCache: client.BuildCacheDiskUsage{
|
|
| 67 |
- Items: []build.CacheRecord{},
|
|
| 68 |
- }, |
|
| 69 |
- Volumes: client.VolumesDiskUsage{
|
|
| 70 |
- Items: []volume.Volume{},
|
|
| 71 | 62 |
}, |
| 63 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 64 |
+ Volumes: client.VolumesDiskUsage{},
|
|
| 72 | 65 |
}) |
| 73 | 66 |
return du |
| 74 | 67 |
}, |
| ... | ... |
@@ -155,9 +144,9 @@ func TestDiskUsage(t *testing.T) {
|
| 155 | 155 |
}, |
| 156 | 156 |
expected: client.DiskUsageResult{
|
| 157 | 157 |
Containers: stepDU.Containers, |
| 158 |
- Images: client.ImagesDiskUsage{Items: []image.Summary{}},
|
|
| 159 |
- BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
|
|
| 160 |
- Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}},
|
|
| 158 |
+ Images: client.ImagesDiskUsage{},
|
|
| 159 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 160 |
+ Volumes: client.VolumesDiskUsage{},
|
|
| 161 | 161 |
}, |
| 162 | 162 |
}, |
| 163 | 163 |
{
|
| ... | ... |
@@ -167,10 +156,10 @@ func TestDiskUsage(t *testing.T) {
|
| 167 | 167 |
Verbose: true, |
| 168 | 168 |
}, |
| 169 | 169 |
expected: client.DiskUsageResult{
|
| 170 |
- Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
|
|
| 170 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 171 | 171 |
Images: stepDU.Images, |
| 172 |
- BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
|
|
| 173 |
- Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}},
|
|
| 172 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 173 |
+ Volumes: client.VolumesDiskUsage{},
|
|
| 174 | 174 |
}, |
| 175 | 175 |
}, |
| 176 | 176 |
{
|
| ... | ... |
@@ -180,9 +169,9 @@ func TestDiskUsage(t *testing.T) {
|
| 180 | 180 |
Verbose: true, |
| 181 | 181 |
}, |
| 182 | 182 |
expected: client.DiskUsageResult{
|
| 183 |
- Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
|
|
| 184 |
- Images: client.ImagesDiskUsage{Items: []image.Summary{}},
|
|
| 185 |
- BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
|
|
| 183 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 184 |
+ Images: client.ImagesDiskUsage{},
|
|
| 185 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 186 | 186 |
Volumes: stepDU.Volumes, |
| 187 | 187 |
}, |
| 188 | 188 |
}, |
| ... | ... |
@@ -193,10 +182,10 @@ func TestDiskUsage(t *testing.T) {
|
| 193 | 193 |
Verbose: true, |
| 194 | 194 |
}, |
| 195 | 195 |
expected: client.DiskUsageResult{
|
| 196 |
- Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
|
|
| 197 |
- Images: client.ImagesDiskUsage{Items: []image.Summary{}},
|
|
| 196 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 197 |
+ Images: client.ImagesDiskUsage{},
|
|
| 198 | 198 |
BuildCache: stepDU.BuildCache, |
| 199 |
- Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}},
|
|
| 199 |
+ Volumes: client.VolumesDiskUsage{},
|
|
| 200 | 200 |
}, |
| 201 | 201 |
}, |
| 202 | 202 |
{
|
| ... | ... |
@@ -208,8 +197,8 @@ func TestDiskUsage(t *testing.T) {
|
| 208 | 208 |
}, |
| 209 | 209 |
expected: client.DiskUsageResult{
|
| 210 | 210 |
Containers: stepDU.Containers, |
| 211 |
- Images: client.ImagesDiskUsage{Items: []image.Summary{}},
|
|
| 212 |
- BuildCache: client.BuildCacheDiskUsage{Items: []build.CacheRecord{}},
|
|
| 211 |
+ Images: client.ImagesDiskUsage{},
|
|
| 212 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 213 | 213 |
Volumes: stepDU.Volumes, |
| 214 | 214 |
}, |
| 215 | 215 |
}, |
| ... | ... |
@@ -221,10 +210,10 @@ func TestDiskUsage(t *testing.T) {
|
| 221 | 221 |
Verbose: true, |
| 222 | 222 |
}, |
| 223 | 223 |
expected: client.DiskUsageResult{
|
| 224 |
- Containers: client.ContainersDiskUsage{Items: []containertypes.Summary{}},
|
|
| 224 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 225 | 225 |
Images: stepDU.Images, |
| 226 | 226 |
BuildCache: stepDU.BuildCache, |
| 227 |
- Volumes: client.VolumesDiskUsage{Items: []volume.Volume{}},
|
|
| 227 |
+ Volumes: client.VolumesDiskUsage{},
|
|
| 228 | 228 |
}, |
| 229 | 229 |
}, |
| 230 | 230 |
{
|
| ... | ... |
@@ -237,9 +226,7 @@ func TestDiskUsage(t *testing.T) {
|
| 237 | 237 |
}, |
| 238 | 238 |
expected: client.DiskUsageResult{
|
| 239 | 239 |
Containers: stepDU.Containers, |
| 240 |
- Images: client.ImagesDiskUsage{
|
|
| 241 |
- Items: []image.Summary{},
|
|
| 242 |
- }, |
|
| 240 |
+ Images: client.ImagesDiskUsage{},
|
|
| 243 | 241 |
BuildCache: stepDU.BuildCache, |
| 244 | 242 |
Volumes: stepDU.Volumes, |
| 245 | 243 |
}, |
| ... | ... |
@@ -253,9 +240,7 @@ func TestDiskUsage(t *testing.T) {
|
| 253 | 253 |
Verbose: true, |
| 254 | 254 |
}, |
| 255 | 255 |
expected: client.DiskUsageResult{
|
| 256 |
- Containers: client.ContainersDiskUsage{
|
|
| 257 |
- Items: []containertypes.Summary{},
|
|
| 258 |
- }, |
|
| 256 |
+ Containers: client.ContainersDiskUsage{},
|
|
| 259 | 257 |
Images: stepDU.Images, |
| 260 | 258 |
BuildCache: stepDU.BuildCache, |
| 261 | 259 |
Volumes: stepDU.Volumes, |
| ... | ... |
@@ -272,10 +257,8 @@ func TestDiskUsage(t *testing.T) {
|
| 272 | 272 |
expected: client.DiskUsageResult{
|
| 273 | 273 |
Containers: stepDU.Containers, |
| 274 | 274 |
Images: stepDU.Images, |
| 275 |
- BuildCache: client.BuildCacheDiskUsage{
|
|
| 276 |
- Items: []build.CacheRecord{},
|
|
| 277 |
- }, |
|
| 278 |
- Volumes: stepDU.Volumes, |
|
| 275 |
+ BuildCache: client.BuildCacheDiskUsage{},
|
|
| 276 |
+ Volumes: stepDU.Volumes, |
|
| 279 | 277 |
}, |
| 280 | 278 |
}, |
| 281 | 279 |
{
|
| ... | ... |
@@ -17,7 +17,7 @@ type DiskUsage struct {
|
| 17 | 17 |
|
| 18 | 18 |
// List of build cache records. |
| 19 | 19 |
// |
| 20 |
- Items []*CacheRecord `json:"Items,omitempty"` |
|
| 20 |
+ Items []CacheRecord `json:"Items,omitempty"` |
|
| 21 | 21 |
|
| 22 | 22 |
// Disk space that can be reclaimed by removing inactive build cache records. |
| 23 | 23 |
// |
| ... | ... |
@@ -5,6 +5,7 @@ import ( |
| 5 | 5 |
"encoding/json" |
| 6 | 6 |
"fmt" |
| 7 | 7 |
"net/url" |
| 8 |
+ "slices" |
|
| 8 | 9 |
|
| 9 | 10 |
"github.com/moby/moby/api/types/build" |
| 10 | 11 |
"github.com/moby/moby/api/types/container" |
| ... | ... |
@@ -151,14 +152,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 151 | 151 |
return DiskUsageResult{}, fmt.Errorf("Error retrieving disk usage: %v", err)
|
| 152 | 152 |
} |
| 153 | 153 |
|
| 154 |
- var ( |
|
| 155 |
- r DiskUsageResult |
|
| 156 |
- imagesFrom = []*image.Summary{}
|
|
| 157 |
- containersFrom = []*container.Summary{}
|
|
| 158 |
- volumesFrom = []*volume.Volume{}
|
|
| 159 |
- buildCacheFrom = []*build.CacheRecord{}
|
|
| 160 |
- ) |
|
| 161 |
- |
|
| 154 |
+ var r DiskUsageResult |
|
| 162 | 155 |
if du.ImageUsage != nil {
|
| 163 | 156 |
r.Images = ImagesDiskUsage{
|
| 164 | 157 |
ActiveImages: du.ImageUsage.ActiveImages, |
| ... | ... |
@@ -168,7 +162,7 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 168 | 168 |
} |
| 169 | 169 |
|
| 170 | 170 |
if options.Verbose {
|
| 171 |
- imagesFrom = du.ImageUsage.Items |
|
| 171 |
+ r.Images.Items = slices.Clone(du.ImageUsage.Items) |
|
| 172 | 172 |
} |
| 173 | 173 |
} else {
|
| 174 | 174 |
// Fallback for legacy response. |
| ... | ... |
@@ -176,16 +170,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 176 | 176 |
TotalSize: du.LayersSize, |
| 177 | 177 |
} |
| 178 | 178 |
|
| 179 |
- if du.Images != nil && options.Verbose {
|
|
| 180 |
- imagesFrom = du.Images |
|
| 179 |
+ if options.Verbose {
|
|
| 180 |
+ r.Images.Items = slices.Collect(func(yield func(image.Summary) bool) {
|
|
| 181 |
+ for _, i := range du.Images {
|
|
| 182 |
+ if !yield(*i) {
|
|
| 183 |
+ return |
|
| 184 |
+ } |
|
| 185 |
+ } |
|
| 186 |
+ }) |
|
| 181 | 187 |
} |
| 182 | 188 |
} |
| 183 | 189 |
|
| 184 |
- r.Images.Items = make([]image.Summary, len(imagesFrom)) |
|
| 185 |
- for i, ii := range imagesFrom {
|
|
| 186 |
- r.Images.Items[i] = *ii |
|
| 187 |
- } |
|
| 188 |
- |
|
| 189 | 190 |
if du.ContainerUsage != nil {
|
| 190 | 191 |
r.Containers = ContainersDiskUsage{
|
| 191 | 192 |
ActiveContainers: du.ContainerUsage.ActiveContainers, |
| ... | ... |
@@ -195,16 +190,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 195 | 195 |
} |
| 196 | 196 |
|
| 197 | 197 |
if options.Verbose {
|
| 198 |
- containersFrom = du.ContainerUsage.Items |
|
| 198 |
+ r.Containers.Items = slices.Clone(du.ContainerUsage.Items) |
|
| 199 | 199 |
} |
| 200 | 200 |
} else if du.Containers != nil && options.Verbose {
|
| 201 | 201 |
// Fallback for legacy response. |
| 202 |
- containersFrom = du.Containers |
|
| 203 |
- } |
|
| 204 |
- |
|
| 205 |
- r.Containers.Items = make([]container.Summary, len(containersFrom)) |
|
| 206 |
- for i, c := range containersFrom {
|
|
| 207 |
- r.Containers.Items[i] = *c |
|
| 202 |
+ r.Containers.Items = slices.Collect(func(yield func(container.Summary) bool) {
|
|
| 203 |
+ for _, c := range du.Containers {
|
|
| 204 |
+ if !yield(*c) {
|
|
| 205 |
+ return |
|
| 206 |
+ } |
|
| 207 |
+ } |
|
| 208 |
+ }) |
|
| 208 | 209 |
} |
| 209 | 210 |
|
| 210 | 211 |
if du.BuildCacheUsage != nil {
|
| ... | ... |
@@ -216,16 +212,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 216 | 216 |
} |
| 217 | 217 |
|
| 218 | 218 |
if options.Verbose {
|
| 219 |
- buildCacheFrom = du.BuildCacheUsage.Items |
|
| 219 |
+ r.BuildCache.Items = slices.Clone(du.BuildCacheUsage.Items) |
|
| 220 | 220 |
} |
| 221 | 221 |
} else if du.BuildCache != nil && options.Verbose {
|
| 222 | 222 |
// Fallback for legacy response. |
| 223 |
- buildCacheFrom = du.BuildCache |
|
| 224 |
- } |
|
| 225 |
- |
|
| 226 |
- r.BuildCache.Items = make([]build.CacheRecord, len(buildCacheFrom)) |
|
| 227 |
- for i, b := range buildCacheFrom {
|
|
| 228 |
- r.BuildCache.Items[i] = *b |
|
| 223 |
+ r.BuildCache.Items = slices.Collect(func(yield func(build.CacheRecord) bool) {
|
|
| 224 |
+ for _, b := range du.BuildCache {
|
|
| 225 |
+ if !yield(*b) {
|
|
| 226 |
+ return |
|
| 227 |
+ } |
|
| 228 |
+ } |
|
| 229 |
+ }) |
|
| 229 | 230 |
} |
| 230 | 231 |
|
| 231 | 232 |
if du.VolumeUsage != nil {
|
| ... | ... |
@@ -237,16 +234,17 @@ func (cli *Client) DiskUsage(ctx context.Context, options DiskUsageOptions) (Dis |
| 237 | 237 |
} |
| 238 | 238 |
|
| 239 | 239 |
if options.Verbose {
|
| 240 |
- volumesFrom = du.VolumeUsage.Items |
|
| 240 |
+ r.Volumes.Items = slices.Clone(du.VolumeUsage.Items) |
|
| 241 | 241 |
} |
| 242 | 242 |
} else if du.Volumes != nil && options.Verbose {
|
| 243 | 243 |
// Fallback for legacy response. |
| 244 |
- volumesFrom = du.Volumes |
|
| 245 |
- } |
|
| 246 |
- |
|
| 247 |
- r.Volumes.Items = make([]volume.Volume, len(volumesFrom)) |
|
| 248 |
- for i, v := range volumesFrom {
|
|
| 249 |
- r.Volumes.Items[i] = *v |
|
| 244 |
+ r.Volumes.Items = slices.Collect(func(yield func(volume.Volume) bool) {
|
|
| 245 |
+ for _, v := range du.Volumes {
|
|
| 246 |
+ if !yield(*v) {
|
|
| 247 |
+ return |
|
| 248 |
+ } |
|
| 249 |
+ } |
|
| 250 |
+ }) |
|
| 250 | 251 |
} |
| 251 | 252 |
|
| 252 | 253 |
return r, nil |