@@ -29,18 +29,22 @@ func ListCommand() commands.Command {
2929 }
3030}
3131
32- type listIPAddress struct {
33- Access string `json:"access"`
34- Address string `json:"address"`
35- Floating bool `json:"floating"`
36- }
37-
3832type listServerIpaddresses struct {
3933 ServerUUID string
40- IPAddresses [] listIPAddress
34+ IPAddresses upcloud. IPAddressSlice
4135 Error error
4236}
4337
38+ type serverWithIPAddress struct {
39+ upcloud.Server
40+
41+ IPAddresses upcloud.IPAddressSlice `json:"ip_addresses"`
42+ }
43+
44+ type serversWithIPAddresses struct {
45+ Servers []serverWithIPAddress `json:"servers"`
46+ }
47+
4448type listCommand struct {
4549 * commands.BaseCommand
4650 showIPAddresses string
@@ -88,6 +92,7 @@ func (ls *listCommand) ExecuteWithoutArguments(exec commands.Executor) (output.O
8892 }
8993
9094 if ls .showIPAddresses != "none" {
95+ serversWithIPs := serversWithIPAddresses {}
9196 ipaddressMap , err := getIPAddressesByServerUUID (servers , ls .showIPAddresses , exec )
9297 if err != nil {
9398 return nil , err
@@ -96,20 +101,35 @@ func (ls *listCommand) ExecuteWithoutArguments(exec commands.Executor) (output.O
96101 for i , row := range rows {
97102 uuid := row [0 ].(string )
98103
99- var listIpaddresses []listIPAddress
104+ // Add IPs to the table in human output
105+ var listIpaddresses upcloud.IPAddressSlice
100106 if serverIpaddresses , ok := ipaddressMap [uuid ]; ok {
101107 listIpaddresses = append (listIpaddresses , serverIpaddresses .IPAddresses ... )
102108 }
103109 row = append (row [:3 ], row [2 :]... )
104110 row [2 ] = listIpaddresses
105111 rows [i ] = row
112+
113+ // Add IPs to machine output
114+ serversWithIPs .Servers = append (serversWithIPs .Servers , serverWithIPAddress {
115+ Server : servers .Servers [i ],
116+ IPAddresses : listIpaddresses ,
117+ })
106118 }
107119 columns = append (columns [:3 ], columns [2 :]... )
108120 columns [2 ] = output.TableColumn {
109121 Key : "ip_addresses" ,
110122 Header : "IP addresses" ,
111123 Format : formatListIPAddresses ,
112124 }
125+
126+ return output.MarshaledWithHumanOutput {
127+ Value : serversWithIPs ,
128+ Output : output.Table {
129+ Columns : columns ,
130+ Rows : rows ,
131+ },
132+ }, nil
113133 }
114134
115135 return output.MarshaledWithHumanOutput {
@@ -152,21 +172,18 @@ func getIPAddressesByServerUUID(servers *upcloud.Servers, accessType string, exe
152172 return ipaddressMap , nil
153173}
154174
155- func getServerIPAddresses (uuid , accessType string , exec commands.Executor ) ([] listIPAddress , error ) {
175+ func getServerIPAddresses (uuid , accessType string , exec commands.Executor ) (upcloud. IPAddressSlice , error ) {
156176 server , err := exec .All ().GetServerNetworks (exec .Context (), & request.GetServerNetworksRequest {ServerUUID : uuid })
157177 if err != nil {
158178 return nil , err
159179 }
160180
161- var ipaddresses [] listIPAddress
181+ var ipaddresses upcloud. IPAddressSlice
162182 for _ , iface := range server .Interfaces {
163183 for _ , ipa := range iface .IPAddresses {
164184 if accessType == "all" || iface .Type == accessType {
165- ipaddresses = append (ipaddresses , listIPAddress {
166- Access : iface .Type ,
167- Address : ipa .Address ,
168- Floating : ipa .Floating .Bool (),
169- })
185+ ipa .Access = iface .Type
186+ ipaddresses = append (ipaddresses , ipa )
170187 }
171188 }
172189 }
@@ -186,22 +203,22 @@ func getServerIPAddresses(uuid, accessType string, exec commands.Executor) ([]li
186203 return accessMap [ipaddresses [i ].Access ] > accessMap [ipaddresses [j ].Access ]
187204 }
188205
189- return floatingMap [ipaddresses [i ].Floating ] > floatingMap [ipaddresses [j ].Floating ]
206+ return floatingMap [ipaddresses [i ].Floating . Bool () ] > floatingMap [ipaddresses [j ].Floating . Bool () ]
190207 })
191208
192209 return ipaddresses , nil
193210}
194211
195212func formatListIPAddresses (val interface {}) (text.Colors , string , error ) {
196- ipaddresses , ok := val .([] listIPAddress )
213+ ipaddresses , ok := val .(upcloud. IPAddressSlice )
197214 if ! ok {
198- return nil , "" , fmt .Errorf ("cannot parse IP addresses from %T, expected []listIPAddress " , val )
215+ return nil , "" , fmt .Errorf ("cannot parse IP addresses from %T, expected upcloud.IPAddressSlice " , val )
199216 }
200217
201218 var rows []string
202219 for _ , ipa := range ipaddresses {
203220 var floating string
204- if ipa .Floating {
221+ if ipa .Floating . Bool () {
205222 floating = " (f)"
206223 }
207224
0 commit comments