From 14940a067d007af445560a0a7eb414f6547a7cd4 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Wed, 12 Jan 2022 08:19:13 -0500 Subject: Remove two GetImages functions from API [NO NEW TESTS NEEDED] This is just code cleanup. The remote API has three different GetImages functions, which I believe can be handled by just one function. Signed-off-by: Daniel J Walsh --- pkg/api/handlers/compat/images.go | 54 +++++++++++++++++++++++++++++---------- pkg/api/handlers/libpod/images.go | 43 ------------------------------- pkg/api/handlers/types.go | 40 ----------------------------- pkg/api/handlers/utils/images.go | 40 ----------------------------- 4 files changed, 41 insertions(+), 136 deletions(-) (limited to 'pkg/api/handlers') diff --git a/pkg/api/handlers/compat/images.go b/pkg/api/handlers/compat/images.go index c1cc99da4..f08a7ee41 100644 --- a/pkg/api/handlers/compat/images.go +++ b/pkg/api/handlers/compat/images.go @@ -11,6 +11,7 @@ import ( "github.com/containers/buildah" "github.com/containers/common/libimage" "github.com/containers/common/pkg/config" + "github.com/containers/common/pkg/filters" "github.com/containers/image/v5/manifest" "github.com/containers/image/v5/types" "github.com/containers/podman/v3/libpod" @@ -404,25 +405,52 @@ func GetImage(w http.ResponseWriter, r *http.Request) { } func GetImages(w http.ResponseWriter, r *http.Request) { - images, err := utils.GetImages(w, r) - if err != nil { - utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Failed get images")) + decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder) + runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) + query := struct { + All bool + Digests bool + Filter string // Docker 1.24 compatibility + }{ + // This is where you can override the golang default value for one of fields + } + + if err := decoder.Decode(&query, r.URL.Query()); err != nil { + utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, + errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String())) + return + } + if _, found := r.URL.Query()["digests"]; found && query.Digests { + utils.UnSupportedParameter("digests") return } - summaries := make([]*entities.ImageSummary, 0, len(images)) - for _, img := range images { - // If the image is a manifest list, extract as much as we can. - if isML, _ := img.IsManifestList(r.Context()); isML { - continue + filterList, err := filters.FiltersFromRequest(r) + if err != nil { + utils.Error(w, "Something went wrong.", http.StatusInternalServerError, err) + return + } + if !utils.IsLibpodRequest(r) { + if len(query.Filter) > 0 { // Docker 1.24 compatibility + filterList = append(filterList, "reference="+query.Filter) } + filterList = append(filterList, "manifest=false") + } - is, err := handlers.ImageToImageSummary(img) - if err != nil { - utils.Error(w, "Something went wrong.", http.StatusInternalServerError, errors.Wrap(err, "Failed transform image summaries")) - return + imageEngine := abi.ImageEngine{Libpod: runtime} + + listOptions := entities.ImageListOptions{All: query.All, Filter: filterList} + summaries, err := imageEngine.List(r.Context(), listOptions) + if err != nil { + utils.Error(w, "Something went wrong.", http.StatusInternalServerError, err) + return + } + + if !utils.IsLibpodRequest(r) { + // docker adds sha256: in front of the ID + for _, s := range summaries { + s.ID = "sha256:" + s.ID } - summaries = append(summaries, is) } utils.WriteResponse(w, http.StatusOK, summaries) } diff --git a/pkg/api/handlers/libpod/images.go b/pkg/api/handlers/libpod/images.go index 6e23845f0..d3dbf3023 100644 --- a/pkg/api/handlers/libpod/images.go +++ b/pkg/api/handlers/libpod/images.go @@ -12,7 +12,6 @@ import ( "github.com/containers/buildah" "github.com/containers/common/libimage" - "github.com/containers/common/pkg/filters" "github.com/containers/image/v5/manifest" "github.com/containers/image/v5/types" "github.com/containers/podman/v3/libpod" @@ -103,48 +102,6 @@ func GetImage(w http.ResponseWriter, r *http.Request) { utils.WriteResponse(w, http.StatusOK, inspect) } -func GetImages(w http.ResponseWriter, r *http.Request) { - decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder) - runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) - query := struct { - All bool - Digests bool - Filter string // Docker 1.24 compatibility - }{ - // This is where you can override the golang default value for one of fields - } - - if err := decoder.Decode(&query, r.URL.Query()); err != nil { - utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest, - errors.Wrapf(err, "failed to parse parameters for %s", r.URL.String())) - return - } - if _, found := r.URL.Query()["digests"]; found && query.Digests { - utils.UnSupportedParameter("digests") - return - } - - filterList, err := filters.FiltersFromRequest(r) - if err != nil { - utils.Error(w, "Something went wrong.", http.StatusInternalServerError, err) - return - } - if !utils.IsLibpodRequest(r) && len(query.Filter) > 0 { // Docker 1.24 compatibility - filterList = append(filterList, "reference="+query.Filter) - } - - imageEngine := abi.ImageEngine{Libpod: runtime} - - listOptions := entities.ImageListOptions{All: query.All, Filter: filterList} - summaries, err := imageEngine.List(r.Context(), listOptions) - if err != nil { - utils.Error(w, "Something went wrong.", http.StatusInternalServerError, err) - return - } - - utils.WriteResponse(w, http.StatusOK, summaries) -} - func PruneImages(w http.ResponseWriter, r *http.Request) { var ( err error diff --git a/pkg/api/handlers/types.go b/pkg/api/handlers/types.go index 588758b2c..3b821d9e7 100644 --- a/pkg/api/handlers/types.go +++ b/pkg/api/handlers/types.go @@ -184,46 +184,6 @@ type ExecStartConfig struct { Width uint16 `json:"w"` } -func ImageToImageSummary(l *libimage.Image) (*entities.ImageSummary, error) { - options := &libimage.InspectOptions{WithParent: true, WithSize: true} - imageData, err := l.Inspect(context.TODO(), options) - if err != nil { - return nil, errors.Wrapf(err, "failed to obtain summary for image %s", l.ID()) - } - - containers, err := l.Containers() - if err != nil { - return nil, errors.Wrapf(err, "failed to obtain Containers for image %s", l.ID()) - } - containerCount := len(containers) - - isDangling, err := l.IsDangling(context.TODO()) - if err != nil { - return nil, errors.Wrapf(err, "failed to check if image %s is dangling", l.ID()) - } - - is := entities.ImageSummary{ - // docker adds sha256: in front of the ID - ID: "sha256:" + l.ID(), - ParentId: imageData.Parent, - RepoTags: imageData.RepoTags, - RepoDigests: imageData.RepoDigests, - Created: l.Created().Unix(), - Size: imageData.Size, - SharedSize: 0, - VirtualSize: imageData.VirtualSize, - Labels: imageData.Labels, - Containers: containerCount, - ReadOnly: l.IsReadOnly(), - Dangling: isDangling, - Names: l.Names(), - Digest: string(imageData.Digest), - ConfigDigest: "", // TODO: libpod/image didn't set it but libimage should - History: imageData.NamesHistory, - } - return &is, nil -} - func ImageDataToImageInspect(ctx context.Context, l *libimage.Image) (*ImageInspect, error) { options := &libimage.InspectOptions{WithParent: true, WithSize: true} info, err := l.Inspect(context.Background(), options) diff --git a/pkg/api/handlers/utils/images.go b/pkg/api/handlers/utils/images.go index 3f3f48193..639de9915 100644 --- a/pkg/api/handlers/utils/images.go +++ b/pkg/api/handlers/utils/images.go @@ -6,7 +6,6 @@ import ( "strings" "github.com/containers/common/libimage" - "github.com/containers/common/pkg/filters" "github.com/containers/image/v5/docker" storageTransport "github.com/containers/image/v5/storage" "github.com/containers/image/v5/transports/alltransports" @@ -16,7 +15,6 @@ import ( "github.com/containers/podman/v3/pkg/util" "github.com/containers/storage" "github.com/docker/distribution/reference" - "github.com/gorilla/schema" "github.com/pkg/errors" ) @@ -91,44 +89,6 @@ func ParseStorageReference(name string) (types.ImageReference, error) { return imageRef, nil } -// GetImages is a common function used to get images for libpod and other compatibility -// mechanisms -func GetImages(w http.ResponseWriter, r *http.Request) ([]*libimage.Image, error) { - decoder := r.Context().Value(api.DecoderKey).(*schema.Decoder) - runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) - query := struct { - All bool - Digests bool - Filter string // Docker 1.24 compatibility - }{ - // This is where you can override the golang default value for one of fields - } - - if err := decoder.Decode(&query, r.URL.Query()); err != nil { - return nil, err - } - if _, found := r.URL.Query()["digests"]; found && query.Digests { - UnSupportedParameter("digests") - } - - filterList, err := filters.FiltersFromRequest(r) - if err != nil { - return nil, err - } - if !IsLibpodRequest(r) && len(query.Filter) > 0 { // Docker 1.24 compatibility - filterList = append(filterList, "reference="+query.Filter) - } - - if !query.All { - // Filter intermediate images unless we want to list *all*. - // NOTE: it's a positive filter, so `intermediate=false` means - // to display non-intermediate images. - filterList = append(filterList, "intermediate=false") - } - listOptions := &libimage.ListImagesOptions{Filters: filterList} - return runtime.LibimageRuntime().ListImages(r.Context(), nil, listOptions) -} - func GetImage(r *http.Request, name string) (*libimage.Image, error) { runtime := r.Context().Value(api.RuntimeKey).(*libpod.Runtime) image, _, err := runtime.LibimageRuntime().LookupImage(name, nil) -- cgit v1.2.3-54-g00ecf