Skip to content

Commit 0ff7a1b

Browse files
authored
Add JSON output option to all hcloud list commands (#225)
1 parent 5fa7cdb commit 0ff7a1b

12 files changed

+325
-14
lines changed

.goreleaser.yml

+2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,10 @@ signs:
5252
- gon.hcl
5353
artifacts: all
5454
signature: "hcloud-macos-amd64.zip"
55+
id: hcloud-macos-sign
5556
- artifacts: all
5657
signature: "${artifact}.sig"
58+
id: hcloud-sign
5759
ids:
5860
- hcloud-build
5961
args: ["--batch", "-u", "[email protected]", "--pinentry-mode", "loopback", "--output", "${signature}", "--detach-sign", "${artifact}"]

cli/datacenter_list.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"github.com/hetznercloud/hcloud-go/hcloud"
5+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
56
"github.com/spf13/cobra"
67
)
78

@@ -29,14 +30,23 @@ func newDatacenterListCommand(cli *CLI) *cobra.Command {
2930
PreRunE: cli.ensureToken,
3031
RunE: cli.wrap(runDatacenterList),
3132
}
32-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(datacenterListTableOutput.Columns()))
33+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(datacenterListTableOutput.Columns()), outputOptionJSON())
3334
return cmd
3435
}
3536

3637
func runDatacenterList(cli *CLI, cmd *cobra.Command, args []string) error {
3738
outOpts := outputFlagsForCommand(cmd)
3839

3940
datacenters, err := cli.Client().Datacenter.All(cli.Context)
41+
42+
if outOpts.IsSet("json") {
43+
var datacenterSchemas []schema.Datacenter
44+
for _, datacenter := range datacenters {
45+
datacenterSchemas = append(datacenterSchemas, datacenterToSchema(*datacenter))
46+
}
47+
return describeJSON(datacenterSchemas)
48+
}
49+
4050
if err != nil {
4151
return err
4252
}

cli/floatingip_list.go

+32-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"strings"
66

7+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
8+
79
"github.com/hetznercloud/hcloud-go/hcloud"
810
"github.com/spf13/cobra"
911
)
@@ -27,7 +29,7 @@ func newFloatingIPListCommand(cli *CLI) *cobra.Command {
2729
PreRunE: cli.ensureToken,
2830
RunE: cli.wrap(runFloatingIPList),
2931
}
30-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(floatingIPListTableOutput.Columns()))
32+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(floatingIPListTableOutput.Columns()), outputOptionJSON())
3133
cmd.Flags().StringP("selector", "l", "", "Selector to filter by labels")
3234
return cmd
3335
}
@@ -47,6 +49,35 @@ func runFloatingIPList(cli *CLI, cmd *cobra.Command, args []string) error {
4749
return err
4850
}
4951

52+
if outOpts.IsSet("json") {
53+
var floatingIPSchemas []schema.FloatingIP
54+
for _, floatingIP := range floatingIPs {
55+
floatingIPSchema := schema.FloatingIP{
56+
ID: floatingIP.ID,
57+
Name: floatingIP.Name,
58+
Description: hcloud.String(floatingIP.Description),
59+
IP: floatingIP.IP.String(),
60+
Created: floatingIP.Created,
61+
Type: string(floatingIP.Type),
62+
HomeLocation: locationToSchema(*floatingIP.HomeLocation),
63+
Blocked: floatingIP.Blocked,
64+
Protection: schema.FloatingIPProtection{Delete: floatingIP.Protection.Delete},
65+
Labels: floatingIP.Labels,
66+
}
67+
for ip, dnsPtr := range floatingIP.DNSPtr {
68+
floatingIPSchema.DNSPtr = append(floatingIPSchema.DNSPtr, schema.FloatingIPDNSPtr{
69+
IP: ip,
70+
DNSPtr: dnsPtr,
71+
})
72+
}
73+
if floatingIP.Server != nil {
74+
floatingIPSchema.Server = hcloud.Int(floatingIP.Server.ID)
75+
}
76+
floatingIPSchemas = append(floatingIPSchemas, floatingIPSchema)
77+
}
78+
return describeJSON(floatingIPSchemas)
79+
}
80+
5081
cols := []string{"id", "type", "name", "description", "ip", "home", "server", "dns"}
5182
if outOpts.IsSet("columns") {
5283
cols = outOpts["columns"]

cli/image_list.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"fmt"
55
"strings"
66

7+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
8+
79
humanize "github.com/dustin/go-humanize"
810
"github.com/hetznercloud/hcloud-go/hcloud"
911
"github.com/spf13/cobra"
@@ -29,7 +31,7 @@ func newImageListCommand(cli *CLI) *cobra.Command {
2931
PreRunE: cli.ensureToken,
3032
RunE: cli.wrap(runImageList),
3133
}
32-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(imageListTableOutput.Columns()))
34+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(imageListTableOutput.Columns()), outputOptionJSON())
3335
cmd.Flags().StringVarP(&typeFilter, "type", "t", "", "Only show images of given type")
3436
cmd.Flags().StringP("selector", "l", "", "Selector to filter by labels")
3537
return cmd
@@ -58,6 +60,15 @@ func runImageList(cli *CLI, cmd *cobra.Command, args []string) error {
5860
}
5961
images = _images
6062
}
63+
64+
if outOpts.IsSet("json") {
65+
var imageSchemas []schema.Image
66+
for _, image := range images {
67+
imageSchemas = append(imageSchemas, imageToSchema(*image))
68+
}
69+
return describeJSON(imageSchemas)
70+
}
71+
6172
cols := []string{"id", "type", "name", "description", "image_size", "disk_size", "created"}
6273
if outOpts.IsSet("columns") {
6374
cols = outOpts["columns"]

cli/iso_list.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"github.com/hetznercloud/hcloud-go/hcloud"
5+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
56
"github.com/spf13/cobra"
67
)
78

@@ -25,7 +26,7 @@ func newISOListCommand(cli *CLI) *cobra.Command {
2526
PreRunE: cli.ensureToken,
2627
RunE: cli.wrap(runISOList),
2728
}
28-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(isoListTableOutput.Columns()))
29+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(isoListTableOutput.Columns()), outputOptionJSON())
2930
return cmd
3031
}
3132

@@ -37,6 +38,14 @@ func runISOList(cli *CLI, cmd *cobra.Command, args []string) error {
3738
return err
3839
}
3940

41+
if outOpts.IsSet("json") {
42+
var isoSchemas []schema.ISO
43+
for _, iso := range isos {
44+
isoSchemas = append(isoSchemas, isoToSchema(*iso))
45+
}
46+
return describeJSON(isoSchemas)
47+
}
48+
4049
cols := []string{"id", "name", "description", "type"}
4150
if outOpts.IsSet("columns") {
4251
cols = outOpts["columns"]

cli/location_list.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli
22

33
import (
44
"github.com/hetznercloud/hcloud-go/hcloud"
5+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
56
"github.com/spf13/cobra"
67
)
78

@@ -25,7 +26,7 @@ func newLocationListCommand(cli *CLI) *cobra.Command {
2526
PreRunE: cli.ensureToken,
2627
RunE: cli.wrap(runLocationList),
2728
}
28-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(locationListTableOutput.Columns()))
29+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(locationListTableOutput.Columns()), outputOptionJSON())
2930
return cmd
3031
}
3132

@@ -37,6 +38,14 @@ func runLocationList(cli *CLI, cmd *cobra.Command, args []string) error {
3738
return err
3839
}
3940

41+
if outOpts.IsSet("json") {
42+
var locationSchemas []schema.Location
43+
for _, location := range locations {
44+
locationSchemas = append(locationSchemas, locationToSchema(*location))
45+
}
46+
return describeJSON(locationSchemas)
47+
}
48+
4049
cols := []string{"id", "name", "description", "network_zone", "country", "city"}
4150
if outOpts.IsSet("columns") {
4251
cols = outOpts["columns"]

cli/network_list.go

+35-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strings"
66

77
"github.com/hetznercloud/hcloud-go/hcloud"
8+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
89
"github.com/spf13/cobra"
910
)
1011

@@ -27,7 +28,7 @@ func newNetworkListCommand(cli *CLI) *cobra.Command {
2728
PreRunE: cli.ensureToken,
2829
RunE: cli.wrap(runNetworkList),
2930
}
30-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(networkListTableOutput.Columns()))
31+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(networkListTableOutput.Columns()), outputOptionJSON())
3132
cmd.Flags().StringP("selector", "l", "", "Selector to filter by labels")
3233
return cmd
3334
}
@@ -47,6 +48,39 @@ func runNetworkList(cli *CLI, cmd *cobra.Command, args []string) error {
4748
return err
4849
}
4950

51+
if outOpts.IsSet("json") {
52+
var networkSchemas []schema.Network
53+
for _, network := range networks {
54+
networkSchema := schema.Network{
55+
ID: network.ID,
56+
Name: network.Name,
57+
IPRange: network.IPRange.String(),
58+
Protection: schema.NetworkProtection{Delete: network.Protection.Delete},
59+
Created: network.Created,
60+
Labels: network.Labels,
61+
}
62+
for _, subnet := range network.Subnets {
63+
networkSchema.Subnets = append(networkSchema.Subnets, schema.NetworkSubnet{
64+
Type: string(subnet.Type),
65+
IPRange: subnet.IPRange.String(),
66+
NetworkZone: string(subnet.NetworkZone),
67+
Gateway: subnet.Gateway.String(),
68+
})
69+
}
70+
for _, route := range network.Routes {
71+
networkSchema.Routes = append(networkSchema.Routes, schema.NetworkRoute{
72+
Destination: route.Destination.String(),
73+
Gateway: route.Gateway.String(),
74+
})
75+
}
76+
for _, server := range network.Servers {
77+
networkSchema.Servers = append(networkSchema.Servers, server.ID)
78+
}
79+
networkSchemas = append(networkSchemas, networkSchema)
80+
}
81+
return describeJSON(networkSchemas)
82+
}
83+
5084
cols := []string{"id", "name", "ip_range", "servers"}
5185
if outOpts.IsSet("columns") {
5286
cols = outOpts["columns"]

cli/server_list.go

+59-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"strconv"
55
"strings"
66

7+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
8+
79
"github.com/hetznercloud/hcloud-go/hcloud"
810
"github.com/spf13/cobra"
911
)
@@ -27,7 +29,7 @@ func newServerListCommand(cli *CLI) *cobra.Command {
2729
PreRunE: cli.ensureToken,
2830
RunE: cli.wrap(runServerList),
2931
}
30-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(serverListTableOutput.Columns()))
32+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(serverListTableOutput.Columns()), outputOptionJSON())
3133
cmd.Flags().StringP("selector", "l", "", "Selector to filter by labels")
3234
return cmd
3335
}
@@ -47,6 +49,62 @@ func runServerList(cli *CLI, cmd *cobra.Command, args []string) error {
4749
return err
4850
}
4951

52+
if outOpts.IsSet("json") {
53+
var serversSchema []schema.Server
54+
for _, server := range servers {
55+
serverSchema := schema.Server{
56+
ID: server.ID,
57+
Name: server.Name,
58+
Status: string(server.Status),
59+
Created: server.Created,
60+
Datacenter: datacenterToSchema(*server.Datacenter),
61+
ServerType: serverTypeToSchema(*server.ServerType),
62+
PublicNet: schema.ServerPublicNet{
63+
IPv4: schema.ServerPublicNetIPv4{
64+
IP: server.PublicNet.IPv4.IP.String(),
65+
Blocked: server.PublicNet.IPv4.Blocked,
66+
DNSPtr: server.PublicNet.IPv4.DNSPtr,
67+
},
68+
IPv6: schema.ServerPublicNetIPv6{
69+
IP: server.PublicNet.IPv6.IP.String(),
70+
Blocked: server.PublicNet.IPv6.Blocked,
71+
},
72+
},
73+
RescueEnabled: server.RescueEnabled,
74+
BackupWindow: hcloud.String(server.BackupWindow),
75+
OutgoingTraffic: &server.OutgoingTraffic,
76+
IngoingTraffic: &server.IngoingTraffic,
77+
IncludedTraffic: server.IncludedTraffic,
78+
Protection: schema.ServerProtection{
79+
Delete: server.Protection.Delete,
80+
Rebuild: server.Protection.Rebuild,
81+
},
82+
}
83+
if server.Image != nil {
84+
serverImage := imageToSchema(*server.Image)
85+
serverSchema.Image = &serverImage
86+
}
87+
if server.ISO != nil {
88+
serverISO := isoToSchema(*server.ISO)
89+
serverSchema.ISO = &serverISO
90+
}
91+
for ip, dnsPTR := range server.PublicNet.IPv6.DNSPtr {
92+
serverSchema.PublicNet.IPv6.DNSPtr = append(serverSchema.PublicNet.IPv6.DNSPtr, schema.ServerPublicNetIPv6DNSPtr{
93+
IP: ip,
94+
DNSPtr: dnsPTR,
95+
})
96+
}
97+
for _, floatingIP := range server.PublicNet.FloatingIPs {
98+
serverSchema.PublicNet.FloatingIPs = append(serverSchema.PublicNet.FloatingIPs, floatingIP.ID)
99+
}
100+
for _, volume := range server.Volumes {
101+
serverSchema.Volumes = append(serverSchema.Volumes, volume.ID)
102+
}
103+
serversSchema = append(serversSchema, serverSchema)
104+
}
105+
return describeJSON(serversSchema)
106+
}
107+
50108
cols := []string{"id", "name", "status", "ipv4", "ipv6", "datacenter"}
51109
if outOpts.IsSet("columns") {
52110
cols = outOpts["columns"]

cli/servertypes_list.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package cli
33
import (
44
"fmt"
55

6+
"github.com/hetznercloud/hcloud-go/hcloud/schema"
7+
68
"github.com/hetznercloud/hcloud-go/hcloud"
79
"github.com/spf13/cobra"
810
)
@@ -36,7 +38,7 @@ func newServerTypeListCommand(cli *CLI) *cobra.Command {
3638
PreRunE: cli.ensureToken,
3739
RunE: cli.wrap(runServerTypeList),
3840
}
39-
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(serverTypeListTableOutput.Columns()))
41+
addOutputFlag(cmd, outputOptionNoHeader(), outputOptionColumns(serverTypeListTableOutput.Columns()), outputOptionJSON())
4042
return cmd
4143
}
4244

@@ -48,6 +50,14 @@ func runServerTypeList(cli *CLI, cmd *cobra.Command, args []string) error {
4850
return err
4951
}
5052

53+
if outOpts.IsSet("json") {
54+
var serverTypeSchemas []schema.ServerType
55+
for _, serverType := range serverTypes {
56+
serverTypeSchemas = append(serverTypeSchemas, serverTypeToSchema(*serverType))
57+
}
58+
return describeJSON(serverTypeSchemas)
59+
}
60+
5161
cols := []string{"id", "name", "cores", "memory", "disk", "storage_type"}
5262
if outOpts.IsSet("columns") {
5363
cols = outOpts["columns"]

0 commit comments

Comments
 (0)