diff --git a/src/cmd/list.go b/src/cmd/list.go index 39eafc9..97ad4ab 100644 --- a/src/cmd/list.go +++ b/src/cmd/list.go @@ -30,13 +30,6 @@ import ( "golang.org/x/term" ) -type toolboxImage struct { - ID string - Names []string - Created string - Labels map[string]string -} - type toolboxContainer struct { ID string Names []string @@ -107,7 +100,7 @@ func list(cmd *cobra.Command, args []string) error { lsImages = false } - var images []toolboxImage + var images []podman.Image var containers []toolboxContainer var err error @@ -187,22 +180,16 @@ func listHelp(cmd *cobra.Command, args []string) { } } -func getImages() ([]toolboxImage, error) { +func getImages() ([]podman.Image, error) { logrus.Debug("Fetching all images") args := []string{"--sort", "repository"} - data, err := podman.GetImagesJSON(args...) + images, err := podman.GetImages(args...) if err != nil { logrus.Debugf("Fetching all images failed: %s", err) return nil, errors.New("failed to get images") } - var images []toolboxImage - if err := json.Unmarshal(data, &images); err != nil { - logrus.Debugf("Fetching all images failed: %s", err) - return nil, errors.New("failed to get images") - } - - var toolboxImages []toolboxImage + var toolboxImages []podman.Image for _, image := range images { for label := range toolboxLabels { @@ -216,7 +203,7 @@ func getImages() ([]toolboxImage, error) { return toolboxImages, nil } -func listOutput(images []toolboxImage, containers []toolboxContainer) { +func listOutput(images []podman.Image, containers []toolboxContainer) { if len(images) != 0 { writer := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) fmt.Fprintf(writer, "%s\t%s\t%s\n", "IMAGE ID", "IMAGE NAME", "CREATED") @@ -302,35 +289,6 @@ func listOutput(images []toolboxImage, containers []toolboxContainer) { } } -func (image *toolboxImage) UnmarshalJSON(data []byte) error { - var raw struct { - ID string - Names []string - Created interface{} - Labels map[string]string - } - - if err := json.Unmarshal(data, &raw); err != nil { - return err - } - - image.ID = raw.ID - image.Names = raw.Names - - // Until Podman 2.0.x the field 'Created' held a human-readable string in - // format "5 minutes ago". Since Podman 2.1 the field holds an integer with - // Unix time. Go interprets numbers in JSON as float64. - switch value := raw.Created.(type) { - case string: - image.Created = value - case float64: - image.Created = utils.HumanDuration(int64(value)) - } - - image.Labels = raw.Labels - return nil -} - func (c *toolboxContainer) UnmarshalJSON(data []byte) error { var raw struct { ID string diff --git a/src/pkg/podman/podman.go b/src/pkg/podman/podman.go index 049d4b7..0ffd446 100644 --- a/src/pkg/podman/podman.go +++ b/src/pkg/podman/podman.go @@ -24,9 +24,17 @@ import ( "github.com/HarryMichal/go-version" "github.com/containers/toolbox/pkg/shell" + "github.com/containers/toolbox/pkg/utils" "github.com/sirupsen/logrus" ) +type Image struct { + ID string + Names []string + Created string + Labels map[string]string +} + var ( podmanVersion string ) @@ -35,6 +43,35 @@ var ( LogLevel = logrus.ErrorLevel ) +func (image *Image) UnmarshalJSON(data []byte) error { + var raw struct { + ID string + Names []string + Created interface{} + Labels map[string]string + } + + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + + image.ID = raw.ID + image.Names = raw.Names + + // Until Podman 2.0.x the field 'Created' held a human-readable string in + // format "5 minutes ago". Since Podman 2.1 the field holds an integer with + // Unix time. Go interprets numbers in JSON as float64. + switch value := raw.Created.(type) { + case string: + image.Created = value + case float64: + image.Created = utils.HumanDuration(int64(value)) + } + + image.Labels = raw.Labels + return nil +} + // CheckVersion compares provided version with the version of Podman. // // Takes in one string parameter that should be in the format that is used for versioning (eg. 1.0.0, 2.5.1-dev). @@ -95,14 +132,14 @@ func GetContainers(args ...string) ([]map[string]interface{}, error) { return containers, nil } -// GetImagesJSON is a wrapper function around `podman images --format json` command. +// GetImages is a wrapper function around `podman images --format json` command. // // Parameter args accepts an array of strings to be passed to the wrapped command (eg. ["-a", "--filter", "123"]). // -// Returned value is the JSON representing the images. +// Returned value is a slice of Images. // // If a problem happens during execution, first argument is nil and second argument holds the error message. -func GetImagesJSON(args ...string) ([]byte, error) { +func GetImages(args ...string) ([]Image, error) { var stdout bytes.Buffer logLevelString := LogLevel.String() @@ -112,7 +149,12 @@ func GetImagesJSON(args ...string) ([]byte, error) { } data := stdout.Bytes() - return data, nil + var images []Image + if err := json.Unmarshal(data, &images); err != nil { + return nil, err + } + + return images, nil } // GetVersion returns version of Podman in a string