summaryrefslogtreecommitdiff
path: root/pkg/api/handlers/utils/images.go
diff options
context:
space:
mode:
authorValentin Rothberg <rothberg@redhat.com>2021-04-22 08:01:12 +0200
committerValentin Rothberg <rothberg@redhat.com>2021-05-05 11:30:12 +0200
commit0f7d54b0260c1be992ee3b9cee359ef3a9e8bd21 (patch)
tree192e52054de2abf0c92d83ecdbc71d498c2ec947 /pkg/api/handlers/utils/images.go
parent8eefca5a257121b177562742c972e39e1686140d (diff)
downloadpodman-0f7d54b0260c1be992ee3b9cee359ef3a9e8bd21.tar.gz
podman-0f7d54b0260c1be992ee3b9cee359ef3a9e8bd21.tar.bz2
podman-0f7d54b0260c1be992ee3b9cee359ef3a9e8bd21.zip
migrate Podman to containers/common/libimage
Migrate the Podman code base over to `common/libimage` which replaces `libpod/image` and a lot of glue code entirely. Note that I tried to leave bread crumbs for changed tests. Miscellaneous changes: * Some errors yield different messages which required to alter some tests. * I fixed some pre-existing issues in the code. Others were marked as `//TODO`s to prevent the PR from exploding. * The `NamesHistory` of an image is returned as is from the storage. Previously, we did some filtering which I think is undesirable. Instead we should return the data as stored in the storage. * Touched handlers use the ABI interfaces where possible. * Local image resolution: previously Podman would match "foo" on "myfoo". This behaviour has been changed and Podman will now only match on repository boundaries such that "foo" would match "my/foo" but not "myfoo". I consider the old behaviour to be a bug, at the very least an exotic corner case. * Futhermore, "foo:none" does *not* resolve to a local image "foo" without tag anymore. It's a hill I am (almost) willing to die on. * `image prune` prints the IDs of pruned images. Previously, in some cases, the names were printed instead. The API clearly states ID, so we should stick to it. * Compat endpoint image removal with _force_ deletes the entire not only the specified tag. Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
Diffstat (limited to 'pkg/api/handlers/utils/images.go')
-rw-r--r--pkg/api/handlers/utils/images.go62
1 files changed, 21 insertions, 41 deletions
diff --git a/pkg/api/handlers/utils/images.go b/pkg/api/handlers/utils/images.go
index da3c9e985..2662cd368 100644
--- a/pkg/api/handlers/utils/images.go
+++ b/pkg/api/handlers/utils/images.go
@@ -3,15 +3,14 @@ package utils
import (
"fmt"
"net/http"
- "strings"
+ "github.com/containers/common/libimage"
+ "github.com/containers/common/pkg/filters"
"github.com/containers/image/v5/docker"
"github.com/containers/image/v5/storage"
"github.com/containers/image/v5/transports/alltransports"
"github.com/containers/image/v5/types"
"github.com/containers/podman/v3/libpod"
- "github.com/containers/podman/v3/libpod/image"
- "github.com/containers/podman/v3/pkg/util"
"github.com/gorilla/schema"
"github.com/pkg/errors"
)
@@ -54,7 +53,7 @@ func ParseStorageReference(name string) (types.ImageReference, error) {
// GetImages is a common function used to get images for libpod and other compatibility
// mechanisms
-func GetImages(w http.ResponseWriter, r *http.Request) ([]*image.Image, error) {
+func GetImages(w http.ResponseWriter, r *http.Request) ([]*libimage.Image, error) {
decoder := r.Context().Value("decoder").(*schema.Decoder)
runtime := r.Context().Value("runtime").(*libpod.Runtime)
query := struct {
@@ -65,56 +64,37 @@ func GetImages(w http.ResponseWriter, r *http.Request) ([]*image.Image, error) {
// This is where you can override the golang default value for one of fields
}
- filterMap, err := util.PrepareFilters(r)
- if err != nil {
- return nil, err
- }
-
if err := decoder.Decode(&query, r.URL.Query()); err != nil {
return nil, err
}
- var filters = []string{}
if _, found := r.URL.Query()["digests"]; found && query.Digests {
UnSupportedParameter("digests")
}
- var images []*image.Image
- queryFilters := *filterMap
+ filterList, err := filters.FiltersFromRequest(r)
+ if err != nil {
+ return nil, err
+ }
if !IsLibpodRequest(r) && len(query.Filter) > 0 { // Docker 1.24 compatibility
- if queryFilters == nil {
- queryFilters = make(map[string][]string)
- }
- queryFilters["reference"] = append(queryFilters["reference"], query.Filter)
+ filterList = append(filterList, "reference="+query.Filter)
}
- if len(queryFilters) > 0 {
- for k, v := range queryFilters {
- filters = append(filters, fmt.Sprintf("%s=%s", k, strings.Join(v, "=")))
- }
- images, err = runtime.ImageRuntime().GetImagesWithFilters(filters)
- if err != nil {
- return images, err
- }
- } else {
- images, err = runtime.ImageRuntime().GetImages()
- if err != nil {
- return images, err
- }
- }
- if query.All {
- return images, nil
+ 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)
+}
- filter, err := runtime.ImageRuntime().IntermediateFilter(r.Context(), images)
+func GetImage(r *http.Request, name string) (*libimage.Image, error) {
+ runtime := r.Context().Value("runtime").(*libpod.Runtime)
+ lookupOptions := &libimage.LookupImageOptions{IgnorePlatform: true}
+ image, _, err := runtime.LibimageRuntime().LookupImage(name, lookupOptions)
if err != nil {
return nil, err
}
- images = image.FilterImages(images, []image.ResultFilter{filter})
-
- return images, nil
-}
-
-func GetImage(r *http.Request, name string) (*image.Image, error) {
- runtime := r.Context().Value("runtime").(*libpod.Runtime)
- return runtime.ImageRuntime().NewFromLocal(name)
+ return image, err
}