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

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) ===
Output detailed container, state and snapshot info in JSON format.

Fixes #882.
From cef37715ad4bdc6e0a7974509eb1d38b0aa3edbd Mon Sep 17 00:00:00 2001
From: Casey Marshall <casey.marsh...@canonical.com>
Date: Fri, 8 Apr 2016 16:22:37 -0500
Subject: [PATCH] Add json format option.

Output detailed container, state and snapshot info in JSON format.

Fixes #882.
---
 lxc/list.go | 69 ++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 50 insertions(+), 19 deletions(-)

diff --git a/lxc/list.go b/lxc/list.go
index 902f177..e0cfd6c 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -1,6 +1,7 @@
 package main
 
 import (
+       "encoding/json"
        "fmt"
        "os"
        "regexp"
@@ -47,9 +48,15 @@ func (a byName) Less(i, j int) bool {
        return a[i][0] < a[j][0]
 }
 
+const (
+       listFormatTable = "table"
+       listFormatJSON  = "json"
+)
+
 type listCmd struct {
        chosenColumnRunes string
        fast              bool
+       format            string
 }
 
 func (c *listCmd) showByDefault() bool {
@@ -60,7 +67,7 @@ func (c *listCmd) usage() string {
        return i18n.G(
                `Lists the available resources.
 
-lxc list [resource] [filters] [-c columns] [--fast]
+lxc list [resource] [filters] [--format table|json] [-c columns] [--fast]
 
 The filters are:
 * A single keyword like "web" which will list any container with "web" in its 
name.
@@ -70,7 +77,7 @@ The filters are:
 * "security.privileged=1" will list all privileged containers
 * "s.privileged=1" will do the same
 
-The columns are:
+Columns for table format are:
 * 4 - IPv4 address
 * 6 - IPv6 address
 * a - architecture
@@ -89,6 +96,7 @@ Fast column layout: nsacPt`)
 func (c *listCmd) flags() {
        gnuflag.StringVar(&c.chosenColumnRunes, "c", "ns46tS", 
i18n.G("Columns"))
        gnuflag.StringVar(&c.chosenColumnRunes, "columns", "ns46tS", 
i18n.G("Columns"))
+       gnuflag.StringVar(&c.format, "format", "table", i18n.G("Format"))
        gnuflag.BoolVar(&c.fast, "fast", false, i18n.G("Fast mode (same as 
--columns=nsacPt"))
 }
 
@@ -263,31 +271,54 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos 
[]shared.ContainerInfo, f
        cStatesWg.Wait()
        cSnapshotsWg.Wait()
 
-       data := [][]string{}
-       for _, cInfo := range cinfos {
-               if !c.shouldShow(filters, &cInfo) {
-                       continue
+       switch c.format {
+       case listFormatTable:
+               data := [][]string{}
+               for _, cInfo := range cinfos {
+                       if !c.shouldShow(filters, &cInfo) {
+                               continue
+                       }
+
+                       col := []string{}
+                       for _, column := range columns {
+                               col = append(col, column.Data(cInfo, 
cStates[cInfo.Name], cSnapshots[cInfo.Name]))
+                       }
+                       data = append(data, col)
                }
 
-               col := []string{}
-               for _, column := range columns {
-                       col = append(col, column.Data(cInfo, 
cStates[cInfo.Name], cSnapshots[cInfo.Name]))
+               table := tablewriter.NewWriter(os.Stdout)
+               table.SetAutoWrapText(false)
+               table.SetAlignment(tablewriter.ALIGN_LEFT)
+               table.SetRowLine(true)
+               table.SetHeader(headers)
+               sort.Sort(byName(data))
+               table.AppendBulk(data)
+               table.Render()
+       case listFormatJSON:
+               data := make([]listContainerItem, len(cinfos))
+               for i := range cinfos {
+                       data[i].ContainerInfo = &cinfos[i]
+                       data[i].State = cStates[cinfos[i].Name]
+                       data[i].Snapshots = cSnapshots[cinfos[i].Name]
+               }
+               enc := json.NewEncoder(os.Stdout)
+               err := enc.Encode(data)
+               if err != nil {
+                       return err
                }
-               data = append(data, col)
+       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(headers)
-       sort.Sort(byName(data))
-       table.AppendBulk(data)
-       table.Render()
-
        return nil
 }
 
+type listContainerItem struct {
+       *shared.ContainerInfo
+       State     *shared.ContainerState `json:"state"`
+       Snapshots []shared.SnapshotInfo  `json:"snapshots"`
+}
+
 func (c *listCmd) run(config *lxd.Config, args []string) error {
        var remote string
        name := ""
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to