mirror of https://github.com/containers/podman.git
Added --sort flag to podman image
Signed-off-by: haircommander <pehunt@redhat.com> Closes: #937 Approved by: rhatdan
This commit is contained in:
parent
65033b586f
commit
b868470238
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -14,7 +15,6 @@ import (
|
||||||
"github.com/projectatomic/libpod/libpod"
|
"github.com/projectatomic/libpod/libpod"
|
||||||
"github.com/projectatomic/libpod/libpod/image"
|
"github.com/projectatomic/libpod/libpod/image"
|
||||||
"github.com/urfave/cli"
|
"github.com/urfave/cli"
|
||||||
"sort"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type imagesTemplateParams struct {
|
type imagesTemplateParams struct {
|
||||||
|
@ -42,14 +42,42 @@ type imagesOptions struct {
|
||||||
digests bool
|
digests bool
|
||||||
format string
|
format string
|
||||||
outputformat string
|
outputformat string
|
||||||
|
sort string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type declaration and functions for sorting the PS output by time
|
// Type declaration and functions for sorting the images output
|
||||||
type imagesSorted []imagesTemplateParams
|
type imagesSorted []imagesTemplateParams
|
||||||
|
|
||||||
func (a imagesSorted) Len() int { return len(a) }
|
func (a imagesSorted) Len() int { return len(a) }
|
||||||
func (a imagesSorted) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
func (a imagesSorted) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
||||||
func (a imagesSorted) Less(i, j int) bool { return a[i].CreatedTime.After(a[j].CreatedTime) }
|
|
||||||
|
type imagesSortedTime struct{ imagesSorted }
|
||||||
|
|
||||||
|
func (a imagesSortedTime) Less(i, j int) bool {
|
||||||
|
return a.imagesSorted[i].CreatedTime.After(a.imagesSorted[j].CreatedTime)
|
||||||
|
}
|
||||||
|
|
||||||
|
type imagesSortedID struct{ imagesSorted }
|
||||||
|
|
||||||
|
func (a imagesSortedID) Less(i, j int) bool { return a.imagesSorted[i].ID < a.imagesSorted[j].ID }
|
||||||
|
|
||||||
|
type imagesSortedTag struct{ imagesSorted }
|
||||||
|
|
||||||
|
func (a imagesSortedTag) Less(i, j int) bool { return a.imagesSorted[i].Tag < a.imagesSorted[j].Tag }
|
||||||
|
|
||||||
|
type imagesSortedRepository struct{ imagesSorted }
|
||||||
|
|
||||||
|
func (a imagesSortedRepository) Less(i, j int) bool {
|
||||||
|
return a.imagesSorted[i].Repository < a.imagesSorted[j].Repository
|
||||||
|
}
|
||||||
|
|
||||||
|
type imagesSortedSize struct{ imagesSorted }
|
||||||
|
|
||||||
|
func (a imagesSortedSize) Less(i, j int) bool {
|
||||||
|
size1, _ := units.FromHumanSize(a.imagesSorted[i].Size)
|
||||||
|
size2, _ := units.FromHumanSize(a.imagesSorted[j].Size)
|
||||||
|
return size1 < size2
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
imagesFlags = []cli.Flag{
|
imagesFlags = []cli.Flag{
|
||||||
|
@ -81,6 +109,11 @@ var (
|
||||||
Name: "quiet, q",
|
Name: "quiet, q",
|
||||||
Usage: "display only image IDs",
|
Usage: "display only image IDs",
|
||||||
},
|
},
|
||||||
|
cli.StringFlag{
|
||||||
|
Name: "sort",
|
||||||
|
Usage: "Sort by size, time, id, repository or tag",
|
||||||
|
Value: "time",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
imagesDescription = "lists locally stored images."
|
imagesDescription = "lists locally stored images."
|
||||||
|
@ -144,6 +177,7 @@ func imagesCmd(c *cli.Context) error {
|
||||||
noTrunc: c.Bool("no-trunc"),
|
noTrunc: c.Bool("no-trunc"),
|
||||||
digests: c.Bool("digests"),
|
digests: c.Bool("digests"),
|
||||||
format: c.String("format"),
|
format: c.String("format"),
|
||||||
|
sort: c.String("sort"),
|
||||||
}
|
}
|
||||||
|
|
||||||
opts.outputformat = opts.setOutputFormat()
|
opts.outputformat = opts.setOutputFormat()
|
||||||
|
@ -204,6 +238,23 @@ func imagesToGeneric(templParams []imagesTemplateParams, JSONParams []imagesJSON
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sortImagesOutput(sortBy string, imagesOutput imagesSorted) imagesSorted {
|
||||||
|
switch sortBy {
|
||||||
|
case "id":
|
||||||
|
sort.Sort(imagesSortedID{imagesOutput})
|
||||||
|
case "size":
|
||||||
|
sort.Sort(imagesSortedSize{imagesOutput})
|
||||||
|
case "tag":
|
||||||
|
sort.Sort(imagesSortedTag{imagesOutput})
|
||||||
|
case "repository":
|
||||||
|
sort.Sort(imagesSortedRepository{imagesOutput})
|
||||||
|
default:
|
||||||
|
// default is time
|
||||||
|
sort.Sort(imagesSortedTime{imagesOutput})
|
||||||
|
}
|
||||||
|
return imagesOutput
|
||||||
|
}
|
||||||
|
|
||||||
// getImagesTemplateOutput returns the images information to be printed in human readable format
|
// getImagesTemplateOutput returns the images information to be printed in human readable format
|
||||||
func getImagesTemplateOutput(ctx context.Context, runtime *libpod.Runtime, images []*image.Image, opts imagesOptions) (imagesOutput imagesSorted) {
|
func getImagesTemplateOutput(ctx context.Context, runtime *libpod.Runtime, images []*image.Image, opts imagesOptions) (imagesOutput imagesSorted) {
|
||||||
for _, img := range images {
|
for _, img := range images {
|
||||||
|
@ -235,7 +286,7 @@ func getImagesTemplateOutput(ctx context.Context, runtime *libpod.Runtime, image
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort images by created time
|
// Sort images by created time
|
||||||
sort.Sort(imagesSorted(imagesOutput))
|
sortImagesOutput(opts.sort, imagesOutput)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1143,6 +1143,7 @@ _podman_images() {
|
||||||
"
|
"
|
||||||
local options_with_args="
|
local options_with_args="
|
||||||
--format
|
--format
|
||||||
|
--sort
|
||||||
"
|
"
|
||||||
|
|
||||||
local all_options="$options_with_args $boolean_options"
|
local all_options="$options_with_args $boolean_options"
|
||||||
|
|
|
@ -40,6 +40,9 @@ Do not truncate output.
|
||||||
|
|
||||||
Lists only the image IDs.
|
Lists only the image IDs.
|
||||||
|
|
||||||
|
**--sort**
|
||||||
|
|
||||||
|
Sort by id, repository, size, tag or time (default: time)
|
||||||
|
|
||||||
## EXAMPLE
|
## EXAMPLE
|
||||||
|
|
||||||
|
@ -120,6 +123,16 @@ REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
# podman images --sort repository
|
||||||
|
REPOSITORY TAG IMAGE ID CREATED SIZE
|
||||||
|
<none> <none> 2460217d76fc About a minute ago 4.41MB
|
||||||
|
docker.io/library/alpine latest 3fd9065eaf02 5 months ago 4.41MB
|
||||||
|
localhost/myapp latest b2e0ad03474a About a minute ago 4.41MB
|
||||||
|
registry.access.redhat.com/rhel7 latest 7a840db7f020 2 weeks ago 211MB
|
||||||
|
registry.fedoraproject.org/fedora 27 801894bc0e43 6 weeks ago 246MB
|
||||||
|
```
|
||||||
|
|
||||||
## SEE ALSO
|
## SEE ALSO
|
||||||
podman(1)
|
podman(1)
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
package integration
|
package integration
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/docker/go-units"
|
||||||
. "github.com/onsi/ginkgo"
|
. "github.com/onsi/ginkgo"
|
||||||
. "github.com/onsi/gomega"
|
. "github.com/onsi/gomega"
|
||||||
)
|
)
|
||||||
|
@ -28,7 +30,6 @@ var _ = Describe("Podman images", func() {
|
||||||
podmanTest.Cleanup()
|
podmanTest.Cleanup()
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
It("podman images", func() {
|
It("podman images", func() {
|
||||||
session := podmanTest.Podman([]string{"images"})
|
session := podmanTest.Podman([]string{"images"})
|
||||||
session.WaitWithDefaultTimeout()
|
session.WaitWithDefaultTimeout()
|
||||||
|
@ -143,4 +144,25 @@ var _ = Describe("Podman images", func() {
|
||||||
Expect(result.ExitCode()).To(Equal(0))
|
Expect(result.ExitCode()).To(Equal(0))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman images sort by tag", func() {
|
||||||
|
session := podmanTest.Podman([]string{"images", "--sort", "tag", "--format={{.Tag}}"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
sortedArr := session.OutputToStringArray()
|
||||||
|
Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool { return sortedArr[i] < sortedArr[j] })).To(BeTrue())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("podman images sort by size", func() {
|
||||||
|
session := podmanTest.Podman([]string{"images", "--sort", "size", "--format={{.Size}}"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session.ExitCode()).To(Equal(0))
|
||||||
|
|
||||||
|
sortedArr := session.OutputToStringArray()
|
||||||
|
Expect(sort.SliceIsSorted(sortedArr, func(i, j int) bool {
|
||||||
|
size1, _ := units.FromHumanSize(sortedArr[i])
|
||||||
|
size2, _ := units.FromHumanSize(sortedArr[j])
|
||||||
|
return size1 < size2
|
||||||
|
})).To(BeTrue())
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue