diff --git a/client/client_interfaces.go b/client/client_interfaces.go index 554ba8e8f5..7ff179df2e 100644 --- a/client/client_interfaces.go +++ b/client/client_interfaces.go @@ -8,7 +8,6 @@ import ( "github.com/moby/moby/api/types" "github.com/moby/moby/api/types/container" "github.com/moby/moby/api/types/events" - "github.com/moby/moby/api/types/image" "github.com/moby/moby/api/types/network" "github.com/moby/moby/api/types/plugin" "github.com/moby/moby/api/types/registry" @@ -114,8 +113,8 @@ type ImageAPIClient interface { ImageList(ctx context.Context, options ImageListOptions) (ImageListResult, error) ImagePull(ctx context.Context, ref string, options ImagePullOptions) (ImagePullResponse, error) ImagePush(ctx context.Context, ref string, options ImagePushOptions) (ImagePushResponse, error) - ImageRemove(ctx context.Context, image string, options ImageRemoveOptions) ([]image.DeleteResponse, error) - ImageSearch(ctx context.Context, term string, options ImageSearchOptions) ([]registry.SearchResult, error) + ImageRemove(ctx context.Context, image string, options ImageRemoveOptions) (ImageRemoveResult, error) + ImageSearch(ctx context.Context, term string, options ImageSearchOptions) (ImageSearchResult, error) ImageTag(ctx context.Context, image, ref string) error ImagesPrune(ctx context.Context, opts ImagePruneOptions) (ImagePruneResult, error) diff --git a/client/image_remove.go b/client/image_remove.go index 738e647b31..17ed75741c 100644 --- a/client/image_remove.go +++ b/client/image_remove.go @@ -9,7 +9,7 @@ import ( ) // ImageRemove removes an image from the docker host. -func (cli *Client) ImageRemove(ctx context.Context, imageID string, options ImageRemoveOptions) ([]image.DeleteResponse, error) { +func (cli *Client) ImageRemove(ctx context.Context, imageID string, options ImageRemoveOptions) (ImageRemoveResult, error) { query := url.Values{} if options.Force { @@ -22,7 +22,7 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options Imag if len(options.Platforms) > 0 { p, err := encodePlatforms(options.Platforms...) if err != nil { - return nil, err + return ImageRemoveResult{}, err } query["platforms"] = p } @@ -30,10 +30,10 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options Imag resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) defer ensureReaderClosed(resp) if err != nil { - return nil, err + return ImageRemoveResult{}, err } var dels []image.DeleteResponse err = json.NewDecoder(resp.Body).Decode(&dels) - return dels, err + return ImageRemoveResult{Deleted: dels}, err } diff --git a/client/image_remove_opts.go b/client/image_remove_opts.go index 07161f58ed..d028f46086 100644 --- a/client/image_remove_opts.go +++ b/client/image_remove_opts.go @@ -1,6 +1,9 @@ package client -import ocispec "github.com/opencontainers/image-spec/specs-go/v1" +import ( + "github.com/moby/moby/api/types/image" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" +) // ImageRemoveOptions holds parameters to remove images. type ImageRemoveOptions struct { @@ -8,3 +11,8 @@ type ImageRemoveOptions struct { Force bool PruneChildren bool } + +// ImageRemoveResult holds the delete responses returned by the daemon. +type ImageRemoveResult struct { + Deleted []image.DeleteResponse +} diff --git a/client/image_remove_test.go b/client/image_remove_test.go index 7a7db37189..8990cfe899 100644 --- a/client/image_remove_test.go +++ b/client/image_remove_test.go @@ -108,6 +108,6 @@ func TestImageRemove(t *testing.T) { imageDeletes, err := client.ImageRemove(context.Background(), "image_id", opts) assert.NilError(t, err) - assert.Check(t, is.Len(imageDeletes, 2)) + assert.Check(t, is.Len(imageDeletes.Deleted, 2)) } } diff --git a/client/image_search.go b/client/image_search.go index d7154ab961..6e280906a2 100644 --- a/client/image_search.go +++ b/client/image_search.go @@ -13,7 +13,7 @@ import ( // ImageSearch makes the docker host search by a term in a remote registry. // The list of results is not sorted in any fashion. -func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSearchOptions) ([]registry.SearchResult, error) { +func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSearchOptions) (ImageSearchResult, error) { var results []registry.SearchResult query := url.Values{} query.Set("term", term) @@ -28,16 +28,16 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSe if cerrdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx) if privilegeErr != nil { - return results, privilegeErr + return ImageSearchResult{}, privilegeErr } resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) } if err != nil { - return results, err + return ImageSearchResult{}, err } err = json.NewDecoder(resp.Body).Decode(&results) - return results, err + return ImageSearchResult{Items: results}, err } func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (*http.Response, error) { diff --git a/client/image_search_opts.go b/client/image_search_opts.go index 61b94117db..95a7d41fa0 100644 --- a/client/image_search_opts.go +++ b/client/image_search_opts.go @@ -2,8 +2,15 @@ package client import ( "context" + + "github.com/moby/moby/api/types/registry" ) +// ImageSearchResult wraps results returned by ImageSearch. +type ImageSearchResult struct { + Items []registry.SearchResult +} + // ImageSearchOptions holds parameters to search images with. type ImageSearchOptions struct { RegistryAuth string diff --git a/client/image_search_test.go b/client/image_search_test.go index 529bab84b8..eb3ebc4b5d 100644 --- a/client/image_search_test.go +++ b/client/image_search_test.go @@ -97,7 +97,7 @@ func TestImageSearchWithPrivilegedFuncNoError(t *testing.T) { PrivilegeFunc: privilegeFunc, }) assert.NilError(t, err) - assert.Check(t, is.Len(results, 1)) + assert.Check(t, is.Len(results.Items, 1)) } func TestImageSearchWithoutErrors(t *testing.T) { @@ -135,5 +135,5 @@ func TestImageSearchWithoutErrors(t *testing.T) { Filters: make(Filters).Add("is-automated", "true").Add("stars", "3"), }) assert.NilError(t, err) - assert.Check(t, is.Len(results, 1)) + assert.Check(t, is.Len(results.Items, 1)) } diff --git a/integration/build/build_test.go b/integration/build/build_test.go index af2fe63b4d..e45c560166 100644 --- a/integration/build/build_test.go +++ b/integration/build/build_test.go @@ -800,9 +800,9 @@ func TestBuildHistoryDoesNotPreventRemoval(t *testing.T) { err := buildImage("history-a") assert.NilError(t, err) - resp, err := apiClient.ImageRemove(ctx, "history-a", client.ImageRemoveOptions{}) + res, err := apiClient.ImageRemove(ctx, "history-a", client.ImageRemoveOptions{}) assert.NilError(t, err) - assert.Check(t, slices.ContainsFunc(resp, func(r image.DeleteResponse) bool { + assert.Check(t, slices.ContainsFunc(res.Deleted, func(r image.DeleteResponse) bool { return r.Deleted != "" })) } diff --git a/integration/image/remove_test.go b/integration/image/remove_test.go index bc842b8a97..b38b5fd862 100644 --- a/integration/image/remove_test.go +++ b/integration/image/remove_test.go @@ -142,25 +142,25 @@ func TestRemoveWithPlatform(t *testing.T) { {platform: &platformHost, deleted: descs[0]}, {platform: &someOtherPlatform, deleted: descs[3]}, } { - resp, err := apiClient.ImageRemove(ctx, imgName, client.ImageRemoveOptions{ + res, err := apiClient.ImageRemove(ctx, imgName, client.ImageRemoveOptions{ Platforms: []ocispec.Platform{*tc.platform}, Force: true, }) assert.NilError(t, err) - assert.Check(t, is.Len(resp, 1)) - for _, r := range resp { + assert.Check(t, is.Len(res.Deleted, 1)) + for _, r := range res.Deleted { assert.Check(t, is.Equal(r.Untagged, ""), "No image should be untagged") } - checkPlatformDeleted(t, imageIdx, resp, tc.deleted) + checkPlatformDeleted(t, imageIdx, res.Deleted, tc.deleted) } // Delete the rest resp, err := apiClient.ImageRemove(ctx, imgName, client.ImageRemoveOptions{}) assert.NilError(t, err) - assert.Check(t, is.Len(resp, 2)) - assert.Check(t, is.Equal(resp[0].Untagged, imgName)) - assert.Check(t, is.Equal(resp[1].Deleted, imageIdx.Manifests[0].Digest.String())) + assert.Check(t, is.Len(resp.Deleted, 2)) + assert.Check(t, is.Equal(resp.Deleted[0].Untagged, imgName)) + assert.Check(t, is.Equal(resp.Deleted[1].Deleted, imageIdx.Manifests[0].Digest.String())) // TODO(vvoland): Should it also include platform-specific manifests? https://github.com/moby/moby/pull/49982 } diff --git a/vendor/github.com/moby/moby/client/client_interfaces.go b/vendor/github.com/moby/moby/client/client_interfaces.go index 554ba8e8f5..7ff179df2e 100644 --- a/vendor/github.com/moby/moby/client/client_interfaces.go +++ b/vendor/github.com/moby/moby/client/client_interfaces.go @@ -8,7 +8,6 @@ import ( "github.com/moby/moby/api/types" "github.com/moby/moby/api/types/container" "github.com/moby/moby/api/types/events" - "github.com/moby/moby/api/types/image" "github.com/moby/moby/api/types/network" "github.com/moby/moby/api/types/plugin" "github.com/moby/moby/api/types/registry" @@ -114,8 +113,8 @@ type ImageAPIClient interface { ImageList(ctx context.Context, options ImageListOptions) (ImageListResult, error) ImagePull(ctx context.Context, ref string, options ImagePullOptions) (ImagePullResponse, error) ImagePush(ctx context.Context, ref string, options ImagePushOptions) (ImagePushResponse, error) - ImageRemove(ctx context.Context, image string, options ImageRemoveOptions) ([]image.DeleteResponse, error) - ImageSearch(ctx context.Context, term string, options ImageSearchOptions) ([]registry.SearchResult, error) + ImageRemove(ctx context.Context, image string, options ImageRemoveOptions) (ImageRemoveResult, error) + ImageSearch(ctx context.Context, term string, options ImageSearchOptions) (ImageSearchResult, error) ImageTag(ctx context.Context, image, ref string) error ImagesPrune(ctx context.Context, opts ImagePruneOptions) (ImagePruneResult, error) diff --git a/vendor/github.com/moby/moby/client/image_remove.go b/vendor/github.com/moby/moby/client/image_remove.go index 738e647b31..17ed75741c 100644 --- a/vendor/github.com/moby/moby/client/image_remove.go +++ b/vendor/github.com/moby/moby/client/image_remove.go @@ -9,7 +9,7 @@ import ( ) // ImageRemove removes an image from the docker host. -func (cli *Client) ImageRemove(ctx context.Context, imageID string, options ImageRemoveOptions) ([]image.DeleteResponse, error) { +func (cli *Client) ImageRemove(ctx context.Context, imageID string, options ImageRemoveOptions) (ImageRemoveResult, error) { query := url.Values{} if options.Force { @@ -22,7 +22,7 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options Imag if len(options.Platforms) > 0 { p, err := encodePlatforms(options.Platforms...) if err != nil { - return nil, err + return ImageRemoveResult{}, err } query["platforms"] = p } @@ -30,10 +30,10 @@ func (cli *Client) ImageRemove(ctx context.Context, imageID string, options Imag resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) defer ensureReaderClosed(resp) if err != nil { - return nil, err + return ImageRemoveResult{}, err } var dels []image.DeleteResponse err = json.NewDecoder(resp.Body).Decode(&dels) - return dels, err + return ImageRemoveResult{Deleted: dels}, err } diff --git a/vendor/github.com/moby/moby/client/image_remove_opts.go b/vendor/github.com/moby/moby/client/image_remove_opts.go index 07161f58ed..d028f46086 100644 --- a/vendor/github.com/moby/moby/client/image_remove_opts.go +++ b/vendor/github.com/moby/moby/client/image_remove_opts.go @@ -1,6 +1,9 @@ package client -import ocispec "github.com/opencontainers/image-spec/specs-go/v1" +import ( + "github.com/moby/moby/api/types/image" + ocispec "github.com/opencontainers/image-spec/specs-go/v1" +) // ImageRemoveOptions holds parameters to remove images. type ImageRemoveOptions struct { @@ -8,3 +11,8 @@ type ImageRemoveOptions struct { Force bool PruneChildren bool } + +// ImageRemoveResult holds the delete responses returned by the daemon. +type ImageRemoveResult struct { + Deleted []image.DeleteResponse +} diff --git a/vendor/github.com/moby/moby/client/image_search.go b/vendor/github.com/moby/moby/client/image_search.go index d7154ab961..6e280906a2 100644 --- a/vendor/github.com/moby/moby/client/image_search.go +++ b/vendor/github.com/moby/moby/client/image_search.go @@ -13,7 +13,7 @@ import ( // ImageSearch makes the docker host search by a term in a remote registry. // The list of results is not sorted in any fashion. -func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSearchOptions) ([]registry.SearchResult, error) { +func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSearchOptions) (ImageSearchResult, error) { var results []registry.SearchResult query := url.Values{} query.Set("term", term) @@ -28,16 +28,16 @@ func (cli *Client) ImageSearch(ctx context.Context, term string, options ImageSe if cerrdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil { newAuthHeader, privilegeErr := options.PrivilegeFunc(ctx) if privilegeErr != nil { - return results, privilegeErr + return ImageSearchResult{}, privilegeErr } resp, err = cli.tryImageSearch(ctx, query, newAuthHeader) } if err != nil { - return results, err + return ImageSearchResult{}, err } err = json.NewDecoder(resp.Body).Decode(&results) - return results, err + return ImageSearchResult{Items: results}, err } func (cli *Client) tryImageSearch(ctx context.Context, query url.Values, registryAuth string) (*http.Response, error) { diff --git a/vendor/github.com/moby/moby/client/image_search_opts.go b/vendor/github.com/moby/moby/client/image_search_opts.go index 61b94117db..95a7d41fa0 100644 --- a/vendor/github.com/moby/moby/client/image_search_opts.go +++ b/vendor/github.com/moby/moby/client/image_search_opts.go @@ -2,8 +2,15 @@ package client import ( "context" + + "github.com/moby/moby/api/types/registry" ) +// ImageSearchResult wraps results returned by ImageSearch. +type ImageSearchResult struct { + Items []registry.SearchResult +} + // ImageSearchOptions holds parameters to search images with. type ImageSearchOptions struct { RegistryAuth string