Browse code

client: VolumesPrune: rewrite to use option structs and result

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2025/10/16 18:57:57
Showing 6 changed files
... ...
@@ -200,7 +200,7 @@ type VolumeAPIClient interface {
200 200
 	VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error)
201 201
 	VolumeList(ctx context.Context, options VolumeListOptions) (volume.ListResponse, error)
202 202
 	VolumeRemove(ctx context.Context, volumeID string, force bool) error
203
-	VolumesPrune(ctx context.Context, pruneFilter Filters) (volume.PruneReport, error)
203
+	VolumesPrune(ctx context.Context, opts VolumePruneOptions) (VolumePruneResult, error)
204 204
 	VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error
205 205
 }
206 206
 
... ...
@@ -9,21 +9,31 @@ import (
9 9
 	"github.com/moby/moby/api/types/volume"
10 10
 )
11 11
 
12
+// VolumePruneOptions holds parameters to prune networks.
13
+type VolumePruneOptions struct {
14
+	Filters Filters
15
+}
16
+
17
+// VolumePruneResult holds the result from the [Client.VolumesPrune] method.
18
+type VolumePruneResult struct {
19
+	Report volume.PruneReport
20
+}
21
+
12 22
 // VolumesPrune requests the daemon to delete unused data
13
-func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters Filters) (volume.PruneReport, error) {
23
+func (cli *Client) VolumesPrune(ctx context.Context, opts VolumePruneOptions) (VolumePruneResult, error) {
14 24
 	query := url.Values{}
15
-	pruneFilters.updateURLValues(query)
25
+	opts.Filters.updateURLValues(query)
16 26
 
17 27
 	resp, err := cli.post(ctx, "/volumes/prune", query, nil, nil)
18 28
 	defer ensureReaderClosed(resp)
19 29
 	if err != nil {
20
-		return volume.PruneReport{}, err
30
+		return VolumePruneResult{}, err
21 31
 	}
22 32
 
23 33
 	var report volume.PruneReport
24 34
 	if err := json.NewDecoder(resp.Body).Decode(&report); err != nil {
25
-		return volume.PruneReport{}, fmt.Errorf("Error retrieving volume prune report: %v", err)
35
+		return VolumePruneResult{}, fmt.Errorf("Error retrieving volume prune report: %v", err)
26 36
 	}
27 37
 
28
-	return report, nil
38
+	return VolumePruneResult{Report: report}, nil
29 39
 }
... ...
@@ -110,7 +110,7 @@ func TestAuthZPluginV2RejectVolumeRequests(t *testing.T) {
110 110
 	assert.Assert(t, err != nil)
111 111
 	assert.ErrorContains(t, err, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
112 112
 
113
-	_, err = c.VolumesPrune(ctx, nil)
113
+	_, err = c.VolumesPrune(ctx, client.VolumePruneOptions{})
114 114
 	assert.Assert(t, err != nil)
115 115
 	assert.ErrorContains(t, err, fmt.Sprintf("Error response from daemon: plugin %s failed with error:", authzPluginNameWithTag))
116 116
 }
... ...
@@ -270,10 +270,10 @@ func TestVolumePruneAnonymous(t *testing.T) {
270 270
 	assert.NilError(t, err)
271 271
 
272 272
 	// Prune anonymous volumes
273
-	pruneReport, err := apiClient.VolumesPrune(ctx, nil)
273
+	res, err := apiClient.VolumesPrune(ctx, client.VolumePruneOptions{})
274 274
 	assert.NilError(t, err)
275
-	assert.Check(t, is.Equal(len(pruneReport.VolumesDeleted), 1))
276
-	assert.Check(t, is.Equal(pruneReport.VolumesDeleted[0], v.Name))
275
+	assert.Check(t, is.Equal(len(res.Report.VolumesDeleted), 1))
276
+	assert.Check(t, is.Equal(res.Report.VolumesDeleted[0], v.Name))
277 277
 
278 278
 	_, err = apiClient.VolumeInspect(ctx, vNamed.Name)
279 279
 	assert.NilError(t, err)
... ...
@@ -282,9 +282,11 @@ func TestVolumePruneAnonymous(t *testing.T) {
282 282
 	_, err = apiClient.VolumeCreate(ctx, volume.CreateOptions{})
283 283
 	assert.NilError(t, err)
284 284
 
285
-	pruneReport, err = apiClient.VolumesPrune(ctx, make(client.Filters).Add("all", "1"))
285
+	res, err = apiClient.VolumesPrune(ctx, client.VolumePruneOptions{
286
+		Filters: make(client.Filters).Add("all", "1"),
287
+	})
286 288
 	assert.NilError(t, err)
287
-	assert.Check(t, is.Equal(len(pruneReport.VolumesDeleted), 2))
289
+	assert.Check(t, is.Equal(len(res.Report.VolumesDeleted), 2))
288 290
 
289 291
 	// Validate that older API versions still have the old behavior of pruning all local volumes
290 292
 	clientOld, err := client.NewClientWithOpts(client.FromEnv, client.WithVersion("1.41"))
... ...
@@ -297,11 +299,11 @@ func TestVolumePruneAnonymous(t *testing.T) {
297 297
 	vNamed, err = apiClient.VolumeCreate(ctx, volume.CreateOptions{Name: "test-api141"})
298 298
 	assert.NilError(t, err)
299 299
 
300
-	pruneReport, err = clientOld.VolumesPrune(ctx, nil)
300
+	res, err = clientOld.VolumesPrune(ctx, client.VolumePruneOptions{})
301 301
 	assert.NilError(t, err)
302
-	assert.Check(t, is.Equal(len(pruneReport.VolumesDeleted), 2))
303
-	assert.Check(t, is.Contains(pruneReport.VolumesDeleted, v.Name))
304
-	assert.Check(t, is.Contains(pruneReport.VolumesDeleted, vNamed.Name))
302
+	assert.Check(t, is.Equal(len(res.Report.VolumesDeleted), 2))
303
+	assert.Check(t, is.Contains(res.Report.VolumesDeleted, v.Name))
304
+	assert.Check(t, is.Contains(res.Report.VolumesDeleted, vNamed.Name))
305 305
 }
306 306
 
307 307
 func TestVolumePruneAnonFromImage(t *testing.T) {
... ...
@@ -332,7 +334,7 @@ VOLUME ` + volDest
332 332
 	err = apiClient.ContainerRemove(ctx, id, client.ContainerRemoveOptions{})
333 333
 	assert.NilError(t, err)
334 334
 
335
-	pruneReport, err := apiClient.VolumesPrune(ctx, nil)
335
+	res, err := apiClient.VolumesPrune(ctx, client.VolumePruneOptions{})
336 336
 	assert.NilError(t, err)
337
-	assert.Assert(t, is.Contains(pruneReport.VolumesDeleted, volumeName))
337
+	assert.Assert(t, is.Contains(res.Report.VolumesDeleted, volumeName))
338 338
 }
... ...
@@ -200,7 +200,7 @@ type VolumeAPIClient interface {
200 200
 	VolumeInspectWithRaw(ctx context.Context, volumeID string) (volume.Volume, []byte, error)
201 201
 	VolumeList(ctx context.Context, options VolumeListOptions) (volume.ListResponse, error)
202 202
 	VolumeRemove(ctx context.Context, volumeID string, force bool) error
203
-	VolumesPrune(ctx context.Context, pruneFilter Filters) (volume.PruneReport, error)
203
+	VolumesPrune(ctx context.Context, opts VolumePruneOptions) (VolumePruneResult, error)
204 204
 	VolumeUpdate(ctx context.Context, volumeID string, version swarm.Version, options volume.UpdateOptions) error
205 205
 }
206 206
 
... ...
@@ -9,21 +9,31 @@ import (
9 9
 	"github.com/moby/moby/api/types/volume"
10 10
 )
11 11
 
12
+// VolumePruneOptions holds parameters to prune networks.
13
+type VolumePruneOptions struct {
14
+	Filters Filters
15
+}
16
+
17
+// VolumePruneResult holds the result from the [Client.VolumesPrune] method.
18
+type VolumePruneResult struct {
19
+	Report volume.PruneReport
20
+}
21
+
12 22
 // VolumesPrune requests the daemon to delete unused data
13
-func (cli *Client) VolumesPrune(ctx context.Context, pruneFilters Filters) (volume.PruneReport, error) {
23
+func (cli *Client) VolumesPrune(ctx context.Context, opts VolumePruneOptions) (VolumePruneResult, error) {
14 24
 	query := url.Values{}
15
-	pruneFilters.updateURLValues(query)
25
+	opts.Filters.updateURLValues(query)
16 26
 
17 27
 	resp, err := cli.post(ctx, "/volumes/prune", query, nil, nil)
18 28
 	defer ensureReaderClosed(resp)
19 29
 	if err != nil {
20
-		return volume.PruneReport{}, err
30
+		return VolumePruneResult{}, err
21 31
 	}
22 32
 
23 33
 	var report volume.PruneReport
24 34
 	if err := json.NewDecoder(resp.Body).Decode(&report); err != nil {
25
-		return volume.PruneReport{}, fmt.Errorf("Error retrieving volume prune report: %v", err)
35
+		return VolumePruneResult{}, fmt.Errorf("Error retrieving volume prune report: %v", err)
26 36
 	}
27 37
 
28
-	return report, nil
38
+	return VolumePruneResult{Report: report}, nil
29 39
 }