File 0002-Add-JSON-version-of-the-machine-list.patch of Package podman.23518

From 8f7d17dc48471f40ecabe082b015c080f7bf07d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= <anders.f.bjorklund@gmail.com>
Date: Wed, 22 Sep 2021 16:30:15 +0200
Subject: [PATCH 02/15] Add JSON version of the machine list
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

[NO NEW TESTS NEEDED]

Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com>
---
 cmd/podman/machine/list.go | 57 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)

diff --git a/cmd/podman/machine/list.go b/cmd/podman/machine/list.go
index fe9d712e3..5c8c6800c 100644
--- a/cmd/podman/machine/list.go
+++ b/cmd/podman/machine/list.go
@@ -3,8 +3,10 @@
 package machine
 
 import (
+	"encoding/json"
 	"os"
 	"sort"
+	"strconv"
 	"time"
 
 	"github.com/containers/common/pkg/completion"
@@ -41,7 +43,9 @@ type listFlagType struct {
 
 type machineReporter struct {
 	Name     string
+	Default  bool
 	Created  string
+	Running  bool
 	LastUp   string
 	VMType   string
 	CPUs     uint64
@@ -57,7 +61,7 @@ func init() {
 
 	flags := lsCmd.Flags()
 	formatFlagName := "format"
-	flags.StringVar(&listFlag.format, formatFlagName, "{{.Name}}\t{{.VMType}}\t{{.Created}}\t{{.LastUp}}\t{{.CPUs}}\t{{.Memory}}\t{{.DiskSize}}\n", "Format volume output using Go template")
+	flags.StringVar(&listFlag.format, formatFlagName, "{{.Name}}\t{{.VMType}}\t{{.Created}}\t{{.LastUp}}\t{{.CPUs}}\t{{.Memory}}\t{{.DiskSize}}\n", "Format volume output using JSON or a Go template")
 	_ = lsCmd.RegisterFlagCompletionFunc(formatFlagName, completion.AutocompleteNone)
 	flags.BoolVar(&listFlag.noHeading, "noheading", false, "Do not print headers")
 }
@@ -78,6 +82,21 @@ func list(cmd *cobra.Command, args []string) error {
 	sort.Slice(listResponse, func(i, j int) bool {
 		return listResponse[i].Running
 	})
+
+	if report.IsJSON(listFlag.format) {
+		machineReporter, err := toMachineFormat(listResponse)
+		if err != nil {
+			return err
+		}
+
+		b, err := json.Marshal(machineReporter)
+		if err != nil {
+			return err
+		}
+		os.Stdout.Write(b)
+		return nil
+	}
+
 	machineReporter, err := toHumanFormat(listResponse)
 	if err != nil {
 		return err
@@ -121,6 +140,42 @@ func outputTemplate(cmd *cobra.Command, responses []*machineReporter) error {
 	return tmpl.Execute(w, responses)
 }
 
+func strTime(t time.Time) string {
+	iso, err := t.MarshalText()
+	if err != nil {
+		return ""
+	}
+	return string(iso)
+}
+
+func strUint(u uint64) string {
+	return strconv.FormatUint(u, 10)
+}
+
+func toMachineFormat(vms []*machine.ListResponse) ([]*machineReporter, error) {
+	cfg, err := config.ReadCustomConfig()
+	if err != nil {
+		return nil, err
+	}
+
+	machineResponses := make([]*machineReporter, 0, len(vms))
+	for _, vm := range vms {
+		response := new(machineReporter)
+		response.Default = vm.Name == cfg.Engine.ActiveService
+		response.Name = vm.Name
+		response.Running = vm.Running
+		response.LastUp = strTime(vm.LastUp)
+		response.Created = strTime(vm.CreatedAt)
+		response.VMType = vm.VMType
+		response.CPUs = vm.CPUs
+		response.Memory = strUint(vm.Memory * units.MiB)
+		response.DiskSize = strUint(vm.DiskSize * units.GiB)
+
+		machineResponses = append(machineResponses, response)
+	}
+	return machineResponses, nil
+}
+
 func toHumanFormat(vms []*machine.ListResponse) ([]*machineReporter, error) {
 	cfg, err := config.ReadCustomConfig()
 	if err != nil {
-- 
2.35.1

openSUSE Build Service is sponsored by