The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/2031

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Adds the --format option to the `lxc image list` command. Possible options are table and json.

Image list filters still work regardless of output format.

--format table example:
```
$ lxc image list images: 'description=.*yakkety.*s390x.*' --format table
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|             ALIAS             | FINGERPRINT  | PUBLIC | DESCRIPTION               | ARCH  |  SIZE   |         UPLOAD DATE |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
| ubuntu/yakkety/s390x (1 more) | 03a93a03d6bb | yes    | Ubuntu yakkety (s390x) (20160517_03:49) | s390x | 73.19MB | May 17, 2016 at 4:26am (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|                               | 42f6c2bb9348 | yes    | Ubuntu yakkety (s390x) (20160515_03:49) | s390x | 73.09MB | May 15, 2016 at 5:20am (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|                               | a6539f9ece07 | yes    | Ubuntu yakkety (s390x) (20160515_09:20) | s390x | 73.19MB | May 16, 2016 at 6:22pm (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
```

--format json example:
```
$ lxc image list images: 'description=.*yakkety.*s390x.*' --format json
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{},{}]
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_09:20.tar.xz","fingerprint":"a6539f9ece0734574e6ffdaf81e421975fbeb32ac2637b16fe2cbc5648c909fd","properties":{"architecture":"s390x","build":"20160515_09:20","description":"Ubuntu
yakkety (s390x)
(20160515_09:20)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76743878,"auto_update":false,"created_at":"2016-05-16T18:22:41Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-16T18:22:41Z"},{}]
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_09:20.tar.xz","fingerprint":"a6539f9ece0734574e6ffdaf81e421975fbeb32ac2637b16fe2cbc5648c909fd","properties":{"architecture":"s390x","build":"20160515_09:20","description":"Ubuntu
yakkety (s390x)
(20160515_09:20)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76743878,"auto_update":false,"created_at":"2016-05-16T18:22:41Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-16T18:22:41Z"},{"aliases":[{"name":"ubuntu/yakkety/s390x/default","description":"Ubuntu
yakkety (s390x)
(default)"},{"name":"ubuntu/yakkety/s390x","description":"Ubuntu yakkety
(s390x)"}],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160517_03:49.tar.xz","fingerprint":"03a93a03d6bb370a129518c0fd53aa6b199342d8ef40c643c43710972334c4df","properties":{"architecture":"s390x","build":"20160517_03:49","description":"Ubuntu
yakkety (s390x)
(20160517_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76740678,"auto_update":false,"created_at":"2016-05-17T04:26:27Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-17T04:26:27Z"}]
```

Closes https://github.com/lxc/lxd/issues/1951

Signed-off-by: Rene Fragoso <ctrl...@gmail.com>
From 39751b85e083f3fa629e9be23f02d3e8b8097f1e Mon Sep 17 00:00:00 2001
From: Rene Fragoso <ctrl...@gmail.com>
Date: Tue, 17 May 2016 14:23:17 -0400
Subject: [PATCH] Add --format and json output for image list command

Adds the --format option to the `lxc image list` command. Possible options are
table and json.

Image list filters still work regardless of output format.

--format table example:
```
$ lxc image list images: 'description=.*yakkety.*s390x.*' --format table
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|             ALIAS             | FINGERPRINT  | PUBLIC | DESCRIPTION           
    | ARCH  |  SIZE   |         UPLOAD DATE |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
| ubuntu/yakkety/s390x (1 more) | 03a93a03d6bb | yes    | Ubuntu yakkety 
(s390x) (20160517_03:49) | s390x | 73.19MB | May 17, 2016 at 4:26am (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|                               | 42f6c2bb9348 | yes    | Ubuntu yakkety 
(s390x) (20160515_03:49) | s390x | 73.09MB | May 15, 2016 at 5:20am (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
|                               | a6539f9ece07 | yes    | Ubuntu yakkety 
(s390x) (20160515_09:20) | s390x | 73.19MB | May 16, 2016 at 6:22pm (UTC) |
+-------------------------------+--------------+--------+-----------------------------------------+-------+---------+------------------------------+
```

--format json example:
```
$ lxc image list images: 'description=.*yakkety.*s390x.*' --format json
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{},{}]
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_09:20.tar.xz","fingerprint":"a6539f9ece0734574e6ffdaf81e421975fbeb32ac2637b16fe2cbc5648c909fd","properties":{"architecture":"s390x","build":"20160515_09:20","description":"Ubuntu
yakkety (s390x)
(20160515_09:20)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76743878,"auto_update":false,"created_at":"2016-05-16T18:22:41Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-16T18:22:41Z"},{}]
[{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_03:49.tar.xz","fingerprint":"42f6c2bb9348e27a8a048ce9657574cc524473bfa801902f4461da1ca1a456ba","properties":{"architecture":"s390x","build":"20160515_03:49","description":"Ubuntu
yakkety (s390x)
(20160515_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76642122,"auto_update":false,"created_at":"2016-05-15T05:20:21Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-15T05:20:21Z"},{"aliases":[],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160515_09:20.tar.xz","fingerprint":"a6539f9ece0734574e6ffdaf81e421975fbeb32ac2637b16fe2cbc5648c909fd","properties":{"architecture":"s390x","build":"20160515_09:20","description":"Ubuntu
yakkety (s390x)
(20160515_09:20)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76743878,"auto_update":false,"created_at":"2016-05-16T18:22:41Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-16T18:22:41Z"},{"aliases":[{"name":"ubuntu/yakkety/s390x/default","description":"Ubuntu
yakkety (s390x)
(default)"},{"name":"ubuntu/yakkety/s390x","description":"Ubuntu yakkety
(s390x)"}],"architecture":"s390x","cached":false,"filename":"ubuntu-yakkety-s390x-default-20160517_03:49.tar.xz","fingerprint":"03a93a03d6bb370a129518c0fd53aa6b199342d8ef40c643c43710972334c4df","properties":{"architecture":"s390x","build":"20160517_03:49","description":"Ubuntu
yakkety (s390x)
(20160517_03:49)","distribution":"ubuntu","release":"yakkety"},"public":true,"size":76740678,"auto_update":false,"created_at":"2016-05-17T04:26:27Z","expires_at":"1970-01-01T00:00:00Z","last_used_at":"0001-01-01T00:00:00Z","uploaded_at":"2016-05-17T04:26:27Z"}]
```

Closes https://github.com/lxc/lxd/issues/1951

Signed-off-by: Rene Fragoso <ctrl...@gmail.com>
---
 lxc/image.go | 100 ++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 64 insertions(+), 36 deletions(-)

diff --git a/lxc/image.go b/lxc/image.go
index 752b9c6..fad808e 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "encoding/json"
        "fmt"
        "io/ioutil"
        "os"
@@ -73,6 +74,7 @@ type imageCmd struct {
        publicImage bool
        copyAliases bool
        autoUpdate  bool
+       format      string
 }
 
 func (c *imageCmd) showByDefault() bool {
@@ -126,7 +128,7 @@ lxc image export [remote:]<image>
 lxc image info [remote:]<image>
     Print everything LXD knows about a given image.
 
-lxc image list [remote:] [filter]
+lxc image list [remote:] [filter] [--format table|json]
     List images in the LXD image store. Filters may be of the
     <key>=<value> form for property based filtering, or part of the image
     hash or part of the image alias name.
@@ -155,6 +157,7 @@ func (c *imageCmd) flags() {
        gnuflag.BoolVar(&c.copyAliases, "copy-aliases", false, i18n.G("Copy 
aliases from source"))
        gnuflag.BoolVar(&c.autoUpdate, "auto-update", false, i18n.G("Keep the 
image up to date after initial copy"))
        gnuflag.Var(&c.addAliases, "alias", i18n.G("New alias to define at 
target"))
+       gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format"))
 }
 
 func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
@@ -446,11 +449,20 @@ func (c *imageCmd) run(config *lxd.Config, args []string) 
error {
                        return err
                }
 
-               images, err := d.ListImages()
+               var images []shared.ImageInfo
+               allImages, err := d.ListImages()
                if err != nil {
                        return err
                }
 
+               for _, image := range allImages {
+                       if !c.imageShouldShow(filters, &image) {
+                               continue
+                       }
+
+                       images = append(images, image)
+               }
+
                return c.showImages(images, filters)
 
        case "edit":
@@ -572,46 +584,62 @@ func (c *imageCmd) findDescription(props 
map[string]string) string {
 }
 
 func (c *imageCmd) showImages(images []shared.ImageInfo, filters []string) 
error {
-       data := [][]string{}
-       for _, image := range images {
-               if !c.imageShouldShow(filters, &image) {
-                       continue
-               }
+       switch c.format {
+       case listFormatTable:
+               data := [][]string{}
+               for _, image := range images {
+                       if !c.imageShouldShow(filters, &image) {
+                               continue
+                       }
 
-               shortest := c.shortestAlias(image.Aliases)
-               if len(image.Aliases) > 1 {
-                       shortest = fmt.Sprintf(i18n.G("%s (%d more)"), 
shortest, len(image.Aliases)-1)
-               }
-               fp := image.Fingerprint[0:12]
-               public := i18n.G("no")
-               description := c.findDescription(image.Properties)
+                       shortest := c.shortestAlias(image.Aliases)
+                       if len(image.Aliases) > 1 {
+                               shortest = fmt.Sprintf(i18n.G("%s (%d more)"), 
shortest, len(image.Aliases)-1)
+                       }
+                       fp := image.Fingerprint[0:12]
+                       public := i18n.G("no")
+                       description := c.findDescription(image.Properties)
 
-               if image.Public {
-                       public = i18n.G("yes")
+                       if image.Public {
+                               public = i18n.G("yes")
+                       }
+
+                       const layout = "Jan 2, 2006 at 3:04pm (MST)"
+                       uploaded := image.UploadDate.UTC().Format(layout)
+                       size := fmt.Sprintf("%.2fMB", 
float64(image.Size)/1024.0/1024.0)
+                       data = append(data, []string{shortest, fp, public, 
description, image.Architecture, size, uploaded})
+               }
+
+               table := tablewriter.NewWriter(os.Stdout)
+               table.SetAutoWrapText(false)
+               table.SetAlignment(tablewriter.ALIGN_LEFT)
+               table.SetRowLine(true)
+               table.SetHeader([]string{
+                       i18n.G("ALIAS"),
+                       i18n.G("FINGERPRINT"),
+                       i18n.G("PUBLIC"),
+                       i18n.G("DESCRIPTION"),
+                       i18n.G("ARCH"),
+                       i18n.G("SIZE"),
+                       i18n.G("UPLOAD DATE")})
+               sort.Sort(SortImage(data))
+               table.AppendBulk(data)
+               table.Render()
+       case listFormatJSON:
+               data := make([]*shared.ImageInfo, len(images))
+               for i := range images {
+                       data[i] = &images[i]
+                       enc := json.NewEncoder(os.Stdout)
+                       err := enc.Encode(data)
+                       if err != nil {
+                               return err
+                       }
                }
 
-               const layout = "Jan 2, 2006 at 3:04pm (MST)"
-               uploaded := image.UploadDate.UTC().Format(layout)
-               size := fmt.Sprintf("%.2fMB", float64(image.Size)/1024.0/1024.0)
-               data = append(data, []string{shortest, fp, public, description, 
image.Architecture, size, uploaded})
+       default:
+               return fmt.Errorf("invalid format %q", c.format)
        }
 
-       table := tablewriter.NewWriter(os.Stdout)
-       table.SetAutoWrapText(false)
-       table.SetAlignment(tablewriter.ALIGN_LEFT)
-       table.SetRowLine(true)
-       table.SetHeader([]string{
-               i18n.G("ALIAS"),
-               i18n.G("FINGERPRINT"),
-               i18n.G("PUBLIC"),
-               i18n.G("DESCRIPTION"),
-               i18n.G("ARCH"),
-               i18n.G("SIZE"),
-               i18n.G("UPLOAD DATE")})
-       sort.Sort(SortImage(data))
-       table.AppendBulk(data)
-       table.Render()
-
        return nil
 }
 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to