mirror of
https://github.com/containers/podman.git
synced 2026-03-13 08:01:19 +08:00
Merge pull request #12572 from rhatdan/image
Remove two GetImages functions from API
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -840,7 +840,7 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {
|
||||
// $ref: "#/responses/LibpodImageSummaryResponse"
|
||||
// 500:
|
||||
// $ref: '#/responses/InternalError'
|
||||
r.Handle(VersionedPath("/libpod/images/json"), s.APIHandler(libpod.GetImages)).Methods(http.MethodGet)
|
||||
r.Handle(VersionedPath("/libpod/images/json"), s.APIHandler(compat.GetImages)).Methods(http.MethodGet)
|
||||
// swagger:operation POST /libpod/images/load libpod ImageLoadLibpod
|
||||
// ---
|
||||
// tags:
|
||||
|
||||
@@ -26,9 +26,9 @@ func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions)
|
||||
|
||||
summaries := []*entities.ImageSummary{}
|
||||
for _, img := range images {
|
||||
digests := make([]string, len(img.Digests()))
|
||||
for j, d := range img.Digests() {
|
||||
digests[j] = string(d)
|
||||
repoDigests, err := img.RepoDigests()
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "getting repoDigests from image %q", img.ID())
|
||||
}
|
||||
isDangling, err := img.IsDangling(ctx)
|
||||
if err != nil {
|
||||
@@ -37,11 +37,12 @@ func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions)
|
||||
|
||||
e := entities.ImageSummary{
|
||||
ID: img.ID(),
|
||||
// ConfigDigest: string(img.ConfigDigest),
|
||||
// TODO: libpod/image didn't set it but libimage should
|
||||
// ConfigDigest: string(img.ConfigDigest),
|
||||
Created: img.Created().Unix(),
|
||||
Dangling: isDangling,
|
||||
Digest: string(img.Digest()),
|
||||
RepoDigests: digests,
|
||||
RepoDigests: repoDigests,
|
||||
History: img.NamesHistory(),
|
||||
Names: img.Names(),
|
||||
ReadOnly: img.IsReadOnly(),
|
||||
|
||||
Reference in New Issue
Block a user