summaryrefslogtreecommitdiff
path: root/cmd/podman/images.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/podman/images.go')
-rw-r--r--cmd/podman/images.go114
1 files changed, 72 insertions, 42 deletions
diff --git a/cmd/podman/images.go b/cmd/podman/images.go
index 75cdd3465..ed33402ab 100644
--- a/cmd/podman/images.go
+++ b/cmd/podman/images.go
@@ -13,35 +13,36 @@ import (
"github.com/containers/libpod/cmd/podman/cliconfig"
"github.com/containers/libpod/libpod/image"
"github.com/containers/libpod/pkg/adapter"
- "github.com/docker/go-units"
- "github.com/opencontainers/go-digest"
+ units "github.com/docker/go-units"
+ digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
type imagesTemplateParams struct {
- Repository string
- Tag string
- ID string
- Digest digest.Digest
- Digests []digest.Digest
- Created string
- CreatedTime time.Time
- Size string
- ReadOnly bool
- History string
+ Repository string
+ Tag string
+ ID string
+ Digest digest.Digest
+ Digests []digest.Digest
+ CreatedAt time.Time
+ CreatedSince string
+ Size string
+ ReadOnly bool
+ History string
}
type imagesJSONParams struct {
- ID string `json:"id"`
- Name []string `json:"names"`
- Digest digest.Digest `json:"digest"`
- Digests []digest.Digest `json:"digests"`
- Created time.Time `json:"created"`
- Size *uint64 `json:"size"`
- ReadOnly bool `json:"readonly"`
- History []string `json:"history"`
+ ID string `json:"ID"`
+ Name []string `json:"Names"`
+ Created string `json:"Created"`
+ Digest digest.Digest `json:"Digest"`
+ Digests []digest.Digest `json:"Digests"`
+ CreatedAt time.Time `json:"CreatedAt"`
+ Size *uint64 `json:"Size"`
+ ReadOnly bool `json:"ReadOnly"`
+ History []string `json:"History"`
}
type imagesOptions struct {
@@ -65,7 +66,7 @@ func (a imagesSorted) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
type imagesSortedCreated struct{ imagesSorted }
func (a imagesSortedCreated) Less(i, j int) bool {
- return a.imagesSorted[i].CreatedTime.After(a.imagesSorted[j].CreatedTime)
+ return a.imagesSorted[i].CreatedAt.After(a.imagesSorted[j].CreatedAt)
}
type imagesSortedID struct{ imagesSorted }
@@ -155,10 +156,25 @@ func imagesCmd(c *cliconfig.ImagesValues) error {
return errors.New("can not specify an image and a filter")
}
filters := c.Filter
- if len(filters) < 1 {
+ if len(filters) < 1 && len(image) > 0 {
filters = append(filters, fmt.Sprintf("reference=%s", image))
}
+ var sortValues = map[string]bool{
+ "created": true,
+ "id": true,
+ "repository": true,
+ "size": true,
+ "tag": true,
+ }
+ if !sortValues[c.Sort] {
+ keys := make([]string, 0, len(sortValues))
+ for k := range sortValues {
+ keys = append(keys, k)
+ }
+ return errors.Errorf("invalid sort value %q, required values: %s", c.Sort, strings.Join(keys, ", "))
+ }
+
opts := imagesOptions{
quiet: c.Quiet,
noHeading: c.Noheading,
@@ -170,7 +186,17 @@ func imagesCmd(c *cliconfig.ImagesValues) error {
history: c.History,
}
- opts.outputformat = opts.setOutputFormat()
+ outputformat := opts.setOutputFormat()
+ // These fields were renamed, so we need to provide backward compat for
+ // the old names.
+ if strings.Contains(outputformat, "{{.Created}}") {
+ outputformat = strings.Replace(outputformat, "{{.Created}}", "{{.CreatedSince}}", -1)
+ }
+ if strings.Contains(outputformat, "{{.CreatedTime}}") {
+ outputformat = strings.Replace(outputformat, "{{.CreatedTime}}", "{{.CreatedAt}}", -1)
+ }
+ opts.outputformat = outputformat
+
filteredImages, err := runtime.GetFilteredImages(filters, false)
if err != nil {
return errors.Wrapf(err, "unable to get images")
@@ -201,7 +227,7 @@ func (i imagesOptions) setOutputFormat() string {
if i.digests {
format += "{{.Digest}}\t"
}
- format += "{{.ID}}\t{{.Created}}\t{{.Size}}\t"
+ format += "{{.ID}}\t{{.CreatedSince}}\t{{.Size}}\t"
if i.history {
format += "{{if .History}}{{.History}}{{else}}<none>{{end}}\t"
}
@@ -286,16 +312,16 @@ func getImagesTemplateOutput(ctx context.Context, images []*adapter.ContainerIma
imageDigest = img.Digest()
}
params := imagesTemplateParams{
- Repository: repo,
- Tag: tag,
- ID: imageID,
- Digest: imageDigest,
- Digests: img.Digests(),
- CreatedTime: createdTime,
- Created: units.HumanDuration(time.Since(createdTime)) + " ago",
- Size: sizeStr,
- ReadOnly: img.IsReadOnly(),
- History: strings.Join(img.NamesHistory(), ", "),
+ Repository: repo,
+ Tag: tag,
+ ID: imageID,
+ Digest: imageDigest,
+ Digests: img.Digests(),
+ CreatedAt: createdTime,
+ CreatedSince: units.HumanDuration(time.Since(createdTime)) + " ago",
+ Size: sizeStr,
+ ReadOnly: img.IsReadOnly(),
+ History: strings.Join(img.NamesHistory(), ", "),
}
imagesOutput = append(imagesOutput, params)
if opts.quiet { // Show only one image ID when quiet
@@ -319,14 +345,15 @@ func getImagesJSONOutput(ctx context.Context, images []*adapter.ContainerImage)
size = nil
}
params := imagesJSONParams{
- ID: img.ID(),
- Name: img.Names(),
- Digest: img.Digest(),
- Digests: img.Digests(),
- Created: img.Created(),
- Size: size,
- ReadOnly: img.IsReadOnly(),
- History: img.NamesHistory(),
+ ID: img.ID(),
+ Name: img.Names(),
+ Digest: img.Digest(),
+ Digests: img.Digests(),
+ Created: units.HumanDuration(time.Since(img.Created())) + " ago",
+ CreatedAt: img.Created(),
+ Size: size,
+ ReadOnly: img.IsReadOnly(),
+ History: img.NamesHistory(),
}
imagesOutput = append(imagesOutput, params)
}
@@ -369,6 +396,9 @@ func GenImageOutputMap() map[string]string {
values[key] = "R/O"
continue
}
+ if value == "CreatedSince" {
+ value = "created"
+ }
values[key] = strings.ToUpper(splitCamelCase(value))
}
return values