forked from hetznercloud/cli
/
server_list.go
86 lines (77 loc) · 2.19 KB
/
server_list.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package cli
import (
"github.com/hetznercloud/hcloud-go/hcloud"
"github.com/spf13/cobra"
)
var serverListTableOutput *tableOutput
func init() {
serverListTableOutput = newTableOutput().
AddAllowedFields(hcloud.Server{}).
AddFieldOutputFn("ipv4", fieldOutputFn(func(obj interface{}) string {
server := obj.(*hcloud.Server)
return server.PublicNet.IPv4.IP.String()
})).
AddFieldOutputFn("ipv6", fieldOutputFn(func(obj interface{}) string {
server := obj.(*hcloud.Server)
return server.PublicNet.IPv6.Network.String()
})).
AddFieldOutputFn("datacenter", fieldOutputFn(func(obj interface{}) string {
server := obj.(*hcloud.Server)
return server.Datacenter.Name
})).
AddFieldOutputFn("location", fieldOutputFn(func(obj interface{}) string {
server := obj.(*hcloud.Server)
return server.Datacenter.Location.Name
}))
}
func newServerListCommand(cli *CLI) *cobra.Command {
cmd := &cobra.Command{
Use: "list [FLAGS]",
Short: "List servers",
Long: listLongDescription(
"Displays a list of servers.",
serverListTableOutput.Columns(),
),
TraverseChildren: true,
DisableFlagsInUseLine: true,
PreRunE: cli.ensureToken,
RunE: cli.wrap(runServerList),
}
addListOutputFlag(cmd, serverListTableOutput.Columns())
cmd.Flags().StringP("selector", "l", "", "Selector to filter by labels")
return cmd
}
func runServerList(cli *CLI, cmd *cobra.Command, args []string) error {
out, _ := cmd.Flags().GetStringArray("output")
outOpts, err := parseOutputOpts(out)
if err != nil {
return err
}
labelSelector, _ := cmd.Flags().GetString("selector")
opts := hcloud.ServerListOpts{
ListOpts: hcloud.ListOpts{
LabelSelector: labelSelector,
PerPage: 50,
},
}
servers, err := cli.Client().Server.AllWithOpts(cli.Context, opts)
if err != nil {
return err
}
cols := []string{"id", "name", "status", "ipv4", "ipv6", "datacenter"}
if outOpts.IsSet("columns") {
cols = outOpts["columns"]
}
tw := serverListTableOutput
if err = tw.ValidateColumns(cols); err != nil {
return err
}
if !outOpts.IsSet("noheader") {
tw.WriteHeader(cols)
}
for _, server := range servers {
tw.Write(cols, server)
}
tw.Flush()
return nil
}