github.com/hanks177/podman/v4@v4.1.3-0.20220613032544-16d90015bc83/pkg/domain/infra/abi/images_list.go (about)

     1  package abi
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/containers/common/libimage"
     7  	"github.com/hanks177/podman/v4/pkg/domain/entities"
     8  	"github.com/pkg/errors"
     9  )
    10  
    11  func (ir *ImageEngine) List(ctx context.Context, opts entities.ImageListOptions) ([]*entities.ImageSummary, error) {
    12  	listImagesOptions := &libimage.ListImagesOptions{
    13  		Filters: opts.Filter,
    14  	}
    15  	if !opts.All {
    16  		// Filter intermediate images unless we want to list *all*.
    17  		// NOTE: it's a positive filter, so `intermediate=false` means
    18  		// to display non-intermediate images.
    19  		listImagesOptions.Filters = append(listImagesOptions.Filters, "intermediate=false")
    20  	}
    21  
    22  	images, err := ir.Libpod.LibimageRuntime().ListImages(ctx, nil, listImagesOptions)
    23  	if err != nil {
    24  		return nil, err
    25  	}
    26  
    27  	summaries := []*entities.ImageSummary{}
    28  	for _, img := range images {
    29  		repoDigests, err := img.RepoDigests()
    30  		if err != nil {
    31  			return nil, errors.Wrapf(err, "getting repoDigests from image %q", img.ID())
    32  		}
    33  		isDangling, err := img.IsDangling(ctx)
    34  		if err != nil {
    35  			return nil, errors.Wrapf(err, "error checking if image %q is dangling", img.ID())
    36  		}
    37  
    38  		e := entities.ImageSummary{
    39  			ID:          img.ID(),
    40  			Created:     img.Created().Unix(),
    41  			Dangling:    isDangling,
    42  			Digest:      string(img.Digest()),
    43  			RepoDigests: repoDigests,
    44  			History:     img.NamesHistory(),
    45  			Names:       img.Names(),
    46  			ReadOnly:    img.IsReadOnly(),
    47  			SharedSize:  0,
    48  			RepoTags:    img.Names(), // may include tags and digests
    49  		}
    50  		e.Labels, err = img.Labels(ctx)
    51  		if err != nil {
    52  			return nil, errors.Wrapf(err, "error retrieving label for image %q: you may need to remove the image to resolve the error", img.ID())
    53  		}
    54  
    55  		ctnrs, err := img.Containers()
    56  		if err != nil {
    57  			return nil, errors.Wrapf(err, "error retrieving containers for image %q: you may need to remove the image to resolve the error", img.ID())
    58  		}
    59  		e.Containers = len(ctnrs)
    60  
    61  		sz, err := img.Size()
    62  		if err != nil {
    63  			return nil, errors.Wrapf(err, "error retrieving size of image %q: you may need to remove the image to resolve the error", img.ID())
    64  		}
    65  		e.Size = sz
    66  		// This is good enough for now, but has to be
    67  		// replaced later with correct calculation logic
    68  		e.VirtualSize = sz
    69  
    70  		parent, err := img.Parent(ctx)
    71  		if err != nil {
    72  			return nil, errors.Wrapf(err, "error retrieving parent of image %q: you may need to remove the image to resolve the error", img.ID())
    73  		}
    74  		if parent != nil {
    75  			e.ParentId = parent.ID()
    76  		}
    77  
    78  		summaries = append(summaries, &e)
    79  	}
    80  	return summaries, nil
    81  }